Функция WdfRequestComplete (wdfrequest.h)

[Относится к KMDF и UMDF]

Метод WdfRequestComplete завершает указанный запрос ввода-вывода и предоставляет состояние завершения.

Синтаксис

void WdfRequestComplete(
  [in] WDFREQUEST Request,
  [in] NTSTATUS   Status
);

Параметры

[in] Request

Дескриптор объекта запроса платформы, представляющий завершаемый запрос ввода-вывода.

[in] Status

Значение NTSTATUS, представляющее состояние завершения запроса. Допустимые значения состояния включают, помимо прочего, следующие:

STATUS_SUCCESS

Драйвер успешно завершает запрос.

STATUS_CANCELLED

Драйвер отменяет запрос.

STATUS_UNSUCCESSFUL

Драйвер обнаружил ошибку при обработке запроса.

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

None

Remarks

Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.

После того как драйвер вызывает WdfRequestComplete, драйверы более высокого уровня в стеке драйверов могут вызвать WdfRequestGetStatus , чтобы получить значение состояния завершения, указанное для параметра Status . Как правило, драйверы вызывают WdfRequestGetStatus из функции обратного вызова CompletionRoutine .

После возврата вызова WdfRequestComplete дескриптор запроса становится недействительным, если драйвер не вызвал WdfObjectReference для добавления одного или нескольких дополнительных счетчиков ссылок в объект запроса. Обратите внимание, что после возврата WdfRequestComplete драйвер не должен пытаться получить доступ к связанной структуре WDM IRP, даже если он вызвал WdfObjectReference. Это требование распространяется на доступ к связанной структуре WDM IRP путем вызова методов в WDFREQUEST, таких как WdfRequestRetrieveOutputBuffer или WdfRequestRetrieveInputBuffer.

После вызова драйвером WdfRequestComplete платформа вызывает функцию EvtCleanupCallback драйвера для запроса, если драйвер предоставил ее.

Вместо вызова WdfRequestComplete драйвер может вызывать WdfRequestCompleteWithInformation или WdfRequestCompleteWithPriorityBoost. Дополнительные сведения см. в разделе Примечания WdfRequestCompleteWithInformation .

Когда драйвер вызывает WdfRequestComplete, платформа предоставляет значение по умолчанию, которое система использует для повышения приоритета во время выполнения потока, запрашивающего операцию ввода-вывода. Сведения о значениях повышения приоритета по умолчанию см. в разделе Указание повышения приоритета при выполнении запросов ввода-вывода. Драйвер может вызвать WdfRequestCompleteWithPriorityBoost , чтобы переопределить значение повышения приоритета по умолчанию.

Дополнительные сведения о вызове WdfRequestComplete см. в разделе Завершение запросов ввода-вывода.

Примеры

Следующий пример кода представляет собой раздел обработчика запросов. Обработчик запросов принимает только запросы на чтение и запись и завершает каждый запрос с состоянием ошибки, если тип запроса не является чтением или записью.

VOID
MyEvtIoDefault(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request
    )
{
    WDF_REQUEST_PARAMETERS  params;
    WDF_DMA_DIRECTION  direction;

...
    WDF_REQUEST_PARAMETERS_INIT(&params);

    WdfRequestGetParameters(
                            Request,
                            &params
                            );

    //
    // Validate and gather parameters.
    //
    switch (params.Type) {
        case WdfRequestTypeRead:
            length = params.Parameters.Read.Length;
            direction = WdfDmaDirectionReadFromDevice;
            break;
        case WdfRequestTypeWrite:
            length = params.Parameters.Write.Length;
            direction = WdfDmaDirectionWriteToDevice;
            break;
        default:
            WdfRequestComplete(
                               Request,
                               STATUS_INVALID_DEVICE_REQUEST
                               );
            return;
    }
...
}

Требования

Требование Значение
Целевая платформа Универсальное
Минимальная версия KMDF 1,0
Минимальная версия UMDF 2,0
Верхняя часть wdfrequest.h (включая Wdf.h)
Библиотека Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Правила соответствия DDI BufAfterReqCompletedIntIoctl(kmdf), BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf), BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedReadA(kmdf), BufAfterReqCompletedWrite(kmdf), BufAfterReqCompletedWriteA(kmdf), CompleteCanceledReq(kmdf), DeferredRequestCompleted(kmdf), DoubleCompletion(kmdf), DoubleCompletionLocal(kmdf), DriverCreate(kmdf), EvtIoStopCancel(kmdf), EvtIoStopCompleteOrStopAck(kmdf), EvtSurpriseRemoveNoRequestComplete(kmdf), InvalidReqAccess(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MarkCancOnCancReqLocal(kmdf), MdlAfterReqCompletedIntIoctl(kmdf), MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctl(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedRead(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWrite(kmdf), MdlAfterReqCompletedWriteA(kmdf), MemAfterReqCompletedIntIoctl(kmdf), MemAfterReqCompletedIntIoctlA(kmdf), MemAfterReqCompletedIoctl(kmdf), MemAfterReqCompletedIoctlA(kmdf), MemAfterReqCompletedRead(kmdf), MemAfterReqCompletedReadA(kmdf), MemAfterReqCompletedWrite(kmdf), MemAfterReqCompletedWriteA(kmdf), NoCancelFromEvtSurpriseRemove(kmdf), ReqDelete(kmdf), ReqIsCancOnCancReq(kmdf), ReqNotCanceledLocal(kmdf), ReqSendFail(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf)

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

WDF_REQUEST_PARAMETERS

WDF_REQUEST_PARAMETERS_INIT

WdfObjectReference

WdfRequestCompleteWithInformation

WdfRequestCompleteWithPriorityBoost

WdfRequestGetStatus