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


Функция WdfRequestForwardToIoQueue (wdfrequest.h)

[Относится к KMDF и UMDF]

Метод WdfRequestForwardToIoQueue повторно отправляет запрос ввода-вывода в одну из очередей ввода-вывода вызывающего драйвера.

Синтаксис

NTSTATUS WdfRequestForwardToIoQueue(
  [in] WDFREQUEST Request,
  [in] WDFQUEUE   DestinationQueue
);

Параметры

[in] Request

Дескриптор объекта запроса платформы.

[in] DestinationQueue

Дескриптор объекта очереди платформы.

Возвращаемое значение

WdfRequestForwardToIoQueue возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае этот метод может вернуть одно из следующих значений:

Код возврата Описание
STATUS_INVALID_DEVICE_REQUEST
Это значение возвращается, если происходит одно из следующих действий:
  • Драйвер не получил запрос из очереди ввода-вывода.
  • Исходная и целевая очереди совпадают.
  • Исходная и целевая очереди не принадлежат одному устройству.
  • Драйвер не является владельцем запроса.
  • Запрос можно отменить.
STATUS_WDF_BUSY
Конечная очередь не принимает новые запросы.
 

Этот метод также может возвращать другие значения NTSTATUS.

Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.

Комментарии

Драйвер должен владеть запросом ввода-вывода и получать запрос из одной из своих очередей ввода-вывода.

Исходная и целевая очереди не могут быть одинаковыми. Другими словами, драйвер не может вызвать WdfRequestForwardToIoQueue , чтобы вернуть запрос в очередь, из которую он поступил. Чтобы повторно отправить запрос в ту же очередь, используйте WdfRequestRequeue.

Как исходная, так и целевая очереди должны принадлежать одному устройству.

Запрос не должен быть отменен. Если драйвер вызвал WdfRequestMarkCancelable или WdfRequestMarkCancelableEx , чтобы сделать запрос отмененным, он должен вызвать WdfRequestUnmarkCancelable перед вызовомWdfRequestForwardToIoQueue.

После вызова драйвером 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(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );

    switch (IoControlCode)
    {
        case IOCTL_NDISPROT_QUERY_OID_VALUE:
            NICHandleQueryOidRequest(
                                     Queue,
                                     Request,
                                     &params
                                     );
            break;

        case IOCTL_NDISPROT_SET_OID_VALUE:
            NICHandleSetOidRequest(
                                   Queue,
                                   Request,
                                   &params
                                   );
            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)

См. также раздел

EvtDeкистольcallback

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx

WdfRequestRequeue

WdfRequestUnmarkCancelable