WIA 微型驱动程序调试
WIA 驱动程序在 WIA 服务进程中执行。 因此,若要对这些驱动程序执行用户模式调试,必须将调试器连接到 WIA 服务。 有几种不同的方法可以执行此操作:本主题介绍其中两个。 (有关) 的其他信息,请参阅Microsoft Windows SDK文档中的调试服务。
可以通过以下两种方式之一启动调试器:
在调试器下自动启动 WIA 服务。
在运行时将调试器附加到相应的进程。
调试微型驱动程序时,请记住以下两点:
如果需要从调试器内部对符号和其他文件进行网络访问,如果在调试器下自动启动 WIA 服务,则这些符号可能不可见。 WIA 在 Windows XP 中作为 LocalSystem 服务运行,作为 Microsoft Windows Server 2003 及更高操作系统版本的 LocalService 运行,并且没有适当的权限来访问网络。 因此,即使计算机可以“查看”网络上的所有内容,运行该服务的调试器可能无法看到。 有关 WIA 服务已更改的权限级别的详细信息,请参阅 WIA 驱动程序的安全问题。
如果在驱动程序加载或初始化驱动程序的 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”。