注册表Capabilities值解释(DEVICE_CAPABILITIES)
2023-09-01
65
0
这里的注册表指的是:
计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum
路径下的某个设备。
该值其实是总线驱动程序返回的是子设备的DEVICE_CAPABILITIES的简要信息。
其结构体定义如下:
2: kd> dt _DEVICE_CAPABILITIES
nt!_DEVICE_CAPABILITIES
+0x000 Size : Uint2B
+0x002 Version : Uint2B
+0x004 DeviceD1 : Pos 0, 1 Bit
+0x004 DeviceD2 : Pos 1, 1 Bit
+0x004 LockSupported : Pos 2, 1 Bit
+0x004 EjectSupported : Pos 3, 1 Bit
+0x004 Removable : Pos 4, 1 Bit
+0x004 DockDevice : Pos 5, 1 Bit
+0x004 UniqueID : Pos 6, 1 Bit
+0x004 SilentInstall : Pos 7, 1 Bit
+0x004 RawDeviceOK : Pos 8, 1 Bit
+0x004 SurpriseRemovalOK : Pos 9, 1 Bit
+0x004 WakeFromD0 : Pos 10, 1 Bit
+0x004 WakeFromD1 : Pos 11, 1 Bit
+0x004 WakeFromD2 : Pos 12, 1 Bit
+0x004 WakeFromD3 : Pos 13, 1 Bit
+0x004 HardwareDisabled : Pos 14, 1 Bit
+0x004 NonDynamic : Pos 15, 1 Bit
+0x004 WarmEjectSupported : Pos 16, 1 Bit
+0x004 NoDisplayInUI : Pos 17, 1 Bit
+0x004 Reserved1 : Pos 18, 1 Bit
+0x004 WakeFromInterrupt : Pos 19, 1 Bit
+0x004 Reserved : Pos 20, 12 Bits
+0x008 Address : Uint4B
+0x00c UINumber : Uint4B
+0x010 DeviceState : [7] _DEVICE_POWER_STATE
+0x02c SystemWake : _SYSTEM_POWER_STATE
+0x030 DeviceWake : _DEVICE_POWER_STATE
+0x034 D1Latency : Uint4B
+0x038 D2Latency : Uint4B
+0x03c D3Latency : Uint4B
XP系统的结构体定义如下:
typedef struct _DEVICE_CAPABILITIES {
USHORT Size;
USHORT Version; // the version documented here is version 1
ULONG DeviceD1:1;
ULONG DeviceD2:1;
ULONG LockSupported:1;
ULONG EjectSupported:1; // Ejectable in S0
ULONG Removable:1;
ULONG DockDevice:1;
ULONG UniqueID:1;
ULONG SilentInstall:1;
ULONG RawDeviceOK:1;
ULONG SurpriseRemovalOK:1;
ULONG WakeFromD0:1;
ULONG WakeFromD1:1;
ULONG WakeFromD2:1;
ULONG WakeFromD3:1;
ULONG HardwareDisabled:1;
ULONG NonDynamic:1;
ULONG WarmEjectSupported:1;
ULONG NoDisplayInUI:1;
ULONG Reserved:14;
ULONG Address;
ULONG UINumber;
DEVICE_POWER_STATE DeviceState[POWER_SYSTEM_MAXIMUM];
SYSTEM_POWER_STATE SystemWake;
DEVICE_POWER_STATE DeviceWake;
ULONG D1Latency;
ULONG D2Latency;
ULONG D3Latency;
} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
可以看到,DEVICE_CAPABILITIES中的信息比较多,而注册表中Capabilities只是其部分简要信息,其对应关系如下:
Capabilities = (Capabilities->LockSupported) |
(Capabilities->EjectSupported << 1) |
(Capabilities->WarmEjectSupported<< 1) |
(Capabilities->Removable << 2) |
(Capabilities->DockDevice << 3) |
(Capabilities->UniqueID << 4) |
(Capabilities->SilentInstall << 5) |
(Capabilities->RawDeviceOK << 6) |
(Capabilities->SurpriseRemovalOK << 7) |
(Capabilities->HardwareDisabled << 8) |
(Capabilities->NonDynamic << 9);
其实OSR有一个比交有名的工具DeviceTree,只不过因为其版本比较老了,导致这些信息读不出来。