ObReferenceObjectByName函数使用解析

  1. 一、由于ObReferenceObjectByName没有文档化,故在使用前先做声明:  
  2.   
  3. #ifdef __cplusplus  
  4. extern "C"  
  5. {  
  6. #endif  
  7. #include <NTDDK.h>  
  8.   
  9. NTKERNELAPI  
  10. NTSTATUS  
  11. ObReferenceObjectByName(  
  12.     IN PUNICODE_STRING ObjectName,  
  13.     IN ULONG Attributes,  
  14.     IN PACCESS_STATE PassedAccessState OPTIONAL,  
  15.     IN ACCESS_MASK DesiredAccess OPTIONAL,  
  16.     IN POBJECT_TYPE ObjectType,  
  17.     IN KPROCESSOR_MODE AccessMode,  
  18.     IN OUT PVOID ParseContext OPTIONAL,  
  19.     OUT PVOID *Object  
  20.     );  
  21. extern POBJECT_TYPE * IoDeviceObjectType;  
  22. #ifdef __cplusplus  
  23. }  
  24. #endif  
  25.   
  26. 二、使用  
  27.   
  28. 调试ObReferenceObjectByName发现,  
  29.   
  30. (1)可以根据驱动名称可以得到PDRIVER_OBJECT,进而得到该驱动的PDEVICE_OBJECT。  
  31.   
  32. (2)根据设备名称取到PDEVICE_OJBECT为0。  
  33.   
  34. (3)根据符号链接名称取到PDEVICE_OJBECT的地址并不是设备对象地址。  
  35.   
  36. 调试代码如下:  
  37.   
  38.  UNICODE_STRING DeviceName;  
  39. // RtlInitUnicodeString( &DeviceName, L"\\??\\HelloDDKA" );  
  40. // RtlInitUnicodeString( &DeviceName, L"\\??\\DriverA" );  
  41.  RtlInitUnicodeString( &DeviceName, L"\\Driver\\DriverA" );  
  42.   
  43.  PDEVICE_OBJECT DeviceObject = NULL;  
  44.  PFILE_OBJECT FileObject = NULL;  
  45.  PDRIVER_OBJECT pDriver = NULL;  
  46. //  ntStatus = ObReferenceObjectByName(&DeviceName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDeviceObjectType,KernelMode,NULL,(PVOID*)&DeviceObject);  
  47.  ntStatus = ObReferenceObjectByName(&DeviceName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDeviceObjectType,KernelMode,NULL,(PVOID*)&pDriver);  
  48.    
  49.  DeviceObject = pDriver->DeviceObject;  
  50.  PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;  
  51.   
  52.  三、关闭引用  
  53.   
  54. 调用上面的ObReferenceObjectByName对象指针,当得到的对象不再使用后,记得调用ObDereferenceObject关闭引用。  
  55.   
  56. (1)如果得到的是驱动对象,则关闭驱动对象引用,如ObDereferenceObject(pDriver)  
  57.   
  58. (2)如果得到是设备对象,则关闭设备对象引用,如ObDereferenceObject(deviceObject)  
  59.   
  60. (3)如果得到的是文件对象,则关闭文件对象引用,如ObDereferenceObject(fileObject)  

重点注意:获取键盘驱动对象 NTSTATUS status = ObReferenceObjectByName(&uKbdDriverName, OBJ_CASE_INSENSITIVE, NULL, FILE_ALL_ACCESS, *IoDriverObjectType, KernelMode, NULL, (PVOID *)&g_pKdbDriverObj);*IoDriverObjectType前面有个*号否则失败!声明的时候前面也带*号.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值