關於 BypassIO
BypassIO 功能提供優化 I/O 路徑來讀取檔案。 此路徑可減少執行讀取的 CPU 額外負荷,有助於滿足在 Windows 上載入和執行下一代遊戲的 I/O 需求。 BypassIO 是支援 Windows 上 DirectStorage 的基礎結構的一部分。 從 Windows 11 開始,即可使用。
重要的是迷你篩選必須實作 BypassIO 的支援,並且您要盡量保持啟用 BypassIO。 如果沒有過濾器支持,遊戲性能會下降,導致最終用戶的遊戲體驗不佳。
未來的 Windows 版本包括遊戲以外的更廣泛的應用程式用途。
BypassIO 是每個句柄概念。 當您要求 BypassIO 時,您會要求它取得明確的檔案控制碼。 BypassIO 不會影響該檔案的其他句柄。
作為此基礎設施的一部分,添加了FSCTL_MANAGE_BYPASS_IO和同等IOCTL_STORAGE_MANAGE_BYPASS_IO。 迷你篩選器會處理 FSCTL_MANAGE_BYPASS_IO,而檔案系統則將 IOCTL_STORAGE_MANAGE_BYPASS_IO 傳送至磁碟區和儲存體堆疊。 這些控制碼的設計目的是可診斷:它們都會傳回失敗 BypassIO 要求的驅動程式身分識別,以及否決它的原因。
本文提供檔案系統篩選和記憶體堆疊的架構詳細數據,以及如何在迷你篩選驅動程式中實作 BypassIO 的相關資訊。 如需與儲存體驅動程式相關的 BypassIO 資訊,請參閱BypassIO for storage drivers。
BypassIO 支援的範圍
從 Windows 11 開始,BypassIO 支援包含下列功能:
僅支援 Windows 用戶端系統。 伺服器系統支援將在未來版本中推出。
僅支援 NVMe 儲存裝置。 未來版本將支援其他儲存技術。
僅支援 NTFS 檔案系統。 未來版本將支援其他檔案系統。
僅支援非快取讀取。 未來版本將支援非快取寫入。
僅支援檔案 (不支援目錄或磁碟區控點)。
BypassIO 的運作方式
當您在已啟用 BypassIO 的 FileHandle 上呼叫 NtReadFile 時,作業通常不會流經傳統的 I/O 堆疊,而傳統 I/O 堆疊會周遊整個檔案系統堆疊、磁碟區堆疊和儲存體堆疊。 相反地,作業會直接從 I/O 管理員流向 (NTFS) 檔案系統,然後流向磁碟 (classpnp) 驅動程式,然後流向 StorNVMe 驅動程式。 使用完全啟用 BypassIO 的 FileHandle:
- 此作業會略過所有檔案系統篩選器。
- 此作業會略過所有磁碟區堆疊篩選器。
- 此作業會略過在磁碟驅動程式之上,以及在磁碟驅動程式與 StorNVMe 驅動程式之間的所有儲存堆疊篩選器和驅動程式。
在檔案系統篩選堆疊支援 BypassIO 但磁碟區和儲存體堆疊不支援的情況下:
- 讀取 IO 會略過篩選堆疊。
- 讀取 IO 操作仍然會經由磁碟區和儲存體堆疊進行。
此層級的支持稱為部分 BypassIO。
顯示讀取要求之傳統 I O 路徑的影像。
顯示讀取要求的略過 I O 路徑的影像。
BypassIO 的 DDI 變更和新增專案
已新增下列與篩選驅動程式相關的 DIS,以提供 BypassIO 支援:
- FltVetoBypassIo 函式
- FS_BPIO_INFLAGS列舉值
- FS_BPIO_INFO結構
- FS_BPIO_INPUT結構
- FS_BPIO_OPERATIONS列舉值
- FS_BPIO_OUTFLAGS列舉值
- FS_BPIO_OUTPUT 結構
- FS_BPIO_RESULTS 結構
- FSCTL_MANAGE_BYPASS_IO控件程式代碼
- FsRtlGetBypassIoOpenCount 函式
此外,下列 DDI 已變更為支援 BypassIO:
- 已將 BypassIoOpenCount 字段新增至FSRTL_ADVANCED_FCB_HEADER結構。 文件系統會使用此欄位,在目前已啟用 BypassIO 的數據流上維護唯一 FileObject 的計數。 新增此欄位會增加結構大小。 從 Windows 11 開始使用的結構版本FSRTL_FCB_HEADER_V4。
在啟用 BypassIO 的句柄上其他作業的影響
在句柄上啟用 BypassIO 不會影響其他句柄。 不過,啟用 BypassIO 之句柄上的其他作業會影響 BypassIO 的使用,例如在下列案例中:
如果您已開啟 [處理 A] 以啟用和運作 BypassIO 的檔案,且有人 (例如,另一個線程或行程) 會開啟 Handle B 來執行快取或記憶體對應的 IO,則 BypassIO 會在處理 A 上暫時暫停,直到句柄 B 關閉為止。 系統會改用傳統的 I/O 路徑,以確保不會發生過時的數據。 系統會繼續使用該句柄上的傳統 I/O 路徑,直到所有數據區段和快取對應中斷為止。 因此,篩選條件必須先關閉句柄的檔案,才能繼續 BypassIO。
如果已啟用 BypassIO 的檔案標示為疏鬆,所有 BypassIO 作業都會開始使用傳統的 I/O 路徑。
取消清除已啟用 BypassIO 的檔案會導致所有 BypassIO 作業使用傳統的 I/O 路徑。 完成分頁之後,系統會切換回該句柄上的 BypassIO 路徑。
在迷你篩選中實作 BypassIO 支援
更新您的 INF 或 MANIFEST 檔案
從 Windows 11 開始,篩選開發人員應該將SUPPORTED_FS_FEATURES_BYPASS_IO新增至驅動程式 INF 或 MANIFEST 檔案中的 SupportedFeatures。 (您可以在提升權限的命令提示字元中輸入 fltmc instances ,以查看所有使用中篩選條件的 “SprtFtrs” 值。
注意
從不支援 BypassIO 的篩選仍應該將 SUPPORTED_FS_FEATURES_BYPASS_IO 新增至其 SupportedFeatures 狀態,然後在篩選內適當地否決,並指定原因。
鼓勵小型篩選人員儘可能減少否決 BypassIO。
如果小型篩選附加至已啟用 BypassIO 的磁碟區,但該迷你篩選尚未更新其 SupportedFeatures 設定以包含 SUPPORTED_FS_FEATURES_BYPASS_IO,該磁碟區上的所有 BypassIO 作業都會立即遭到封鎖,回復到傳統的 I/O 路徑,導致遊戲效能降低。
未篩選IRP_MJ_READ或IRP_MJ_WRITE的迷你篩選會自動選擇加入 BypassIO 支援,就像在 SupportedFeatures 中新增SUPPORTED_FS_FEATURES_BYPASS_IO一樣。
如果堆疊上有附加的迷你篩選,則FS_BPIO_OP_ENABLE和FS_BPIO_OP_QUERY作業會失敗。
實作 BypassIO 要求的支援
小型篩選工具應新增 BypassIO 要求的支援,這些要求會透過 FSCTL_MANAGE_BYPASS_IO 控制程式代碼傳送。 如需詳細資訊,請參閱 支援 BypassIO 作業 。
判斷 BypassIO 是否正常運作
新增的 fsutil 命令會發出指定FS_BPIO_OP_QUERY作業FSCTL_MANAGE_BYPASS_IO。 顯示的結果會識別第一個阻止 BypassIO 的驅動程式,以及原因。
> fsutil bypassIo state /v <path>
其中 <path> 可以是磁碟區、目錄或特定檔名,而 /v 是選擇性的詳細資訊旗標。
在第一個範例中,WOF 迷你篩選不會選擇加入 BypassIO。 執行命令 fsutil bypassIo state c:\ 會產生下列輸出:
BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.
在第二個範例中,在啟用 BitLocker 的系統上執行 fsutil bypassIO state /v c:\ 會導致下列輸出:
BypassIo on "c:\" is partially supported
Volume stack bypass is disabled (fvevol.sys)
Status: 495 (The specified operation is not supported while encryption is enabled on the target object)
Reason: BitLocker Drive Encryption is enabled.
Storage Type: NVMe
Storage Driver: BypassIo compatible
Driver Name: stornvme.sys
NTFS 特定行為
您可以在 NTFS 常駐檔案上啟用 BypassIO;不過,只要檔案常駐,檔案就會採用傳統的 I/O 路徑。 如果寫入至檔案,使其不具許可權,系統會切換為使用 BypassIO 路徑。
您無法在 BypassIO 作用中檔案上啟用 NTFS 壓縮。
您可以在 BypassIO 作用中檔案上啟用 NTFS 加密。 BypassIO 已暫停。
BypassIO 不會影響卸除讀取/寫入作業。