了解删除 IRP 的命令是何时发出的

下图显示了删除设备驱动程序时涉及的典型 IRP 序列。

说明典型删除 irp 转换的示意图。

以下注释对应于上图中带圆圈的数字:

  1. 查询删除

    PnP 管理器发出 IRP_MN_QUERY_REMOVE_DEVICE ,询问是否可以在不中断计算机的情况下删除设备。 当用户请求更新设备的驱动程序 () ,并在 Windows 2000 及更高版本上 () 设备管理器禁用设备时,它还会发送此 IRP。 (在 Windows 98/Me 上,在这种情况下,PnP 管理器会发送停止 IRP;有关详细信息 ,请参阅停止设备 。)

    如果设备堆栈中的所有驱动程序都返回STATUS_SUCCESS,则驱动程序会将设备置于待删除状态。 在此状态下,驱动程序不得启动阻止删除设备的任何操作。

    在此“干净”删除案例中,PnP 管理器会在发送删除 IRP 之前发送查询删除 IRP。 有关“意外”删除的说明,请参阅步骤 5。

    尽管上图中未显示,但总线驱动程序可能会收到未启动设备的 IRP_MN_QUERY_REMOVE_DEVICE 。 如果用户请求动态删除计算机上实际存在但已禁用的设备,则可能会发生这种情况。

  2. 查询成功后删除

    PnP 管理器发出 IRP_MN_REMOVE_DEVICE 来删除设备的驱动程序。

    驱动程序必须成功执行此请求。 设备的驱动程序执行任何必要的清理,从设备堆栈中分离,并删除 FDO 和任何筛选器DO。 父总线驱动程序会保留 PDO,直到用户以物理方式从计算机中删除设备。

    请注意,驱动程序可能会在删除 IRP 之前收到 IRP_MN_STOP_DEVICE ,但这不是必需的。 在 Windows 2000 及更高版本中, IRP_MN_STOP_DEVICE 仅用于暂停设备以重新平衡资源;这不是删除的一步。 如果用户在设备停止时移除了设备硬件,则 PnP 管理器会在停止 IRP 之后的某个时间点发送删除 IRP,但停止不是删除的先决条件。

  3. 恢复设备

    如果在驱动程序删除其设备对象后恢复设备,PnP 管理器会调用驱动程序的 AddDevice 例程并发出 IRP_MN_START_DEVICE 以恢复设备。 (另请参阅 PnP 透视图中的设备状态 。)

  4. 取消查询删除

    PnP 管理器发出 IRP_MN_CANCEL_REMOVE_DEVICE 来取消查询删除请求。

    为了响应 IRP_MN_CANCEL_REMOVE_DEVICE,驱动程序将设备返回到其启动状态。

  5. 意外删除 (Windows 2000 及更高版本的 Windows)

    在 Windows 2000 及更高系统上,如果用户在不使用拔出或弹出硬件程序的情况下从计算机拔出设备,PnP 管理器会发送 IRP_MN_SURPRISE_REMOVAL IRP。

    这种情况称为“意外”删除,因为驱动程序不会收到任何提前警告。

    为了响应 IRP_MN_SURPRISE_REMOVAL IRP,设备的驱动程序会使任何未完成的 I/O 失败,并释放设备使用的硬件资源。 驱动程序必须确保没有组件尝试访问设备,因为它不再存在。

    所有驱动程序都必须处理 IRP_MN_SURPRISE_REMOVAL IRP,并且必须将状态设置为STATUS_SUCCESS。

    无法取消IRP_MN_SURPRISE_REMOVAL

  6. 意外删除后删除 (Windows 2000 及更高版本的 Windows)

    关闭设备的所有打开句柄后,PnP 管理器会向设备的驱动程序发送 IRP_MN_REMOVE_DEVICE 请求。 每个驱动程序从设备堆栈中分离并删除其设备对象。

  7. 意外删除 (Windows 98/Me)

    在 Windows 98/Me 上,在没有警告的情况下删除设备时,驱动程序不会收到 IRP_MN_SURPRISE_REMOVAL 。 PnP 管理器仅发送 IRP_MN_REMOVE_DEVICE。 WDM 驱动程序必须具有代码来处理 IRP_MN_SURPRISE_REMOVAL 后跟 IRP_MN_REMOVE_DEVICE (Windows 2000 及更高版本的行为,以便意外删除) , 以及没有事先 意外删除 IRP (Windows 98/Me 行为) 的IRP_MN_REMOVE_DEVICE。

  8. windows 2000 及更高版本启动失败后删除 ()

    如果设备的某个驱动程序 在IRP_MN_START_DEVICE失败,PnP 管理器会向设备堆栈发送 IRP_MN_REMOVE_DEVICE 请求。 这种删除 IRP 可确保设备的所有驱动程序都会收到设备未成功启动的通知。 为了响应 IRP_MN_REMOVE_DEVICE IRP,如果设备的驱动程序成功启动 IRP) 并撤消其 AddDevice 操作,则 (撤消其启动操作。 PnP 管理器将此类设备标记为“启动失败”。

    此行为仅适用于 Windows 2000 及更高版本平台。 在 Windows 98/Me 上,PnP 管理器发送 IRP_MN_STOP_DEVICE 以响应失败的启动。

与图中演示典型删除 IRP 转换的情况相比,PnP 设备的驱动程序可以接收 IRP_MN_SURPRISE_REMOVAL 。 例如,用户可以将电脑卡插入计算机,然后在启动设备之前将其移除。 在这种情况下,在调用驱动程序的 AddDevice 例程之后,但在发出 IRP_MN_START_DEVICE 请求之前,PnP 管理器会发出意外删除 IRP。 调用驱动程序的 AddDevice 例程后,必须准备好 PnP 设备的驱动程序,以便随时处理删除 IRP。