我正在使用WinDbg尝试枚举驱动程序及其关联的设备。获取驱动程序名称非常容易。在_DRIVER_OBJECT结构中可以找到它。不幸的是,_DEVICE_OBJECT不包含设备的名称。

使用!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