다음을 통해 공유


컨텍스트 해제

미니 필터는 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이고 필터 관리자가 해제합니다.