PREFETCH_OPEN_ECP_CONTEXT結構 (ntifs.h)
PREFETCH_OPEN_ECP_CONTEXT 結構會傳達預先擷取器是否在檔案上執行指定的開啟要求。
語法
typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
PVOID Context;
} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;
成員
Context
與開啟要求相關聯的不透明內容的指標。
言論
預先擷取是操作系統的元件,與快取管理員和記憶體管理員緊密整合,讓磁碟存取更有效率,因而改善效能。 如果其他元件干擾預先擷取,系統效能會降低,而且可能會死結。 因此,預先擷取會將 PREFETCH_OPEN_ECP_CONTEXT 結構附加至檔案,以傳達預先擷取程式在該檔案上已執行開啟的要求。 預先擷取會在呼叫 FltCreateFileEx2 或 IoCreateFileEx 例程中使用 GUID_ECP_PREFETCH_OPEN GUID 來附加 PREFETCH_OPEN_ECP_CONTEXT 結構。 文件系統篩選驅動程式 (filter) 可以呼叫 FltFindExtraCreateParameter,以判斷 PREFETCH_OPEN_ECP_CONTEXT 是否附加至檔案,然後採取適當的動作。 篩選條件應該呼叫 FltIsEcpFromUserMode 例程,以判斷 PREFETCH_OPEN_ECP_CONTEXT 內容結構是否源自核心模式。 若要防止惡意應用程式詐騙預先擷取,如果篩選源自使用者模式,則不應該接受 PREFETCH_OPEN_ECP_CONTEXT。
在預先擷取將 PREFETCH_OPEN_ECP_CONTEXT 結構附加至檔案之後,檔案的所有其他預先擷取活動都會牽涉到已附加 PREFETCH_OPEN_ECP_CONTEXT 的檔案物件。 如果篩選必須識別建立要求以外的預先擷取文件系統要求,篩選應該維護自己的狀態(例如,篩選管理員處理內容)。 篩選條件會維護自己的狀態,以判斷特定檔案物件是否為預先擷取檔案物件。
記憶體管理員可以快取預先擷取檔案物件。 記憶體管理員接著可以使用預先擷取檔案物件,讓其他使用快取管理員執行對應 I/O 或快取 I/O 的應用程式。 因此,預先擷取檔案物件可用於在預先擷取程式關閉其句柄之前或之後分頁 I/O。 即使預先擷取器永遠不會寫入任何數據,這個分頁 I/O 也可以包含分頁寫入。 分頁寫入是由其他應用程式所產生。 記憶體管理員會使用其快取的預先擷取檔案物件,從應用程式寫入數據。 因此,篩選會執行分頁寫入所觸發的工作,即使分頁寫入位於預先擷取檔案物件上,篩選仍應該執行該工作。
當篩選判斷清除作業發生在預先擷取檔案物件上時,篩選不應該再將檔案物件視為預先擷取開啟。
以下是預先擷取程式執行的常見作業(不過,在這些作業中,預先擷取器永遠不會變更檔案內容):
- 磁碟區開啟並關閉
- 檔案開啟並關閉
- 查詢檔案資訊
- 設定檔案資訊 (只有指示檔案系統不要更新上次開啟的存取時間)
- 建立映像和數據區段
- 執行異步分頁 I/O
若要避免產生可能的死結情況,篩選應該:
- 絕對不要封鎖任何預先擷取作業。
- 透過 傳遞預先擷取作業,而不發出其他文件系統要求。
若要讓任何應用程式或驅動程式存取要預先擷取的任何數據,它必須開啟自己的檔案句柄,或建立區段或兩者。
如需如何使用 ECP 將其他資訊與檔案上的 IRP_MJ_CREATE 作業產生關聯的詳細資訊,請參閱 搭配使用額外建立參數搭配IRP_MJ_CREATE作業。
PREFETCH_OPEN_ECP_CONTEXT 結構是唯讀的。 您應該使用它來擷取預先擷取器開啟 ECP 的相關信息。 如需此問題的詳細資訊,請參閱 System-Defined ECP。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows Vista |
標頭 | ntifs.h (include Ntifs.h) |