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

[Применяется только к KMDF]

Метод WdfRequestRetrieveOutputWdmMdl извлекает список дескрипторов памяти (MDL), который представляет выходной буфер запроса ввода-вывода.

Синтаксис

NTSTATUS WdfRequestRetrieveOutputWdmMdl(
  [in]  WDFREQUEST Request,
  [out] PMDL       *Mdl
);

Параметры

[in] Request

Дескриптор объекта запроса платформы.

[out] Mdl

Указатель на расположение, которое получает указатель на MDL.

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

WdfRequestRetrieveOutputWdmMdl возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае этот метод может вернуть одно из следующих значений:

Код возврата Описание
STATUS_INVALID_PARAMETER
Входной параметр недопустим.
STATUS_INVALID_DEVICE_REQUEST
Недопустимый тип запроса или запрос не использует ни буферизованного, ни прямого ввода-вывода. Дополнительные сведения о поддерживаемых методах доступа к буферам данных см. в следующем разделе о примечаниях.
STATUS_INTERNAL_ERROR
Запрос уже выполнен.
STATUS_BUFFER_TOO_SMALL
Длина входного буфера равна нулю.
STATUS_INSUFFICIENT_RESOURCES
Недостаточно памяти.
 

Этот метод также может возвращать другие значения NTSTATUS.

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

Комментарии

Выходной буфер запроса получает информацию, например данные с диска, которую драйвер предоставляет инициатору запроса. Драйвер может вызывать WdfRequestRetrieveOutputWdmMdl для запроса на чтение или запроса управления вводом-выводом устройства, но не для запроса на запись (так как запросы на запись не предоставляют выходные данные).

Метод WdfRequestRetrieveOutputWdmMdl извлекает MDL выходного буфера для запросов ввода-вывода, использующих метод буферизованного ввода-вывода или прямой метод ввода-вывода для доступа к буферам данных. Если код элемента управления вводом-выводом запроса IRP_MJ_INTERNAL_DEVICE_CONTROL или запрос поступил из другого драйвера в режиме ядра, WdfRequestRetrieveOutputWdmMdl также поддерживает запросы ввода-вывода, которые не используют ни буферизованного, ни прямого ввода-вывода.

Если WdfRequestRetrieveOutputWdmMdl возвращает STATUS_SUCCESS, драйвер получает указатель на MDL, описывающий выходной буфер.

Драйвер не должен получать доступ к MDL запроса после выполнения запроса ввода-вывода.

Дополнительные сведения о WdfRequestRetrieveOutputWdmMdl см. в разделе Доступ к буферам данных в драйверах Framework-Based.

Примеры

Следующий пример кода является частью функции обратного вызова EvtIoRead , которая получает MDL для входного буфера запроса ввода-вывода. Если вызов WdfRequestRetrieveOutputWdmMdl завершается сбоем, драйвер завершает запрос с состоянием ошибки, которое возвращает WdfRequestRetrieveOutputWdmMdl .

VOID 
MyDrvEvtIoRead(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN size_t  Length
    )
{
    NTSTATUS  status;
    PMDL  mdl = NULL;
...
    status = WdfRequestRetrieveOutputWdmMdl(
                                            Request,
                                            &mdl
                                            );
    if (!NT_SUCCESS(status))
    {
        WdfRequestCompleteWithInformation(
                                          Request,
                                          status,
                                          0
                                          );
    }
...
}

Требования

Требование Значение
Целевая платформа Универсальное
Минимальная версия KMDF 1,0
Верхняя часть wdfrequest.h (включая Wdf.h)
Библиотека Wdf01000.sys (см. раздел Управление версиями библиотеки платформы).
IRQL <=DISPATCH_LEVEL
Правила соответствия DDI DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), MdlAfterReqCompletedIntIoctl(kmdf), MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctl(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedRead(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWrite(kmdf), OutputBufferAPI(kmdf)

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

WdfRequestRetrieveInputWdmMdl