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


Функция 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 см. в разделе Requeuing I/O Requests.

Примеры

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

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