Compartilhar via


Função WdfRequestComplete (wdfrequest.h)

[Aplica-se a KMDF e UMDF]

O método WdfRequestComplete conclui uma solicitação de E/S especificada e fornece uma status de conclusão.

Sintaxe

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

Parâmetros

[in] Request

Um identificador para o objeto de solicitação de estrutura que representa a solicitação de E/S que está sendo concluída.

[in] Status

Um valor NTSTATUS que representa o status de conclusão da solicitação. Os valores de status válidos incluem, mas não se limitam a:

STATUS_SUCCESS

O driver está concluindo a solicitação com êxito.

STATUS_CANCELLED

O driver está cancelando a solicitação.

STATUS_UNSUCCESSFUL

O driver encontrou um erro ao processar a solicitação.

Retornar valor

Nenhum

Comentários

Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.

Depois que um driver chama WdfRequestComplete, drivers de nível superior na pilha de driver podem chamar WdfRequestGetStatus para obter a conclusão status valor especificado para o parâmetro Status. Normalmente, os drivers chamam WdfRequestGetStatus de dentro de uma função de retorno de chamada CompletionRoutine .

Depois que uma chamada para WdfRequestComplete retorna, o identificador de solicitação não é mais válido, a menos que o driver tenha chamado WdfObjectReference para adicionar uma ou mais contagens de referência adicionais ao objeto de solicitação. Observe que, depois que WdfRequestComplete retorna, o driver não deve tentar acessar a estrutura WDM IRP associada, mesmo que tenha chamado WdfObjectReference. Esse requisito se estende ao acesso à estrutura WDM IRP associada chamando métodos no WDFREQUEST, como WdfRequestRetrieveOutputBuffer ou WdfRequestRetrieveInputBuffer.

Depois que um driver chama WdfRequestComplete, a estrutura chama a função EvtCleanupCallback do driver para a solicitação, se o driver tiver fornecido uma.

Em vez de chamar WdfRequestComplete, o driver pode chamar WdfRequestCompleteWithInformation ou WdfRequestCompleteWithPriorityBoost. Consulte os Comentários de WdfRequestCompleteWithInformation para obter mais informações.

Quando o driver chama WdfRequestComplete, a estrutura fornece um valor padrão que o sistema usa para aumentar a prioridade de tempo de execução do thread que solicitou a operação de E/S. Para obter informações sobre valores de aumento de prioridade padrão, consulte Especificando aumentos de prioridade ao concluir solicitações de E/S. Seu driver pode chamar WdfRequestCompleteWithPriorityBoost para substituir o valor de aumento de prioridade padrão.

Para obter mais informações sobre como chamar WdfRequestComplete, consulte Concluindo solicitações de E/S.

Exemplos

O exemplo de código a seguir é uma seção de um manipulador de solicitação. O manipulador de solicitação aceita apenas solicitações de leitura e gravação e conclui cada solicitação com um erro status se o tipo de solicitação não for lido ou gravado.

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 Valor
Plataforma de Destino Universal
Versão mínima do KMDF 1.0
Versão mínima do UMDF 2,0
Cabeçalho wdfrequest.h (inclua Wdf.h)
Biblioteca Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Regras de conformidade da 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), 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)

Confira também

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus