我是靠谱客的博主 包容故事,最近开发中收集的这篇文章主要介绍通过驱动名称得到(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)
最后
以上就是包容故事为你收集整理的通过驱动名称得到(T雪工具)驱动对象名_ObReferenceObjectByName_函数的用法的全部内容,希望文章能够帮你解决通过驱动名称得到(T雪工具)驱动对象名_ObReferenceObjectByName_函数的用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复