J'ai perdu ma caméra !

J'ai travaillé recemment sur un problème surprenant ...

L'énoncé était le suivant :

"Sur quelques postes Windows 7, notre logiciel de video conference n'affiche plus la video (Camera USB) . Notre fournisseur prétend qu'il s'agit d'un problème Windows ".

 La demarche de résolution a été la suivante:

    • Surprise, la version 64 bits fonctionne parfaitement alors que la version 32 bits retourne une erreur "Invalid Argument"
  • Il y-a-t-il une différence entre les composants 32 bits et 64 bits (registre,dll, codec ) ?
    • DirectShow s'appuie sur des filtres. Ces filtres ont des "pins"d'entrée et de sortie. Les propriétés des "Pins" déterminent les caractéristiques (format: MPEG,YUV,..., tailles supportées,...)  supportées en entrée et en sortie par ceux-ci . A partir des filtres disponibles et des demandes de l'application cliente, DirectShow (quartz.dll et qcap.dll) essaie de construire un graphe des composants à utiliser pour afficher la video depuis le périphérique de capture vers le périphérique de rendu. L'outil "grphedt" fourni en version 32 bits et 64 bits dans le SDK permet de visualiser le graphe construit par DirectShow et determiner si les filtres existent aussi en 32 bits
    • GraphEdit montre que les filtres sont bien là.
  • ll y-a-t-il un problème avec un élement manquant ?
    • MSDN décrit l'architecture globale de la solution. Un élement manque-t-il ? Comparons alors une station fonctionnant et une autre ne fonctionnant pas ...
    • L'outil DevCon (Windows Device Driver Kit) permet de verifier les definitions de driver et de la "stack" IMAGE associée (c'est à dire les drivers impliqués pour dialoguer avec le driver USBVIDEO.SYS utilisé pour la camera USB )
      • DevCon status =image permet de verifier que la caméra est bien reconnue et que le "device" est bien démarré
      • Devcon stack =image permet de vérifier les drivers impliqués dans la partie "DirectShow", notamment Usbvideo.sys
    • Bingo , sur la machine Ok, le driver ksthunk.sys apparait comme "Upper Filter". Il n'est pas présent sur la machine KO ..
    •  Après recherche, il apparait que le but de ce driver est d'intercepter les paramétres 32 bits fournis par l'application cliente en version 32 bits et de les convertir dans un format 64 bits attendu par ks.sys (kernel streaming driver).
    • Il suffit alors de rajouter la définition de ce driver ksthunk.sys et de rédemarrer ce périphérique pour recharger la pile de drivers avec l'outil DevCon
      • Devcon classfilterimage upper +ksthunk pour rajouter la definition
      • Devcon restart pour réinitialiser la "stack

 Ce cas est original car il montre une architecture où un driver kernel 64 bits intervient uniquement pour gérer les appels provenant des processus 32 bits.

Ci-joint quelques captures d'écran illustrant les différents outils :

Problème avec l'application PlayCap

Le graphe fonctionnant sous 64 montrant les filtres et les properties de la "pin" de sortie du periphérique de capture

GraphEdit retourne une erreur egalement lorsque l'on demande de créer un graphe, pourtant les filtres existent ...

Les commandes Devcon utilisées. A noter que j'ai du relancer la demande restart car la camera etait verrouillée par "GraphEdit" qui était lancée.

  

Architecture USBVideo/Image