停止设备以将其禁用 (Windows 98/Me)

在 Windows 98/Me 上,当设备管理器禁用设备时,PnP 管理器会发出停止 IRP。 (Windows 2000 及更高版本的 Windows 问题在这种情况下 删除 IRP) 。

PnP 管理器按以下顺序发送停止 IRP:

  1. PnP 管理器发出 IRP_MN_QUERY_STOP_DEVICE ,询问设备的驱动程序是否可以停止设备。

    如果设备堆栈中的所有驱动程序都返回STATUS_SUCCESS,则驱动程序会将设备置于停止挂起状态 (停止挂起) ,可从中快速停止设备。

    PnP 管理器根据需要查询任意数量的设备堆栈以禁用设备。

  2. 如果 IRP_MN_QUERY_STOP_DEVICE 成功,PnP 管理器会发出 IRP_MN_STOP_DEVICE 来停止设备。

    仅当设备的上一个查询停止 IRP 成功完成时,PnP 管理器才会发送停止 IRP。 为了响应停止 IRP,驱动程序会释放设备的硬件资源 ((例如其 I/O 端口) ),并使需要访问设备的任何 IRP 失败。

  3. 如果 IRP_MN_QUERY_STOP_DEVICE 失败,PnP 管理器会发送 IRP_MN_CANCEL_STOP_DEVICE 来取消查询。

    为了响应 IRP_MN_CANCEL_STOP_DEVICE,设备的驱动程序将设备返回到启动状态并恢复处理设备的 I/O 请求。

    如果堆栈中的某个驱动程序使请求失败,PnP 管理器将取消设备堆栈的查询停止。 当 PnP 管理器仅取消一个设备堆栈上的查询停止时,它会发送 IRP_MN_CANCEL_STOP_DEVICE 请求,因为查询失败的驱动程序上方附加的任何驱动程序都使设备处于停止挂起状态。 当IRP_MN_CANCEL_STOP_DEVICE成功时,驱动程序已将设备返回到启动状态。

禁用设备时,其驱动程序无法将传入 IRP 排队,因为无法保证何时可以重新启用设备。 因此,数据可能会丢失。