Функция 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(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
//
// 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;
}
...
}
Требования
См. также раздел
WdfRequestCompleteWithInformation