Метод 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 возвращает одно из следующих значений:
Код возврата | Описание |
---|---|
|
Следующий запрос ввода-вывода успешно получен из очереди ввода-вывода. |
|
Очередь не отправляет запросы. Эта ситуация возникает, если устройство переходит в состояние питания и все очереди остановлены от отправки запросов или если драйвер явно вызвал IWDFIoQueue::Stop , чтобы остановить отправку запросов. Эта ситуация также может возникнуть, если драйвер пытается удалить запрос из очереди вручную, которая управляется питанием и выключена, или если очередь приостановлена. |
|
В очереди не было запросов. |
|
Был выполнен вызов для получения запроса из параллельной очереди. |
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 |