FltCreateSectionForDataScan 函式 (fltkernel.h)
FltCreateSectionForDataScan 例程會建立檔案的區段物件。 篩選管理員可以選擇性地同步處理 I/O 與建立的區段。
語法
NTSTATUS FLTAPI FltCreateSectionForDataScan(
[in] PFLT_INSTANCE Instance,
[in] PFILE_OBJECT FileObject,
[in] PFLT_CONTEXT SectionContext,
[in] ACCESS_MASK DesiredAccess,
[in, optional] POBJECT_ATTRIBUTES ObjectAttributes,
[in, optional] PLARGE_INTEGER MaximumSize,
[in] ULONG SectionPageProtection,
[in] ULONG AllocationAttributes,
[in] ULONG Flags,
[out] PHANDLE SectionHandle,
[out] PVOID *SectionObject,
[out, optional] PLARGE_INTEGER SectionFileSize
);
參數
[in] Instance
要擷取其內容之迷你篩選驅動程序實例的不透明實例指標。
[in] FileObject
開啟檔案的檔案物件。 區段物件將由指定的檔案支援。 這個參數是必要的,而且不能是 NULL。
[in] SectionContext
先前配置的區段內容的指標。
[in] DesiredAccess
區段物件的存取類型,做為下列一或多個 ACCESS_MASK 旗標。
旗 | 允許呼叫端 |
---|---|
SECTION_MAP_READ | 讀取區段的檢視。 |
SECTION_MAP_WRITE | 撰寫區段的檢視。 |
SECTION_QUERY | 查詢區段物件以取得區段的相關信息。 驅動程式應該設定此旗標。 |
SECTION_ALL_ACCESS | 先前旗標以及STANDARD_RIGHTS_REQUIRED所定義的所有動作。 如需STANDARD_RIGHTS_REQUIRED的詳細資訊,請參閱 ACCESS_MASK。 |
[in, optional] ObjectAttributes
指定物件名稱和其他屬性之選擇性 OBJECT_ATTRIBUTES 結構的指標。 使用 InitializeObjectAttributes 巨集來初始化這個結構。
[in, optional] MaximumSize
此參數保留供日後使用。
[in] SectionPageProtection
要放在 區段中每個頁面的保護。 指定下列其中一個值。 這是必要參數,不能為零。
旗 | 意義 |
---|---|
PAGE_READONLY | 啟用頁面認可區域的唯讀存取。 嘗試寫入認可的區域會導致存取違規。 如果系統區分只讀存取和執行存取權,則嘗試在認可的區域中執行程式代碼會導致存取違規。 |
PAGE_READWRITE | 啟用頁面認可區域的讀取和寫入存取權。 |
[in] AllocationAttributes
SEC_XXX 旗標的位掩碼會決定 區段的配置屬性。 指定下列一或多個值。 這是必要參數,不能為零。
旗 | 意義 |
---|---|
SEC_COMMIT | 配置記憶體中的實體記憶體,或在磁碟上的分頁檔案中配置區段的所有頁面。 這是預設設定。 請注意,此旗標是必要的,因此無法省略。 |
SEC_FILE | FileObject 參數所指定的檔案是對應的檔案。 |
[in] Flags
此參數保留供日後使用。
[out] SectionHandle
接收區段不透明句柄之呼叫端配置的變數指標。 根據預設,區段句柄是使用者句柄。 如果呼叫端需要核心句柄,則必須在已設定OBJ_KERNEL_HANDLE旗標的 ObjectAttributes 參數中傳入初始化 OBJECT_ATTRIBUTES 結構的指標。
[out] SectionObject
呼叫端配置的變數指標,接收區段物件的不透明指標。
[out, optional] SectionFileSize
呼叫端配置的變數指標,這個變數會在建立區段物件時接收檔案的大小,以位元組為單位。 這個參數是選擇性的,而且可以是 NULL。
傳回值
FltCreateSectionForDataScan 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項。
傳回碼 | 描述 |
---|---|
STATUS_END_OF_FILE | FileObject 參數所指定的檔案大小為零。 |
STATUS_FILE_LOCK_CONFLICT | FileObject 參數指定的檔案已鎖定。 |
STATUS_INSUFFICIENT_RESOURCES | FltCreateSectionForDataScan 發生集區配置失敗。 |
STATUS_INVALID_FILE_FOR_SECTION | FileObject 參數指定的檔案不支援區段。 |
STATUS_INVALID_PARAMETER | 未註冊迷你篩選。 |
STATUS_INVALID_PARAMETER_8 | SectionPageProtection 參數指定的值無效。 |
STATUS_INVALID_PARAMETER_9 | 呼叫端為 AllocationAttributes 參數指定了無效的值。 |
STATUS_NOT_SUPPORTED | 附加至這個實例的磁碟區不支援區段內容。 |
STATUS_PRIVILEGE_NOT_HELD | 呼叫端沒有建立區段物件的必要許可權,其存取權在 desiredAccess 參數 |
STATUS_FILE_IS_A_DIRECTORY | FileObject 參數所指定的檔案是目錄。 |
STATUS_FLT_CONTEXT_ALREADY_DEFINED | Instance 所指定的篩選實例 已經有數據流的開啟區段。 每個數據流只支援一個區段,因此支援每個實例。 |
言論
在呼叫 FltCreateSectionForDataScan之前,小型篩選程式必須先 呼叫 fltRegisterForDataScan來註冊其磁碟區以進行數據掃描。 如同其他篩選內容元素,SectionContext 會先設定 FltAllocateContext。
句柄可以是使用者句柄或核心句柄。 在 OBJECT_ATTRIBUTES 結構中設定OBJ_KERNEL_HANDLE建立的句柄,ObjectAttributes 指向 的句柄是核心句柄,而且只能從核心模式存取。 在沒有OBJ_KERNEL_HANDLE旗標的情況下建立的句柄是使用者句柄,可從使用者或核心模式存取。 篩選條件可以建立使用者句柄,然後將它傳遞至使用者模式應用程式進行處理。 例如,病毒掃描引擎可以存在於使用者模式應用程式中,並從檔案系統篩選器傳送使用者句柄。
在某些情況下,持有區段開啟與目前的檔案 I/O 不相容。 特別是,如果因為開啟區段而防止快取清除,觸發快取清除的檔案 I/O 可能會導致快取不一致。 小型篩選程式可以提供選擇性的回呼例程來通知這些事件的通知。 迷你篩選驅動程式會實作 PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK 來接收這些通知。 如果註冊迷你篩選程式時,FLT_REGISTRATION 的 SectionNotificationCallback 成員設為此回呼例程,就會啟用衝突通知。 收到通知時,區段可以關閉,以允許衝突的 I/O 作業繼續。
注意
FltCreateSectionForDataScan 傳回之前,可能會發生區段通知回呼。 迷你篩選必須能夠接收回呼,並處理 SectionHandle 和 SectionObject 無效的情況。
當這個例程所建立的 section 物件不再需要時,請務必藉由呼叫
如需建立記憶體對應區段和檢視的概觀資訊,請參閱 區段物件和檢視。 此外,請參閱 Microsoft Windows SDK 中 CreateFileMapping 例程的檔。
重要
Minifilters 不得明確刪除傳遞至 FltCreateSectionForDataScan的區段內容。 在區段內容傳遞 至 fltCreateSectionForDataScan之後,請勿呼叫 FltDeleteContext 。 在此案例中,區段內容會藉由呼叫 FltCloseSectionForDataScan,從數據流中移除。
一般而言,應該將區段建立為唯讀。 特別是,如果只讀檔案位於交易中,而且小型篩選程式不會建立只讀區段,則會捨棄對區段的寫入,而且不會包含在交易中。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 8 |
目標平臺 | 普遍 |
標頭 | fltkernel.h (包括 Fltkernel.h) |
連結庫 | FltMgr.lib |
IRQL | <= APC_LEVEL |