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

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

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

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

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

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

  1. Если требуется сетевой доступ к символам и другим файлам в отладчике, они могут не отображаться при автоматическом запуске службы WIA в отладчике. WIA выполняется как служба LocalSystem в Windows XP и в качестве локальной службы для 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.

Подключение отладчика в процессе выполнения

Большинству отладчиков требуется идентификатор процесса, чтобы присоединиться к нему после того, как процесс уже запущен. Так как 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, идентификатор которого равен 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 в списке.