IWDFIoQueue::RetrieveNextRequest 方法 (wudfddi.h)

[警告: UMDF 2 是最新版本的 UMDF,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 未向 UMDF 1 添加新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。 有关详细信息,请参阅使用 UMDF 入门。]

RetrieveNextRequest 方法从 I/O 队列中检索下一个 I/O 请求。

语法

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

参数

[out] ppRequest

指向缓冲区的指针,该缓冲区接收指向下一个请求对象的 IWDFIoRequest 接口的指针;如果队列为空或找不到下一个请求,则接收 NULL

返回值

RetrieveNextRequest 返回以下值之一:

返回代码 说明
S_OK
已成功从 I/O 队列中检索下一个 I/O 请求。
HRESULT_FROM_NT (STATUS_WDF_PAUSED)
队列未调度请求。 如果设备正在进行电源状态转换,并且所有队列都停止调度请求,或者驱动程序显式调用 IWDFIoQueue::Stop 以停止调度请求,则会出现这种情况。 如果驱动程序尝试从由电源管理的手动队列中删除请求,并且该请求已关闭,或者队列已暂停,则也会发生这种情况。
HRESULT_FROM_WIN32 (ERROR_NO_MORE_ITEMS)
队列中没有请求。
HRESULT_FROM_NT (STATUS_INVALID_DEVICE_STATE)
调用是从并行队列检索请求。
 

RetrieveNextRequest 也可能返回其他 HRESULT 值。

注解

如果驱动程序配置 I/O 队列以手动调度 I/O 请求,则驱动程序可以调用 RetrieveNextRequest 方法从队列中获取下一个请求。 有关手动调度 I/O 请求的详细信息,请参阅 为 I/O 队列配置调度模式

如果驱动程序配置 I/O 队列以便按顺序调度 I/O 请求,则驱动程序仍可以调用 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