WIA ミニドライバーのデバッグ

WIA ドライバーは、WIA サービス プロセス内で実行されます。 そのため、これらのドライバーのユーザー モード デバッグを実行するには、WIA サービスにデバッガーを接続する必要があります。 これを行うには、いくつかの異なる方法があります。このトピックでは、そのうちの 2 つについて説明します。 (詳細については、Microsoft Windows SDK ドキュメントのデバッグ サービスを参照してください)。

デバッガーは、次の 2 つの方法のいずれかで起動できます。

  • デバッガーで WIA サービスを自動的に開始します。

  • 実行時に適切なプロセスにデバッガーをアタッチする。

ミニドライバーをデバッグするときは、次の 2 つの点に注意してください。

  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

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 を選択できます。