Conteneurs d’objets

AVStream gère une construction appelée « sac d’objets » pour chaque objet AVStream visible par le minipilote. Un sac d’objets est un conteneur générique pour la conservation de la mémoire allouée dynamiquement associée à un objet donné.

Les structures suivantes ont des membres de type KSOBJECT_BAG, qui est équivalent à PVOID : KSDEVICE, KSFILTERFACTORY, KSFILTERet KSPIN.

Les utilisations des conteneurs d’objets sont les suivantes :

  • Gestion de la mémoire

    Minipilotes peut utiliser des conteneurs d’objets pour la gestion de la mémoire afin de réduire le travail de nettoyage. Pour ce faire, un minipilote doit d’abord appeler ExAllocatePoolWithTag pour allouer de la mémoire dynamique et l’associer à un objet donné. Le minipilote ajoute ensuite la mémoire allouée au sac d’objets en appelant KsAddItemToObjectBag.

    Lorsque le minipilote appelle KsAddItemToObjectBag, AVStream associe une fonction de nettoyage par défaut (généralement ExFreePool) à l’objet. Le minipilote peut également inclure un pointeur vers une routine de nettoyage fournie par le minipilote dans le paramètre Free de KsAddItemToObjectBag. Quand un objet est fermé, AVStream supprime tous les éléments du conteneur d’objets et appelle les routines de nettoyage associées.

  • Partage de données allouées dynamiquement entre plusieurs objets AVStream.

    Un minipilote peut partager des données allouées dynamiquement entre plusieurs objets AVStream en plaçant un élément donné dans plusieurs conteneurs d’objets. Dans ce cas, AVStream ne libère pas l’élément donné tant qu’il n’est plus contenu dans un conteneur d’objets. La seule limitation du nombre d’éléments que peut contenir un sac d’objets est la mémoire disponible.

  • Détermination des structures qui peuvent être modifiées avec des descripteurs.

    Si un minipilote alloue dynamiquement un descripteur ou une sous-structure de descripteur, le minipilote place le descripteur dans le conteneur d’objets approprié. La fonction _KsEdit utilise ensuite ces informations pour déterminer si une structure donnée peut être modifiée.

AVStream supprime automatiquement les éléments d’un conteneur d’objets si l’objet propriétaire est supprimé.

Minipilotes peut supprimer des éléments d’un conteneur d’objets en appelant KsRemoveItemFromObjectBag ou KsDiscard.