共用方式為


註冊內容類型

迷你篩選驅動程式必須先註冊它所使用的每種內容類型。 一旦小型篩選器註冊其使用的內容類型,就可以 建立內容

註冊內容類型的步驟

迷你篩選程式會從其 DriverEntry 例程呼叫 FltRegisterFilter,以註冊它所使用的每種內容類型。 在呼叫 FltRegisterFilter 之前,迷你篩選驅動程式會執行下列動作:

  • 建立 FLT_CONTEXT_REGISTRATION 結構的可變長度陣列。 此陣列中的元素順序並不重要;不過,陣列中的最後一個項目必須是 {FLT_CONTEXT_END}。
  • 將所建立陣列的指標儲存在 FLT_REGISTRATION 結構的ContextRegistration成員中。 迷你篩選會在 FltRegisterFilterRegistration 參數中傳遞這個結構。

針對迷你篩選驅動程式所使用的每個內容類型,它至少必須提供一個內容定義。 定義的形式是 FLT_CONTEXT_REGISTRATION 結構,其中每個結構都會定義內容的類型、大小和其他資訊。

當迷你篩選驅動程式呼叫 FltAllocateContext 來建立新內容時,篩選管理員會使用 Size 參數,以及FLT_CONTEXT_REGISTRATION結構的 SizeFlags 成員,來選取要使用的內容定義:

  • 對於固定大小內容,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

內容管理的迷你篩選回呼例程

迷你篩選驅動程式可以選擇性地提供下列與內容相關的回呼例程,這些回呼例程儲存在FLT_REGISTRATION結構中,該結構作為參數傳遞給FltRegisterFilter

回呼例程 說明
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 }
};