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


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

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

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

Синтаксис

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

Параметры

[out] ppRequest

Указатель на буфер, который получает указатель на интерфейс IWDFIoReque st для следующего объекта запроса, или получает 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.

Замечания

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

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

Примеры

Следующий пример кода, полученный из примера драйвера 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 (include Wudfddi.h)
DLL WUDFx.dll

См. также

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest