一、由于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;
// RtlI