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 顯示所有正在運行的進程。 如果您使用 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]。