Функция WdfRequestRetrieveInputBuffer (wdfrequest.h)
[Относится к KMDF и UMDF]
Метод WdfRequestRetrieveInputBuffer извлекает входной буфер запроса ввода-вывода.
Синтаксис
NTSTATUS WdfRequestRetrieveInputBuffer(
[in] WDFREQUEST Request,
size_t MinimumRequiredLength,
[out] PVOID *Buffer,
[out, optional] size_t *Length
);
Параметры
[in] Request
Дескриптор объекта запроса платформы.
MinimumRequiredLength
Минимальный размер буфера (в байтах), необходимый драйверу для обработки запроса ввода-вывода.
[out] Buffer
Указатель на расположение, которое получает адрес буфера.
[out, optional] Length
Указатель на расположение, которое получает размер буфера в байтах. Этот параметр является необязательным и может иметь значение NULL.
Возвращаемое значение
WdfRequestRetrieveInputBuffer возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае этот метод может вернуть одно из следующих значений:
Код возврата | Описание |
---|---|
|
Входной параметр недопустим. |
|
Длина входного буфера равна нулю или параметр MinimumRequiredSize указывает размер буфера, который больше фактического размера буфера. |
|
Недопустимый тип запроса или запрос не использует ни буферизованного, ни прямого ввода-вывода. Дополнительные сведения о поддерживаемых методах доступа к буферам данных см. в следующем разделе о примечаниях. |
|
Запрос уже выполнен. |
|
Недостаточно памяти. |
Этот метод также может возвращать другие значения NTSTATUS.
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Комментарии
Входной буфер запроса содержит сведения, например данные для записи на диск, предоставленные инициатором запроса. Драйвер может вызвать WdfRequestRetrieveInputBuffer , чтобы получить входной буфер для запроса на запись или запроса управления вводом-выводом устройства, но не для запроса на чтение (так как запросы на чтение не предоставляют входные данные).
Метод WdfRequestRetrieveInputBuffer извлекает входной буфер для запросов ввода-вывода, использующих метод буферизованного ввода-вывода или прямой метод ввода-вывода для доступа к буферам данных. Если код элемента управления вводом-выводом запроса IRP_MJ_INTERNAL_DEVICE_CONTROL или запрос поступил из другого драйвера режима ядра, WdfRequestRetrieveInputBuffer также поддерживает запросы ввода-вывода, которые не используют ни буферизованных, ни прямых операций ввода-вывода.
Если WdfRequestRetrieveInputBuffer возвращает STATUS_SUCCESS, драйвер получает адрес и, при необходимости, размер входного буфера.
Драйвер может получить доступ к полученному буферу, пока не завершит запрос ввода-вывода , который представляет параметр Request .
Вместо вызова WdfRequestRetrieveInputBuffer драйвер может вызвать WdfRequestRetrieveInputMemory, который создает объект памяти платформы, представляющий буфер.
Дополнительные сведения о WdfRequestRetrieveInputBuffer см. в статье Доступ к буферам данных в драйверах Framework-Based.
Примеры
Следующий пример кода является частью функции обратного вызова EvtIoDeviceControl драйвера Serial. Если код элемента управления вводом-выводом IOCTL_SERIAL_SET_TIMEOUT, драйвер получает новые значения времени ожидания из входного буфера запроса ввода-вывода.
VOID
SerialEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
PVOID buffer;
size_t bufSize;
switch (IoControlCode) {
...
case IOCTL_SERIAL_SET_TIMEOUTS: {
PSERIAL_TIMEOUTS NewTimeouts;
Status = WdfRequestRetrieveInputBuffer(
Request,
sizeof(SERIAL_TIMEOUTS),
&buffer,
&bufSize
);
if (!NT_SUCCESS(Status)) {
break;
}
NewTimeouts =(PSERIAL_TIMEOUTS)buffer;
}
...
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия 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), BufAfterReqCompletedWrite(kmdf), BufAfterReqCompletedWriteA(kmdf), DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |