共用方式為


WdfRequestStopAcknowledge 函式 (wdfrequest.h)

[適用於 KMDF 和 UMDF]

WdfRequestStopAcknowledge 方法會通知架構驅動程式已停止處理指定的 I/O 要求。

語法

void WdfRequestStopAcknowledge(
  [in] WDFREQUEST Request,
  [in] BOOLEAN    Requeue
);

參數

[in] Request

架構要求物件的句柄。

[in] Requeue

布爾值,如果 TRUE,則會導致架構將要求重新排入佇列,讓架構再次將它傳遞給驅動程式。 如果 FALSE,則架構不會重新排入要求佇列。 如需詳細資訊,請參閱下列一節。

傳回值

沒有

言論

如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。

如果驅動程式為 I/O 佇列註冊 EvtIoStop 回呼函式,則架構會在佇列的基礎裝置離開其運作狀態時呼叫它。 架構會針對驅動程式尚未 完成的每個 I/O 要求呼叫 EvtIoStop 回呼函式,包括驅動程式 擁有 的要求,以及 轉送 至 I/O 目標的要求。 驅動程式必須執行下列其中一項,來完成、取消或延後處理每個要求:

  • 如果驅動程式擁有要求,它可以呼叫 WdfRequestComplete 來完成或取消要求。
  • 如果驅動程式已將要求轉送至 I/O 目標,它可以呼叫 WdfRequestCancelSentRequest 嘗試取消要求。
  • 如果驅動程式延後處理要求,則必須呼叫 WdfRequestStopAcknowledge
如果您的驅動程式呼叫 WdfRequestStopAcknowledge,則必須從其 EvtIoStop 回呼函式內呼叫此方法。

在驅動程式完成、取消或延後每個要求 EvtIoStop 回呼函式之前,架構不允許裝置保持其運作狀態(D0)。 這種無所作為可能會防止系統進入其休眠狀態或其他低系統電源狀態。

當驅動程式的 EvtIoStop 回呼函式 WdfRequestStopAcknowledge時,可以將 Requeue 參數設定為 TRUEFALSE

  • 重新排入佇列TRUE 會導致架構將要求放回其 I/O 佇列。

    當基礎裝置回到其運作中 (D0) 狀態時,架構會將要求重新傳遞至驅動程式。

  • [重新排入佇列] 設定為 [FALSE 會導致架構不要重新排入要求佇列。 如果驅動程式 擁有 要求,則擁有權會與驅動程式保持一起。 如果驅動程式已轉送要求,驅動程式會負責在完成要求時處理要求。 驅動程式必須停止進行任何需要硬體存取的 I/O 處理。

    當基礎裝置回到其運作中 (D0) 狀態時,架構會呼叫驅動程式的 EvtIoResume 回呼函式,讓驅動程式可以繼續處理要求。

如果驅動程式先前已呼叫 WdfRequestMarkCancelableWdfRequestMarkCancelableEx,則必須先呼叫 WdfRequestUnmarkCancelable,再呼叫 WdfRequestStopAcknowledge,並將 Requeue 設為 TRUE

在呼叫 WdfRequestStopAcknowledge之前,驅動程式的 EvtIoStop 回呼函式必須停止所有需要存取基礎裝置的 I/O 要求處理,因為裝置即將進入低功率狀態。

如需 WdfRequestStopAcknowledge 方法的詳細資訊,請參閱使用 Power-Managed I/O 佇列

例子

如果驅動程式呼叫 WdfRequestStopAcknowledge,且 Requeue 設為 TRUE,它之前必須呼叫 WdfRequestUnmarkCancelable

下列程式代碼範例是 EvtIoStop 回呼函式,會檢查收到的要求是否可取消,如果為 ,則會呼叫 WdfRequestUnmarkCancelable。 如果 WdfRequestUnmarkCancelable 傳回STATUS_CANCELLED,則範例只會傳回 ,因為驅動程式的 EvtRequestCancel 回呼函式會處理要求。 否則,此範例會呼叫 WdfRequestStopAcknowledge,並指定 TRUE,讓架構在基礎裝置返回其工作狀態時重新排入要求佇列。

VOID
MyEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{
    NTSTATUS status;

    // TODO: Take steps here to suspend and, if necessary, roll back any processing that has already occurred on this request

    if (ActionFlags & WdfRequestStopRequestCancelable) {
        status = WdfRequestUnmarkCancelable(Request);
        if (status == STATUS_CANCELLED) {
            return;
        }
    }

    // Inform framework that driver is postponing processing, cause framework to redeliver request when device returns to D0

    WdfRequestStopAcknowledge(Request, TRUE);
}

一般而言,如果驅動程式呼叫 WdfRequestStopAcknowledge,並將 Requeue 設為 FALSE,則會讓要求取消。

下列程式代碼範例是 EvtIoStop 回呼函式,會呼叫 WdfRequestStopAcknowledge,並指定 FALSE,讓架構最終呼叫驅動程式的 EvtIoResume 回呼函式,而驅動程式會繼續處理要求。

如果可以接受程式代碼來停止處理特定要求,並稍後再繼續,而不是重新傳遞要求並從頭開始重新啟動處理,您可能會使用這樣的程序代碼。

VOID
MyEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{

    //TODO: Take steps here to suspend processing of the request so it can be resumed when power returns
	 
    // Acknowledge the stop, but leave the request under driver's ownership.
    // Provide a corresponding EvtIoResume handler to resume processing when power returns

    WdfRequestStopAcknowledge(Request, FALSE);
}

要求

要求 價值
目標平臺 普遍
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
標頭 wdfrequest.h (包括 Wdf.h)
連結庫 Wdf01000.sys (KMDF):WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI 合規性規則 DeferredRequestCompleted(kmdf)DriverCreate(kmdf)EvtIoStopCancel(kmdf)EvtIoStopCompleteOrStopAck(kmdf)EvtIoStopResume(kmdf)kmdfIrql(kmdf)KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf),RequestCompleted(kmdf)RequestCompletedLocal(kmdf)StopAckWithinEvtIoStop(kmdf)

另請參閱

EvtIoStop

EvtRequestCancel

WdfRequestComplete