미니 필터는 FltReleaseContext를 호출하여 컨텍스트를 해제합니다. 다음 루틴 중 하나에 대한 모든 성공적인 호출은 결국 FltReleaseContext 호출과 일치해야 합니다.
컨텍스트 만들기 루틴:
- FltAllocateContext
컨텍스트 가져오기 루틴:
- fltGetInstanceContext
- fltGetFileContext
- FltGetStreamContext
- FltGetStreamHandleContext
- fltGetTransactionContext
- FltGetVolumeContext
컨텍스트 설정 루틴:
- FltSetFileContext
- fltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
컨텍스트 참조 증가 루틴:
FltSetXxx컨텍스트에서 반환된 OldContext 포인터와 FltDeleteContext에서 반환된 컨텍스트 포인터도 더 이상 필요하지 않은 경우 해제해야 합니다.
CTX 샘플 미니 필터에서 가져온 다음 코드 예제에서 CtxInstanceSetup 루틴은 인스턴스 컨텍스트를 만들고 설정한 다음 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가 성공하면 인스턴스 컨텍스트에 자체 참조를 추가합니다(즉, 인스턴스 컨텍스트에서 참조 횟수가 증가함). 따라서 FltAllocateContext 에서 설정한 참조는 더 이상 필요하지 않으며 FltReleaseContext 를 호출하면 제거됩니다.
FltSetInstanceContext가 실패하면 인스턴스 컨텍스트에는 하나의 참조, 즉 FltAllocateContext에서 설정한 참조가 하나만 있습니다. FltReleaseContext가 반환되면 인스턴스 컨텍스트의 참조 개수는 0이며 필터 관리자가 해제합니다.