設定內容
建立新的內容之後,迷你篩選驅動程式可以呼叫下列其中一個集合例程,將其附加至物件:
- FltSetFileContext
- FltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
Set 例程會根據 Operation 參數的值執行下列動作:
如果作業 == FLT_SET_CONTEXT_KEEP_IF_EXISTS:
- 如果迷你篩選程式尚未為 物件設定相同類型的內容,則 set 例程:
- 將新配置的內容附加至物件。
- 遞增參考計數。
- 如果迷你篩選程序已經設定內容,則為 set 例程:
- 傳回STATUS_FLT_CONTEXT_ALREADY_DEFINED (NTSTATUS 錯誤碼)。
- 不會取代現有的內容。
- 不會遞增參考計數。
- 如果 OldContext 參數不是 NULL,則會將指標儲存在 OldContext 參數中。 不再需要此指標時,迷你篩選驅動程式必須藉由呼叫 FltReleaseContext 來釋放它。
- 如果迷你篩選程式尚未為 物件設定相同類型的內容,則 set 例程:
如果作業 == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:
- set 例程一律會將新內容附加至 物件。
- 如果迷你篩選驅動程式已經設定內容,則設定例程:
- 刪除現有的內容、設定新內容,並遞增新內容的參考計數。
- 如果 OldContext 參數不是 NULL,它會接收已刪除內容的指標。 不再需要此指標時,迷你篩選驅動程式必須藉由呼叫 FltReleaseContext 來釋放它。
設定內容類型之後,迷你篩選程式可以在 後續的 I/O 作業期間取得內容 ,以判斷是否需要採取任何動作。
最終必須 刪除每個成功的內容集。
在下列程式代碼範例中,CtxInstanceSetup 例程會建立及設定實例內容,從 CTX 範例迷你篩選中取得:
status = FltAllocateContext(
FltObjects->Filter, //in: Filter
FLT_INSTANCE_CONTEXT, //in: ContextType
CTX_INSTANCE_CONTEXT_SIZE, //in: ContextSize
NonPagedPool, //in: PoolType
&instanceContext); //out: ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //in: Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //in: Operation
instanceContext, //in: NewContext
NULL); //out: OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
請注意,呼叫 FltSetInstanceContext 之後,會呼叫 FltReleaseContext 來釋放 FltAllocateContext 所設定的參考計數(而非 FltSetInstanceContext)。 這會在發行內容中說明。