静态枚举 是一种使驱动程序在系统初始化期间检测并报告设备存在的能力,但在报告系统配置随后的更改方面能力有限。
如果设备的数量和类型或功能子单元是预先确定的且永久性的,并且不依赖于运行驱动程序的系统的配置,则总线驱动程序可以使用静态枚举。
例如,声卡的驱动程序可能充当总线驱动程序,并为卡的每个功能(如 MIDI、音频和游戏杆)创建单独的物理设备对象(PDO)。
静态子列表
框架通过提供静态子列表,使驱动程序能够支持静态枚举。 每个静态子列表表示连接到父设备的子设备的列表。 父设备的总线驱动程序必须标识父设备的子设备,将其添加到父设备的静态子列表,并为每个子设备创建 PDO。
创建静态子列表
每当驱动程序创建表示设备功能设备对象的框架设备对象(FDO)时,框架都会为设备创建一个空的静态子列表。
当框架调用总线驱动程序的 EvtDriverDeviceAdd 回调函数时,回调函数必须调用 WdfDeviceCreate 为父设备创建 FDO。 有关创建 FDO 的详细信息,请参阅 在函数驱动程序中创建设备对象。
然后,驱动程序必须枚举父设备的子级,为子级创建 PDO,并将子级添加到子列表中。
(可选)驱动程序可以调用 WdfDeviceSetBusInformationForChildren 来向框架提供有关总线的信息。 建议这样做,因为它可以更轻松地让子设备和应用识别总线。
若要为已检测的子设备创建 PDO,总线驱动程序必须:
调用 WdfPdoInitAllocate 以获取 WDFDEVICE_INIT 结构。
初始化WDFDEVICE_INIT结构。
调用 WdfDeviceCreate 以创建表示 PDO 的框架设备对象。
有关创建 PDO 的详细信息,请参阅 在总线驱动程序中创建设备对象。
调用 WdfDeviceCreate 后,驱动程序必须调用 WdfFdoAddStaticChild ,才能将子设备添加到子列表。
修改静态子列表
由于驱动程序应仅对预先确定和永久的设备配置使用静态子列表,因此在创建静态子列表后,无需驱动程序修改静态子列表。 如果驱动程序确定子设备不可访问,驱动程序可以调用 WdfPdoMarkMissing。 (如果子设备仍然可访问,但变得无响应且不可用,驱动程序应将WDF_DEVICE_STATE结构的失败成员设置为 WdfTrue,然后调用 WdfDeviceSetDeviceState。
遍历静态子列表
如果需要检索静态子列表的内容,驱动程序可以通过执行以下作遍历列表: