Freigeben über


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(&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);    
}

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

Weitere Informationen