wdfRequestComplete 函数 (wdfrequest.h)

[适用于 KMDF 和 UMDF]

WdfRequestComplete 方法完成指定的 I/O 请求并提供完成状态。

语法

void WdfRequestComplete(
  [in] WDFREQUEST Request,
  [in] NTSTATUS   Status
);

参数

[in] Request

表示正在完成的 I/O 请求的框架请求对象的句柄。

[in] Status

一个 NTSTATUS 值 ,表示请求的完成状态。 有效状态值包括但不限于以下内容:

STATUS_SUCCESS

驱动程序正在成功完成请求。

STATUS_CANCELLED

驱动程序正在取消请求。

STATUS_UNSUCCESSFUL

处理请求时,驱动程序遇到错误。

返回值

备注

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

驱动程序调用 WdfRequestComplete 后,驱动程序堆栈上的更高级别的驱动程序可以调用 WdfRequestGetStatus 以获取为 Status 参数指定的完成状态值。 通常,驱动程序从 CompletionRoutine 回调函数内调用 WdfRequestGetStatus

调用 WdfRequestComplete 后,请求句柄将不再有效,除非驱动程序调用 WdfObjectReference 以向请求对象添加一个或多个其他引用计数。 请注意, 在 WdfRequestComplete 返回后,驱动程序不得尝试访问关联的 WDM IRP 结构,即使它已调用 WdfObjectReference。 此要求通过调用 WDFREQUEST 上的方法(如 WdfRequestRetrieveOutputBufferWdfRequestRetrieveInputBuffer)来访问关联的 WDM IRP 结构。

驱动程序调用 WdfRequestComplete 后,如果驱动程序已提供该函数,框架将调用驱动程序的 EvtCleanupCallback 函数。

驱动程序可以调用 WdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoost,而不是调用 WdfRequestComplete 有关详细信息,请参阅 WdfRequestCompleteWithInformation 的备注。

驱动程序调用 WdfRequestComplete 时,框架提供了一个默认值,系统使用该默认值来提升请求 I/O 操作的线程的运行时优先级。 有关默认优先级提升值的信息,请参阅 “完成 I/O 请求时指定优先级提升”。 驱动程序可以调用 WdfRequestCompleteWithPriorityBoost 来替代默认优先级提升值。

有关调用 WdfRequestComplete 的详细信息,请参阅 “完成 I/O 请求”。

示例

下面的代码示例是请求处理程序的一部分。 请求处理程序仅接受读取和写入请求,如果请求类型不是读取或写入,则它完成每个请求时出现错误状态。

VOID
MyEvtIoDefault(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request
    )
{
    WDF_REQUEST_PARAMETERS  params;
    WDF_DMA_DIRECTION  direction;

...
    WDF_REQUEST_PARAMETERS_INIT(&params);

    WdfRequestGetParameters(
                            Request,
                            &params
                            );

    //
    // Validate and gather parameters.
    //
    switch (params.Type) {
        case WdfRequestTypeRead:
            length = params.Parameters.Read.Length;
            direction = WdfDmaDirectionReadFromDevice;
            break;
        case WdfRequestTypeWrite:
            length = params.Parameters.Write.Length;
            direction = WdfDmaDirectionWriteToDevice;
            break;
        default:
            WdfRequestComplete(
                               Request,
                               STATUS_INVALID_DEVICE_REQUEST
                               );
            return;
    }
...
}

要求

   
目标平台 通用
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
标头 wdfrequest.h (包括 Wdf.h)
Library Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 BufAfterReqCompletedIntIoctl (kmdf) BufAfterReqCompletedIntIoctlA (kmdf) BufAfterReqCompletedIoctl (kmdf ) 、BufAfterReqCompletedIoctlA (kmdf) BufAfterReqCompletedRead (kmdf) BufAfterReqCompletedReadA (kmdf) BufAfterReqCompletedWrite (kmdf) BufAfterReqCompletedWriteA (kmdf) CompleteCanceledReq (kmdf) DeferredRequestCompleted (kmdf) DoubleCompletion (kmdf) 、DoubleCompletionLocal (kmdf) DriverCreate (kmdf ) 、EvtIoStopCancel (kmdf ) 、EvtIoStopCompleteOrStopAck (kmdf) EvtSurpriseRemoveNoRequestComplete (kmdf) InvalidReqAccess (kmdf) KmdfIrql (kmdf ) 、KmdfIrql2 (kmdf) 、KmdfIrqlExplicit (kmdf) MarkCancOnCancReqLocal (kmdf) MdlAfterReqCompletedIntIoctl (kmdf) MdlAfterReqCompletedIntIoctlA (kmdf ) 、MdlAfterReqCompletedIoctl (kmdf) MdlAfterReqCompleted MdlAfterReqCompletedRead ( (kmdf) ) 、MdlAfterReqCompletedReadA (kmdf) MdlAfterReqCompletedWrite (kmdf) MdlAfterReqCompletedWriteA (kmdf) MemAfterReqCompletedIntIoctl (kmdf) MemAfterReqCompletedIntIoctlA (kmdf) MemAfterReqCompletedIoctl (kmdf ) 、MemAfterReqCompletedIoctlA (kmdf) MemAfterReqCompletedRead (kmdf) MemAfterReqCompletedReadA (kmdf) MemAfterReqCompletedWrite (kmdf ) 、MemAfterReqCompletedWriteA (kmdf) NoCancelFromEvtSurpriseRemove (kmdf) ReqDelete (kmdf) ReqIsCancOnCancReq (kmdf) ReqNotCanceledLocal (kmdf ) 、ReqSendFail (kmdf ) 、RequestCompleted (kmdf) RequestCompletedLocal (kmdf)

另请参阅

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus