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:
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.
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.