Partager via


Sacs d’objets

AVStream gère une construction appelée conteneur d’objets pour chaque objet AVStream visible par le minidriver. Un conteneur d’objets est un conteneur générique permettant de contenir 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, KSFILTER et KSPIN.

Les utilisations des sacs d’objets sont les suivantes :

  • Gestion de la mémoire

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

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

  • Partage dynamique des données allouées entre plusieurs objets AVStream.

    Un minidriver peut partager des données allouées dynamiquement entre plusieurs objets AVStream en plaçant un élément donné dans plusieurs sacs 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 qu’un conteneur d’objets peut contenir est la mémoire disponible.

  • Déterminer quelles structures peuvent être modifiées avec des descripteurs.

    Si un minidriver alloue dynamiquement un descripteur ou une sous-structure de descripteur, le minidriver 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é.

Les minidrivers peuvent supprimer des éléments individuels d’un conteneur d’objets en appelant KsRemoveItemFromObjectBag ou KsDiscard.