WIA ミニドライバーのデバッグ
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\Stisvc\ImagePath
以下の文字列と値を作成します。
%SystemRoot%\System32\stisvc.exe -k imgsvc"
WIA サービスは、起動時にssvchost.exeではなく、stisvc.exeで実行されます。 stisvc.exeのインスタンスは 1 つだけであるため、このプロセスの検索は簡単です。 PID を検索する必要はありません。 そのため、たとえば、Microsoft Visual Studio を使用してドライバーを開発している場合は、[ビルド] メニューの [デバッグの開始] メニュー項目に移動し、[プロセスにアタッチ] をクリックして、一覧からstisvc.exeを選択できます。