Поделиться через


функция обратного вызова EVT_ACX_OBJECT_PROCESS_REQUEST (acxrequest.h)

Обратный вызов EVT_ACX_OBJECT_PROCESS_REQUEST используется драйвером для обработки WDFREQUEST.

Синтаксис

EVT_ACX_OBJECT_PROCESS_REQUEST EvtAcxObjectProcessRequest;

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

Параметры

Object

Объект ACX, связанный с запросом. Драйвер обычно приводит этот дескриптор к типу объекта ACX, к которому принадлежит это свойство. Дополнительные сведения об объектах ACX см. в разделе Сводка по объектам ACX.

Request

Объект WDFREQUEST ввода-вывода.

Дополнительные сведения о работе с объектами запросов WDF см. в разделах Создание объектов запросов платформы и заголовок wdfrequest.h.

Возвращаемое значение

None

Remarks

Пример

Ниже приведен пример использования.

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

Минимальная версия ACX: 1.0

Дополнительные сведения о версиях ACX см. в статье Обзор версий ACX.

Требования

Требование Значение
Заголовок acxrequest.h
IRQL PASSIVE_LEVEL

См. также раздел