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

类型键的初始值0X20阻止显示调试器窗口。 将 类型 键的值更改为 DWORD 值0X120。

在运行时附加调试器

大多数调试器需要获取正在运行进程的 PID,以便在进程启动后进行附加调试。 由于 WIA 在名为 svchost.exe的泛型托管进程中运行,因此查找正确的 svchost.exe 实例至关重要。

如果从 Microsoft 站点下载了调试器包,则它包括名为 tlist.exe的实用工具程序。 Tlist.exe 显示所有正在运行的进程。 如果使用 s 开关执行 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 以开始调试。

可以复制 svchost.exe 并将其重命名(例如, stisvc.exe),而不是使用实用工具程序(如 tlist.exe)来标识多个 svchost.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