Отладка мини-драйвера WIA
Драйверы WIA выполняются внутри процесса службы WIA. Поэтому для отладки этих драйверов в пользовательском режиме необходимо подключить отладчик к службе WIA. Это можно сделать несколькими способами. В этом разделе представлены два из них. (Дополнительные сведения см. в разделе Службы отладки в документации по Microsoft Windows SDK.
Отладчик можно запустить одним из двух способов:
Автоматический запуск службы WIA в отладчике.
Присоединение отладчика к соответствующему процессу во время выполнения.
При отладке мини-накопителя учитывайте следующие два момента:
Если требуется сетевой доступ к символам и другим файлам из отладчика, они могут не отображаться при автоматическом запуске службы WIA в отладчике. WIA работает как служба LocalSystem в Windows XP и в качестве LocalService для Microsoft Windows Server 2003 и более поздних версий операционной системы и не имеет соответствующих привилегий для доступа к сети. Таким образом, несмотря на то, что компьютер может "видеть" все данные в сети, отладчик, на котором запущена служба, может быть не в состоянии. Дополнительные сведения об измененных уровнях привилегий службы WIA см. в разделе Проблемы безопасности для драйверов WIA.
Если проблема возникает во время загрузки драйвера или инициализации части драйвера STI (например, во время IStiUSD::Initialize), то к моменту подключения отладчика ошибка уже произошла и получить полезные сведения слишком поздно. Распространенный симптом этой проблемы заключается в том, что устройство не отображается в папке "Мой компьютер", но отображается в папке диспетчер устройств.
Запуск службы WIA в отладчике
При запуске службы WIA диспетчер управления службами (SCM) просматривает запись в базе данных управления службой и запускает исполняемый файл, на который указывает эта запись. Простой способ запустить службу WIA в отладчике — заменить ее записью, включающую отладчик. Запись можно найти в реестре в следующих разделах:
HKLM\System\CurrentControlSet\Services\StiSvc\ImagePath
Изначально для ключа ImagePath задано следующее строковое значение:
"%SystemRoot%\System32\svchost.exe -k imgsvc"
Например, чтобы запустить службу WIA в NTSD, измените предыдущее значение следующим образом:
"ntsd -g -G %SystemRoot%\System32\svchost.exe -k imgsvc"
При этом изменении служба WIA всегда запускается в NTSD. Обратите внимание, что если служба уже запущена, ее необходимо остановить и перезапустить, прежде чем это изменение вступит в силу. Дополнительные сведения см. в статье Запуск и остановка службы неподвижных образов .
Чтобы окно отладчика было видимым, необходимо также изменить другой раздел реестра. Путь к этому разделу реестра:
HKLM\System\CurrentControlSet\Services\StiSvc\Type
Начальное значение ключа Type , 0X20, предотвращает отображение окна отладчика. Измените значение ключа Type на значение DWORD 0X120.
Присоединение отладчика во время выполнения
Большинству отладчиков требуется PID выполняющегося процесса, чтобы присоединиться к нему после того, как процесс уже запущен. Так как WIA выполняется в рамках универсального процесса размещения под названиемsvchost.exe, необходимо найти правильный экземпляр svchost.exe .
Если вы скачали пакет отладчика с сайта Майкрософт, он включает служебную программу с именемtlist.exe. Tlist.exe отображаются все запущенные процессы. Если вы выполняете tlist.exe с помощью параметра s, эта служебная программа также показывает, в каких процессах размещаются какие службы. Например, при выполнении tlist.exe -s выходные данные выводятся примерно так:
0 System Process
4 System
160 smss.exe
216 csrss.exe Title:
208 winlogon.exe Title: NetDDE Agent
268 services.exe Svcs: Eventlog,PlugPlay
280 lsass.exe Svcs: Netlogon,PolicyAgent,ProtectedStorage,SamSs
416 svchost.exe Svcs: RpcSs
444 svchost.exe Svcs: AudioSrv,CryptSvc,Dhcp,EventSystem,FastUserSwitching,CompatibilityServices,helpsvc,Irmon,lanmanserver,lanmanworkstation,Netman,Nla,Schedule,SENS,ShellHWDetection,srservice,TapiSrv,TermService,ThemeService,uploadmgr,W32Time,winmgmt,WmdmPmSp
504 svchost.exe Svcs: Dnscache
372 svchost.exe Svcs: LmHosts,Messenger,RemoteRegistry,SSDPSRV,WebClient
616 spoolsv.exe Svcs: Spooler
680 inojobsv.exe Svcs: Cheyenne InocuLAN Anti-Virus Server
700 emsvc.exe Svcs: EMSVC
912 fxssvc.exe Svcs: Fax
192 explorer.exe Title: Program Manager
1076 svchost.exe Svcs: stisvc
22824 tlist.exe
В предыдущем примере выполняется пять экземпляров svchost.exe . Служба WIA StiSvc (служба неподвижных образов) выполняется в экземпляреsvchost.exe с piD 1076. Подключите отладчик к процессу 1076, чтобы начать отладку.
Вместо использования служебной программы, такой как tlist.exe, для идентификации одного экземпляра из нескольких экземпляровsvchost.exe можно создать копию svchost.exe и переименовать ее (например, stisvc.exe). Затем измените значение ImagePath элемента управления службой, чтобы использовать эту копию svchost.exe (имя которой теперь stisvc.exe). Например, можно задать ключ, путь которого равен
HKLM\System\CurrentControlSet\Control\Services\Stisvc\ImagePath
для следующего строкового значения:
%SystemRoot%\System32\stisvc.exe -k imgsvc"
При запуске службы WIA она выполняется в stisvc.exe вместо svchost.exe. Найти этот процесс проще, так как существует только один экземпляр stisvc.exe. Вам не нужно искать PID, чтобы найти его. Например, если вы разрабатываете драйвер с помощью Microsoft Visual Studio, вы можете перейти в пункт меню Начать отладку в меню Сборка , щелкнуть Присоединиться к процессу... и выбрать stisvc.exe в списке.