IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针

本文介绍了在Windows驱动开发中如何使用IoGetDeviceObjectPointer及ObReferenceObjectByName等函数获取设备对象指针的方法,并提供了一个模拟IoGetDeviceObjectPointer功能的自定义函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值