Функция 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 или 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) |