共用方式為


處理 Windows 2000 和更新版本 (IRP_MN_STOP_DEVICE 要求)

IRP_MN_STOP_DEVICE要求會先由裝置堆疊中的頂端驅動程式處理,然後再由每個下一個較低的驅動程序處理。 驅動程式會在其 DispatchPnP 例程中處理停止 IRP。

驅動程式會使用下列程式來處理 IRP_MN_STOP_DEVICE 要求:

  1. 確定裝置已暫停。

    如果驅動程式未完全暫停裝置以回應 IRP_MN_QUERY_STOP_DEVICE 要求,則必須立即執行此動作。 在裝置擴充功能中設定HOLD_NEW_REQUESTS旗標,並執行任何其他必要的作業來暫停裝置。

    裝置可能會在資源重新平衡作業期間失去電源,因此可能會失去裝置狀態。 裝置的驅動程式應該儲存任何裝置狀態資訊,並在收到後續 IRP_MN_START_DEVICE 要求時加以還原。

  2. 釋放裝置的硬體資源。

    在函式驅動程式中,確切作業取決於裝置和驅動程式,但可以包含中斷 與 IoDisconnectInterrupt 中斷連線、使用 MmUnmapIoSpace 釋放實體地址範圍,以及釋放 I/O 連接埠。

    如果篩選或總線驅動程式取得裝置的任何硬體資源,該驅動程式必須釋放資源以回應 IRP_MN_STOP_DEVICE 要求。

  3. [Irp-IoStatus.Status>] 設定為 [STATUS_SUCCESS]。

  4. 將 IRP 傳遞至下一個較低的驅動程式,或完成 IRP。

    • 在函式或篩選驅動程式中,使用 IoSkipCurrentIrpStackLocation 設定下一個堆棧位置、使用 IoCallDriver 將 IRP 傳遞至下一個較低的驅動程式,並從 IoCallDriver 傳回狀態作為 DispatchPnP 例程的傳回狀態。 請勿完成 IRP。

    • 在總線驅動程式中,使用 IoCompleteRequest 搭配 IO_NO_INCREMENT完成 IRP,並從 DispatchPnP 例程傳回。

當裝置停止以重新平衡資源時,驅動程式無法啟動任何存取裝置的 IRP。 驅動程式必須將這類 IRP 排入佇列,如 在裝置暫停時保留傳入 IRP 中所述,如果驅動程式未實作 IRP 保存佇列且不得卸除 I/O 要求,則它們會失敗。