我是靠谱客的博主 动人外套,最近开发中收集的这篇文章主要介绍IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

//IoGetDeviceObjectPointer得到设备对象指针

UNICODE_STRING DeviceName;
RtlInitUnicodeString(&DeviceName,L"\Device\MyDDKDeviceA");
PDEVICE_OBJECT DeviceObject=NULL;
PFILE_OBJECT FileObject=NULL;
NTSTATUS ntStatus=IoGetDeviceObjectPointer(&DeviceName,FILE_ALL_ACCESS,&FileObject,&DeviceObject);

//判断设备是否被成功打开
if(!NT_SUCCESS(ntStatus))return;

//将文件对象指针的引用计数减1
ObDereferenceObject(FileObject);






//ObReferenceObjectByName获得设备指针
#ifdef __cplusplus
extern "c"
{
#endif
#include<NTDDK.h>

	NTKERNELAPI
		NTSTATUS 
		ObreferenceObjectByName(
		IN PUNICODE_STRING objectName,
		IN ULONG Attributes,
		IN PACCESS_STATE PassedAccessState OPTIONAL,
		IN ACCESS_MASK DesiredAccess OPTIONAL,
		IN POBJECT_TYPE objectType,
		IN KPROCESSOR_MODE AccessMode,
		IN OUT PVOID ParseContext OPTIONAL,
		OUT PVOID *Object
		);

	extern POBJECT_TYPE IoDeviceObjectType;
}
#endif


UNICODE_STRING DeviceName;
RtlInitUnicodeString(&DeviceName,L"\??\HelloDDKA");
PDEVICE_OBJECT DeviceObject=NULL;
PFILE_OBJECT FileObject=NULL;
NTSTATUS ntStatus=ObReferenceObjectByName(&DeviceName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDeviceObjectType,KernelMode,NULL,(PVOID*)&DeviceObject);

//判断设备是否被成功打开
if(!NT_SYCCESS(ntStatus))return;




//模拟IoGetDeviceObjectPointer函数
1.用InitializeObjectAttributes内核函数构造OBJECT_ATTRIBUTES结构体
2.用ZwOpenFile内核函数打开设备对象的句柄
3.用ObRefenenceObjectByHandle内核函数将设备对象的句柄转化成设备对象相关的文件对象句柄
4.用IoGetBaseFileSystemDeviceObject内核函数从设备相关文件对象指针得到设备对象指针

NTSTATUS MyIoGetDeviceObjectPointer(IN PUNICODE_STRING objectName, IN ACCESS_MASK DesiredAccess,OUT PFILE_OBJECT *FileObject,OUT PDEVICE_OBJECT *DeviceObject)
{
	PFILE_OBJECT fileObject;
	OBJECT_ATTRIBUTES objectAttributes;
	HANDLE fileHandle;
	IO_STATUS_BLOCK ioStatus;
	NTSTATUS status;

	//设置要打开的设备的设备名
	InitializeObjectAttributes(&objectAttributes,ObjectName,OBJ_KERNEL_HANDLE,NULL,NULL);

	//打开设备
	status=ZwOpenFile(&fileHandle,DesiredAccess,&objectAttributes,&ioStatus,0,FILE_NON_DIRECTORY_FILE);

	//判断操作是否倍挂起
	if(NT_SUCCESS(status))
	{
		//得到文件对象指针
		status=ObReferenceObjectByHandle(fileHandle,0,*IoFileObjectType,KernelMode,(PVOID*)&FileObject,NULL);

		//判断操作是否成功
		if(NT_SUCCESS(status))
		{
			*FileObject=fileObject;
			//得到设备对象指针
			*DeviceObject=IoGetBaseFileSystemDeviceObject(FileObject);
		}
		//关闭设备句柄
		ZwClose(fileHandle);
	}

	return status;
}

最后

以上就是动人外套为你收集整理的IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针的全部内容,希望文章能够帮你解决IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部