Compartilhar via


EVT_ACX_OBJECT_PROCESS_REQUEST função de retorno de chamada (acxrequest.h)

O retorno de chamada EVT_ACX_OBJECT_PROCESS_REQUEST é usado pelo driver para lidar com um WDFREQUEST.

Sintaxe

EVT_ACX_OBJECT_PROCESS_REQUEST EvtAcxObjectProcessRequest;

void EvtAcxObjectProcessRequest(
  ACXOBJECT Object,
  WDFREQUEST Request
)
{...}

Parâmetros

Object

Um objeto ACX associado à solicitação. O driver normalmente converte esse identificador para o tipo de objeto ACX ao qual essa propriedade pertence. Para obter mais informações sobre objetos ACX, consulte Resumo de objetos ACX.

Request

Um objeto WDFREQUEST de E/S.

Para obter mais informações sobre como trabalhar com objetos de solicitação WDF, consulte Criando objetos de solicitação de estrutura e cabeçalho wdfrequest.h.

Retornar valor

Nenhum

Comentários

Exemplo

O uso de exemplo é mostrado abaixo.

EVT_ACX_OBJECT_PROCESS_REQUEST      C_EvtAckMessageCallback;

...

VOID
C_EvtAckMessageCallback(
    _In_    WDFOBJECT   Object,
    _In_    WDFREQUEST  Request
    )
{
    NTSTATUS                        status      = STATUS_NOT_SUPPORTED;
    ACXCIRCUIT                      This        = (ACXCIRCUIT)Object;
    CAPTURE_CTRL_CIRCUIT_CONTEXT *  ctrlCtx     = GetCaptureCtrlCircuitContext(This);;
    CAPTURE_DEVICE_CONTEXT *        ctx         = GetCaptureDeviceContext(ctrlCtx->Device);
    PAPX_ACK_MESSAGE                args        = nullptr;
    ULONG                           argsCb      = sizeof(APX_ACK_MESSAGE);
    PLIST_ENTRY                     le          = nullptr;
    PAPX_SYNC_MESSAGE               message     = nullptr;
    ACX_REQUEST_PARAMETERS          params;
        
    PAGED_CODE();
    
    //
    // Get request parameters.
    //
    ACX_REQUEST_PARAMETERS_INIT(&params);
    AcxRequestGetParameters(Request, &params);

    ASSERT(params.Type == AcxRequestTypeMethod);
    ASSERT(params.Parameters.Method.Verb == AcxMethodVerbSend);
    ASSERT(params.Parameters.Method.ArgsCb >= argsCb);
        
    args = (PAPX_ACK_MESSAGE)params.Parameters.Method.Args;
    argsCb = params.Parameters.Method.ArgsCb; // use real value.

    if (args->Size != argsCb)
    {
        status = STATUS_INVALID_PARAMETER;
        ASSERT(FALSE);
        goto exit;
    }

    //
    // Find the message to ack.
    //
    KeWaitForSingleObject(&ctx->Lock, Executive, KernelMode, FALSE, NULL);

    for (le = ctx->ApxPendingMessages.Flink; le != &ctx->ApxPendingMessages; le = le->Flink)
    {
        message = CONTAINING_RECORD(le, APX_SYNC_MESSAGE, ListEntry);
        if (message->MessageId == args->MessageId)
        {
            message->Result = args->Result;
            KeSetEvent(&message->Event, 0, FALSE);
            break;
        }

        message = nullptr;
    }
    
    KeReleaseMutex(&ctx->Lock, FALSE);
    
    if (message)
    {
        status = STATUS_SUCCESS;
    }
    else
    {
        // The pending message must have timeout out and thus got cancelled.
        status = STATUS_CANCELLED;
    }
    
exit:
    WdfRequestComplete(Request, status);    
}

Requisitos do ACX

Versão mínima do ACX: 1.0

Para obter mais informações sobre as versões do ACX, consulte Visão geral da versão do ACX.

Requisitos

Requisito Valor
Cabeçalho acxrequest.h
IRQL PASSIVE_LEVEL

Confira também