Debug di MINIdriver WIA
I driver WIA eseguono all'interno del processo di servizio WIA. Pertanto, per eseguire il debug in modalità utente di questi driver, è necessario connettere il debugger al servizio WIA. Esistono diversi modi per farlo; questo argomento presenta due di essi. Per altre informazioni, vedere Debug dei servizi nella documentazione di Microsoft Windows SDK.
Il debugger può essere avviato in uno dei due modi seguenti:
Avviare automaticamente il servizio WIA in un debugger.
Collegamento del debugger al processo appropriato in fase di esecuzione.
Tenere presenti i due punti seguenti durante il debug del minidriver:
Se è necessario l'accesso di rete ai simboli e ad altri file dall'interno del debugger, questi potrebbero non essere visibili se si avvia automaticamente il servizio WIA nel debugger. WIA viene eseguito come servizio LocalSystem in Windows XP e come localService per Microsoft Windows Server 2003 e versioni successive del sistema operativo e non dispone dei privilegi appropriati per accedere alla rete. Quindi, anche se il computer può "vedere" tutto nella rete, il debugger che esegue il servizio potrebbe non essere in grado di. Per altre informazioni sul livello dei privilegi modificati del servizio WIA, vedere Problemi di sicurezza per i driver WIA.
Se si verifica un problema durante il caricamento del driver o l'inizializzazione della parte STI del driver (ad esempio, durante IStiUSD::Initialize), dal momento in cui viene collegato un debugger, l'errore è già stato generato ed è troppo tardi per ottenere informazioni utili. Un sintomo comune di questo problema è che il dispositivo non viene visualizzato nella cartella My Computer, ma viene visualizzato nella cartella Gestione dispositivi.
Avvio del servizio WIA in un debugger
Al momento dell'avvio del servizio WIA, gestione controllo del servizio esamina la voce nel database del controllo del servizio e avvia il file eseguibile a cui punta tale voce. Un modo semplice per avviare il servizio WIA in un debugger consiste nel sostituire tale voce con una che include il debugger. La voce è disponibile nel Registro di sistema in:
HKLM\System\CurrentControlSet\Services\StiSvc\ImagePath
Inizialmente, la chiave ImagePath è impostata sul valore stringa seguente:
"%SystemRoot%\System32\svchost.exe -k imgsvc"
Per eseguire il servizio WIA in NTSD, ad esempio, modificare il valore precedente come indicato di seguito:
"ntsd -g -G %SystemRoot%\System32\svchost.exe -k imgsvc"
Con questa modifica, il servizio WIA viene sempre avviato in NTSD. Si noti che se il servizio è già in esecuzione, è necessario arrestarlo e riavviarlo prima che questa modifica venga eseguita. Per informazioni dettagliate, vedere Avvio e arresto del servizio immagini ancora .
Per rendere visibile la finestra del debugger, è anche necessario modificare un'altra chiave del Registro di sistema. Il percorso della chiave del Registro di sistema è:
HKLM\System\CurrentControlSet\Services\StiSvc\Type
Il valore iniziale della chiave Type , 0X20, impedisce la visualizzazione della finestra del debugger. Modificare il valore della chiave Type nel valore DWORD 0X120.
Collegamento del debugger in fase di esecuzione
La maggior parte dei debugger richiede il PID del processo in esecuzione per collegarlo dopo l'avvio del processo. Poiché WIA viene eseguito in un processo di hosting generico denominato svchost.exe, la ricerca dell'istanza corretta di svchost.exe è essenziale.
Se è stato scaricato il pacchetto del debugger dal sito Microsoft, include un programma di utilità denominato tlist.exe. Tlist.exe visualizza tutti i processi in esecuzione. Se si esegue tlist.exe usando l'opzione s, questa utilità mostra anche quali processi ospitano i servizi. Ad esempio, l'esecuzione ditlist.exe -s produce output simile al seguente:
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
Nell'esempio precedente sono in esecuzione cinque istanze di svchost.exe . Il servizio WIA, StiSvc (servizio Immagine ancora), è in esecuzione nell'istanza disvchost.exe il cui PID è 1076. Collegare il debugger per elaborare 1076 per avviare il debug.
Anziché usare un programma di utilità, ad esempio tlist.exe, per identificare una singola istanza di più istanze di svchost.exe , è possibile creare una copia di svchost.exe e rinominarla (ad esempio, stisvc.exe). Modificare quindi il valore ImagePath della voce del controllo del servizio per usare questa copia di svchost.exe (quella il cui nome è ora stisvc.exe). Ad esempio, è possibile impostare la chiave il cui percorso è
HKLM\System\CurrentControlSet\Control\Services\Stisvc\ImagePath
al valore stringa seguente:
%SystemRoot%\System32\stisvc.exe -k imgsvc"
Quando il servizio WIA viene avviato, viene eseguito in stisvc.exe anziché svchost.exe. La ricerca di questo processo è più semplice, perché esiste solo una singola istanza di stisvc.exe. Non è necessario cercare il PID per trovarlo. Pertanto, ad esempio, se si sta sviluppando il driver usando Microsoft Visual Studio, è possibile passare alla voce di menu Avvia debug nel menu Compila , fare clic su Collega a processo... e selezionare stisvc.exe nell'elenco.