ObReferenceObjectByName函数使用解析

一、由于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,					// 结构比较复杂设计对象特性的东西access state
 							FILE_ALL_ACCESS,		 // 访问权限可以写0 写0完全访问不受控制FILE_ALL_ACCESS
 							IoDeviceObjectType,		//对象类型 注意加*号
 							KernelMode,				//内核模式 有三种模式 enum 类型
 							NULL,					//不知道 parse context  parse contex
 							(PVOID*)&pDriver		//输出对象 我们要得到的驱动对象
 							);  
   
 DeviceObject = pDriver->DeviceObject;  
 PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;  

说明:

driverString驱动名称 如:L“\\Driver\\Disk”
driverObject注意前面的&符号
*IoDriverObjectType 定义时有星号,用的时候*IoDriverObjectType也要加星号

三、关闭引用

调用上面的ObReferenceObjectByName对象指针,当得到的对象不再使用后,记得调用ObDereferenceObject关闭引用。

(1)如果得到的是驱动对象,则关闭驱动对象引用,如ObDereferenceObject(pDriver)

(2)如果得到是设备对象,则关闭设备对象引用,如ObDereferenceObject(deviceObject)

(3)如果得到的是文件对象,则关闭文件对象引用,如ObDereferenceObject(fileObject)

重点注意:
获取键盘驱动对象

NTSTATUS status = ObReferenceObjectByName(
										&uKbdDriverName, 
										OBJ_CASE_INSENSITIVE,
										NULL, 
										FILE_ALL_ACCESS, 
										*IoDriverObjectType, 
										KernelMode, 
										NULL, 
										(PVOID *)&g_pKdbDriverObj
										);

IoDriverObjectType前面有个号否则失败!声明的时候前面也带*号.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数常用于将字符串按照指定格式解析成不同类型的数据,并将解析结果存储到指定的变量中。下面对sscanf函数的参数进行解析: ```c int sscanf(const char *str, const char *format, ...); ``` - `str`:要被解析的字符串。 - `format`:解析格式字符串,类似于printf函数中的格式字符串,用来指定解析的方式。 - `...`:可变参数列表,表示解析结果需要存储到的变量,可以是多个变量,变量的类型和解析格式字符串中的格式符要匹配。 下面介绍一些常用的格式符: - `%d`:解析一个有符号十进制整数。 - `%u`:解析一个无符号十进制整数。 - `%o`:解析一个无符号八进制整数。 - `%x`:解析一个无符号十六进制整数,字母可以是小写或大写。 - `%f`:解析一个浮点数。 - `%lf`:解析一个双精度浮点数。 - `%c`:解析单个字符。 - `%s`:解析字符串,遇到空格和制表符停止。 - `%p`:解析指针类型的数据,如`"%p", &p`表示将字符串转换为指针类型,存储到p中。 例如,下面的代码将字符串"123 3.14 hello"按照指定格式解析成整数、浮点数和字符串,并将解析结果存储到变量a、b和c中: ```c char str[] = "123 3.14 hello"; int a; float b; char c[10]; sscanf(str, "%d %f %s", &a, &b, c); ``` 在格式字符串中,"%d"表示解析整数,"%f"表示解析浮点数,"%s"表示解析字符串。另外,解析结果存储到变量a、b和c中,对应的变量地址需要使用"&"符号进行取地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值