處理篩選或函式驅動程式中的系統Query-Power IRP

篩選或函式驅動程式 (不是裝置的電源原則擁有者,) 應該在下列步驟中將系統查詢電源 IRP 傳遞給下一個較低的驅動程式:

  1. 呼叫 IoAcquireRemoveLock,傳遞目前的 IRP,以確保驅動程式在處理電源 IRP 時不會收到 PnP IRP_MN_REMOVE_DEVICE 要求。

    如果 IoAcquireRemoveLock 傳回失敗狀態,驅動程式不應該繼續處理 IRP。 相反地,從 Windows Vista 開始,驅動程式應該呼叫 IoCompleteRequest 來完成 IRP 並傳回失敗狀態。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,驅動程式應該呼叫 PoStartNextPowerIrp、呼叫 IoCompleteRequest 來完成 IRP,並傳回失敗狀態。

  2. 判斷查詢是否應該失敗。 如需指導方針,請參閱 篩選或函式驅動程式中的系統Query-Power IRP 失敗 ,並完成處理,如該章節所述。

  3. 呼叫 PoStartNextPowerIrp。 僅 (Windows Server 2003、Windows XP 和 Windows 2000)

  4. (IoSkipCurrentIrpStackLocationIoCopyCurrentIrpStackLocationToNext) 設定 IRP 堆疊位置。 驅動程式可以在 IRP 中設定 IoCompletion 常式,但很少需要這麼做。

  5. 在 Windows Server 2003、Windows XP 和 Windows 2000) 中呼叫 IoCallDriver (和 Windows Vista) 或 PoCallDriver (,以將 IRP 傳遞至下一個較低的驅動程式。

  6. 呼叫 IoReleaseRemoveLock。 不過,如果驅動程式為 IRP 設定 IoCompletion 常式,請改為從 IoCompletion 常式進行此呼叫。

  7. 其 DispatchPower 常式傳回STATUS_PENDING。