使用
!devobj
命令,我可以看到设备的名称,但是我想找到包含名称的表/结构。#1 楼
因此,假设像您说的那样,您具有设备对象的线性地址,请使用windbg扩展名!object 0xlinearaddress
。根据您的Windows构建,它将显示对象标题的线性地址。 使用windbg为您解析
OBJECT_HEADER
结构。从Windows 7开始,您将拥有一个名为InfoMask
的成员,而早期版本则具有NameInfoOffset
。 如果您使用的是较早的版本,则从对象标头的线性基数中减去
NameInfoOffset
,以获取该对象的OBJECT_HEADER_NAME_INFO
结构的基数。如果如果使用Windows 7或更高版本,则
InfoMask
是位掩码,用于描述标头开头之前存在的其他创建者结构。它使用ObInfoMaskToOffsetTable
计算,其中包含对象的OBJECT_HEADER_NAME_INFO
结构的偏移量。它始终位于一个恒定的位置,但是应该使用InfoMask
来确定是否命名了该对象,因为并非所有对象都必须被命名。位于fffffa8001234560
的设备对象。我们还假设您使用的是Windows 7 x64。 > -0x20,因为在这种情况下,表中使用的InfoMask
的索引值为0x20。此结构包含相对于其对象目录的名称。
还可以看看导出的内核例程
ObQueryNameInfo
。#2 楼
据我所知,XP和Win7都始终采用这种格式:做了object_directory_followed
:kd> !devobj \Device\Beep;dt nt!_OBJECT_HEADER_NAME_INFO 86884db8-28
Device object (86884db8) is for:
Beep \Driver\Beep DriverObject 86e703b8
Current Irp 00000000 RefCount 0 Type 00000001 Flags 00000044
Dacl e1020c34 DevExt 86884e70 DevObjExt 86884ec8
ExtensionFlags (0000000000)
Device queue is not busy.
+0x000 Directory : 0xe100d670 _OBJECT_DIRECTORY
+0x004 Name : _UNICODE_STRING "Beep"
+0x00c QueryReferences : 1
kd> !devobj \Deviceq4312078q000013
Device object (86fe7cd0) is for:
00000013 \Driver\PnpManager DriverObject 86fe9328
Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040
Dacl e1020c34 DevExt 86fe7d88 DevObjExt 86fe7d90 DevNode 86fe7b88
ExtensionFlags (0x00000010) DOE_START_PENDING
Device queue is not busy.
kd> dt nt!_OBJECT_HEADER_NAME_INFO 86fe7cd0-28
+0x000 Directory : 0xe100d670 _OBJECT_DIRECTORY
+0x004 Name : _UNICODE_STRING "00000013"
+0x00c QueryReferences : 1