Condividi tramite


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:

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

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