Traitement des données

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Analyse des données multimédias

Si votre filtre analyse les données multimédias, n’approuvez pas les en-têtes ou d’autres données auto-décrivant le contenu. Par exemple, n’approuvez pas les valeurs de taille qui apparaissent dans les blocs RIFF AVI ou les paquets MPEG. Voici des exemples courants de ce type d’erreur :

  • Lecture de N octets de données, où la valeur de N provient du contenu, sans vérifier N par rapport à la taille réelle de votre mémoire tampon.
  • Passer à un décalage d’octets dans une mémoire tampon, sans vérifier que le décalage se trouve dans la mémoire tampon.

Une autre classe courante d’erreurs implique de ne pas valider les descriptions de format qui se trouvent dans le contenu. Par exemple :

  • Une structure BITMAPINFOHEADER peut être suivie d’une table de couleurs. La structure BITMAPINFO est définie comme une structure BITMAPINFOHEADER suivie d’un tableau de valeurs RGBQUAD qui composent la table de couleurs. La taille du tableau est déterminée par la valeur de biClrUsed. Ne copiez jamais une table de couleurs dans un BITMAPINFO sans vérifier au préalable la taille de la mémoire tampon allouée pour la structure BITMAPINFO .
  • Une structure WAVEFORMATEX peut avoir des informations de format supplémentaires ajoutées à la structure. Le membre cbSize spécifie la taille des informations supplémentaires.

Lors de la connexion d’épingle, un filtre doit vérifier que toutes les structures de format sont bien formées et contiennent des valeurs raisonnables. Si ce n’est pas le cas, refusez la connexion. Dans le code qui valide la structure de format, faites particulièrement attention au dépassement arithmétique. Par exemple, dans un BITMAPINFOHEADER, la largeur et la hauteur sont des valeurs de longueur 32 bits, mais la taille de l’image (qui est une fonction du produit des deux) n’est qu’une valeur DWORD .

Si le format des données de la source est supérieur à celui de votre mémoire tampon allouée, ne tronquez pas les données sources pour les copier dans votre mémoire tampon. Cela peut créer une structure dont la taille implicite est supérieure à sa taille réelle. Par exemple, un en-tête bitmap peut spécifier une table de palettes qui n’existe plus. Au lieu de cela, réallouer la mémoire tampon ou simplement échouer la connexion.

Erreurs pendant la diffusion en continu

Lorsque le graphique est en cours d’exécution, si votre filtre reçoit du contenu mal formé, il doit arrêter la diffusion en continu. Effectuez les actions suivantes :

Modifications de format

Plusieurs mécanismes permettent aux filtres de modifier les formats au milieu du flux. Chacun d’eux implique plus d’une étape, ce qui crée le risque de fausses acceptations. Si votre filtre obtient une demande de modification de format dynamique, il doit soit rejeter la demande, soit respecter le nouveau format lorsqu’il arrive. De même, ne changez jamais de format, sauf si l’autre filtre est d’accord. Pour plus d’informations, consultez Modifications de format dynamique.