處理 Windows 2000 和更新版本 (IRP_MN_CANCEL_STOP_DEVICE 要求)
必須先由裝置的父總線驅動程式處理 IRP_MN_CANCEL_STOP_DEVICE 要求,然後再由裝置堆疊中的每個較高驅動程序處理。 驅動程式會在其 DispatchPnP 例程中處理停止 IRP。
為了回應 IRP_MN_CANCEL_STOP_DEVICE 要求,驅動程式必須將裝置傳回其啟動狀態,並繼續正常作業。 驅動程式必須成功取消停止 IRP。
驅動程式會使用下列程式來處理 IRP_MN_CANCEL_STOP_DEVICE 要求:
延後重新啟動裝置,直到較低的驅動程式完成其重新啟動作業為止。 (請參閱 延後 PnP IRP 處理直到較低的驅動程式完成為止。)
在較低的驅動程式完成之後,將裝置傳回其已啟動狀態。
確切作業取決於裝置和驅動程式。
在 IRP 保存佇列中啟動 IRP。
如果驅動程式在裝置處於停止擱置狀態時保留要求,請清除 HOLD_NEW_REQUESTS 旗標,並在 IRP 保存佇列中啟動 IRP。 如需詳細資訊,請參閱 在裝置暫停時保留傳入 IRP 。
使用 IoCompleteRequest 完成 IRP。
在函式或篩選驅動程式中:
驅動程式的 IoCompletion 例程傳回STATUS_MORE_PROCESSING_REQUIRED,如 將 PnP IRP 處理延後到較低驅動程式完成中所述,因此驅動程式的 DispatchPnP 例程必須呼叫 IoCompleteRequest 以繼續 I/O 完成處理。
驅動程式會將 Irp-IoStatus.Status> 設定為STATUS_SUCCESS、呼叫優先順序提升為 IO_NO_INCREMENT 的 IoCompleteRequest,並從其 DispatchPnP 例程傳回STATUS_SUCCESS。
驅動程式不得使這項作業失敗。 如果驅動程式失敗重新啟動 IRP,裝置的狀態不一致,且無法正常運作。
在父總線驅動程式中:
驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS,並呼叫 IoCompleteRequest 來指定IO_NO_INCREMENT的優先順序提升。 總線驅動程式會從 其 DispatchPnP 例程傳回STATUS_SUCCESS。
總線驅動程式不得使這項作業失敗。 如果驅動程式失敗重新啟動 IRP,裝置的狀態不一致,且無法正常運作。
當裝置啟動時,驅動程式可能會收到假性的取消停止要求。 例如,如果驅動程式 (或裝置堆疊中的驅動程式較高,) 失敗 IRP_MN_QUERY_STOP_DEVICE 要求,就會發生這種情況。 當裝置啟動且作用中時,驅動程式可以安全地成功要求裝置的假性取消停止要求。