컨텍스트 설정

새 컨텍스트를 만든 후 미니 필터 드라이버는 다음 집합 루틴 중 하나를 호출하여 개체에 연결할 수 있습니다.

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 아님)에서 설정한 참조 수를 해제합니다. 이는 컨텍스트 해제에 설명되어 있습니다.