共用方式為


管理 UMDF 驅動程式中的緩衝區存取方法

如果您要撰寫 UMDF 驅動程式,您可以為架構用於讀取和寫入要求,以及裝置 I/O 控制要求的緩衝區存取方法指定偏好設定。 UMDF 驅動程式所提供的值只是喜好設定,而且不保證由架構使用。

指定慣用的緩衝區存取方法

從 UMDF 2.0 版開始,UMDF 驅動程式會呼叫 WdfDeviceInitSetIoTypeEx,以註冊讀取/寫入要求和裝置 I/O 控制要求的慣用存取方法。

如果驅動程式未呼叫 WdfDeviceInitSetIoTypeEx,UMDF 會針對此裝置的 I/O 要求使用緩衝方法。

架構會使用下列規則來判斷要使用的存取方法:

  • 驅動程式堆疊中的所有 UMDF 驅動程式都必須使用相同的方法來存取裝置的緩衝區,而架構會提供緩衝 I/O 的喜好設定。

    如果 UMDF 判斷某些驅動程式偏好緩衝 I/O 或裝置的直接 I/O,而其他驅動程式則只偏好針對裝置緩衝 I/O,UMDF 會針對所有驅動程式使用緩衝 I/O。 如果一或多個堆疊的驅動程式只偏好緩衝 I/O,而其他驅動程式則只偏好直接 I/O,UMDF 會將事件記錄至系統事件記錄檔,而不會啟動驅動程式堆疊。

    驅動程式可以呼叫 WdfDeviceGetDeviceStackIoType,以判斷 UMDF 指派給裝置讀取/寫入要求和 I/O 控制要求的緩衝區存取方法。

  • 在某些情況下,UMDF 會將直接 I/O 指派給裝置,但為了達到最佳效能,對裝置的其中一個或多個請求使用緩衝 I/O。 例如,UMDF 若能比對緩衝區進行直接存取更快地將數據複製到驅動程式的緩衝區,則會針對小型緩衝區使用緩衝 I/O。

    您可以選擇性地,當驅動程式呼叫 WdfDeviceInitSetIoTypeEx時,提供 DirectTransferThreshold 值。 架構會使用此值來判斷架構將使用直接 I/O 的最小緩衝區大小。 一般而言,您不需要提供此值,因為架構會使用提供最佳效能的設定。

  • UMDF 只會針對在記憶體頁面界限上開始和結束的緩衝區空間使用直接 I/O。 如果緩衝區的開頭或結尾不在頁面界限上,UMDF 會針對該緩衝區部分使用緩衝 I/O。 換句話說,UMDF 可能會針對由數個 I/O 要求組成的大型數據傳輸使用緩衝 I/O 和直接 I/O。

  • 針對裝置 I/O 控件要求,只有在 I/O 控制程式代碼 (IOCTL) 指定直接 I/O 時,UMDF 才會使用直接 I/O,而且只有當該裝置的所有 UMDF 驅動程式都呼叫 WdfDeviceInitSetIoTypeEx,才能指定直接存取方法。

檢索 I/O 要求的存取方式

不論緩衝區存取方法為何,驅動程式都會使用相同的要求物件方法來存取數據緩衝區。 因此,大部分的驅動程式通常不需要知道UMDF是否針對I/O要求使用緩衝I/O或直接I/O。

在某些情況下,如果您知道 I/O 要求的存取方法,您可以改善驅動程式的效能。 例如,考慮通常使用直接 I/O 的高效能裝置。 當驅動程式收到 I/O 要求時,它會將數據從共用緩衝區空間複製到本機驅動程式記憶體以進行驗證。

不過,驅動程式偶爾可能會收到使用緩衝輸入/輸出的緩衝區。 由於 I/O 管理員已將此資料複製到中繼緩衝區,因此驅動程式不需要在本機複製參數。 藉由避免複製作業,驅動程式可改善效能。

UMDF 驅動程式會呼叫 WdfRequestGetEffectiveIoType,以取得 I/O 要求的緩衝區存取方法。 如上所述,特定要求的 I/O 類型可能與裝置的架構指派 I/O 類型設定不同。

從既非緩衝 I/O 也非直接 I/O 轉換

UMDF 驅動程式無法使用 「neither」 方法。

不過,某些裝置 I/O 控制代碼(IOCTLs)定義 中指定要求使用「皆非」方法。 選擇性地,UMDF 驅動程式可以將這類裝置 I/O 控制要求的緩衝區存取方法轉換為緩衝 I/O 或直接 I/O。 使用下列步驟:

  1. UmdfMethodNeitherAction 指示詞包含在驅動程式的 INF 檔案中的 INF DDInstall 區段的 中。 您可以設定指令的值,以說明 UMDF 應該將使用「兩者皆非」存取方法的裝置 I/O 控制要求傳遞給驅動程式。 (否則,UMDF 會以錯誤狀態值完成這些 I/O 要求。

  2. 使用 UMDF 提供的物件方法來存取 I/O 要求的緩衝區,以支持 緩衝 I/O直接 I/O

只有當您確定 UMDF 可以將存取方法轉換為緩衝的 I/O 或直接 I/O 時,才應該啟用使用 “neither” 方法的 IOCTL 要求支援。 例如,如果 IOCTL 指定的不遵循 I/O 控制碼的緩衝區描述中所述的緩衝區規格規則的自定義請求,則 UMDF 無法轉換緩衝區。