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.
Począwszy od systemu Windows Vista, gdy menedżer Plug and Play (PnP) wykryje nowe urządzenie w systemie, system operacyjny uruchamia proces hosta instalacji urządzenia (DrvInst.exe) w celu wyszukania i zainstalowania sterownika dla urządzenia.
Ponieważ instalacja urządzenia odbywa się w ramach tego procesu trybu użytkownika, zwykle najłatwiej jest użyć debugera trybu użytkownika zgodnie z opisem w debugowaniu instalacji urządzeń za pomocą debugera trybu użytkownika. W niektórych przypadkach warto jednak użyć debugera jądra (KD) do monitorowania procesu instalacji urządzenia w trybie użytkownika.
Na przykład przy użyciu KD podczas debugowania instalacji urządzenia w trybie użytkownika można wykonać następujące czynności:
Jednocześnie debuguj kwestię trybu jądra używając polecenia !devnode, !devobj, !drvobj, !irp oraz innych rozszerzeń KD.
Monitoruj inne procesy trybu użytkownika bez zarządzania wieloma debugerami przy użyciu rozszerzeń KD !process lub .process /p.
Aby uzyskać więcej informacji na temat KD i innych narzędzi do debugowania, zobacz Debugowanie systemu Windows.
Wartość rejestru DebugInstall określa typ obsługi debugowania instalacji urządzenia włączone w systemie. Aby uzyskać więcej informacji na temat tej wartości rejestru, zobacz Włączanie obsługi debugowania instalacji urządzeń.
Gdy wartość rejestru DebugInstall jest ustawiona na 1, DrvInst.exe najpierw sprawdzi, czy debuger jądra jest włączony i aktualnie dołączony, zanim przejdzie do debugera. Po wykonaniu tej przerwy punkty przerwania można ustawić w modułach trybu użytkownika bieżącego procesu. Na przykład:
kd> .reload /user
kd> bp /p @$proc setupapi!SetupDiCallClassInstaller
Spowoduje to ustawienie punktu przerwania w procedurze SETUPAPI!SetupDiCallClassInstaller tylko dla bieżącego procesu.
Dla dewelopera pakietu sterowników najbardziej pożądane jest debugowanie działań instalatora klasy lub biblioteki DLL współinstalatora podczas instalacji urządzenia. Jeśli jednak DrvInst.exe wejdzie do debuggera, żadne biblioteki DLL instalatora klas ani współinstalatora z pakietu sterowników nie zostaną załadowane. Mimo że debugery trybu użytkownika obsługują możliwość ustawiania wyjątku debugera, gdy moduł trybu użytkownika jest ładowany do procesu za pomocą polecenia "sx e ld", debuger jądra obsługuje tylko moduły trybu jądra za pomocą tego polecenia.
Poniższy przykład kodu pokazuje, jak "Program poleceń debugera" monitoruje ładowanie określonego instalatora klasy lub współinstalatora do bieżącego procesu. W tym przykładzie program poleceń debugera ustawi punkt przerwania w głównym punkcie wejścia (CoInstallerProc) współinstalatora Mycoinst.dll :
file: Z:\bpcoinst.txt
r $t1 = 0
!for_each_module .if ($spat("@#ModuleName", "mycoinst*") = 0) {r $t1 = 1}
.if (not @$t1 = 0) {.echo mycoinst is loaded, set bp on mycoinst!CoInstallerProc } .else {.echo mycoinst not loaded}
.if (not @$t1 = 0) {.reload mycoinst.dll}
.if (not @$t1 = 0) {bp[0x20] /p @$proc mycoinst!CoInstallerProc } .else {bc[0x20]}
Po wykonaniu program poleceń debugera sprawdzi listę modułów załadowanych do bieżącego procesu dla Mycoinst.dll. Po załadowaniu tej biblioteki DLL współinstalatora, debugger ustawi punkt przerwania (z dobrze znanym identyfikatorem punktu przerwania) w funkcji punktu wejścia CoInstallerProc.
Począwszy od przerwania debugowania zainicjowanego przez proces hosta DrvInst.exe , należy najpierw ustawić punkt przerwania na adres zwrotny wywołania, w którym DrvInst.exe włamał się do debugera jądra. Ten punkt przerwania spowoduje wyczyszczenie wszystkich punktów przerwania ustawionych podczas instalacji urządzenia i kontynuowanie wykonywania:
DRVINST.EXE: Entering debugger during PnP device installation.
Device instance = "X\Y\Z" ...
Break instruction exception - code 80000003 (first chance)
010117b7 cc int 3
kd> bp[0x13] /p @$proc @$ra "bc *;g"
Następnie należy ustawić niektóre punkty przerwania w procesie, aby umożliwić wykonywanie poleceń w programie poleceń debugera w odpowiednim czasie podczas instalacji urządzenia.
Aby upewnić się, że punkt przerwania dla instalatora klasy lub punktu wejścia biblioteki DLL współinstalatora jest ustawiony przed wywołaniem funkcji na potrzeby instalacji urządzenia, program poleceń debugera powinien zostać wykonany w dowolnym momencie załadowania nowej biblioteki DLL do bieżącego procesu, czyli po wywołaniu funkcji LoadLibraryExW zwraca:
kd> .reload
kd> bp[0x10] /p @$proc kernel32!LoadLibraryExW "gu;$$><Z:\\bpcoinst.txt;g"
Zamiast wykonywać program przy każdym wywołaniu LoadLibraryEx w procesie (bp[0x10]), programista może ograniczyć go do wykonywania tylko wtedy, gdy instalator klas i koinstalator bibliotek DLL są ładowane do procesu. Ponieważ SetupDiCallClassInstaller to procedura, która wywołuje instalatory klas i współinstalatory zarejestrowane dla urządzenia, te biblioteki DLL zostaną załadowane do procesu podczas tego wywołania.
Ponieważ nie można zakładać, kiedy te biblioteki DLL zostaną rozładowane z procesu hosta DrvInst.exe, należy upewnić się, że punkty przerwania mogą obsługiwać lokalizowanie punktów wejścia biblioteki DLL podczas wszystkich wywołań do SetupDiCallClassInstaller z procesu hosta DrvInst.exe.
kd> bd[0x10]
kd> bp[0x11] /p @$proc setupapi!SetupDiCallClassInstaller "be[0x10];bp[0x12] /p @$proc @$ra \"bd[0x10];bc[0x12];g\";g"
kd> g
Punkt przerwania do wykonania programu poleceń debugera (bp[0x10]) jest początkowo wyłączony. Za każdym razem, gdy wywołuje się SetupDiCallClassInstaller (bp[0x11]), zostaje uruchomiony i kontynuowane jest wykonywanie. Program poleceń debugera (bp[0x10]) jest ponownie wyłączony, gdy SetupDiCallClassInstaller zwraca, poprzez ustawienie punktu przerwania na adresie zwrotnym samej tej procedury (bp[0x12]).
Należy pamiętać, że punkt przerwania, który wyłącza program poleceń debugera, również czyści się i kontynuuje wykonywanie do momentu ponownego wywołania SetupDiCallClassInstaller lub do momentu zakończenia programu instalacyjnego i wyczyszczenia wszystkich punktów przerwania (bp[0x13]).
Gdy wykonanie rozpoczyna się po ustawieniu powyższych punktów przerwania, proces zostanie przerwany przy każdym wywołaniu metody mycoinst! CoInstallerProc. Dzięki temu można debugować wykonywanie instalatora klasy lub biblioteki DLL współinstalatora podczas instalacji podstawowego urządzenia.
Domyślny okres ukończenia procesu instalacji wynosi 5 minut. Jeśli proces nie zostanie ukończony w danym okresie, system zakłada, że proces przestał odpowiadać i został zakończony.
Domyślne ograniczenie limitu czasu nałożone na instalacje urządzeń nadal obowiązuje, gdy proces jest debugowany przez debuger jądra. Ponieważ wykonywanie wszystkich programów w systemie jest zatrzymywane w ramach debugera, czas potrzebny na proces instalacji jest śledzony tak samo, jak w systemie, który nie jest debugowany.