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


Функция 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, чтобы вернуть запрос в очередь, из которую она поступила. Чтобы повторно отправить запрос в ту же очередь, используйте WdfRequestRequestRequeue.

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

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

После вызова драйвера 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(&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)

См. также

EvtDeskallback

WdfRequestMarkCancelable

WdfRequestMarkCancelableEx

WdfRequestRequeue

WdfRequestUnmarkCancelable