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


Метод IWDFIoQueue::RetrieveNextRequest (wudfddi.h)

[Предупреждение: UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. В UMDF 1 новые функции не добавляются, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2. Дополнительные сведения см. в разделе начало работы с UMDF.]

Метод RetrieveNextRequest извлекает следующий запрос ввода-вывода из очереди ввода-вывода.

Синтаксис

HRESULT RetrieveNextRequest(
  [out] IWDFIoRequest **ppRequest
);

Параметры

[out] ppRequest

Указатель на буфер, который получает указатель на интерфейс IWDFIoRequest для следующего объекта запроса или получает значение NULL , если очередь пуста или если следующий запрос не найден.

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

RetrieveNextRequest возвращает одно из следующих значений:

Код возврата Описание
S_OK
Следующий запрос ввода-вывода успешно получен из очереди ввода-вывода.
HRESULT_FROM_NT (STATUS_WDF_PAUSED)
Очередь не отправляет запросы. Эта ситуация возникает, если устройство переходит в состояние питания и все очереди остановлены от отправки запросов или если драйвер явно вызвал IWDFIoQueue::Stop , чтобы остановить отправку запросов. Эта ситуация также может возникнуть, если драйвер пытается удалить запрос из очереди вручную, которая управляется питанием и выключена, или если очередь приостановлена.
HRESULT_FROM_WIN32 (ERROR_NO_MORE_ITEMS)
В очереди не было запросов.
HRESULT_FROM_NT (STATUS_INVALID_DEVICE_STATE)
Был выполнен вызов для получения запроса из параллельной очереди.
 

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

Комментарии

Если драйвер настраивает очередь ввода-вывода для отправки запросов ввода-вывода вручную, драйвер может вызвать метод RetrieveNextRequest , чтобы получить следующий запрос из очереди. Дополнительные сведения о ручной отправке запросов ввода-вывода см. в разделе Настройка режима диспетчеризации для очереди ввода-вывода.

Если драйвер настраивает очередь ввода-вывода для последовательной отправки запросов ввода-вывода, драйвер по-прежнему может вызвать метод RetrieveNextRequest , чтобы получить следующий запрос из очереди без получения ошибки. Хотя платформа позволяет драйверу вызывать RetrieveNextRequest для получения запроса из последовательной очереди, драйвер должен вызывать RetrieveNextRequest только до завершения текущего запроса. В противном случае, если водитель попытается вызвать RetrieveNextRequest после выполнения текущего запроса, может возникнуть состояние гонки. Это состояние гонки происходит между автоматической отправкой платформой следующего запроса из последовательной очереди и вызовом драйвера RetrieveNextRequest для получения следующего запроса.

Примеры

В следующем примере кода, который является примером драйвера umdf_fx2 , опрашивает очередь на запросы до тех пор, пока запросы можно получить. Код сначала проверяет, связаны ли запросы с определенным объектом файла.

VOID
CMyDevice::ServiceSwitchChangeQueue(
    __in SWITCH_STATE NewState,
    __in HRESULT CompletionStatus,
    __in_opt IWDFFile *SpecificFile
    )
{
    IWDFIoRequest *fxRequest;
    HRESULT enumHr = S_OK;
    do {
        HRESULT hr;
        //
        // Get the next request.
        //
        if (NULL != SpecificFile) {
        enumHr = m_SwitchChangeQueue->RetrieveNextRequestByFileObject(
                                        SpecificFile,
                                        &fxRequest
                                        );
        }
        else {
            enumHr = m_SwitchChangeQueue->RetrieveNextRequest(&fxRequest);
        }
        //
        // If a request was retrieved, complete it.
        //
        if (S_OK == enumHr) {
            if (S_OK == CompletionStatus) {
                IWDFMemory *fxMemory;
                //
                // Copy the result to the request buffer.
                //
                fxRequest->GetOutputMemory(&fxMemory);
                hr = fxMemory->CopyFromBuffer(0, 
                                              &NewState, 
                                              sizeof(SWITCH_STATE));
                                              fxMemory->Release();
            }
            else {
                 hr = CompletionStatus;
            }
            //
            // Complete the request with the copy or 
            // completion status.
            //
            if (S_OK == hr) {
                fxRequest->CompleteWithInformation(hr, 
                                                   sizeof(SWITCH_STATE));
            }
            else {
                fxRequest->Complete(hr);
            }
            fxRequest->Release();
        }
    }
    while (S_OK == enumHr);
}

Требования

Требование Значение
Дата окончания поддержки Недоступно в UMDF 2.0 и более поздних версиях.
Целевая платформа Персональный компьютер
Минимальная версия UMDF 1.5
Верхняя часть wudfddi.h (включая Wudfddi.h)
DLL WUDFx.dll

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

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest