Функция 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 или EvtDegradCallback объекта запроса, задающего запрос, для доступа к ресурсам дочернего устройства, так как ресурсы могут быть удалены до выполнения функции EvtCleanupCallback или EvtDegradCallback .

Дополнительные сведения о 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