Windows驱动笔记
+ -

Windows设备的ID及DeviceCapability

2024-06-04 6 0

设备ID

Windows设备的ID常见的有以下四种:

  • BusQueryDeviceID
  • BusQueryInstanceID
  • BusQueryHardwareIDs
  • BusQueryCompatibleIDs

BusQueryDeviceID

BusQueryDeviceID是由总线驱动程序上报给系统的。一般是第一BusQueryHardwareIDs,其作为设备的类标识。其主要作用是和BusQueryInstanceID生成InstancePath.

BusQueryInstanceID

BusQueryInstanceID也是由总线驱动程序上报。其作为同类设备BusQueryDeviceID
下的实例区分。

BusQueryHardwareIDs

BusQueryHardwareIDs是一个集合,一个设备所有名字集合,其以REG_MULTI_SZ的形式返回。
硬件ID用于设备定制驱动的标识校验。
162052352386

  • HID代表总线类型。
  • VID PID是USB设备的厂商ID和产口ID
  • REV是USB设备的BCDDevie
  • MI:是接口描述符ID
  • Col:只出现在HID设备,是HID报告描述符应用集合的位次索引。

BusQueryCompatibleIDs

兼容ID是按设备类集合。
其主要用于兼容或者说是类驱动的标识校验。
162114417125

https://www.usb.org/defined-class-codes
162141889455

在Windows系统中,一般专门定制驱动的优先级高于兼容驱动。但有时这不是绝对的,因为驱动的加权也会计算驱动的签名。
更多的可以见:https://learn.microsoft.com/zh-cn/windows-hardware/drivers/install/how-setup-ranks-drivers--windows-vista-and-later-

2 设备实例路径InstancePath

影响设备实例路径由以下几个要素决定:BusQueryDeviceID、BusQueryInstanceID、DeviceCapabilty中的Unique和父节点的InstancePath相关。

If(DeviceCapability.Unique)
{
    InstancePath = BusQueryDeviceID. BusQueryInstanceID
}
Else
{
InstancePath = BusQueryDeviceID.Hash(父节点InstancePath).InstanceID
}

其中父节点InstancePath 哈希的学名为ParentIdPrefix,其实现机制为PDO设备的层级深度和父节点的Hash值。
ParentIdPrefix可以在注册表下可以看到:

计算机计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_351E&PID_00CC\7&314ba276&0&1

ULONG GetInstancePathHas(WCHAR* pInstancePath)
{
    ULONG Hash = 0;
    ULONG nLen = (ULONG)wcslen(pInstancePath);
     PWCHAR  _ep = pInstancePath + nLen;
    ULONG _chHolder = 0;
    while (pInstancePath < _ep)
    {
        _chHolder = 37 * _chHolder + (unsigned int)(*pInstancePath++);
    }

    Hash = abs((INT64)(314159269 * _chHolder)) % 1000000007;
    return Hash;
}

162352587785

3 DeviceCapability

在注册表键值为:Capabilities,通过Windbg查看的数据结构为:

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

其中注册表中它的值内容为:

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);

0 篇笔记 写笔记

解析INF文件中支持的设备硬件ID
安装Windows驱动,首先得知道INF支持的硬件ID.本人手中有一个测试的inf文件,其内容如下:设备支持的硬件ID如下:字符串内容如下:编写一个程序,用来解析INF文件。#include #include #include......
SetupAPI根据硬件ID获取驱动INF文件和驱动日期版本信息
SetupAPI根据硬件ID获取驱动INF文件和驱动日期版本信息。注释掉的代码是获取该硬件的所有可用驱动信息。代码是逐渐完善的,没想到可以直接从注册表信息中获取到。SetupDiOpenDevRegKey打开的注册表路径示例为:计算机HKEY_LOCAL_MACHINESYSTEM......
Devcon hwids命令源代码实现
Devcon hwids命令显示设备的硬件ID信息。主要的显示包括如下:了解过之前几个命令的同学应该觉地比较简单,因为或多或少有些信息如设备友名,设备实例名路径我们都获取过,而设备的硬件ID和兼容ID其实与是比较简单是,和设备的友名一样,是通过SetupDiGetDeviceRegistryPro......
虚拟总线创建子设备返回无效ID
虚拟了一个虚拟总线设备,从设备管理器中看来是正常的,但从功能上来看是不正常的。在设备管理器中提示如下:这个设备运转正常。Windows 无法识别与该硬件连接的一个次要设备,原因使该设备没有有效的硬件标识号。请与硬件制造商联系取得协助。从上面的提示来看,是因为无一个有效的硬件标识号。什么是硬件标识号......
Windows设备的ID及DeviceCapability
设备IDWindows设备的ID常见的有以下四种:BusQueryDeviceIDBusQueryInstanceIDBusQueryHardwareIDsBusQueryCompatibleIDsBusQueryDeviceIDBusQueryDeviceID是由总线驱动程序上报给系统的。一......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!