Share via


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\Stisvc\ImagePath

以下の文字列と値を作成します。

%SystemRoot%\System32\stisvc.exe -k imgsvc"

WIA サービスは、起動時にssvchost.exeではなく、stisvc.exeで実行されます。 stisvc.exeのインスタンスは 1 つだけであるため、このプロセスの検索は簡単です。 PID を検索する必要はありません。 そのため、たとえば、Microsoft Visual Studio を使用してドライバーを開発している場合は、[ビルド] メニューの [デバッグの開始] メニュー項目に移動し、[プロセスにアタッチ] をクリックして、一覧からstisvc.exeを選択できます。