WIA ドライバーは、WIA サービス プロセス内で実行されます。 そのため、これらのドライバーのユーザー モード デバッグを実行するには、WIA サービスにデバッガーを接続する必要があります。 これを行うには、いくつかの異なる方法があります。このトピックでは、そのうちの 2 つについて説明します。 (詳細については、Microsoft Windows SDK ドキュメントのデバッグ サービスを参照してください)。
デバッガーは、次の 2 つの方法のいずれかで起動できます。
デバッガーで WIA サービスを自動的に開始します。
実行時に適切なプロセスにデバッガーをアタッチする。
ミニドライバーをデバッグするときは、次の 2 つの点に注意してください。
デバッガー内からシンボルやその他のファイルへのネットワーク アクセスが必要な場合は、デバッガーで 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 キーの値を、0X120 DWORD 値に変更します。
実行時にデバッガーをアタッチする
ほとんどのデバッガーは、プロセスが既に開始された後に実行中のプロセスの 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 の 5 つのインスタンスが実行されています。 WIA サービス の StiSvc (Still Image Service) は、PID が 1076 の svchost.exe インスタンスで実行されています。 デバッグを開始するには、デバッガーをプロセス 1076 にアタッチします。
tlist.exe などのユーティリティ プログラムを使用して、複数の svchost.exe インスタンスの 1 つのインスタンスを識別する代わりに、svchost.exe のコピーを作成して名前を変更できます ( たとえば、stisvc.exe)。 次に、サービス コントロール エントリの ImagePath 値を変更して、この svchost.exe のコピー (名前が stisvc.exe) を使用します。 たとえば、指定されたパスにあるキーを設定することができます。
HKLM\System\CurrentControlSet\Control\Services\Stisvc\ImagePath
を次の文字列値に設定します。
%SystemRoot%\System32\stisvc.exe -k imgsvc"
WIA サービスが開始されると、svchost.exeではなく、stisvc.exe で実行されます。 このプロセスを見つけることは簡単です。なぜなら、stisvc.exeのインスタンスは 1 つしかないからです。 PID を検索する必要はありません。 そのため、たとえば、Microsoft Visual Studio を使用してドライバーを開発している場合は、[ビルド] メニューの [デバッグの開始] メニュー項目に移動し、[プロセスにアタッチ]をクリックして、一覧から stisvc.exe を選択できます。