컨텍스트 참조

필터 관리자는 참조 계산을 사용하여 미니필터 컨텍스트의 수명을 관리합니다. 참조 수는 컨텍스트의 상태를 나타내는 숫자입니다.

컨텍스트가 성공적으로 만들어지면 FltMgr은 컨텍스트의 참조 횟수를 1로 초기화합니다. 이를 컨텍스트에 대한 초기 참조 라고 합니다.

예를 들어 성공적인 컨텍스트 집합 또는 가져오기에서 컨텍스트를 참조 때마다 FltMgr은 컨텍스트의 참조 수를 하나씩 증가합니다.

컨텍스트가 더 이상 필요하지 않은 경우 해당 참조 수를 감소시켜야 합니다. 긍정 참조 수는 컨텍스트를 사용할 수 있음을 의미합니다. 참조 수가 0이 되면 컨텍스트를 사용할 수 없으며 FltMgr은 결국 해제합니다.

FltMgr은 개체가 분해될 때 컨텍스트에 대한 초기 참조를 해제하고(참조 수를 0으로 감소) 필터의 선택적 컨텍스트 정리 콜백을 호출합니다. 이 경우는 거의 발생하지 않지만 미니 필터가 해제하기 전에 개체에서 컨텍스트를 제거해야 하는 경우, 미니필터는 FltDeleteContext를 호출하여 컨텍스트에 대한 초기 참조를 안전하게 해제해야 합니다.

미니필터는 FltReferenceContext 를 호출하여 컨텍스트의 참조 수를 증가시켜 컨텍스트에 대한 자체 참조를 추가할 수 있습니다. 결국 미니필터는 FltReleaseContext를 호출하여 이 추가된 참조를 제거해야 합니다.

다음은 일반적인 개체에 대한 참조 개수 기록의 간단한 예입니다. 모든 Flt API 호출이 성공이라고 가정합니다.

필터 콜백 Flt API 호출 컨텍스트 참조 수 Description
미리 만들기 FltAllocateContext 1 필터가 사전 만들기를 처리하고 파일을 추적할 수 있다고 결정합니다. FltMgr이 참조 횟수를 1로 초기화하도록 하는 스트림 컨텍스트를 할당합니다. 필터는 CompletionContext 매개 변수를 통해 컨텍스트를 PostCreate 콜백에 전달합니다.
PostCreate FltSetStreamContext 2 필터는 PreCreate 중에 할당된 컨텍스트를 PostCreate 콜백에 전달했습니다. 만들기가 성공했기 때문에 필터가 컨텍스트를 연결하여 FltMgr이 참조 횟수를 증가시켰습니다.
PostCreate FltReleaseContext 1 FltSetStreamContext가 참조 횟수를 증가시켰기 때문에 필터는 추가 횟수를 제거해야 합니다. 필터가 컨텍스트를 해제한 후 참조 수는 1이므로 컨텍스트가 활성 상태로 유지됩니다. 필터가 결국 이 파일에 대해 신경 쓰지 않는다고 결정한 경우 FltSetStreamContext 호출을 건너뛰고 FltReleaseContext를 호출했을 수 있습니다. 이 경우 개수는 0으로 이동하고 컨텍스트의 할당이 취소되었을 것입니다.
PreRead FltGetStreamContext 2 필터는 읽기 I/O를 보고 이 파일을 추적하는지 확인하려고 합니다. 스트림 컨텍스트를 요청하고 가져오므로 이 파일을 추적하려고 한다는 것을 알 수 있습니다. FltMgr은 참조 횟수를 증분합니다.
PreRead FltReleaseContext 1 필터는 컨텍스트를 사용하여 수행되므로 필터를 해제하여 참조 수가 감소합니다. 모든 FltGet*컨텍스트FltReleaseContext와 균형이 조정되어야 합니다.
PreCleanup FltGetStreamContext 2 필터는 해당 컨텍스트를 요청하고 가져옵니다. 이 컨텍스트는 참조 횟수를 증가합니다.
PreCleanup FltReleaseContext 1 필터는 컨텍스트를 사용하여 수행되므로 이를 해제하여 참조 횟수를 감소합니다.
컨텍스트 정리 콜백 0 파일 시스템이 기본 스트림 개체를 분해하고 있습니다. 스트림 개체의 특정 경우 IRP_MJ_CLOSE 의해 중단이 트리거됩니다. FltMgr은 참조 수를 0으로 감소시키고 필터의 컨텍스트 정리 콜백을 호출합니다. 이제 필터가 컨텍스트를 클린 수 있습니다.