共用方式為


註冊內容類型

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

註冊內容類型的步驟

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

  • 建立 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

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

迷你篩選驅動程式可以選擇性地提供下列內容相關的回呼例程,這些例程會儲存在傳遞為參數給 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 }
};