Función WdfRequestComplete (wdfrequest.h)

[Se aplica a KMDF y UMDF]

El método WdfRequestComplete completa una solicitud de E/S especificada y proporciona un estado de finalización.

Sintaxis

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

Parámetros

[in] Request

Identificador del objeto de solicitud de marco que representa la solicitud de E/S que se está completando.

[in] Status

Valor NTSTATUS que representa el estado de finalización de la solicitud. Entre los valores de estado válidos se incluyen, entre otros, los siguientes:

STATUS_SUCCESS

El controlador está completando correctamente la solicitud.

STATUS_CANCELLED

El controlador cancela la solicitud.

STATUS_UNSUCCESSFUL

El controlador ha encontrado un error al procesar la solicitud.

Valor devuelto

None

Observaciones

Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.

Después de que un controlador llame a WdfRequestComplete, los controladores de nivel superior de la pila de controladores pueden llamar a WdfRequestGetStatus para obtener el valor de estado de finalización especificado para el parámetro Status . Normalmente, los controladores llaman a WdfRequestGetStatus desde una función de devolución de llamada CompletionRoutine .

Después de que se devuelva una llamada a WdfRequestComplete , el identificador de solicitud ya no es válido a menos que el controlador haya llamado A WdfObjectReference para agregar uno o varios recuentos de referencia adicionales al objeto de solicitud. Tenga en cuenta que después de que WdfRequestComplete devuelva, el controlador no debe intentar acceder a la estructura IRP de WDM asociada, incluso si ha llamado A WdfObjectReference. Este requisito se extiende para acceder a la estructura IRP de WDM asociada mediante una llamada a métodos en WDFREQUEST, como WdfRequestRetrieveOutputBuffer o WdfRequestRetrieveInputBuffer.

Después de que un controlador llame a WdfRequestComplete, el marco llama a la función EvtCleanupCallback del controlador para la solicitud, si el controlador ha proporcionado uno.

En lugar de llamar a WdfRequestComplete, el controlador puede llamar a WdfRequestCompleteWithInformation o WdfRequestCompleteWithPriorityBoost. Vea los comentarios de WdfRequestCompleteWithInformation para obtener más información.

Cuando el controlador llama a WdfRequestComplete, el marco proporciona un valor predeterminado que el sistema usa para aumentar la prioridad en tiempo de ejecución del subproceso que solicitó la operación de E/S. Para obtener información sobre los valores predeterminados de optimización de prioridad, vea Especificar aumentos de prioridad al completar solicitudes de E/S. El controlador puede llamar a WdfRequestCompleteWithPriorityBoost para invalidar el valor de aumento de prioridad predeterminado.

Para obtener más información sobre cómo llamar a WdfRequestComplete, consulte Finalización de solicitudes de E/S.

Ejemplos

El ejemplo de código siguiente es una sección de un controlador de solicitudes. El controlador de solicitudes acepta solo solicitudes de lectura y escritura, y completa cada solicitud con un estado de error si el tipo de solicitud no es de lectura o escritura.

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;
    }
...
}

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Versión mínima de UMDF 2.0
Encabezado wdfrequest.h (incluya Wdf.h)
Library Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de 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), MdlAfterReqPletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctl(kmdf), MdlAfterReqCompletedIoctlA(kmdf), 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)

Consulte también

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus