Поделиться через


Отладка мини-драйвера WIA

Драйверы WIA выполняются внутри процесса службы WIA. Поэтому для отладки этих драйверов в пользовательском режиме необходимо подключить отладчик к службе WIA. Это можно сделать несколькими способами. В этом разделе представлены два из них. (Дополнительные сведения см. в разделе Службы отладки в документации по Microsoft Windows SDK.

Отладчик можно запустить одним из двух способов:

  • Автоматический запуск службы WIA в отладчике.

  • Присоединение отладчика к соответствующему процессу во время выполнения.

При отладке мини-накопителя учитывайте следующие два момента:

  1. Если требуется сетевой доступ к символам и другим файлам из отладчика, они могут не отображаться при автоматическом запуске службы WIA в отладчике. WIA работает как служба LocalSystem в Windows XP и в качестве LocalService для Microsoft Windows Server 2003 и более поздних версий операционной системы и не имеет соответствующих привилегий для доступа к сети. Таким образом, несмотря на то, что компьютер может "видеть" все данные в сети, отладчик, на котором запущена служба, может быть не в состоянии. Дополнительные сведения об измененных уровнях привилегий службы WIA см. в разделе Проблемы безопасности для драйверов WIA.

  2. Если проблема возникает во время загрузки драйвера или инициализации части драйвера 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 в списке.