Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Deweloperzy są zachęcani do przenoszenia starszych sterowników filtrów do modelu menedżera filtrów, aby uzyskać lepsze funkcje sterowników filtrów i zwiększyć niezawodność systemu. Doświadczeni deweloperzy powinni uznać to za stosunkowo łatwe, aby przeportować stary sterownik filtru do sterownika minifiltru. Deweloperzy sterowników filtrów w firmie Microsoft zalecają następujące podejście:
Zacznij od niezawodnego zestawu testów regresji, aby zweryfikować zachowanie starszego sterownika filtru i sterownika minifiltru portowego.
Utwórz powłokę sterownika minifiltru i systematyczne przenoszenie funkcji ze starszego sterownika filtru do sterownika minifiltru. Na przykład, uruchom działanie załącznika, a następnie przenoś jedną operację na raz, testując po każdej operacji.
Zmień komunikację w trybie użytkownika/trybie jądra na końcu, aby móc użyć istniejących narzędzi do przetestowania sterownika minifiltru.
Skompiluj z użyciem PREfast i przetestuj, włączając opcję weryfikacji I/O w Weryfikatorze filtra w Weryfikatorze sterownika.
Podczas procesu przenoszenia należy przejrzeć cały starszy kod sterownika filtru, aby w pełni wykorzystać możliwości menedżera filtrów. W szczególności należy pamiętać o następujących kwestiach:
Operacje we/wy oparte na IRP i szybkie operacje we/wy mogą być realizowane w ramach tej samej operacji, gdy to odpowiednie, co pomaga zmniejszyć duplikację kodu.
Podczas rejestrowania operacji sterownik minifiltru może jawnie zignorować wszystkie operacje wejścia/wyjścia związane ze stronicowaniem i buforowaniem, co eliminuje potrzebę sprawdzania kodu.
Powiadomienia o wystąpieniach znacznie upraszczają logikę dołączania/odłączania.
Zarejestruj się tylko w przypadku operacji, które musi obsługiwać sterownik minifiltru; możesz zignorować wszystkie inne elementy.
Skorzystaj z obsługi zarządzania kontekstami i nazwami menedżera filtrów.
Skorzystaj z obsługi menedżera filtrów do realizowania nierekurencyjnych operacji we/wy.
W przeciwieństwie do starszych sterowników filtrów sterowniki minifiltrów nie mogą polegać na zmiennych lokalnych w celu zachowania kontekstu od przetwarzania wstępnego do przetwarzania pooperacyjnego. Rozważ przydzielenie listy lookaside do przechowywania stanu operacji.
Pamiętaj, aby zwolnić odwołania po zakończeniu korzystania z nazwy lub kontekstu.
Porty kompletacji w trybie użytkownika dodają zaawansowaną technikę tworzenia kolejek. Prawdopodobnie będzie potrzebne tylko jedno połączenie z jednym nazwanym portem.
W poniższej tabeli wymieniono typowe operacje w starszym sterowniku filtru i sposób mapowania ich na model menedżera filtrów.
| Starszy model sterownika filtru | Model menedżera filtrów |
|---|---|
Operacja przekazywania bez procedury uzupełniania |
Jeśli sterownik minifiltru nigdy nie obsługuje tego typu operacji we/wy, nie rejestruj procedury przedoperacyjnej ani procedury wywołania zwrotnego po operacji dla tej operacji. W przeciwnym razie zwróć FLT_PREOP_SUCCESS_NO_CALLBACK z zarejestrowanej procedury wywołania przedoperacyjnego dla tej operacji. |
Operacja przekazywania z procedurą uzupełniania |
Zwróć FLT_PREOP_SUCCESS_WITH_CALLBACK z procedury wywołania zwrotnego przedoperacji. |
Operacja oczekująca w funkcji wywołania zwrotnego przed operacją |
Wywołaj FltLockUserBuffer zgodnie z potrzebami, aby upewnić się, że bufory użytkownika są prawidłowo zablokowane, aby można było uzyskać do nich dostęp w wątku roboczym. Dodaj pracę do wątku roboczego, wywołując funkcje pomocnicze, takie jak FltAllocateDeferredIoWorkItem i FltQueueDeferredIoWorkItem. Zwróć FLT_PREOP_PENDING z procedury przedoperacyjnego wywołania zwrotnego. Gdy wszystko będzie gotowe do zwrócenia operacji we/wy do menedżera filtrów, wywołaj metodę FltCompletePendedPreOperation. Zobacz Oczekiwanie na operację I/O w procedurze wywołania zwrotnego przed operacją. |
Operacja pend w procedurze wywołania zwrotnego pooperacji |
W procedurze wywołania zwrotnego przedoperacyjnym wywołaj metodę FltLockUserBuffer, aby upewnić się, że bufory użytkownika są prawidłowo zablokowane, aby można było uzyskać do nich dostęp w wątku pracownika. Kolejkowanie zadania do wątku roboczego przez wywołanie rutyn wsparcia, takich jak FltAllocateGenericWorkItem i FltQueueGenericWorkItem. Zwróć FLT_POSTOP_MORE_PROCESSING_REQUIRED z rutyny wywołania zwrotnego po operacji. Gdy będziesz gotowy, aby zwrócić operację we/wy do menedżera filtrów, wywołaj metodę FltCompletePendedPostOperation. Zobacz Oczekiwanie na operację we/wy w procedurze wywołania zwrotnego po operacji. |
Synchronizowanie operacji |
Zwróć FLT_PREOP_SYNCHRONIZE z procedury wywołania zwrotnego przed operacją. Zobacz Zwracanie FLT_PREOP_SYNCHRONIZE. |
Ukończ operację w rutynie wywołania zwrotnego wstępnej operacji |
Ustaw ostateczny stan operacji i informacje w elemencie członka IoStatus struktury FLT_CALLBACK_DATA dla operacji. Zwróć FLT_PREOP_COMPLETE z rutyny wywołania zwrotnego przedoperacyjnego. Zobacz Kończenie operacji we/wy w funkcji wywołania zwrotnego przed operacją. |
Dokończ operację po jej zawieszeniu w procedurze wywołania zwrotnego przedoperacyjnej. |
Ustaw końcowy stan operacji i informacje w członku IoStatus struktury FLT_CALLBACK_DATA dla operacji. Wywołaj funkcję FltCompletePendedPreOperation z wątku roboczego przetwarzającego operację we/wy, przekazując FLT_PREOP_COMPLETE jako parametr CallbackStatus. Zobacz Realizacja operacji we/wy w procedurze wywołania zwrotnego przed operacją. |
Wykonaj wszystkie zadania ukończenia w rutynie ukończenia |
Zwróć FLT_POSTOP_FINISHED_PROCESSING z wywołania zwrotnego procedury pooperacyjnej. |
Wykonuj pracę zakończeniową na bezpiecznym poziomie IRQL |
Wywołaj FltDoCompletionProcessingWhenSafe z procedury wywołania zwrotnego po zakończeniu operacji. Zobacz Zapewnianie, że przetwarzanie uzupełniania jest wykonywane w bezpiecznym IRQL. |
Zasygnalizować zdarzenie z procedury zakończenia |
Zwróć FLT_PREOP_SYNCHRONIZE z procedury wywołania zwrotnego w preoperacji dla tej operacji. Menedżer filtrów wywołuje procedurę wywołania zwrotnego pooperacji w tym samym kontekście wątku, co procedura wywołania zwrotnego przedoperacji, na poziomie IRQL <= APC_LEVEL. Zobacz Zwracanie FLT_PREOP_SYNCHRONIZE. |
Niepowodzenie pomyślnej operacji tworzenia |
Wywołaj FltCancelFileOpen z procedury zwrotnej po operacji tworzenia. Ustaw odpowiednią wartość błędu NTSTATUS w elemencie IoStatus członkowskim struktury FLT_CALLBACK_DATA dla operacji. Zwróć FLT_POSTOP_FINISHED_PROCESSING. Zobacz Nieudane operacje we/wy w procedurze wywołania zwrotnego po operacji. |
Nie zezwalaj na operacje wejścia/wyjścia przez szybką ścieżkę dla operacji wejścia/wyjścia. |
Zwróć FLT_STATUS_DISALLOW_FAST_IO z funkcji wywołania zwrotnego przed operacją dla operacji. |
Modyfikowanie parametrów operacji we/wy |
Ustaw zmodyfikowane wartości parametrów w elemencie Iopb struktury FLT_CALLBACK_DATA dla operacji. Oznacz strukturę FLT_CALLBACK_DATA jako zanieczyszczoną, wywołując metodę FltSetCallbackDataDirty, z wyjątkiem sytuacji, gdy zawartość elementu członkowskiego IoStatus struktury FLT_CALLBACK_DATA została zmodyfikowana. |
Zablokuj bufor użytkownika na czas operacji |
Skorzystaj z technik i wskazówek opisanych w Dostęp do buforów użytkownika dla operacji wejścia/wyjścia. |