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.
Najbardziej efektywnym sposobem debugowania procesu hosta instalacji urządzenia w trybie użytkownika jest debuger trybu użytkownika, taki jak WinDbg lub Visual Studio. Ponieważ proces DrvInst.exe zwykle kończy się bez żadnej interakcji użytkownika, firma Microsoft dodała obsługę systemu Windows Vista i nowszych wersji systemu Windows, aby umożliwić deweloperowi pakietu sterowników dołączenie debugera przed przetworzeniem podstawowych etapów instalacji urządzenia.
Aby uzyskać więcej informacji na temat debugerów trybu użytkownika i innych narzędzi debugowania, zobacz Debugowanie systemu Windows.
Wartość rejestru DebugInstall określa typ obsługi debugowania instalacji urządzenia, który jest włączony 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 2, DrvInst.exe zaczeka na dołączenie debugera trybu użytkownika do procesu przed kontynuowaniem instalacji. Po dołączeniu debugera proces zostanie podzielony na sam debuger. Debuger powinien być dołączony i skonfigurowany tak, aby nie inicjował własnego początkowego punktu przerwania w systemie docelowym, który jest debugowany.
Na przykład debuger można dołączyć do DrvInst.exe według nazwy:
C:\>C:\Debuggers\WinDbg.exe -g -pn DrvInst.exe
Jeśli debuger jest dołączony do systemu docelowego, zostaną wyświetlone następujące informacje o debugowaniu:
DRVINST.EXE: Waiting for debugger on Process ID = 3556 ......
Dzięki temu debuger może być dołączony do procesu DrvInst.exe przy użyciu jego unikatowego identyfikatora procesu:
C:\>C:\Debuggers\WinDbg.exe -g -p 3556
Po dołączeniu debugera trybu użytkownika do procesuDrvInst.exe, proces przejdzie do debugera.
Debugger detected!
DRVINST.EXE: Entering debugger during PnP device installation.
Device instance = "X\Y\Z" ...
(d48.5a0): Break instruction exception - code 80000003 (first chance)
eax=7ffde000 ebx=00000000 ecx=00000000 edx=77f745c0 esi=00000000 edi=00000000
eip=77f24584 esp=0105ff74 ebp=0105ffa0 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!DbgBreakPoint:
77f24584 cc int 3
0:000> |
. 0id: d48attachname: E:\Windows\system32\DrvInst.exe
Ponieważ podstawowe etapy instalacji urządzenia nie zostały przetworzone, żadne biblioteki DLL instalatora klas lub współinstalatora, które są używane dla urządzenia, nie zostały jeszcze załadowane.
Jeśli nazwa modułu i funkcji punktu przerwania są znane z wyprzedzeniem, tę nazwę można ustawić jako nierozwiązany punkt przerwania przy użyciu polecenia debugera "bu". W poniższym przykładzie kodu pokazano, jak ustawić nieustawiony punkt przerwania dla głównego punktu wejścia (CoInstallerProc) współinstalatora MyCoinst.dll :
0:000> bu mycoinst!CoInstallerProc
0:000> bl
0 eu 0001 (0001) (mycoinst!CoInstallerProc)
Gdy współinstalator MyCoinst.dll jest załadowany i punkt przerwania zostanie osiągnięty:
Breakpoint 0 hit
eax=00000001 ebx=00000000 ecx=00000152 edx=00000151 esi=01a57298 edi=00000002
eip=5bcf54f1 esp=0007e204 ebp=0007e580 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
mycoinst!CoInstallerProc:
5bcf54f1 8bff mov edi,edi
0:000> bl
0 e 5bcf54f1 0001 (0001) 0:**** mycoinst!CoInstallerProc
Instalator klasy lub biblioteka DLL współinstalatora nie powinny przewidywać, kiedy te elementy zostaną załadowane lub zwolnione z procesu DrvInst.exe. Jednak punkt przerwania ustawiony przy użyciu "bu" pozostanie nawet wtedy, gdy moduł zostanie wyładowany.
Alternatywnie, można pozwolić, aby proces DrvInst.exe był wykonywany aż do momentu, gdy określony instalator klasy lub współinstalator DLL jest wczytywany do procesu przez ustawienie wyjątku debuggera dla zdarzenia wczytywania tej biblioteki DLL.
0:000> sxe ld mycoinst.dll
0:000> g
Po załadowaniu modułu punkty przerwania można ustawić w ramach biblioteki DLL. Na przykład:
ModLoad: 5bcf0000 5bd05000 C:\WINDOWS\system32\mycoinst.dll
eax=00000000 ebx=00000000 ecx=011b0000 edx=7c90eb94 esi=00000000 edi=00000000
eip=7c90eb94 esp=0007da54 ebp=0007db48 iopl=0 nv up ei ng nz ac po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000296
ntdll!KiFastSystemCallRet:
7c90eb94 c3 ret
0:000> .reload mycoinst.dll
0:000> x mycoinst!*InstallerProc*
5bcf54f1 mycoinst!CoInstallerProc (unsigned int, void *, struct _SP_DEVINFO_DATA *)
0:000> bu mycoinst!CoInstallerProc
0:000> bl
0 e 3b0649d5 0001 (0001) 0:**** mycoinst!CoInstallerProc
0:000> sxd ld mycoinst.dll
0:000> g
Breakpoint 0 hit
eax=00000001 ebx=00000000 ecx=000001d4 edx=000001d3 esi=000bbac0 edi=00000002
eip=5bcf54f1 esp=0007e204 ebp=0007e580 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
mycoinst!CoInstallerProc:
5bcf54f1 8bff mov edi,edi
0:000>
Ponieważ punkt przerwania został ustawiony jako nierozwiązany punkt przerwania (bu), pozostanie ustawiony nawet w przypadku zwolnienia modułu.
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 zawiesza się (przestał odpowiadać), a proces instalacji zostanie zakończony.
Jeśli debuger trybu użytkownika jest dołączony do systemu docelowego podczas procesu instalacji urządzenia, system nie będzie wymuszał tego limitu czasu. Dzięki temu deweloper pakietu sterowników może poświęcić czas potrzebny na debugowanie procesu instalacji.