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


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

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

Метод WdfRequestForwardToParentDeviceIoQueue повторно запрашивает запрос ввода-вывода из очереди ввода-вывода дочернего устройства в указанную очередь ввода-вывода родительского устройства.

Синтаксис

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

Параметры

[in] Request

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

[in] ParentDeviceQueue

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

[in] ForwardOptions

Указатель на структуру, выделенную вызывающим объектом WDF_REQUEST_FORWARD_OPTIONS.

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

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

Возвращаемый код Описание
STATUS_INFO_LENGTH_MISMATCH
Недопустимый размер предоставленной WDF_REQUEST_FORWARD_OPTIONS структуры.
STATUS_INVALID_PARAMETER
Элемент предоставленной WDF_REQUEST_FORWARD_OPTIONS структуры содержит недопустимое значение.
STATUS_INVALID_DEVICE_REQUEST
Это значение возвращается, если происходит одно из следующих действий:
  • Драйвер не получил запрос ввода-вывода из очереди ввода-вывода.
  • Очереди ввода-вывода источника и назначения совпадают.
  • Указанная очередь ввода-вывода не принадлежит родительскому устройству.
  • Драйвер включил гарантированного хода выполнения вперед, а указанный запрос ввода-вывода зарезервирован для ситуаций с низкой памятью.
  • Драйвер не вызывал WdfPdoInitAllowForwardingRequestToParent.
STATUS_WDF_BUSY
Указанная очередь ввода-вывода не принимает новые запросы.
 

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

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

Замечания

Прежде чем драйвер может вызвать WdfRequestForwardToParentDeviceIoQueue, он должен вызывать WdfPdoInitAllowForwardingRequestToParent.

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

Если драйвер вызовет WdfRequestForwardToParentDeviceIoQueue для повторного запроса ввода-вывода, драйвер не должен использовать объект запроса в качестве родительского элемента других объектов платформы, таких как объекты таймера или рабочие объекты элементов.

Если драйвер вызвал WdfDeviceInitSetRequestAttributes, чтобы указать пространство контекста для объектов запроса родительского устройства, платформа не добавляет это пространство контекста для запроса объектов, получаемых драйвером в очереди дочернего устройства. Драйвер может вызывать WdfObjectAllocateContext, чтобы добавить пространство контекста в объект запроса перед вызовом драйвера WdfRequestForwardToParentDeviceIoQueue. С другой стороны, если драйвер вызвал WdfDeviceInitSetRequestAttributes для объектов запроса дочерних устройства, и если объекты запроса родительского устройства используют пространство контекста, равное или меньшему пространству контекста дочернего устройства, драйвер может использовать пространство контекста объекта запроса без вызова WdfObjectAllocateContext.

В настоящее время драйвер должен использовать параметр отправки и забыть для всех повторных запросов ввода-вывода. Следовательно, помните, что к тому времени, когда платформа удаляет повторно полученный объект запроса, возможно, он уже удалил дочернее устройство, которое первоначально получило объект запроса. Таким образом, драйвер не должен использовать функцию EvtCleanupCallback или EvtDebuildCallback объекта повторного запроса для доступа к ресурсам дочернего устройства, так как ресурсы могут быть удалены до запуска функции EvtCleanupCallback или EvtDebuildCallback.

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

Примеры

В следующем примере кода сначала определяется родительское устройство устройства, которое получило запрос ввода-вывода, а затем повторно отправляет запрос ввода-вывода в очередь ввода-вывода родительского устройства по умолчанию.

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

Требования

Требование Ценность
целевая платформа Всеобщий
минимальная версия KMDF 1.9
заголовка wdfrequest.h (включая Wdf.h)
библиотеки Wdf01000.sys (см. управление версиями библиотеки Платформы).)
IRQL <=DISPATCH_LEVEL
правил соответствия DDI DriverCreate(kmdf)

См. также

WdfPdoInitAllowForwardingRequestToParent