WIA Minidriver Debugging

WIA-Treiber werden innerhalb des WIA-Dienstprozesses ausgeführt. Zum Debuggen dieser Treiber im Benutzermodus müssen Sie daher den Debugger mit dem WIA-Dienst verbinden. Es gibt verschiedene Möglichkeiten, dies zu tun. In diesem Thema werden zwei davon vorgestellt. (Weitere Informationen finden Sie unter Debuggen von Diensten in der Microsoft Windows SDK-Dokumentation.)

Der Debugger kann auf zwei Arten gestartet werden:

  • Automatisches Starten des WIA-Diensts unter einem Debugger.

  • Anfügen des Debuggers an den entsprechenden Prozess zur Laufzeit.

Beachten Sie beim Debuggen Ihres Minitreibers die folgenden beiden Punkte:

  1. Wenn Sie Netzwerkzugriff auf Symbole und andere Dateien aus dem Debugger benötigen, sind diese möglicherweise nicht sichtbar, wenn Sie den WIA-Dienst automatisch unter dem Debugger starten. WIA wird als LocalSystem-Dienst in Windows XP und als LocalService für Microsoft Windows Server 2003 und höher ausgeführt und verfügt nicht über die entsprechenden Berechtigungen für den Zugriff auf das Netzwerk. Obwohl Ihr Computer also alles in Ihrem Netzwerk "sehen" kann, ist der Debugger, der den Dienst ausführt, möglicherweise nicht in der Lage. Weitere Informationen zur geänderten Berechtigungsstufe des WIA-Diensts finden Sie unter Sicherheitsprobleme für WIA-Treiber.

  2. Wenn ein Problem beim Laden oder Initialisieren des Treibers des STI-Teils des Treibers auftritt (z. B. während IStiUSD::Initialize), ist der Fehler beim Anfügen eines Debuggers bereits aufgetreten, und es ist zu spät, um nützliche Informationen zu erhalten. Ein häufiges Symptom dieses Problems ist, dass das Gerät nicht im Ordner "Arbeitsplatz" angezeigt wird, sondern im Ordner Geräte-Manager angezeigt wird.

Starten des WIA-Diensts unter einem Debugger

Wenn der WIA-Dienst gestartet wird, überprüft der Dienststeuerungs-Manager (SCM) den Eintrag in der Dienststeuerungsdatenbank und startet die ausführbare Datei, auf die dieser Eintrag verweist. Eine einfache Möglichkeit, den WIA-Dienst unter einem Debugger zu starten, besteht darin, diesen Eintrag durch einen zu ersetzen, der Ihren Debugger enthält. Der Eintrag befindet sich in der Registrierung unter:

HKLM\System\CurrentControlSet\Services\StiSvc\ImagePath

Zunächst wird der ImagePath-Schlüssel auf den folgenden Zeichenfolgenwert festgelegt:

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

Um den WIA-Dienst unter NTSD auszuführen, ändern Sie z. B. den vorherigen Wert wie folgt:

"ntsd -g -G %SystemRoot%\System32\svchost.exe -k imgsvc"

Mit dieser Änderung wird der WIA-Dienst immer unter NTSD gestartet. Wenn der Dienst bereits ausgeführt wird, muss er beendet und neu gestartet werden, bevor diese Änderung wirksam wird. Weitere Informationen finden Sie unter Starten und Beenden des Standbilddiensts .

Um das Debuggerfenster sichtbar zu machen, müssen Sie auch einen anderen Registrierungsschlüssel ändern. Der Pfad zu diesem Registrierungsschlüssel lautet:

HKLM\System\CurrentControlSet\Services\StiSvc\Type

Der Anfangswert des Typschlüssels 0X20 verhindert, dass das Debuggerfenster angezeigt wird. Ändern Sie den Wert des Typschlüssels in den DWORD-Wert 0X120.

Anfügen des Debuggers zur Laufzeit

Die meisten Debugger benötigen die PID des ausgeführten Prozesses, um ihn anzufügen, nachdem der Prozess bereits gestartet wurde. Da WIA unter einem generischen Hostingprozess namens svchost.exeausgeführt wird, ist es wichtig, die richtige instance von svchost.exe zu finden.

Wenn Sie das Debuggerpaket von der Microsoft-Website heruntergeladen haben, enthält es ein Hilfsprogramm namens tlist.exe. Tlist.exe zeigt alle ausgeführten Prozesse an. Wenn Sie tlist.exe mit dem Schalter s ausführen, zeigt dieses Hilfsprogramm auch an, welche Prozesse welche Dienste hosten. Wenn Sie z. B.tlist.exe -s ausführen, wird eine Ausgabe ähnlich der folgenden erzeugt:

   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

Im vorherigen Beispiel werden fünf Instanzen von svchost.exe ausgeführt. Der WIA-Dienst StiSvc (Still Image-Dienst) wird unter dem svchost.exe instance ausgeführt, dessen PID 1076 ist. Fügen Sie den Debugger an den Prozess 1076 an, um mit dem Debuggen zu beginnen.

Anstatt ein Hilfsprogramm wietlist.exe zu verwenden , können Sie zum Identifizieren einer einzelnen instance mehrerer svchost.exe-Instanzen eine Kopie von svchost.exe erstellen und umbenennen (z. B.stisvc.exe). Ändern Sie dann den ImagePath-Wert des Dienststeuerelementeintrags, um diese Kopie von svchost.exe zu verwenden (die Kopie, deren Name jetzt stisvc.exeist). Sie können z. B. den Schlüssel festlegen, dessen Pfad

HKLM\System\CurrentControlSet\Control\Services\Stisvc\ImagePath

an den folgenden Zeichenfolgenwert:

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

Wenn der WIA-Dienst gestartet wird, wird er unter stisvc.exe statt untersvchost.exeausgeführt. Die Suche nach diesem Prozess ist einfacher, da es nur eine einzelne instance stisvc.exegibt. Sie müssen nicht nach der PID suchen, um sie zu finden. Wenn Sie den Treiber beispielsweise mit Microsoft Visual Studio entwickeln, können Sie im Menü Erstellen zum Menü "Debuggen starten" wechseln, auf An Prozess anfügen... klicken und in der Liste stisvc.exe auswählen.