在 UMDF 驱动程序中使用设备池
User-Mode Driver Framework (UMDF) 版本 1.11 和 2.0
如果 User-Mode Driver Framework (UMDF) 驱动程序是使用版本 1.11 或 2.0 生成的,并且正在 Windows 8 或更高版本上运行,则框架会创建可以托管多个设备堆栈的 Wudfhost 的单个实例。 此方法称为 设备池。 设备池main好处是减少具有多个 UMDF 设备的环境中的内存消耗。
如果共用设备发生故障,框架将终止 Wudfhost 的实例,并尝试重启以前位于池中的所有设备。 如果设备在共用时再次发生故障,框架会为设备创建单独的 Wudfhost 进程,并尝试再次启动设备。
如果设备在单独的主机进程中发生故障,框架将尝试重启它最多五次。 当自上次失败以来已过 30 分钟时,框架会将设备错误计数重置为 1。
如果重新启动系统,框架会重新池设备,但那些在单独的进程中运行时失败的设备除外。
若要为特定设备禁用设备池,请使用 INF 的 WDF 特定 DDInstall 节中的 UmdfHostProcessSharing 指令。 有关 UmdfHostProcessSharing 的信息,请参阅 在 INF 文件中指定 WDF 指令。
如果驱动程序使用 直接 I/O,则必须将 UmdfHostProcessSharing 设置为 ProcessSharingDisabled。 否则,驱动程序可能无法启动。 如果选择 了 WdfDeviceIoBufferedOrDirect 并将设备加入池,则框架会将缓冲区访问方法更改为 缓冲 I/O。 如果选择了 WdfDeviceIoBufferedOrDirect 并且设备未入池,则框架会将缓冲区访问方法更改为定向 I/O。
若要选择缓冲区访问方法,驱动程序必须从其 IDriverEntry::OnDeviceAdd 回调函数调用 IWDFDeviceInitialize2::SetIoTypePreference 方法。 有关访问方法的信息,请参阅 在UMDF-Based驱动程序中访问数据缓冲区。
UMDF 版本 1.9 及更早版本
如果驱动程序是使用 UMDF 版本 1.9 或更早版本生成的,则框架会为每个设备堆栈创建主机进程的单独实例, (Wudfhost) 。
如果设备无法启动,框架将尝试重启它最多五次。 当自上次失败以来已过 30 分钟时,框架会将设备错误计数重置为 1。
在非共用环境中,如果多个设备堆栈共享同一 UMDF 驱动程序:
- 每个设备堆栈在单独的 WudfHost 进程中加载。
- 框架为每个设备堆栈调用驱动程序的 IDriverEntry::OnInitialize 和 IDriverEntry::OnDeinitialize 方法一次。
- 框架为每个设备堆栈调用驱动程序的 IDriverEntry::OnDeviceAdd 方法一次。 每个设备对象都与一个单独的驱动程序对象相关联。
在共用环境中,如果多个设备堆栈共享相同的用户模式驱动程序:
- 每个设备堆栈在同一 WudfHost 进程中加载。
- 框架仅调用驱动程序的 IDriverEntry::OnInitialize 和 IDriverEntry::OnDeinitialize 方法一次。
- 框架为每个设备堆栈调用驱动程序的 IDriverEntry::OnDeviceAdd 方法一次。 每个设备对象都与同一个驱动程序对象相关联。
由于共用配置中只有一个驱动程序对象,因此驱动程序不得将任何每个设备的上下文存储在全局变量或跨设备共享的对象(如驱动程序回调对象)中。 相反,驱动程序必须将每个设备的上下文存储在设备堆栈之间不共享的对象中,例如驱动程序的设备回调对象。