1、Windows设备栈相关的介绍,可在WDK中找到,参见:https://learn.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/device-nodes-and-device-stacks
2、关于设备栈,简单的理解就是,一个设备添加到总线后(物理的或虚拟的),操作系统可能会创建一系列的设备对象。
3、为了避免对每一个设备都编写一个驱动,Windows使用“设备类”来统一某类设备的访问接口,例如:你观察所有的磁盘、光驱设备,你会发现它们都使用相同的设备驱动程序。
4、USB是一种接口技术,其总线由USB主机控制器、集线器组成。USB-IF负责其标准化,标准中也包括了设备类的定义。参见:https://www.usb.org/defined-class-codes
这个设备类的定义反映在设备的兼容ID中。
5、在TD的设备监控策略中,设备类是指Windows定义的设备类,设备子类是指USB-IF定义的设备类。
6、关于设备栈和设备类,举个例子来说明,你把一个苹果手机通过USB插入到电脑后,会创建三个设备对象,按先后次序(父子关系)分别有:
1) Apple Mobile Device USB Composite Device,设备类为USB
2)Apple Mobile Device USB Device,设备类为USB
3)Apple iPhone,设备类为WPD(便携设备)
而这三个设备的兼容ID中所指示的USB-IF定义的设备类,都是06,Image设备。
7、再举一个更简单的例子,插入一个U盘,也会产生至少两个设备:
1) USB大容量存储设备,设备类为USBSTOR,设备兼容ID为08(Mass Storage)
2)一个磁盘设备,设备类为DISK
8、总结:
1)设备类是Windows完成设备安装后的分类
2) USB设备子类是USB-IF在硬件信息里定义的分类,反映在注册表的兼容ID里
3) USB-IF定义的规范,厂商经常不完全遵守,例如,利用MassStorage来驱动打印机、读卡器或其它设备,目的是借用Windows的USB大容量存储类接口达到免驱的效果。
Device nodes and device stacks - Windows drivers | Microsoft Learn
观察设备的加载,除了设备管理器,还可以参考以下注册表位置:
1、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum,这里记录了所有安装过驱动的设备实例
2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class,这里是系统定义的设备类