Condividi tramite


Debug di installazioni di dispositivi con un debugger in modalità utente

A partire da Windows Vista, quando il gestore Plug and Play (PnP) rileva un nuovo dispositivo nel sistema, il sistema operativo avvia il processo host di installazione del dispositivo (DrvInst.exe) per cercare e installare un driver per il dispositivo.

Il modo più efficiente per eseguire il debug del processo host di installazione del dispositivo in modalità utente consiste in un debugger in modalità utente, ad esempio WinDbg o Visual Studio. Poiché il processo diDrvInst.exe normalmente viene completato senza alcuna interazione dell'utente, Microsoft ha aggiunto il supporto a Windows Vista e versioni successive di Windows per consentire allo sviluppatore di un pacchetto driver di collegare un debugger prima dell'elaborazione delle fasi principali dell'installazione del dispositivo.

Per altre informazioni sui debugger in modalità utente e su altri strumenti di debug, vedere Debug di Windows.

Il valore del Registro di sistema DebugInstall specifica il tipo di supporto per il debug dell'installazione del dispositivo abilitato nel sistema. Per altre informazioni su questo valore del Registro di sistema, vedere Abilitazione del supporto per il debug delle installazioni dei dispositivi.

Quando il valore del Registro di sistema DebugInstall è impostato su 2, DrvInst.exe attenderà che un debugger in modalità utente venga collegato al processo prima che continui con l'installazione. Dopo che un debugger è stato collegato, il processo verrà suddiviso nel debugger stesso. Un debugger deve essere collegato e configurato in modo che non avvii il proprio punto di interruzione iniziale nel sistema di destinazione di cui viene eseguito il debug.

Ad esempio, un debugger può essere collegato a DrvInst.exe in base al nome:

C:\>C:\Debuggers\WinDbg.exe -g -pn DrvInst.exe

In alternativa, se un debugger è collegato al sistema di destinazione, verranno visualizzate le informazioni di debug seguenti:

DRVINST.EXE: Waiting for debugger on Process ID = 3556 ......

In questo modo il debugger può essere collegato al processo diDrvInst.exe usando il relativo ID processo univoco:

C:\>C:\Debuggers\WinDbg.exe -g -p 3556

Dopo che un debugger in modalità utente è collegato al processo diDrvInst.exe , il processo verrà suddiviso nel debugger:

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

Poiché le fasi principali dell'installazione del dispositivo non sono state elaborate, non vengono ancora caricate le DLL del programma di installazione di classe o del programma di installazione condivisa usate per il dispositivo.

Se il modulo e il nome della funzione per un punto di interruzione sono noti in anticipo, tale nome può essere impostato come punto di interruzione non risolto usando il comando debugger "bu". Nell'esempio di codice seguente viene illustrato come impostare un punto di interruzione non risolto per il punto di ingresso principale (CoInstallerProc) del programma di installazione MyCoinst.dll :

0:000> bu mycoinst!CoInstallerProc
0:000> bl
 0 eu             0001 (0001) (mycoinst!CoInstallerProc)

Quando viene caricatoMyCoinst.dll co-programma di installazione e viene raggiunto il punto di interruzione:

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

Un programma di installazione di classe o una DLL con co-programma di installazione non deve prevedere quando, rispettivamente, verrà caricato o scaricato dal processo diDrvInst.exe . Tuttavia, un punto di interruzione impostato tramite "bu" rimarrà anche se il modulo viene scaricato.

In alternativa, il processo diDrvInst.exe potrebbe essere autorizzato a eseguire fino al punto in cui un programma di installazione di classe o una DLL del programma di installazione condivisa specifico viene caricato nel processo impostando un'eccezione del debugger per l'evento di caricamento di tale DLL:

0:000> sxe ld mycoinst.dll

0:000> g

Dopo il caricamento del modulo, i punti di interruzione possono essere impostati all'interno della DLL. Ad esempio:

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> 

Poiché il punto di interruzione è stato impostato come punto di interruzione non risolto (bu), rimarrà impostato anche se il modulo viene scaricato.

Il periodo di tempo predefinito per il completamento di un processo di installazione è di 5 minuti. Se il processo non viene completato entro il periodo di tempo specificato, il sistema presuppone che il processo sia bloccato (arrestato in risposta) e che il processo di installazione venga terminato.

Se un debugger in modalità utente è collegato al sistema di destinazione durante il processo di installazione del dispositivo, il sistema non imposterà questo periodo di timeout. In questo modo uno sviluppatore di pacchetti driver può dedicare il tempo necessario per eseguire il debug del processo di installazione.