Compartir a través de


Depuración de instalaciones de dispositivos con un depurador en modo de usuario

A partir de Windows Vista, cuando el administrador de Plug and Play (PnP) detecta un nuevo dispositivo en el sistema, el sistema operativo inicia el proceso de host de instalación del dispositivo (DrvInst.exe) para buscar e instalar un controlador para el dispositivo.

La manera más eficaz de depurar el proceso de host de instalación de dispositivos en modo de usuario es con un depurador en modo de usuario, como WinDbg o Visual Studio. Dado que el proceso deDrvInst.exe normalmente se completaría sin ninguna interacción del usuario, Microsoft ha agregado compatibilidad a Windows Vista y versiones posteriores de Windows para permitir que el desarrollador de un paquete de controladores adjunte un depurador antes de que se procesen las fases principales de la instalación del dispositivo.

Para obtener más información sobre los depuradores en modo de usuario y otras herramientas de depuración, vea Depuración de Windows.

El valor del Registro DebugInstall especifica el tipo de compatibilidad con la depuración de instalación de dispositivos habilitada en el sistema. Para obtener más información sobre este valor del Registro, consulte Habilitación de la compatibilidad con la depuración de instalaciones de dispositivos.

Cuando el valor del Registro DebugInstall se establece en 2, DrvInst.exe esperará a que un depurador en modo de usuario se adjunte a su proceso antes de continuar con la instalación. Una vez asociado un depurador, el proceso se dividirá en el propio depurador. Un depurador debe adjuntarse y configurarse de modo que no inicie su propio punto de interrupción inicial en el sistema de destino que se está depurando.

Por ejemplo, un depurador se puede asociar a DrvInst.exe por nombre:

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

O bien, si un depurador está asociado al sistema de destino, se mostrará la siguiente información de depuración:

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

Esto permite que el depurador se adjunte al proceso deDrvInst.exe mediante su identificador de proceso único:

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

Después de adjuntar un depurador en modo de usuario al proceso deDrvInst.exe , el proceso se interrumpirá en el depurador:

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

Dado que las fases principales de la instalación de dispositivos no se han procesado, todavía no se cargan los archivos DLL de instalación conjunta o instalador de clase que se usan para el dispositivo.

Si el nombre del módulo y de la función de un punto de interrupción se conocen de antemano, ese nombre se puede establecer como un punto de interrupción sin resolver mediante el comando del depurador "bu". En el ejemplo de código siguiente se muestra cómo establecer un punto de interrupción sin resolver para el punto de entrada principal (CoInstallerProc) del MyCoinst.dll coinstalador:

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

Cuando se cargaMyCoinst.dll co-instalador y se alcanza el punto de interrupción:

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 instalador de clase o un archivo DLL de coinstalador no deben predecir cuándo, respectivamente, se cargarán o descargarán desde el proceso deDrvInst.exe . Sin embargo, un punto de interrupción que se establece mediante "bu" permanecerá aunque el módulo se descargue.

Como alternativa, el proceso deDrvInst.exe puede ejecutarse hasta el punto en el que se carga un instalador de clase específico o un archivo DLL de coinstalador en el proceso estableciendo una excepción del depurador para el evento de carga de ese archivo DLL:

0:000> sxe ld mycoinst.dll

0:000> g

Una vez cargado el módulo, los puntos de interrupción se pueden establecer en el archivo DLL. Por ejemplo:

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> 

Dado que el punto de interrupción se estableció como un punto de interrupción sin resolver (bu), permanecerá establecido incluso si se descarga el módulo.

El período de tiempo predeterminado para que se complete un proceso de instalación es de 5 minutos. Si el proceso no se completa dentro del período de tiempo determinado, el sistema asume que el proceso se ha bloqueado (se ha detenido la respuesta) y el proceso de instalación finaliza.

Si un depurador en modo de usuario está asociado al sistema de destino durante el proceso de instalación del dispositivo, el sistema no aplicará este período de tiempo de espera. Esto permite que un desarrollador de paquetes de controladores dedique el tiempo necesario para depurar el proceso de instalación.