컨텍스트 설정
새 컨텍스트를 만든 후 미니 필터 드라이버는 다음 집합 루틴 중 하나를 호출하여 개체에 연결할 수 있습니다.
- FltSetFileContext
- FltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
Set 루틴은 Operation 매개 변수의 값에 따라 다음을 수행합니다.
작업이 == FLT_SET_CONTEXT_KEEP_IF_EXISTS 경우:
- 미니 필터가 개체에 대해 동일한 형식의 컨텍스트를 아직 설정하지 않은 경우 다음 루틴을 설정합니다.
- 개체에 새로 할당된 컨텍스트를 연결합니다.
- 참조 수를 증분합니다.
- 미니 필터가 이미 컨텍스트를 설정한 경우 다음 루틴을 설정합니다.
- STATUS_FLT_CONTEXT_ALREADY_DEFINED 반환합니다(NTSTATUS 오류 코드).
- 기존 컨텍스트를 대체하지 않습니다.
- 참조 수를 증가시키지 않습니다.
- 기존 컨텍스트에 대한 포인터를 NULL이 아닌 경우 OldContext 매개 변수에 저장합니다. 이 포인터가 더 이상 필요하지 않으면 미니 필터 드라이버는 FltReleaseContext를 호출하여 해제해야 합니다.
- 미니 필터가 개체에 대해 동일한 형식의 컨텍스트를 아직 설정하지 않은 경우 다음 루틴을 설정합니다.
작업이 == FLT_SET_CONTEXT_REPLACE_IF_EXISTS 경우:
- set 루틴은 항상 새 컨텍스트를 개체에 연결합니다.
- 미니 필터 드라이버가 이미 컨텍스트를 설정한 경우 다음 루틴을 설정합니다.
- 기존 컨텍스트를 삭제하고, 새 컨텍스트를 설정하고, 새 컨텍스트에 대한 참조 수를 증분합니다.
- OldContext 매개 변수가 NULL이 아닌 경우 삭제된 컨텍스트에 대한 포인터를 받습니다. 이 포인터가 더 이상 필요하지 않으면 미니 필터 드라이버는 FltReleaseContext를 호출하여 해제해야 합니다.
컨텍스트 형식이 설정되면 미니 필터는 후속 I/O 작업 중에 컨텍스트를 가져와서 작업을 수행해야 하는지 여부를 결정할 수 있습니다.
성공한 모든 컨텍스트 집합은 결국 삭제되어야 합니다.
CTX 샘플 미니 필터에서 가져온 다음 코드 예제에서 CtxInstanceSetup 루틴은 인스턴스 컨텍스트를 만들고 설정합니다.
status = FltAllocateContext(
FltObjects->Filter, //in: Filter
FLT_INSTANCE_CONTEXT, //in: ContextType
CTX_INSTANCE_CONTEXT_SIZE, //in: ContextSize
NonPagedPool, //in: PoolType
&instanceContext); //out: ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //in: Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //in: Operation
instanceContext, //in: NewContext
NULL); //out: OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
FltSetInstanceContext를 호출한 후에 FltReleaseContext를 호출하여 FltAllocateContext(FltSetInstanceContext 아님)에서 설정한 참조 수를 해제합니다. 이는 컨텍스트 해제에 설명되어 있습니다.