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用法(自己测试成功)

//全局的一个对象类型 extern POBJECT_TYPE *IoDriverObjectType;  函数原型声明 NTSTATUS ObReferenceObjectByName ...
  • cosmoslife
  • cosmoslife
  • 2013年05月04日 22:25
  • 906

IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针

//IoGetDeviceObjectPointer得到设备对象指针 UNICODE_STRING DeviceName; RtlInitUnicodeString(&DeviceName,L"\\...
  • qq125096885
  • qq125096885
  • 2016年02月19日 11:22
  • 381

ObReferenceObjectByName 函数

这是一个DDK未公开的内核函数,DDK的所有.h头文件中没有关于这个函数的声明,因此不可能通过包含某个头文件后就能使用,需要自己声明.C++中如下声明: #pragma once #ifdef _...
  • cosmoslife
  • cosmoslife
  • 2012年08月03日 17:05
  • 301

ObReferenceObjectByName函数,通过驱动程序得到设备对象

一、由于ObReferenceObjectByName没有文档化,故在使用前先做声明: #ifdef __cplusplus extern "C" { #endif #include ...
  • htqlhy
  • htqlhy
  • 2012年10月23日 17:55
  • 668

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

//全局的一个对象类型 extern POBJECT_TYPE *IoDriverObjectType;  函数原型声明 NTSTATUS ObReferenceObjectByName (     ...
  • qq1841370452
  • qq1841370452
  • 2017年01月26日 17:49
  • 829

蛋疼的ObReferenceObjectByName调试

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

未文档化函数ObReferenceObjectByName的说明

使用方式如下 status = ObReferenceObjectByName( &kdbName, OBJ_CASE_INSENSITIVE, NULL, 0, IoDrive...
  • u013923131
  • u013923131
  • 2015年04月05日 19:30
  • 556

过滤/ObReferenceObjectByName/XT

ObReferenceObjectByName
  • u013205877
  • u013205877
  • 2017年02月24日 21:30
  • 194

ObReferenceObjectByName蓝屏问题

在拖了几天,调了快一天之后,问题终于在新年的第一天解决,庆贺一下O(∩_∩)O~ 在“北极星2003”的CSDN博客上看到说用ObReferenceObjectByName来输出驱动程序的基本信息,...
  • cosmoslife
  • cosmoslife
  • 2013年04月24日 17:02
  • 543

json解析函数。

  玩 web 也不是一年两年了。json也用了许久。今天一好友突然问我要讲一个javascript对象保存到cookie中。我直接想到的是json。以前在 extjs中倒是有。难不成为了这么一个小功...
  • bywayboy
  • bywayboy
  • 2009年03月06日 14:01
  • 3632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ObReferenceObjectByName 函数解析
举报原因:
原因补充:

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