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.
Sterowniki stanowią znaczną część całkowitego kodu wykonywanego w trybie jądra. Sterownik trybu jądra jest w efekcie składnikiem systemu operacyjnego. W związku z tym sterowniki, które są niezawodne i bezpieczne, znacząco przyczyniają się do ogólnej wiarygodności systemu operacyjnego. Aby utworzyć niezawodny sterownik trybu jądra, postępuj zgodnie z następującymi wytycznymi:
Poprawnie zabezpieczaj obiekty urządzenia.
Dostęp użytkownika do sterowników i urządzeń systemu jest kontrolowany przez deskryptory zabezpieczeń przypisywane przez system do obiektów urządzeń. Najczęściej system ustawia parametry zabezpieczeń urządzenia podczas instalowania urządzenia. Aby uzyskać więcej informacji, zobacz Tworzenie bezpiecznych instalacji urządzeń. Czasami konieczne jest, aby kierowca odgrywał rolę w kontrolowaniu dostępu do jego urządzenia. Aby uzyskać więcej informacji, zobacz Zabezpieczanie obiektów urządzeń.
Zweryfikuj prawidłowo obiekty urządzenia.
Jeśli sterownik tworzy wiele typów obiektów urządzeń, musi sprawdzić typ, który otrzymuje w każdym IRP. Aby uzyskać więcej informacji, zobacz Niepowodzenie sprawdzania poprawności obiektów urządzeń.
Użyj funkcji "bezpiecznego ciągu".
Podczas manipulowania ciągami sterownik powinien używać bezpiecznych funkcji ciągów zamiast funkcji ciągów dostarczanych z bibliotekami środowiska uruchomieniowego języka C/C++. Aby uzyskać więcej informacji, zobacz Using Safe String Functions.
Zweryfikuj uchwyty obiektów.
Sterowniki, które otrzymują uchwyty obiektów jako dane wejściowe, muszą sprawdzić, czy uchwyty są prawidłowe, dostępne i mają oczekiwany typ. Aby uzyskać więcej informacji na temat korzystania z uchwytów obiektów, zobacz następujące tematy:
Obsługiwać prawidłowo wieloprocesory.
Nigdy nie zakładaj, że sterownik będzie działać tylko w systemach z jednym procesorem. Aby uzyskać informacje na temat technik programowania, których można użyć w celu zapewnienia prawidłowego działania sterownika w systemach wieloprocesorowych, zobacz następujące tematy:
Zajmij się poprawnym stanem sterownika.
Ważne jest, aby zawsze sprawdzić, czy twój sterownik znajduje się w stanie, który zakładasz. Na przykład, jeśli sterownik otrzymuje IRP, czy obsługuje już IRP tego samego typu? Jeśli sterownik nie sprawdza tej sytuacji, pierwszy protokół IRP może zostać utracony. Aby uzyskać więcej informacji, zobacz Niepowodzenie sprawdzania stanu sterownika.
Weryfikowanie wartości wejściowych protokołu IRP.
Zarówno z perspektywy niezawodności, jak i bezpieczeństwa, niezbędne jest zweryfikowanie wszystkich wartości skojarzonych z IRP, takich jak adresy buforów i ich długości. Poniższe tematy zawierają informacje o weryfikowaniu wartości wejściowych protokołu IRP:
DispatchReadWrite przy użyciu buforowanego I/O
Błędy w buforowanym We/Wy
DispatchReadWrite przy użyciu bezpośredniego we/wy
Poprawnie obsłuż stos we/wy.
Podczas przekazywania IRP w dół stosu sterowników ważne jest, aby sterowniki wywoływały funkcje IoSkipCurrentIrpStackLocation lub IoCopyCurrentIrpStackLocationToNext, aby ustawić lokalizację stosu we/wy dla następnego sterownika. Nie należy pisać kodu, który bezpośrednio kopiuje jedną lokalizację stosu we/wy do następnej.
Poprawnie obsłuż operacje uzupełniania IRP.
Sterownik nigdy nie może ukończyć protokołu IRP z wartością stanu STATUS_SUCCESS, chyba że faktycznie obsługuje i przetwarza protokół IRP. Aby uzyskać informacje o prawidłowych sposobach obsługi operacji zakończenia IRP, zobacz Kończenie IRP.
Poprawnie obsłuż operacje anulowania protokołu IRP.
Operacje anulowania mogą być trudne do poprawnego kodowania, ponieważ zwykle są wykonywane asynchronicznie. Problemy w kodzie, który obsługuje operacje anulowania, mogą być niezauważone przez długi czas, ponieważ ten kod zwykle nie jest wykonywany często w uruchomionym systemie.
Pamiętaj, aby zapoznać się ze wszystkimi informacjami podanymi w Anulowanie IRPs. Zwróć szczególną uwagę na Synchronizowanie anulowania IRP-ów oraz kwestie, które należy wziąć pod uwagę podczas anulowania IRP-ów.
Jednym ze sposobów uniknięcia problemów z synchronizacją skojarzonych z operacjami anulowania jest zaimplementowanie kolejki IRP z bezpiecznym anulowaniem. Kolejka IRP z bezpiecznym anulowaniem to kolejka zarządzana przez sterownik, która została wprowadzona dla systemu Windows XP i nowszych wersji systemu operacyjnego, ale jest również zgodna z poprzednimi wersjami.
Obsługa prawidłowego czyszczenia IRP i zamykania operacji.
Upewnij się, że rozumiesz różnicę między żądaniami IRP_MJ_CLEANUP i IRP_MJ_CLOSE. Żądania czyszczenia są dostarczane po zamknięciu wszystkich uchwytów w obiekcie pliku, jednak czasami przed zakończeniem wszystkich żądań we/wy. Żądania zamknięcia docierają po zakończeniu lub anulowaniu wszystkich żądań we/wy dla obiektu pliku. Aby uzyskać więcej informacji, zobacz następujące tematy:
Aby uzyskać więcej informacji na temat prawidłowego obsługi IRP, zobacz Dodatkowe błędy w obsłudze IRP.
Korzystanie z weryfikatora sterowników
Weryfikator sterowników jest najważniejszym narzędziem, którego można użyć, aby zapewnić niezawodność sterownika. Weryfikator sterowników może sprawdzić różne typowe problemy ze sterownikiem, w tym niektóre z tych omówionych w tej sekcji. Jednak użycie weryfikatora sterowników nie zastępuje starannego, przemyślanego projektu oprogramowania.