共用方式為


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