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
Header wudfddi.h (Wudfddi.h を含む)
[DLL] WUDFx.dll

こちらもご覧ください

IWDFIoQueue

IWDFIoQueue::Stop

IWDFIoRequest