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 は、次のいずれかの値を返します。
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 の
IWDFIoRequest の