Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterownik minifiltru musi najpierw zarejestrować każdy typ kontekstu, którego używa. Gdy minifiltr zarejestrował używane typy kontekstu, może utworzyć kontekst.
Kroki rejestrowania typu kontekstu
Minifiltr wywołuje funkcję FltRegisterFilter z procedury DriverEntry w celu zarejestrowania każdego typu kontekstu, którego używa. Przed wywołaniem funkcji FltRegisterFilter sterownik minifiltru wykonuje następujące czynności:
- Tworzy tablicę struktur FLT_CONTEXT_REGISTRATION o zmiennej długości. Kolejność elementów w tej tablicy nie ma znaczenia; jednak ostatnim elementem tablicy musi być {FLT_CONTEXT_END}.
- Przechowuje wskaźnik do utworzonej tablicy w elemencie ContextRegistration struktury FLT_REGISTRATION . Minifiltr przekazuje tę strukturę w parametrze RejestracjiFltRegisterFilter.
Dla każdego typu kontekstu używanego przez sterownik minifiltru musi podać co najmniej jedną definicję kontekstu. Definicja jest w formie struktury FLT_CONTEXT_REGISTRATION , w której każda struktura definiuje typ, rozmiar i inne informacje dla kontekstu.
Gdy sterownik minifiltru wywołuje kontrolkę FltAllocateContext w celu utworzenia nowego kontekstu, menedżer filtrów używa parametru Rozmiar , a także elementów członkowskich Rozmiar i Flags struktury FLT_CONTEXT_REGISTRATION, aby wybrać definicję kontekstu do użycia:
W przypadku kontekstów o stałym rozmiarze element członkowski rozmiaru struktury FLT_CONTEXT_REGISTRATION określa rozmiar w bajtach części struktury kontekstu zdefiniowanej przez sterownik minifiltru. Maksymalny rozmiar kontekstu to MAXUSHORT (64 KB). Zero jest prawidłową wartością rozmiaru. Menedżer filtrów implementuje konteksty o stałym rozmiarze za pomocą list lookaside. Menedżer filtrów tworzy dwie listy pomocnicze dla każdej wartości rozmiaru: jedną stronicowaną i jedną niestronicowaną.
W przypadku kontekstów o zmiennym rozmiarze element członkowski rozmiaru musi być ustawiony na FLT_VARIABLE_SIZED_CONTEXTS. Menedżer filtrów przydziela konteksty o zmiennym rozmiarze bezpośrednio ze stronicowanej lub niestronicowanej puli.
W elemencie Flags struktury FLT_CONTEXT_REGISTRATION można określić flagę FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH. Jeśli sterownik minifiltru używa kontekstów o stałym rozmiarze, a ta flaga jest określona, menedżer filtrów przydziela kontekst z listy lookaside, jeśli rozmiar kontekstu jest większy lub równy żądanemu rozmiarowi. W przeciwnym razie rozmiar kontekstu musi być równy żądanemu rozmiarowi.
Dla danego typu kontekstu sterownik minifiltru może dostarczać maksymalnie trzy definicje kontekstu o stałym rozmiarze, z których każda ma inny rozmiar i jedną definicję o zmiennym rozmiarze. Aby uzyskać więcej informacji, zobacz FLT_CONTEXT_REGISTRATION.
Procedury wywołania zwrotnego minifiltru na potrzeby zarządzania kontekstem
Sterownik minifiltru może opcjonalnie podać następujące procedury wywołania zwrotnego związane z kontekstem, które są przechowywane w strukturze FLT_REGISTRATION , która jest przekazywana jako parametr do FltRegisterFilter:
| Procedura wywołania zwrotnego | Opis |
|---|---|
| PFLT_CONTEXT_ALLOCATE_CALLBACK | Bardzo rzadko minifiltr może wymagać zdefiniowania własnej procedury wywołania zwrotnego, aby przydzielić konteksty, zamiast polegać na menedżerze filtrów. |
| PFLT_CONTEXT_CLEANUP_CALLBACK | Rutyna oczyszczania minifiltru, która ma być wywołana przed zwolnieniem kontekstu. |
| PFLT_CONTEXT_FREE_CALLBACK | W bardzo rzadkich przypadkach minifiltr może wymagać zdefiniowania własnej procedury zwrotnej, aby zwolnić konteksty, zamiast polegać na menedżerze filtrów. |
Przykład kodu dotyczącego rejestracji kontekstu
Poniższy przykład kodu, który jest pobierany ze sterownika minifiltru przykładowego CTX, przedstawia tablicę struktur FLT_CONTEXT_REGISTRATION używanych do rejestrowania kontekstu wystąpienia, pliku, strumienia i obiektu pliku (uchwyt strumienia).
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 }
};