警告
UMDF 2 是最新版的 UMDF,並取代 UMDF 1。 所有新的UMDF驅動程式都應該使用UMDF 2撰寫。 未將新功能新增至 UMDF 1,而且較新版本的 Windows 10 上對 UMDF 1 的支援有限。 通用 Windows 驅動程式必須使用 UMDF 2。
封存的 UMDF 1 範例可在 Windows 11 版本 22H2 - 2022 年 5 月驅動程式範例更新中找到。
如需詳細資訊,請參閱 開始使用UMDF。
UMDF 驅動程式可以同步或異步地將 I/O 要求傳送至一般 I/O 目標。
如果驅動程式同步傳送 I/O 要求,驅動程式線程會一次傳送一個要求。 線程會等候每個要求完成,再傳送下一個要求。 此程式比以異步方式傳送 I/O 要求更簡單。 如果驅動程式未傳送許多要求,且驅動程式等候每個 I/O 要求時,系統或裝置效能不會降低,則驅動程式可以同步傳送 I/O 要求。
如果驅動程式以異步方式傳送 I/O 要求,驅動程式線程會在要求準備好傳送時立即傳送每個要求,而不會等待先前傳送的要求完成。 如果驅動程式必須在短時間內處理許多 I/O 要求,驅動程式可能無法等待每個要求完成,再傳送下一個要求。 否則,驅動程式可能會遺失其裝置的數據或效能,而且可能會降低整個系統的效能。
在 UMDF 驅動程式可以將 I/O 要求傳送至 I/O 目標之前,驅動程式必須格式化要求。 下表列出驅動程式可以呼叫以格式化 I/O 要求的方法。 驅動程式可以使用這些方法來格式化其接收到的 I/O 佇列中的要求或自行建立的要求。
方法 | 目標 |
---|---|
IWDFIoRequest::FormatUsingCurrentType |
將驅動程式從架構收到的要求格式化,讓驅動程式可以將要求未經修改,傳送至目標 |
IWDFIoTarget::FormatRequestForIoctl |
格式化裝置控制要求 |
#B0 #A1 IWDFIoTarget::FormatRequestForRead #A2 #C3 |
格式化讀取請求 |
IWDFIoTarget::FormatRequestForWrite |
格式化寫入請求 |
IWDFIoTarget2::FormatRequestForFlush |
格式化要求以排清緩衝區。 |
IWDFIoTarget2:FormatRequestForQueryInformation |
格式化請求以獲取檔案信息。 |
#B0 #A1 IWDFIoTarget2::FormatRequestForSetInformation #A2 #C3 |
格式化一個請求以設置檔案資訊。 |
若要將 I/O 要求傳送至 I/O 目標,驅動程式會呼叫 IWDFIoRequest::Send 方法。 若要同步傳送 I/O 要求,驅動程式會將 WDF_REQUEST_SEND_OPTION_SYNCHRONOUS 旗標傳遞至 #C0 Flags #C1 參數。 否則,驅動程式會以異步方式傳送 I/O 要求。 如果驅動程式以異步方式傳送 I/O 要求,則當另一個驅動程式完成要求時,驅動程式通常需要通知。 驅動程式應該定義 IRequestCallbackRequestCompletion::OnCompletion 回呼函式,並藉由呼叫 IWDFIoRequest::SetCompletionCallback 方法來註冊它。 如需詳細資訊,請參閱 完成 I/O 要求。
呼叫驅動程式的 IWDFIoRequest::Send 函式來傳送 I/O 要求後,可以稍後呼叫 IWDFIoRequest::CancelSentRequest 方法來嘗試取消要求。 如果驅動程式取消從架構接收的 I/O 要求,驅動程式必須透過呼叫 IWDFIoRequest::Complete 或 IWDFIoRequest::CompleteWithInformation 方法,並將 CompletionStatus 參數設為 STATUS_CANCELLED 來完成該要求。 如果驅動程式建立請求物件,驅動程式會呼叫 IWDFObject::DeleteWdfObject,而不是完成請求。