Share via


컨텍스트 형식 등록

미니필터 드라이버는 먼저 사용하는 각 유형의 컨텍스트를 등록해야 합니다. 미니필터가 사용하는 컨텍스트 형식을 등록하면 컨텍스트를 만들 수 있습니다.

컨텍스트 형식을 등록하는 단계

미니필터는 DriverEntry 루틴에서 FltRegisterFilter를 호출하여 사용하는 각 유형의 컨텍스트를 등록합니다. FltRegisterFilter를 호출하기 전에 미니필터 드라이버는 다음을 수행합니다.

  • FLT_CONTEXT_REGISTRATION 구조체의 가변 길이 배열을 만듭니다. 이 배열의 요소 순서는 중요하지 않습니다. 그러나 배열의 마지막 요소는 {FLT_CONTEXT_END}이어야 합니다.
  • 생성된 배열에 대한 포인터를 FLT_REGISTRATION 구조체의 ContextRegistration 멤버에 저장합니다. 미니 필터는 FltRegisterFilterRegistration 매개 변수에서 이 구조를 전달합니다.

미니필터 드라이버가 사용하는 각 컨텍스트 형식에 대해 하나 이상의 컨텍스트 정의를 제공해야 합니다. 정의는 각 구조체가 컨텍스트에 대한 형식, 크기 및 기타 정보를 정의하는 FLT_CONTEXT_REGISTRATION 구조체 형식입니다.

미니필터 드라이버가 FltAllocateContext 를 호출하여 새 컨텍스트를 만들 때 필터 관리자는 Size 매개 변수와 FLT_CONTEXT_REGISTRATION 구조체의 SizeFlags 멤버를 사용하여 사용할 컨텍스트 정의를 선택합니다.

  • 고정 크기 컨텍스트의 경우 FLT_CONTEXT_REGISTRATION 구조체의 Size 멤버는 미니필터 드라이버에서 정의한 컨텍스트 구조의 크기(바이트)를 지정합니다. 컨텍스트의 최대 크기는 MAXUSHORT(64KB)입니다. 0은 유효한 크기 값입니다. 필터 관리자는 lookaside 목록을 사용하여 고정 크기 컨텍스트를 구현합니다. 필터 관리자는 각 크기 값에 대해 두 개의 lookaside 목록을 만듭니다. 하나는 페이징되고 다른 하나는 페이지가 없는 목록입니다.

  • 변수 크기 컨텍스트의 경우 Size 멤버를 FLT_VARIABLE_SIZED_CONTEXTS 설정해야 합니다. 필터 관리자는 페이징된 풀 또는 비페이지 풀에서 직접 가변 크기 컨텍스트를 할당합니다.

FLT_CONTEXT_REGISTRATION 구조체의 Flags 멤버에서 FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH 플래그를 지정할 수 있습니다. 미니필터 드라이버가 고정 크기 컨텍스트를 사용하고 이 플래그를 지정하는 경우 필터 관리자는 컨텍스트의 크기가 요청된 크기보다 크거나 같은 경우 lookaside 목록에서 컨텍스트를 할당합니다. 그렇지 않으면 컨텍스트의 크기가 요청된 크기와 같아야 합니다.

지정된 컨텍스트 형식의 경우 미니필터 드라이버는 각각 크기가 다른 최대 3개의 고정 크기 컨텍스트 정의와 하나의 가변 크기 정의를 제공할 수 있습니다. 자세한 내용은 FLT_CONTEXT_REGISTRATION 참조하세요.

컨텍스트 관리를 위한 미니필터 콜백 루틴

미니필터 드라이버는 선택적으로 FltRegisterFilter에 매개 변수로 전달되는 FLT_REGISTRATION 구조에 저장된 다음과 같은 컨텍스트 관련 콜백 루틴을 제공할 수 있습니다.

콜백 루틴 Description
PFLT_CONTEXT_ALLOCATE_CALLBACK 매우 드문 경우지만 미니필터는 필터 관리자에 의존하지 않고 컨텍스트를 할당하기 위해 자체 콜백 루틴을 정의해야 할 수 있습니다.
PFLT_CONTEXT_CLEANUP_CALLBACK 컨텍스트를 해제하기 전에 호출할 미니필터의 정리 루틴입니다.
PFLT_CONTEXT_FREE_CALLBACK 매우 드문 경우지만 미니필터는 필터 관리자에 의존하지 않고 컨텍스트를 해제하기 위해 자체 콜백 루틴을 정의해야 할 수 있습니다.

컨텍스트 등록 코드 예제

CTX 샘플 미니필터 드라이버에서 가져온 다음 코드 예제에서는 instance, 파일, 스트림 및 파일 개체(스트림 핸들) 컨텍스트를 등록하는 데 사용되는 FLT_CONTEXT_REGISTRATION 구조의 배열을 보여 줍니다.

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};