Функция WdfRequestForwardToIoQueue (wdfrequest.h)
[Относится к KMDF и UMDF]
Метод WdfRequestForwardToIoQueue повторно отправляет запрос ввода-вывода в одну из очередей ввода-вывода вызывающего драйвера.
Синтаксис
NTSTATUS WdfRequestForwardToIoQueue(
[in] WDFREQUEST Request,
[in] WDFQUEUE DestinationQueue
);
Параметры
[in] Request
Дескриптор объекта запроса платформы.
[in] DestinationQueue
Дескриптор объекта очереди платформы.
Возвращаемое значение
WdfRequestForwardToIoQueue возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае этот метод может вернуть одно из следующих значений:
Код возврата | Описание |
---|---|
|
Это значение возвращается, если происходит одно из следующих действий:
|
|
Конечная очередь не принимает новые запросы. |
Этот метод также может возвращать другие значения NTSTATUS.
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Комментарии
Драйвер должен владеть запросом ввода-вывода и получать запрос из одной из своих очередей ввода-вывода.
Исходная и целевая очереди не могут быть одинаковыми. Другими словами, драйвер не может вызвать WdfRequestForwardToIoQueue , чтобы вернуть запрос в очередь, из которую он поступил. Чтобы повторно отправить запрос в ту же очередь, используйте WdfRequestRequeue.
Как исходная, так и целевая очереди должны принадлежать одному устройству.
Запрос не должен быть отменен. Если драйвер вызвал WdfRequestMarkCancelable или WdfRequestMarkCancelableEx , чтобы сделать запрос отмененным, он должен вызвать WdfRequestUnmarkCancelable перед вызовомWdfRequestForwardToIoQueue.
После вызова драйвером WdfRequestForwardToIoQueue драйвер не будет владеть запросом повторной отправки, пока платформа не доставляет запрос из новой очереди драйверу. Пока запрос находится в новой очереди, платформа владеет запросом и может отменить его, не уведомляя драйвер.
Перед возвратом WdfRequestForwardToIoQueue могут возникнуть следующие события:
- Если конечная очередь пуста, платформа может доставить запрос ввода-вывода, отложенный в очередь, в один из обработчиков запросов конечной очереди.
- Если метод диспетчеризации исходной очереди является последовательным или параллельным, платформа может доставить другой запрос одному из обработчиков запросов исходной очереди.
Примеры
Следующий пример кода представляет собой функцию обратного вызова EvtIoDeviceControl из примера драйвера PCIDRV . Если полученный запрос содержит код управления вводом-выводом 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) |