Отладка установок устройств с помощью пользовательского отладчика
Начиная с Windows Vista, когда диспетчер Plug and Play (PnP) обнаруживает новое устройство в системе, операционная система запускает процесс установки устройства (DrvInst.exe), чтобы найти и установить драйвер для устройства.
Наиболее эффективным способом отладки узла установки устройства в пользовательском режиме является отладчик пользовательского режима, например WinDbg или Visual Studio. Поскольку процессDrvInst.exe обычно завершается без участия пользователя, корпорация Майкрософт добавила поддержку Windows Vista и более поздних версий Windows, чтобы позволить разработчику пакета драйверов подключить отладчик до обработки основных этапов установки устройства.
Дополнительные сведения об отладчиках пользовательского режима и других средствах отладки см. в разделе Отладка Windows.
Значение реестра DebugInstall указывает тип поддержки отладки установки устройства, которая включена в системе. Дополнительные сведения об этом значении реестра см. в разделе Включение поддержки отладки установок устройств.
Если параметру реестра DebugInstall присвоено значение 2, DrvInst.exe будет ожидать, пока отладчик пользовательского режима будет подключен к процессу, прежде чем продолжить установку. После присоединения отладчика процесс войдет в сам отладчик. Отладчик должен быть присоединен и настроен таким образом, чтобы он не запускал собственную начальную точку останова в отлаживаемой целевой системе.
Например, отладчик можно присоединить к DrvInst.exe по имени:
C:\>C:\Debuggers\WinDbg.exe -g -pn DrvInst.exe
Или, если отладчик подключен к целевой системе, будут отображаться следующие отладочные сведения:
DRVINST.EXE: Waiting for debugger on Process ID = 3556 ......
Это позволяет подключить отладчик к процессуDrvInst.exe с помощью его уникального идентификатора процесса:
C:\>C:\Debuggers\WinDbg.exe -g -p 3556
После подключения отладчика пользовательского режима к процессуDrvInst.exe процесс войдет в отладчик:
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
Так как основные этапы установки устройства не были обработаны, все установщики классов или библиотеки DLL для совместного установщика, используемые для устройства, еще не загружены.
Если имя модуля и функции для точки останова известно заранее, это имя можно задать как неразрешенную точку останова с помощью команды отладчика "bu". В следующем примере кода показано, как задать неразрешенную точку останова для точки входа main (CoInstallerProc) совместного установщикаMyCoinst.dll:
0:000> bu mycoinst!CoInstallerProc
0:000> bl
0 eu 0001 (0001) (mycoinst!CoInstallerProc)
При загрузкеMyCoinst.dll совместного установщика и достижении точки останова:
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
Установщик класса или библиотека DLL совместного установщика не должны прогнозировать, когда они будут загружаться или выгружаться из процессаDrvInst.exe . Однако точка останова, заданная с помощью "bu", останется даже при выгрузке модуля.
Кроме того, процессDrvInst.exe может выполняться до точки, когда в процесс загружается определенный установщик класса или библиотека DLL совместного установщика, задав исключение отладчика для события загрузки этой библиотеки DLL:
0:000> sxe ld mycoinst.dll
0:000> г
После загрузки модуля в библиотеке DLL можно задать точки останова. Пример:
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>
Так как точка останова была задана как неразрешенная точка останова (bu), она останется заданной, даже если модуль выгружен.
Период времени по умолчанию для завершения процесса установки составляет 5 минут. Если процесс не завершается в течение заданного периода времени, система предполагает, что процесс завис (перестал отвечать), и процесс установки завершается.
Если отладчик пользовательского режима подключен к целевой системе во время установки устройства, система не будет применять этот период времени ожидания. Это позволяет разработчику пакета драйверов тратить время, необходимое для отладки процесса установки.