静态枚举

静态枚举 是驱动程序在系统初始化期间检测和报告设备是否存在的功能,并且报告系统配置的后续更改的能力有限。

如果设备或功能子单元的数量和类型是预先确定的和永久的,并且不依赖于运行驱动程序的系统的配置,则总线驱动程序可以使用静态枚举。

例如,声音卡的驱动程序可以充当总线驱动程序, (PDO) 为卡的每个功能(例如 MIDI、音频和游戏杆)创建单独的物理设备对象。

静态子列表

框架通过提供静态子列表,使驱动程序能够支持静态枚举。 每个静态子列表表示连接到父设备的子设备列表。 父设备的总线驱动程序必须标识父设备的子设备,将它们添加到父设备的静态子设备列表中,并为每个子设备创建 PDO。

创建静态子列表

每次驱动程序创建一个框架设备对象,该框架对象表示 (设备的 FDO) 功能设备对象时,框架都会为设备创建一个空的静态子列表。

当框架调用总线驱动程序的 EvtDriverDeviceAdd 回调函数时,回调函数必须调用 WdfDeviceCreate 为父设备创建 FDO。 有关创建 FDO 的详细信息,请参阅 在函数驱动程序中创建设备对象

然后,驱动程序必须枚举父设备的子级,为子级创建 PDO,并将子级添加到子级列表。

(可选)驱动程序可以调用 WdfDeviceSetBusInformationForChildren ,为框架提供有关总线的信息。 建议这样做,因为这样可以更轻松地让子设备和应用识别总线。

若要为检测到的子设备创建 PDO,总线驱动程序必须:

  1. 调用 WdfPdoInitAllocate 以获取 WDFDEVICE_INIT 结构。

  2. 初始化WDFDEVICE_INIT结构。

  3. 调用 WdfDeviceCreate 以创建表示 PDO 的框架设备对象。

有关创建 PDO 的详细信息,请参阅 在总线驱动程序中创建设备对象

调用 WdfDeviceCreate 后,驱动程序必须调用 WdfFdoAddStaticChild 以将子设备添加到子列表。

修改静态子列表

由于驱动程序应仅对预先确定的永久性设备配置使用静态子列表,因此驱动程序在创建静态子列表后几乎不需要修改它。 如果驱动程序确定子设备变得不可访问,驱动程序可以调用 WdfPdoMarkMissing。 (如果子设备仍可访问,但变得无响应且不可用,则驱动程序应将 WDF_DEVICE_STATE 结构的 Failed 成员设置为 WdfTrue,然后调用 WdfDeviceSetDeviceState.)

遍历静态子列表

如果需要检索静态子列表的内容,驱动程序可以通过执行以下操作遍历该列表:

  1. 调用 WdfFdoLockStaticChildListForIteration

  2. 根据需要多次调用 WdfFdoRetrieveNextStaticChild

  3. 调用 WdfFdoUnlockStaticChildListFromIteration