Débogage des installations d’appareils avec un débogueur en mode utilisateur
À compter de Windows Vista, lorsque le gestionnaire Plug-and-Play (PnP) détecte un nouvel appareil dans le système, le système d’exploitation démarre le processus hôte d’installation de l’appareil (DrvInst.exe) pour rechercher et installer un pilote pour l’appareil.
Le moyen le plus efficace de déboguer le processus hôte d’installation d’appareil en mode utilisateur consiste à utiliser un débogueur en mode utilisateur, tel que WinDbg ou Visual Studio. Étant donné que le processus deDrvInst.exe se termine normalement sans aucune interaction utilisateur, Microsoft a ajouté la prise en charge de Windows Vista et des versions ultérieures de Windows pour permettre au développeur d’un package de pilotes d’attacher un débogueur avant que les étapes principales de l’installation de l’appareil ne soient traitées.
Pour plus d’informations sur les débogueurs en mode utilisateur et d’autres outils de débogage, consultez Débogage Windows.
La valeur de Registre DebugInstall spécifie le type de prise en charge du débogage d’installation d’appareil activée sur le système. Pour plus d’informations sur cette valeur de Registre, consultez Activation de la prise en charge pour le débogage des installations d’appareils.
Lorsque la valeur de Registre DebugInstall est définie sur 2, DrvInst.exe attend qu’un débogueur en mode utilisateur soit attaché à son processus avant de continuer l’installation. Une fois qu’un débogueur a été attaché, le processus s’interrompt dans le débogueur lui-même. Un débogueur doit être attaché et configuré de telle sorte qu’il ne lance pas son propre point d’arrêt initial dans le système cible en cours de débogage.
Par exemple, un débogueur peut être attaché à DrvInst.exe par nom :
C:\>C:\Debuggers\WinDbg.exe -g -pn DrvInst.exe
Ou, si un débogueur est attaché au système cible, les informations de débogage suivantes s’affichent :
DRVINST.EXE: Waiting for debugger on Process ID = 3556 ......
Cela permet au débogueur d’être attaché au processus DrvInst.exe à l’aide de son ID de processus unique :
C:\>C:\Debuggers\WinDbg.exe -g -p 3556
Une fois qu’un débogueur en mode utilisateur est attaché au processus deDrvInst.exe , le processus s’insère dans le débogueur :
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
Étant donné que les étapes principales de l’installation de l’appareil n’ont pas été traitées, les DLL de programme d’installation ou de co-programme d’installation de classe utilisées pour l’appareil ne sont pas encore chargées.
Si le nom du module et de la fonction d’un point d’arrêt sont connus à l’avance, ce nom peut être défini en tant que point d’arrêt non résolu à l’aide de la commande « bu » du débogueur. L’exemple de code suivant montre comment définir un point d’arrêt non résolu pour le point d’entrée main (CoInstallerProc) du co-programme d’installationMyCoinst.dll :
0:000> bu mycoinst!CoInstallerProc
0:000> bl
0 eu 0001 (0001) (mycoinst!CoInstallerProc)
Lorsque MyCoinst.dll co-programme d’installation est chargé et que le point d’arrêt est atteint :
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 programme d’installation de classe ou une DLL de co-programme d’installation ne doit pas prédire quand, respectivement, sera chargé ou déchargé à partir du processus DrvInst.exe . Toutefois, un point d’arrêt défini à l’aide de « bu » reste même si le module est déchargé.
Vous pouvez également autoriser le processus DrvInst.exe à s’exécuter jusqu’au point où un programme d’installation de classe ou une DLL de co-programme d’installation spécifique est chargé dans le processus en définissant une exception de débogueur pour l’événement de chargement de cette DLL :
0:000> sxe ld mycoinst.dll
0:000> g
Une fois le module chargé, des points d’arrêt peuvent être définis dans la DLL. Par exemple :
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>
Étant donné que le point d’arrêt a été défini en tant que point d’arrêt non résolu (bu), il reste défini même si le module est déchargé.
La période par défaut d’exécution d’un processus d’installation est de 5 minutes. Si le processus ne se termine pas dans la période donnée, le système suppose que le processus a été suspendu (a cessé de répondre) et que le processus d’installation est terminé.
Si un débogueur en mode utilisateur est attaché au système cible pendant le processus d’installation de l’appareil, le système n’applique pas ce délai d’expiration. Cela permet à un développeur de package de pilotes de passer le temps nécessaire pour déboguer le processus d’installation.