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. Normalmente, o driver converte esse identificador no 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 do WDF, consulte Criando objetos de solicitação da estrutura e cabeçalho wdfrequest.h.
Valor de retorno
Nenhum
Observações
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(¶ms);
AcxRequestGetParameters(Request, ¶ms);
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 versões do ACX, consulte visão geral da versão do ACX.
Requisitos
Requisito | Valor |
---|---|
cabeçalho | acxrequest.h |
IRQL | PASSIVE_LEVEL |