取消 UMDF 中的 I/O 要求

警告

UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的 UMDF 驅動程式都應該使用 UMDF 2 來撰寫。 未將新功能新增至 UMDF 1,而且較新版本的 Windows 10 上不支援 UMDF 1。 通用 Windows 驅動程式必須使用 UMDF 2。

封存的 UMDF 1 範例可在Windows 11 22H2 版 - 2022 年 5 月驅動程式範例更新中找到。

如需詳細資訊,請參閱使用 UMDF 消費者入門

裝置進行中的 I/O 作業 (,例如要求從磁片讀取數個區塊) 可由應用程式、系統或驅動程式取消。 如果裝置的 I/O 作業已取消,I/O 管理員會嘗試取消與 I/O 作業相關聯的所有未處理 I/O 要求。 當 I/O 管理員嘗試取消 I/O 要求時,裝置的驅動程式可以註冊以收到通知,而驅動程式可以 透過完成 狀態完成HRESULT_FROM_WIN32 (ERROR_OPERATION_ABORTED) 來取消他們所擁有的要求。

架構會處理架構型驅動程式的一些取消工作。 如果裝置的 I/O 作業已取消,架構就會完成,且完成狀態為 HRESULT_FROM_WIN32 (ERROR_OPERATION_ABORTED) --下列與取消作業相關聯的 I/O 要求:

因為架構會取消這些要求,所以不會將它們傳遞給驅動程式。

在架構將 I/O 要求傳遞給驅動程式之後,驅動程式會擁有要求,而且架構無法取消它。 此時,只有驅動程式可以取消 I/O 要求,但架構必須通知驅動程式應該取消要求。 驅動程式會藉由提供 IRequestCallbackCancel::OnCancel 回 呼函式來接收此通知。

有時候,驅動程式會從 I/O 佇列收到 I/O 要求,但驅動程式不會處理要求,而是將要求重新佇列至相同或另一個 I/O 佇列,以供稍後處理。 例如,架構可能會將 I/O 要求傳遞給其中一個驅動程式的要求處理常式,而驅動程式後續可能會呼叫 IWDFIoRequest::ForwardToIoQueue ,將要求放在不同的佇列或 IWDFIoRequest2::Requeue 中,將要求放回相同的佇列。

在這些情況下,架構可以取消 I/O 要求,因為要求位於 I/O 佇列中。 不過,如果驅動程式已註冊要求所在 I/O 佇列的回呼函式,則架構會在取消相關聯的 I/O 作業時呼叫回呼函式,而不是取消要求。 如果架構呼叫驅動程式的回呼函式,驅動程式必須取消要求。

總而言之,取消 I/O 作業時,架構一律會取消從未傳遞至驅動程式的所有相關聯 I/O 要求。 如果驅動程式收到要求,然後重新排入佇列,除非驅動程式為 I/O 佇列提供回呼函式,否則架構將會取消要求 () 。

呼叫 MarkCancelable

驅動程式可以呼叫 IWDFIoRequest::MarkCancelable 來註冊 IRequestCallbackCancel::OnCancel 回 呼函式。 如果驅動程式已呼叫 MarkCancelable,而且如果取消與要求相關聯的 I/O 作業,架構會呼叫驅動程式的 OnCancel 回呼函式,讓驅動程式可以取消 I/O 要求。

如果驅動程式擁有要求的時間相當長,應該呼叫 MarkCancelable 。 例如,驅動程式可能必須等候裝置回應,或者可能需要等候較低的驅動程式完成驅動程式收到單一要求時所建立的一組要求。

如果驅動程式未呼叫MarkCancelable,或驅動程式在呼叫MarkCancelable之後呼叫IWDFIoRequest::UnmarkCancelable,則驅動程式不會察覺取消,因此通常會處理要求。

呼叫 IsCanceled

如果驅動程式尚未呼叫 MarkCancelable 來註冊 OnCancel 回呼函式,它可以呼叫 IWDFIoRequest2::IsCanceled 來判斷 I/O 管理員是否嘗試取消 I/O 要求。 如果 IsCanceled 傳回 TRUE,驅動程式應該取消要求。

例如,如果驅動程式尚未針對收到的要求呼叫MarkCancelable,則會在驅動程式的 I/O 目標完成每個較小的要求之後呼叫 IsCanceled,接收大型讀取或寫入要求的驅動程式可能會呼叫IsCanceled

取消要求

取消 I/O 要求可能牽涉到下列任一項:

  • 停止進行中的 I/O 作業。

  • 未將要求轉送至 I/O 目標。

  • 呼叫 IWDFIoRequest::CancelSentRequest 嘗試取消驅動程式先前已提交至 I/O 目標的要求。

如果驅動程式正在取消驅動程式從架構收到的要求物件 I/O 要求,則驅動程式一律必須呼叫 IWDFIoRequest::CompleteIWDFIoRequest::CompleteWithInformation來完成要求,並具有 HRESULT_FROM_WIN32 (ERROR_OPERATION_ABORTED) 的 CompletionStatus 參數。 (如果驅動程式稱為 IWDFDevice::CreateRequest 來建立要求物件,驅動程式會呼叫 IWDFObject::D eleteWdfObject ,而不是完成 request.)