查DDK有如下参考信息:
NTSTATUS IoGetDeviceObjectPointer(
IN PUNICODE_STRING ObjectName,
IN ACCESS_MASK DesiredAccess,
OUT PFILE_OBJECT *FileObject,
OUT PDEVICE_OBJECT *DeviceObject
);
FILE_OBJECT STRUCT
_Type SWORD ? ; 0000h IO_TYPE_FILE (original field name Type)
_Size SWORD ? ; 0002h (original name Size)
DeviceObject PVOID ? ; 0004h PTR DEVICE_OBJECT
.....
FILE_OBJECT ENDS
PFILE_OBJECT typedef PTR FILE_OBJECT
代码片段:
... ...
push esi ; DeviceObject
push edi ; FileObject <──┐
push FILE_READ_ATTRIBUTES ; DesiredAccess │
lea eax, usDestinationString │
push eax ; ObjectName │
call IoGetDeviceObjectPointer │
test
eax, eax │
jz @ │
nop │
@@: │
mov eax, [edi] ; FileObject │
mov eax, [eax+4] │
mov [esi], eax ; DeviceObject <──┘
... ...