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 は、次のいずれかの値を返します。
リターン コード | 説明 |
---|---|
|
次の I/O 要求は、I/O キューから正常に取得されました。 |
|
キューが要求をディスパッチしていません。 この状況は、デバイスが電源状態の遷移を受け、すべてのキューが要求のディスパッチを停止した場合、またはドライバーが明示的に IWDFIoQueue::Stop を呼び出して要求のディスパッチを停止した場合に発生します。 この状況は、ドライバーが電源管理され、電源が切れている手動キューから要求を削除しようとした場合、またはキューが一時停止している場合にも発生する可能性があります。 |
|
キューに要求はありませんでした。 |
|
並列キューから要求を取得するための呼び出しが行われました。 |
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 |