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,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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章