IWDFIoQueue::RetrieveNextRequest 方法 (wudfddi.h)
[警告: UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的UMDF驅動程式都應該使用UMDF 2撰寫。 未將新功能新增至 UMDF 1,且較新版本的 #D614260EA287F4E8E9B236DD75D5E2ED2 上,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 |
標頭 | wudfddi.h (包含 Wudfddi.h) |
Dll | WUDFx.dll |