Udostępnij przez


Weryfikacja we/wy

Weryfikator sterowników ma dwa poziomy weryfikacji we/wy:

  • Weryfikacja we/wy na poziomie 1 jest zawsze aktywna za każdym razem, gdy wybrano weryfikację we/wy.

  • Weryfikacja we/wy na poziomie 2 jest zawsze aktywna za każdym razem, gdy w systemie Windows XP lub nowszym wybrano weryfikację we/wy.

Zobacz Również:Rozszerzona Weryfikacja We/Wy W systemie Windows 7 i nowszych wersjach systemu operacyjnego Windows, Rozszerzona Weryfikacja We/Wy jest automatycznie aktywowana po wybraniu Weryfikacji We/Wy. Nie jest dostępna lub konieczna do wybrania jej jako oddzielnej opcji.

Weryfikacja I/O poziomu 1

Po włączeniu Weryfikacji We/Wy Poziomu 1, wszystkie IRP-y uzyskane za pośrednictwem IoAllocateIrp są przydzielane ze specjalnej puli, a ich użycie jest śledzone.

Ponadto weryfikator sterowników sprawdza nieprawidłowe wywołania we/wy, w tym:

  • Próbuje zwolnić protokół IRP, którego typ nie jest IO_TYPE_IRP

  • Przekazywanie nieprawidłowych obiektów urządzenia do IoCallDriver

  • Przekazywanie IRP do IoCompleteRequest, który zawiera nieprawidłowy stan lub nadal ma ustawioną procedurę anulowania

  • Zmiany poziomu IRQL podczas wywołania procedury dyspozycyjnej sterownika

  • Próbuje zwolnić protokół IRP, który pozostaje skojarzony z wątkiem

  • Przekazanie obiektu urządzenia do IoInitializeTimer, który już zawiera zainicjowany czasomierz

  • Przekazanie nieprawidłowego bufora do IoBuildAsynchronousFsdRequest lub IoBuildDeviceIoControlRequest

  • Przekazywanie bloku stanu we/wy do IRP, gdy ten blok jest przydzielany na stosie, który został zbyt daleko rozwinięty.

  • Przekazywanie obiektu zdarzenia do IRP, gdy ten obiekt zdarzenia jest przydzielany na stosie, który został nadmiernie rozwinięty

Ponieważ specjalna pula IRP ma ograniczony rozmiar, weryfikacja I/O jest najbardziej skuteczna, gdy jest używana tylko na jednym sterowniku jednocześnie.

Błędy weryfikacji we/wy na poziomie 1 powodują wystąpienie sprawdzenia błędu 0xC9. Pierwszy parametr tego sprawdzania błędów wskazuje, jakie naruszenie wystąpiło. Aby uzyskać pełną listę parametrów, zobacz Sprawdzanie błędów 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION).

Weryfikacja we/wy poziomu 2

Błędy weryfikacji we/wy poziomu 2 są wyświetlane na różne sposoby: na niebieskim ekranie, w pliku zrzutu awaryjnego i debugerze jądra.

Na niebieskim ekranie te błędy są zanotowane przez komunikat BŁĄD WERYFIKACJI SYSTEMU WE/WY i ciąg BŁĄD STEROWNIKA WDMXXX, gdzie XXX jest kodem błędu WE/WY.

W pliku zrzutu awaryjnego większość z tych błędów jest zanotowana przez komunikat BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION), wraz z kodem błędu wejścia/wyjścia. W tym przypadku kod błędu I/O jest wyświetlany jako pierwszy parametr kontroli błędów 0xC9. Pozostałe są oznaczone komunikatem Bug Check 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION), wraz z kodem błędu Weryfikatora Sterowników. W tym przypadku kod błędu Weryfikatora sterownika jest wyświetlany jako pierwszy parametr sprawdzania błędów 0xC4.

W debugerze jądra (KD lub WinDbg) te błędy są zanotowane przez komunikat BŁĄD STEROWNIKA WDM i opisowy ciąg tekstowy. Gdy debuger jądra jest aktywny, można zignorować błędy poziomu 2 i wznowić operację systemu. (Nie jest to możliwe w przypadku innych testów usterek).

Niebieski ekran, plik zrzutu awaryjnego i debuger jądra wyświetla również dodatkowe informacje. Aby uzyskać pełny opis większości komunikatów o błędach na poziomie weryfikacji we/wy 2, zobacz Sprawdzanie błędów 0xC9. W pozostałej części zobacz sprawdzanie błędów 0xC4.

