컨텍스트 삭제
FltSetXxx컨텍스트 호출에 의해 설정된 모든 컨텍스트는 결국 삭제되어야 합니다.
필터 관리자는 다음 상황이 발생할 때 컨텍스트를 자동으로 삭제합니다.
- 컨텍스트가 연결된 개체가 삭제됩니다.
- 볼륨에서 분리된 미니필터 instance
- 미니필터 드라이버가 언로드됨
따라서 미니필터가 컨텍스트를 명시적으로 삭제할 필요는 거의 없습니다.
미니필터는 다음 컨텍스트 삭제 루틴 중 하나를 호출하여 컨텍스트를 삭제할 수 있습니다.
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
컨텍스트는 현재 개체에 대해 설정된 경우에만 삭제할 수 있습니다. 아직 설정되지 않았거나 이미 FltSetXxx컨텍스트에 대한 성공적인 호출로 대체된 경우 컨텍스트를 삭제할 수 없습니다.
OldContext가 NULL이 아니고 NULL_CONTEXT 가리키지 않는 경우 FltDeleteXxx컨텍스트 루틴은 OldContext 매개 변수의 이전 컨텍스트에 대한 포인터를 반환합니다. OldContext가 NULL인 경우 필터 관리자는 컨텍스트에 대한 참조 수를 감소시킨 다음 미니필터에 미해결 참조가 없는 한 해제됩니다.
다음 코드 예제에서는 스트림 컨텍스트를 삭제하는 방법을 보여줍니다.
status = FltDeleteStreamContext(
FltObjects->Instance, //Instance
FltObjects->FileObject, //FileObject
&oldContext); //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
FltReleaseContext(oldContext);
}
이 예제에서는 FltDeleteStreamContext:
- 스트림에서 스트림 컨텍스트를 제거합니다.
- OldContext 매개 변수가 NULL이 아니므로 컨텍스트의 참조 수가 감소하지 않습니다.
- OldContext 매개 변수에서 삭제된 컨텍스트(스트림에서 제거된 컨텍스트)의 주소를 반환합니다.
NULL이 아닌 OldContext 매개 변수로 인해 필요한 처리를 수행한 후 필터는 FltReleaseContext를 호출하여 삭제된 컨텍스트를 해제해야 합니다.