Функция 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, если операция выполнена успешно. В противном случае этот метод может возвращать одно из следующих значений:
Код возврата | Описание |
---|---|
|
Недопустимый размер предоставленной WDF_REQUEST_FORWARD_OPTIONS структуры. |
|
Элемент предоставленной структуры WDF_REQUEST_FORWARD_OPTIONS содержит недопустимое значение. |
|
Это значение возвращается, если происходит одно из следующих действий:
|
|
Указанная очередь ввода-вывода не принимает новые запросы. |
Этот метод также может возвращать другие значения 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) |