通过驱动名称得到(T雪工具)驱动对象名_ObReferenceObjectByName_函数的用法

//全局的一个对象类型
extern POBJECT_TYPE *IoDriverObjectType;
 函数原型声明
NTSTATUS
ObReferenceObjectByName (
    __in PUNICODE_STRING ObjectName,
    __in ULONG Attributes,
    __in_opt PACCESS_STATE AccessState,
    __in_opt ACCESS_MASK DesiredAccess,
    __in POBJECT_TYPE ObjectType,
    __in KPROCESSOR_MODE AccessMode,
    __inout_opt PVOID ParseContext,
    __out PVOID *Object
    );
 
PDRIVER_OBJECT  driverObject;
UNICODE_STRING driverString;
 
用法示例代码:
 status = ObReferenceObjectByName(&driverString,
                                     OBJ_CASE_INSENSITIVE,//不区分大小写 驱动名可以写大写或小写 
                                     NULL,  // 结构比较复杂设计对象特性的东西access state
                                     0,       // 访问权限可以写0 写0完全访问不受控制FILE_ALL_ACCESS,
                                     *IoDriverObjectType,//对象类型 注意加*号 
                                     KernelMode,//内核模式 有三种模式 enum 类型  
                                     NULL,                 //不知道 parse context  parse context
                                     (PVOID*)&driverObject);//输出对象 我们要得到的驱动对象  
 
 
说明:
driverString驱动名称 如:L“\\Driver\\Disk”
driverObject注意前面的&符号
*IoDriverObjectType 定义时有星号,用的时候*IoDriverObjectType也要加星号
一、由于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;  
#ifdef __cplusplus  
}  
#endif  
  
二、使用  
  
调试ObReferenceObjectByName发现,  
  
(1)可以根据驱动名称可以得到PDRIVER_OBJECT,进而得到该驱动的PDEVICE_OBJECT。  
  
(2)根据设备名称取到PDEVICE_OJBECT为0。  
  
(3)根据符号链接名称取到PDEVICE_OJBECT的地址并不是设备对象地址。  
  
调试代码如下:  
  
 UNICODE_STRING DeviceName;  
// RtlInitUnicodeString( &DeviceName, L"\\??\\HelloDDKA" );  
// RtlInitUnicodeString( &DeviceName, L"\\??\\DriverA" );  
 RtlInitUnicodeString( &DeviceName, L"\\Driver\\DriverA" );  
  
 PDEVICE_OBJECT DeviceObject = NULL;  
 PFILE_OBJECT FileObject = NULL;  
 PDRIVER_OBJECT pDriver = NULL;  
//  ntStatus = ObReferenceObjectByName(&DeviceName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDeviceObjectType,KernelMode,NULL,(PVOID*)&DeviceObject);  
 ntStatus = ObReferenceObjectByName(&DeviceName,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDeviceObjectType,KernelMode,NULL,(PVOID*)&pDriver);  
   
 DeviceObject = pDriver->DeviceObject;  
 PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;  
  
 三、关闭引用  
  
调用上面的ObReferenceObjectByName对象指针,当得到的对象不再使用后,记得调用ObDereferenceObject关闭引用。  
  
(1)如果得到的是驱动对象,则关闭驱动对象引用,如ObDereferenceObject(pDriver)  
  
(2)如果得到是设备对象,则关闭设备对象引用,如ObDereferenceObject(deviceObject)  
  
(3)如果得到的是文件对象,则关闭文件对象引用,如ObDereferenceObject(fileObject)  


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值