意外删除顺序
如果用户在不发出警告的情况下移除设备,只需在不使用 设备管理器 或安全删除硬件实用工具的情况下拔下设备,则设备被视为“意外删除”。发生这种情况时,框架遵循略有不同的删除顺序。 如果另一个驱动程序在设备上调用 IoInvalidateDeviceState ,则也会遵循意外删除序列,即使设备在物理上仍然存在。 在意外删除序列中,框架先调用 EvtDeviceSurpriseRemoval 回调,然后再调用删除序列中的其他任何回调。 序列完成后,框架将销毁设备对象。 所有可移动设备的驱动程序必须确保关闭和启动路径中的回调可以处理故障,尤其是硬件删除导致的故障。 访问硬件的任何尝试都不应无限期等待,但应受到超时或监视程序计时器的约束。
下图显示了意外删除中涉及的回调:
如果设备在删除时未处于工作状态,框架会在 EvtDeviceSurpriseRemoval 之后立即调用 EvtDeviceReleaseHardware 事件回调。 它省略了在设备退出工作状态时已执行的干预步骤。