컨텍스트 해제
미니 필터는 FltReleaseContext를 호출하여 컨텍스트를 해제합니다. 다음 루틴 중 하나에 대한 모든 성공적인 호출은 결국 FltReleaseContext 호출과 일치해야 합니다.
컨텍스트 만들기 루틴:
컨텍스트 가져오기 루틴:
컨텍스트 집합 루틴:
컨텍스트 참조 증가 루틴:
FltSetXxx컨텍스트에서 반환된 OldContext 포인터와 FltDeleteContext에서 반환된 컨텍스트 포인터도 더 이상 필요하지 않은 경우 해제해야 합니다.
CTX 샘플 미니필터에서 가져온 다음 코드 예제에서 CtxInstanceSetup 루틴은 instance 컨텍스트를 만들고 설정한 다음 FltReleaseContext를 호출합니다.
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //Operation
instanceContext, //NewContext
NULL); //OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
FltSetInstanceContext 호출이 성공했는지 여부에 관계없이 FltReleaseContext가 호출됩니다.
FltSetInstanceContext가 성공하면 instance 컨텍스트에 자체 참조를 추가합니다(즉, instance 컨텍스트에서 참조 횟수가 증가함). 따라서 FltAllocateContext 에서 설정한 참조는 더 이상 필요하지 않으며 FltReleaseContext 를 호출하면 해당 참조가 제거됩니다.
FltSetInstanceContext가 실패하면 instance 컨텍스트에는 하나의 참조, 즉 FltAllocateContext에서 설정한 참조가 하나만 있습니다. FltReleaseContext가 반환되면 instance 컨텍스트의 참조 수가 0이고 필터 관리자가 해제합니다.