Функция WdfRequestForwardToIoQueue (wdfrequest.h)
[Применимо к KMDF и UMDF]
Метод WdfRequestForwardToIoQueue повторно запрашивает запрос ввода-вывода в одну из очередей ввода-вывода вызывающего драйвера.
Синтаксис
NTSTATUS WdfRequestForwardToIoQueue(
[in] WDFREQUEST Request,
[in] WDFQUEUE DestinationQueue
);
Параметры
[in] Request
Дескриптор объекта запроса платформы.
[in] DestinationQueue
Дескриптор объекта очереди платформы.
Возвращаемое значение
WdfRequestForwardToIoQueue возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае этот метод может вернуть одно из следующих значений:
Возвращаемый код | Описание |
---|---|
|
Это значение возвращается, если происходит одно из следующих действий:
|
|
Очередь назначения не принимает новые запросы. |
Этот метод также может возвращать другие значения NTSTATUS.
Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Замечания
Драйвер должен собственный запрос ввода-вывода и должен получить запрос из одной из очередей ввода-вывода.
Исходные и конечные очереди не могут быть одинаковыми. Другими словами, драйвер не может вызывать WdfRequestForwardToIoQueue, чтобы вернуть запрос в очередь, из которую она поступила. Чтобы повторно отправить запрос в ту же очередь, используйте WdfRequestRequestRequeue.
Как исходные, так и конечные очереди должны принадлежать одному устройству.
Запрос не должен быть отменен. Если драйвер вызвал WdfRequestMarkCancelable или WdfRequestMarkCancelableEx для отмены запроса, необходимо вызвать WdfRequestUnmarkCancelable перед вызовом WdfRequestForwardToIoQueue.
После вызова драйвера WdfRequestForwardToIoQueueдрайвер не владеет повторным запросом, пока платформа не доставляет запрос из новой очереди драйверу. Хотя запрос находится в новой очереди, платформа владеет запросом и может отменить его без уведомления драйвера.
Перед возвратом WdfRequestForwardToIoQueue могут произойти следующие события:
- Если очередь назначения была пуста, платформа может доставлять запрос повторного ввода-вывода в один из обработчиков запросов конечной очереди.
- Если метода отправки исходной очереди последовательно или параллельно, платформа может доставлять другой запрос одному из обработчиков запросов исходной очереди.
Примеры
Следующий пример кода — это функция обратного вызова EvtIoDeviceControl из примера драйвера PCID RV. Если полученный запрос содержит код управления ввода-вывода IOCTL_NDISPROT_INDICATE_STATUS, драйвер вызывает WdfRequestForwardToIoQueue для перемещения запроса в другую очередь ввода-вывода.
VOID
PciDrvEvtIoDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
{
NTSTATUS status= STATUS_SUCCESS;
PFDO_DATA fdoData = NULL;
WDFDEVICE hDevice;
WDF_REQUEST_PARAMETERS params;
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(InputBufferLength);
hDevice = WdfIoQueueGetDevice(Queue);
fdoData = FdoGetData(hDevice);
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
switch (IoControlCode)
{
case IOCTL_NDISPROT_QUERY_OID_VALUE:
NICHandleQueryOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_SET_OID_VALUE:
NICHandleSetOidRequest(
Queue,
Request,
¶ms
);
break;
case IOCTL_NDISPROT_INDICATE_STATUS:
status = WdfRequestForwardToIoQueue(
Request,
fdoData->PendingIoctlQueue
);
if(!NT_SUCCESS(status)){
WdfRequestComplete(
Request,
status
);
break;
}
break;
default:
WdfRequestComplete(
Request,
STATUS_INVALID_DEVICE_REQUEST
);
break;
}
return;
}
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
минимальная версия KMDF | 1.0 |
минимальная версия UMDF | 2.0 |
заголовка | wdfrequest.h (включая Wdf.h) |
библиотеки | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
правил соответствия DDI | DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf) |