Począwszy od okna Vista, opcja Weryfikacja we/wy sprawdza następujące błędy sterownika:

  • Ukończenie i anulowanie IRP pochodzących z aplikacji działających w trybie użytkownika trwa zbyt długo.

  • Zwalnianie blokady usuwania, która nie została jeszcze nabyta.

  • Wywoływanie IoReleaseRemoveLock lub IoReleaseRemoveLockAndWait z parametrem tagu, który różni się od parametru tagu używanego w odpowiednim wywołaniu IoAcquireRemoveLock.

  • Wywoływanie usługi IoCallDriver z wyłączonymi przerwaniami.

  • Wywoływanie IoCallDriver na poziomie IRQL większym niż DISPATCH_LEVEL.

  • Powrót z procedury obsługi sterownika z wyłączonymi przerwaniami.

  • Powrót z procedury wysyłania sterownika ze zmienionym środowiskiem IRQL.

  • Powrót z procedury wysyłania sterownika z wyłączonymi wywołaniami APC. W takim przypadku sterownik mógł wywoływać KeEnterCriticalRegion więcej razy niż KeLeaveCriticalRegion, co jest główną przyczyną błędu sprawdzania 0x20 (KERNEL_APC_PENDING_DURING_EXIT) oraz błędu sprawdzania 0x1 (APC_INDEX_MISMATCH).

Począwszy od systemu Windows 7, opcja Weryfikacja we/wy sprawdza następujące błędy sterownika:

  • Próbuje zwolnić środowiska IRPs przez wywołanie exFreePool. IRP muszą zostać zwolnione za pomocą IoFreeIrp.

Ponadto można użyć tej opcji, aby wykryć kolejną typową usterkę sterownika — ponowne inicjowanie usuwania blokad. Struktury danych związane z blokadami powinny być alokowane wewnątrz rozszerzeń urządzeń. Dzięki temu menedżer we/wy zwalnia pamięć, która przechowuje strukturę IO_REMOVE_LOCK tylko wtedy, gdy obiekt urządzenia zostanie usunięty. Jeśli sterownik wykonuje następujące trzy kroki, możliwe, że po kroku 2 aplikacja lub sterownik nadal przechowuje odwołanie do urządzenia Device1:

  • Przydziela strukturę IO_REMOVE_LOCK odpowiadającą urządzeniu Device1, ale strukturę alokuje poza rozszerzeniem Device1.
  • Wywołuje IoReleaseRemoveLockAndWait podczas usuwania urządzenia Device1.
  • Wywołuje metodę IoInitializeRemoveLock dla tej samej blokady, aby użyć jej ponownie jako blokady usuwania dla urządzenia Device2.

Możliwe, że po kroku 2 aplikacja lub sterownik nadal przechowuje odwołanie do urządzenia Device1. Aplikacja lub sterownik nadal może wysyłać żądania do urządzenia Device1, mimo że to urządzenie zostało usunięte. W związku z tym nie można bezpiecznie ponownie użyć tej samej pamięci co nowa blokada usuwania, dopóki menedżer we/wy nie usunie urządzenia Device1. Ponowne inicjowanie tej samej blokady, gdy inny wątek próbuje go uzyskać, może spowodować uszkodzenie blokady, z nieprzewidywalnymi wynikami sterownika i całego systemu.

W systemie Windows 7 i nowszych wersjach systemu operacyjnego Windows rozszerzona weryfikacja operacji we/wy jest automatycznie aktywowana po wybraniu Weryfikacja operacji we/wy.

Aktywowanie tej opcji

Funkcję weryfikacji we/wy można aktywować dla co najmniej jednego sterownika za pomocą Menedżera weryfikatora sterowników lub wiersza polecenia Verifier.exe. Aby uzyskać szczegółowe informacje, zobacz Wybieranie opcji weryfikatora sterowników.

  • W wierszu polecenia.

    W wierszu polecenia opcja Weryfikacja we/wy jest reprezentowana przez bit 4 (0x10). Aby aktywować weryfikację we/wy, użyj wartości flagi 0x10 lub dodaj 0x10 do wartości flagi. Przykład:

    verifier /flags 0x10 /driver MyDriver.sys
    

    Funkcja będzie aktywna po następnym rozruchu.

    Możesz również aktywować i dezaktywować weryfikację we/wy bez ponownego uruchamiania komputera, dodając parametr /volatile do polecenia. Przykład:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    To ustawienie jest skuteczne natychmiast, ale zostanie utracone po zamknięciu lub ponownym uruchomieniu komputera. Aby uzyskać szczegółowe informacje, zobacz Używanie zmiennych ustawień.

    Funkcja weryfikacji we/wy jest również uwzględniona w ustawieniach standardowych. Przykład:

    verifier /standard /driver MyDriver.sys
    
  • Korzystanie z Menedżera weryfikatora sterowników

    1. Wybierz pozycję Utwórz ustawienia niestandardowe (dla deweloperów kodu), a następnie kliknij przycisk Dalej.
    2. Wybierz poszczególne ustawienia z pełnej listy.
    3. Wybierz (zaznacz) weryfikację I/O.

    Funkcja weryfikacji we/wy jest również uwzględniona w ustawieniach standardowych. Aby użyć tej funkcji, w Menedżerze weryfikatora sterowników kliknij pozycję Utwórz ustawienia standardowe.