WIA 微型驱动程序调试

WIA 驱动程序在 WIA 服务进程中执行。 因此,若要对这些驱动程序执行用户模式调试,必须将调试器连接到 WIA 服务。 有几种不同的方法可以执行此操作:本主题介绍其中两个。 (有关) 的其他信息,请参阅Microsoft Windows SDK文档中的调试服务。

可以通过以下两种方式之一启动调试器:

  • 在调试器下自动启动 WIA 服务。

  • 在运行时将调试器附加到相应的进程。

调试微型驱动程序时,请记住以下两点:

  1. 如果需要从调试器内部对符号和其他文件进行网络访问,如果在调试器下自动启动 WIA 服务,则这些符号可能不可见。 WIA 在 Windows XP 中作为 LocalSystem 服务运行,作为 Microsoft Windows Server 2003 及更高操作系统版本的 LocalService 运行,并且没有适当的权限来访问网络。 因此,即使计算机可以“查看”网络上的所有内容,运行该服务的调试器可能无法看到。 有关 WIA 服务已更改的权限级别的详细信息,请参阅 WIA 驱动程序的安全问题

  2. 如果在驱动程序加载或初始化驱动程序的 STI 部分期间出现问题, (例如,在 IStiUSD::Initialize) 期间,则到附加调试器时,错误已发生,为时已晚,无法获取有用信息。 此问题的一个常见症状是设备未显示在“我的电脑”文件夹中,而是显示在“设备管理器”文件夹中。

在调试器下启动 WIA 服务

WIA 服务启动时,服务控制管理器 (SCM) 查看服务控制数据库中的条目,并启动该条目指向的可执行文件。 在调试器下启动 WIA 服务的一种简单方法是将该条目替换为包含调试器的条目。 可以在注册表中找到以下项:

HKLM\System\CurrentControlSet\Services\StiSvc\ImagePath

最初, ImagePath 键设置为以下字符串值:

%SystemRoot%\System32\svchost.exe -k imgsvc

例如,若要在 NTSD 下运行 WIA 服务,请修改前面的值,如下所示:

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 的正确实例。

如果从 Microsoft 站点下载了调试器包,它将包含名为 tlist.exe的实用工具。 Tlist.exe 显示所有正在运行的进程。 如果使用 开关执行 tlist.exe ,此实用工具还会显示承载哪些服务的进程。 例如,运行 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 (静态图像服务) 在 PID 为 1076 的 svchost.exe 实例下运行。 将调试器附加到进程 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”。