WdfRequestCancelSentRequest 函数 (wdfrequest.h)

[适用于 KMDF 和 UMDF]

WdfRequestCancelSentRequest 方法尝试取消调用方以前提交到 I/O 目标的 I/O 请求。

语法

BOOLEAN WdfRequestCancelSentRequest(
  [in] WDFREQUEST Request
);

参数

[in] Request

框架请求对象的句柄。

返回值

如果 WdfRequestCancelSentRequest 成功将取消请求传递到驱动程序的 I/O 目标,则返回 TRUE 。 如果请求已完成或取消,或者 I/O 目标驱动程序未调用 WdfRequestMarkCancelableWdfRequestMarkCancelableEx,则此方法返回 FALSE

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

备注

驱动程序可以调用 WdfRequestCancelSentRequest ,以尝试取消以前通过调用 WdfRequestSend 发送到 I/O 目标的 I/O 请求。

如果请求位于 I/O 目标队列中,框架将取消请求。 如果框架已将请求传递到 I/O 目标驱动程序,并且该驱动程序已调用 WdfRequestMarkCancelableWdfRequestMarkCancelableEx 以启用取消,则框架将调用该驱动程序的 EvtRequestCancel 回调函数。 如果目标驱动程序未调用 WdfRequestMarkCancelableWdfRequestMarkCancelableEx,则除非请求变为可取消,否则不会取消请求。

如果驱动程序为请求注册了 CompletionRoutine 回调函数,则框架会在请求取消后调用回调函数。

通常,如果驱动程序调用 WdfRequestCancelSentRequest,它必须递增请求对象的引用计数。 有关详细信息,请参阅 同步取消发送的请求

有关请求取消的详细信息,请参阅 取消 I/O 请求

示例

下面的代码示例来自 kmdf_fx2 示例驱动程序。 此示例是 EvtIoStop 回调函数。 由于此驱动程序将每个请求发送到其 I/O 目标,因此,如果已删除设备, EvtIoStop 回调函数将调用 WdfRequestCancelSentRequest

VOID
OsrFxEvtIoStop(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN ULONG  ActionFlags
    )
{
    UNREFERENCED_PARAMETER(Queue);

    if (ActionFlags & WdfRequestStopActionSuspend) {
        WdfRequestStopAcknowledge(Request, FALSE);
    } else if (ActionFlags & WdfRequestStopActionPurge) {
        WdfRequestCancelSentRequest(Request);
    }
    return;
}

要求

   
目标平台 通用
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
Header wdfrequest.h (包括 Wdf.h)
Library Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate (kmdf) EvtIoStopCancel (kmdf) EvtIoStopCompleteOrStopAck (kmdf) InvalidReqAccess (kmdf) 、InvalidReqAccessLocal (kmdf) KmdfIrql (kmdf) 、KmdfIrql2 (kmdf) 、KmdfIrqlExplicit (kmdf)

另请参阅

CompletionRoutine

EvtRequestCancel

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx

WdfRequestSend