使用自我管理的 I/O
大多数基于框架的驱动程序利用框架的 PnP 和电源管理功能来获取它们支持的设备。 换句话说,大多数基于框架的驱动程序都允许框架通过执行以下所有操作来管理设备的 PnP 和电源状态:
提供 EvtDeviceD0Entry 和 EvtDeviceD0Exit 回调函数。
提供 EvtDevicePrepareHardware 和 EvtDeviceReleaseHardware 回调函数。
对要求设备处于其工作状态的 I/O 请求使用电源托管队列,并为所有其他请求使用非电源管理的队列。
但是,一些基于框架的驱动程序需要更深入地了解其设备的状态,包括以下情况下的驱动程序:
驱动程序执行的操作不由驱动程序从框架 I/O 队列接收的一组 I/O 请求决定。
驱动程序与较旧的非框架驱动程序通信,并直接处理 WDM 接口。
驱动程序接收的 I/O 请求不能分为两组:要求设备处于其工作状态的 I/O 请求和不工作状态的 I/O 请求。
大多数驱动程序不是上述情况之一,但如果驱动程序是,它可能需要更直接地控制设备的 PnP 和电源管理操作。 此类驱动程序可以使用 自我管理的 I/O。 使用自我管理的 I/O 意味着,每当设备插入或拔出电源时,以及设备暂时停止时,) ,通过一组回调函数通知驱动程序 (。
请注意,驱动程序可以使用自托管 I/O,并且仍然可以将框架的 I/O 队列用作电源管理的队列。 例如,驱动程序可以将框架的 I/O 队列(而不是电源托管)与一组自我管理的 I/O 回调函数配合使用。
若要使用自托管 I/O,驱动程序会在调用 WdfDeviceInitSetPnpPowerEventCallbacks 时注册一组额外的事件回调函数。 这些事件回调函数包括:
EvtDeviceSelfManagedIoInit,用于初始化和启动设备的 I/O 操作。
EvtDeviceSelfManagedIoSuspend,可挂起 I/O 操作。
EvtDeviceSelfManagedIoRestart,它将在设备的 I/O 操作暂停后重启。
EvtDeviceSelfManagedIoFlush,可删除未服务的 I/O 请求。
EvtDeviceSelfManagedIoCleanup,用于解除分配 由 EvtDeviceSelfManagedIoInit 分配的资源。
当设备首次进入其工作 (D0) 状态时,框架会调用驱动程序的 EvtDeviceSelfManagedIoInit 回调函数。 每次用户将设备插入系统以及每次重启系统时,都会发生这种情况。
驱动程序必须停止设备的 I/O 操作有三种情况:设备即将进入低功耗状态、即将删除或已意外删除。 以下列表详细检查了其中每种情况:
设备即将进入低功耗状态,最终将恢复其工作状态。
当设备即将进入低功耗状态 (,因为设备处于空闲状态、整个系统进入低功耗状态,或者 PnP 管理器) 重新分发系统硬件资源 时,框架会调用驱动程序的 EvtDeviceSelfManagedIoSuspend 回调函数。 设备重新进入其工作状态后,框架会调用驱动程序的 EvtDeviceSelfManagedIoRestart 回调函数。
设备即将删除。
为了处理 用户请求的设备删除,框架在停止设备之前调用驱动程序的 EvtDeviceSelfManagedIoSuspend 回调函数。 停止设备后,框架调用驱动程序的 EvtDeviceSelfManagedIoFlush 回调函数。 删除设备后,框架将调用 EvtDeviceSelfManagedIoCleanup 回调函数。
设备已被意外删除 (意外删除) 。
如果设备总线的驱动程序确定设备不再存在,或者堆栈中的另一个驱动程序确定设备未响应,则发现问题的驱动程序会通知 PnP 管理器。 然后,PnP 管理器通知其余驱动程序设备已消失。 对于基于框架的驱动程序,框架接收 PnP 管理器的消息,并调用驱动程序的 EvtDeviceSelfManagedIoSuspend、 EvtDeviceSelfManagedIoFlush 和 EvtDeviceSelfManagedIoCleanup 回调函数。
(驱动程序还可以注册 EvtDeviceSurpriseRemoval 回调函数。 如果设备在删除时处于工作状态 (D0) 状态,框架会在调用自托管 I/O 回调函数之前调用 EvtDeviceSurpriseRemoval 。 如果设备在移除时处于低功耗状态,则会在 EvtDeviceSelfManagedIoSuspend 之后调用 EvtDeviceSurpriseRemoval)
有关框架调用驱动程序的事件回调函数的顺序的详细信息,请参阅 PnP 和电源管理方案。
尽管很少必要,但该框架允许驱动程序通过访问 框架中的状态机来更好地控制设备的 PnP 和电源状态。