Udostępnij za pośrednictwem


Tworzenie kontekstów

Gdy minifiltr zarejestrował używane typy kontekstu, może utworzyć kontekst, wywołując FltAllocateContext. Ta rutyna wybiera odpowiednią definicję kontekstu do użycia zgodnie z kryteriami opisanymi w Rejestrowanie typów kontekstu.

Przed przydzielaniem kontekstu i podjęciem próby jego ustawienia minifiltr może wywołać następujące procedury, aby określić, czy podstawowy system plików obsługuje konteksty pliku, strumienia lub uchwytu strumienia.

W poniższym przykładzie kodu, zaczerpniętym ze sterownika przykładowego minifiltru CTX, procedura CtxInstanceSetup wywołuje FltAllocateContext w celu utworzenia kontekstu wystąpienia:

status = FltAllocateContext(
      FltObjects->Filter,           //Filter
      FLT_INSTANCE_CONTEXT,         //ContextType
      CTX_INSTANCE_CONTEXT_SIZE,    //ContextSize
      NonPagedPool,                 //PoolType
      &instanceContext);            //ReturnedContext

W przykładzie CTX następująca definicja kontekstu jest rejestrowana dla kontekstów wystąpień:

{ FLT_INSTANCE_CONTEXT,              //ContextType
  0,                                 //Flags
  CtxContextCleanup,                 //ContextCleanupCallback
  CTX_INSTANCE_CONTEXT_SIZE,         //Size
  CTX_INSTANCE_CONTEXT_TAG },        //PoolTag

Definicja kontekstu ma stały rozmiar, ponieważ człon Rozmiar wynosi CTX_INSTANCE_CONTEXT_SIZE (w przeciwieństwie do FLT_VARIABLE_SIZED_CONTEXTS, który służy do wskazywania definicji kontekstu o zmiennym rozmiarze). Należy pamiętać, że flaga FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH nie jest ustawiona w elemencie flagi. W takim przypadku, jeśli wartość parametru ContextSize w FltAllocateContext odpowiada wartości członka Size w definicji kontekstu, FltAllocateContext przydziela kontekst instancji z odpowiedniej niestronicowanej listy lookaside. Jeśli wartości nie są zgodne, FltAllocateContext kończy się niepowodzeniem z zwracaną wartością STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND.

W przypadku powodzenia FltAllocateContext ustawia licznik odwołań w nowym kontekście na jeden. Gdy kontekst nie jest już potrzebny, sterownik minifiltru musi zwolnić tę referencję. W związku z tym, każde wywołanie FltAllocateContext musi być uzupełnione kolejnym wywołaniem FltReleaseContext.

Po utworzeniu kontekstu minifiltr może ustawić go dla obiektu.