註冊內容類型
迷你篩選驅動程式必須先註冊它所使用的每種內容類型。 一旦迷你篩選器註冊其使用的內容類型之後,就可以 建立內容。
註冊內容類型的步驟
迷你篩選會從其 DriverEntry 例程呼叫 FltRegisterFilter,以註冊它所使用的每種內容類型。 呼叫 FltRegisterFilter 之前,minifilter 驅動程序會執行下列動作:
- 建立 FLT_CONTEXT_REGISTRATION 結構的可變長度陣列。 此陣列中的項目順序並不重要;不過,陣列中的最後一個項目必須是 {FLT_CONTEXT_END}。
- 將所建立陣列的指標儲存在 FLT_REGISTRATION 結構的ContextRegistration成員中。 迷你篩選會在 FltRegisterFilter 的 Registration 參數中傳遞這個結構。
針對迷你篩選驅動程式所使用的每個內容類型,它必須至少提供一個內容定義。 定義的格式為 FLT_CONTEXT_REGISTRATION 結構,其中每個結構都會定義內容的類型、大小和其他資訊。
當迷你篩選驅動程式呼叫 FltAllocateContext 來建立新的內容時,篩選管理員會使用 Size 參數,以及FLT_CONTEXT_REGISTRATION結構的 Size 和 Flags 成員,來選取要使用的內容定義:
對於固定大小內容,FLT_CONTEXT_REGISTRATION 結構的 Size 成員會指定迷你篩選驅動程式所定義之內容結構部分的大小,以位元組為單位。 內容的大小上限為 MAXUSHORT (64 KB) 。 零是有效的大小值。 篩選管理員會使用 lookaside 清單來實作固定大小的內容。 篩選管理員會為每個大小值建立兩個外觀清單:一個分頁和一個非分頁。
對於可變大小內容, Size 成員必須設定為 FLT_VARIABLE_SIZED_CONTEXTS。 篩選管理員會直接從分頁或非分頁集區配置可變大小的內容。
在 FLT_CONTEXT_REGISTRATION 結構的 Flags 成員中,可以指定FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH旗標。 如果迷你篩選驅動程式使用固定大小的內容並指定此旗標,則篩選管理員會在內容的大小大於或等於要求的大小時,從 lookaside 清單中配置內容。 否則,內容的大小必須等於要求的大小。
針對指定的內容類型,迷你篩選驅動程式最多可提供三個固定大小的內容定義,每個定義大小不同,以及一個可變大小定義。 如需詳細資訊,請參閱 FLT_CONTEXT_REGISTRATION。
內容管理的迷你篩選回呼例程
迷你篩選驅動程式可以選擇性地提供下列內容相關的回呼例程,這些例程會儲存在傳遞為參數給 FltRegisterFilter的 FLT_REGISTRATION 結構中:
回呼常式 | Description |
---|---|
PFLT_CONTEXT_ALLOCATE_CALLBACK | 在非常罕見的情況下,迷你篩選程式可能需要定義自己的回呼例程來配置內容,而不是依賴篩選管理員。 |
PFLT_CONTEXT_CLEANUP_CALLBACK | 在釋放內容之前,要呼叫的迷你篩選清除例程。 |
PFLT_CONTEXT_FREE_CALLBACK | 在非常罕見的情況下,迷你篩選程式可能需要定義自己的回呼例程來釋放內容,而不是依賴篩選管理員。 |
內容註冊程式代碼範例
下列程式代碼範例取自 CTX 範例迷你篩選驅動程式,顯示用來註冊實例、檔案、數據流和檔案物件的 FLT_CONTEXT_REGISTRATION 結構數位, (數據流句柄) 內容。
const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
{ FLT_INSTANCE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_INSTANCE_CONTEXT_SIZE, //Size
CTX_INSTANCE_CONTEXT_TAG //PoolTag
},
{ FLT_FILE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_FILE_CONTEXT_SIZE, //Size
CTX_FILE_CONTEXT_TAG //PoolTag
},
{ FLT_STREAM_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_STREAM_CONTEXT_SIZE, //Size
CTX_STREAM_CONTEXT_TAG //PoolTag
},
{ FLT_STREAMHANDLE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_STREAMHANDLE_CONTEXT_SIZE, //Size
CTX_STREAMHANDLE_CONTEXT_TAG //PoolTag
},
{ FLT_CONTEXT_END }
};