Débogage de minidriver WIA
Les pilotes WIA s’exécutent à l’intérieur du processus de service WIA. Par conséquent, pour effectuer un débogage en mode utilisateur de ces pilotes, vous devez connecter le débogueur au service WIA. Il existe plusieurs façons de procéder; cette rubrique présente deux d’entre eux. (Pour plus d’informations, consultez Débogage des services dans la documentation Microsoft Windows SDK).
Votre débogueur peut être démarré de l’une des deux manières suivantes :
Démarrage automatique du service WIA sous un débogueur.
Attachement du débogueur au processus approprié au moment de l’exécution.
Gardez les deux points suivants à l’esprit lorsque vous déboguez votre minidriver :
Si vous avez besoin d’un accès réseau aux symboles et autres fichiers à partir du débogueur, ceux-ci peuvent ne pas être visibles si vous démarrez automatiquement le service WIA sous le débogueur. WIA s’exécute en tant que service LocalSystem dans Windows XP et en tant que LocalService pour Microsoft Windows Server 2003 et versions ultérieures du système d’exploitation et ne dispose pas des privilèges appropriés pour accéder au réseau. Ainsi, même si votre ordinateur peut « voir » tout sur votre réseau, le débogueur exécutant le service peut ne pas être en mesure de le faire. Pour plus d’informations sur le niveau de privilège modifié du service WIA, consultez Problèmes de sécurité pour les pilotes WIA.
Si un problème se produit pendant le chargement ou l’initialisation du pilote de la partie STI du pilote (par exemple, pendant IStiUSD::Initialize), au moment où un débogueur est attaché, l’erreur s’est déjà produite et il est trop tard pour obtenir des informations utiles. Un symptôme courant de ce problème est que l’appareil n’apparaît pas dans le dossier Poste de travail, mais s’affiche dans le dossier Gestionnaire de périphériques.
Démarrage du service WIA sous un débogueur
Lorsque le service WIA est démarré, le gestionnaire de contrôle de service (SCM) examine l’entrée dans la base de données de contrôle de service et lance le fichier exécutable pointé par cette entrée. Un moyen simple de démarrer le service WIA sous un débogueur consiste à remplacer cette entrée par une entrée qui inclut votre débogueur. L’entrée se trouve dans le Registre sous :
HKLM\System\CurrentControlSet\Services\Stisvc\ImagePath
Initialement, la clé ImagePath est définie sur la valeur de chaîne suivante :
« %SystemRoot%\System32\svchost.exe -k imgsvc »
Pour exécuter le service WIA sous NTSD, par exemple, modifiez la valeur précédente comme suit :
« ntsd -g -G %SystemRoot%\System32\svchost.exe -k imgsvc »
Avec cette modification, le service WIA démarre toujours sous NTSD. Notez que si le service est déjà en cours d’exécution, il doit être arrêté et redémarré avant que cette modification ne prenne effet. Pour plus d’informations, consultez Démarrage et arrêt du service d’images fixes .
Pour que la fenêtre du débogueur soit visible, vous devez également modifier une autre clé de Registre. Le chemin d’accès à cette clé de Registre est le suivant :
HKLM\System\CurrentControlSet\Services\Stisvc\Type
La valeur initiale de la clé type , 0X20, empêche l’affichage de la fenêtre du débogueur. Remplacez la valeur de la clé type par la valeur DWORD 0X120.
Attachement du débogueur au moment de l’exécution
La plupart des débogueurs nécessitent le PID du processus en cours d’exécution pour s’y attacher une fois que le processus a déjà démarré. Étant donné que WIA s’exécute sous un processus d’hébergement générique appelé svchost.exe, il est essentiel de rechercher la instance correcte de svchost.exe.
Si vous avez téléchargé le package de débogueur à partir du site Microsoft, il inclut un programme utilitaire nommé tlist.exe. Tlist.exe affiche tous les processus en cours d’exécution. Si vous exécutez tlist.exe à l’aide du commutateur s, cet utilitaire indique également quels processus hébergent quels services. Par exemple, l’exécution detlist.exe -s produit une sortie similaire à ce qui suit :
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
Dans l’exemple précédent, cinq instances de svchost.exe sont en cours d’exécution. Le service WIA, StiSvc (service Image fixe), s’exécute sous le svchost.exe instance dont le PID est 1076. Attachez le débogueur au processus 1076 pour démarrer le débogage.
Au lieu d’utiliser un programme utilitaire tel que tlist.exe, pour identifier une seule instance de plusieurs instances desvchost.exe, vous pouvez effectuer une copie de svchost.exe et le renommer (par exemple, stisvc.exe). Ensuite, modifiez la valeur ImagePath de l’entrée de contrôle de service pour utiliser cette copie de svchost.exe (celle dont le nom est maintenant stisvc.exe). Par exemple, vous pouvez définir la clé dont le chemin est
HKLM\System\CurrentControlSet\Control\Services\Stisvc\ImagePath
à la valeur de chaîne suivante :
%SystemRoot%\System32\stisvc.exe -k imgsvc »
Lorsque le service WIA démarre, il s’exécute sous stisvc.exe au lieu de svchost.exe. La recherche de ce processus est plus simple, car il n’existe qu’une seule instance de stisvc.exe. Vous n’avez pas besoin de rechercher le PID pour le trouver. Par exemple, si vous développez le pilote à l’aide de Microsoft Visual Studio, vous pouvez accéder à l’élément de menu Démarrer le débogage sous le menu Générer , cliquer sur Attacher au processus..., puis sélectionner stisvc.exe dans la liste.