EVT_ACX_OBJECT_PROCESS_REQUEST Rückruffunktion (acxrequest.h)
Der EVT_ACX_OBJECT_PROCESS_REQUEST Rückruf wird vom Treiber verwendet, um eine WDFREQUEST zu verarbeiten.
Syntax
EVT_ACX_OBJECT_PROCESS_REQUEST EvtAcxObjectProcessRequest;
void EvtAcxObjectProcessRequest(
ACXOBJECT Object,
WDFREQUEST Request
)
{...}
Parameter
Object
Ein ACX-Objekt, das der Anforderung zugeordnet ist. Der Treiber wandelt dieses Handle normalerweise in den ACX-Objekttyp um, zu dem diese Eigenschaft gehört. Weitere Informationen zu ACX-Objekten finden Sie unter Zusammenfassung von ACX-Objekten.
Request
Ein E/A-WDFREQUEST-Objekt.
Weitere Informationen zum Arbeiten mit WDF-Anforderungsobjekten finden Sie unter Erstellen von Framework-Anforderungsobjekten und wdfrequest.h-Headern.
Rückgabewert
Keine
Bemerkungen
Beispiel
Das Beispiel für die Verwendung ist unten dargestellt.
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);
}
ACX-Anforderungen
ACX-Mindestversion: 1.0
Weitere Informationen zu ACX-Versionen finden Sie unter ACX-Versionsübersicht.
Anforderungen
Anforderung | Wert |
---|---|
Header | acxrequest.h |
IRQL | PASSIVE_LEVEL |