ObReferenceObjectByName 函数解析

转载 2013年12月05日 22:22:23
一、由于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)



相关文章推荐

过滤/ObReferenceObjectByName/XT

ObReferenceObjectByName

蛋疼的ObReferenceObjectByName调试

今天花了近一天的时间都在调试ObReferenceObjectByName这个内核函数,结果却无比狗血。故写篇文章记录一下这一天蛋疼的调试记录。 其实说是调试,其实是一直编译连接不通过。今天在研究楚...
  • aksnzhy
  • aksnzhy
  • 2011年10月11日 19:49
  • 5055

[转载]关于驱动中的ObReferenceObjectByName 和 IoGetDeviceObjectPointer

今天huhu0013问我为什么ObReferenceObjectByName不能得到Device类型的对象,讨论一番,最终得到如下解释,记录一下:===========================...
  • wowbell
  • wowbell
  • 2011年03月17日 10:50
  • 1115

scanf函数解析

  • 2015年08月14日 20:56
  • 50KB
  • 下载

利用反汇编手段解析C语言函数

1问题的提出 函数是 C语言中的重要概念。利用好函数能够充分利用系统库的功能写出模块独立、易于维护和修改的程序。函数并不是 C 语言独有的概念,其他语言中的方法、过程等本质上都是函数。可见函数在教学中...

复变函数的分析与实例解析

  • 2013年12月02日 16:50
  • 844KB
  • 下载

复杂函数申明解析

  • 2014年04月12日 07:21
  • 151KB
  • 下载

Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析

我们在前面讲到了file_operations,其是一个函数指针的集合,用于存放我们定义的用于操作设备的函数的指针,如果我们不定义,它默认保留为NULL。其中有最重要的几个函数,分别是open()、r...

常用C語言函數解析

  • 2013年11月15日 10:04
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ObReferenceObjectByName 函数解析
举报原因:
原因补充:

(最多只允许输入30个字)