Condividi tramite


Contenitori di oggetti

AVStream gestisce un costrutto denominato contenitore di oggetti per ogni oggetto AVStream visibile al minidriver. Un contenitore di oggetti è un contenitore generico per contenere la memoria allocata dinamicamente associata a un determinato oggetto.

Le strutture seguenti hanno membri di tipo KSOBJECT_BAG, che equivale a PVOID: KSDEVICE, KSFILTERFACTORY, KSFILTER e KSPIN.

Gli usi dei contenitori di oggetti includono:

  • Gestione della memoria.

    I minidriver possono usare contenitori di oggetti per la gestione della memoria per ridurre il lavoro di pulizia. A tale scopo, un minidriver deve prima chiamare ExAllocatePoolWithTag per allocare memoria dinamica e associarlo a un determinato oggetto. Il minidriver aggiunge quindi la memoria allocata al contenitore di oggetti chiamando KsAddItemToObjectBag.

    Quando il minidriver chiama KsAddItemToObjectBag, AVStream associa una funzione di pulizia predefinita (in genere ExFreePool) all'oggetto . In alternativa, il minidriver può includere un puntatore a una routine di pulizia fornita da minidriver nel parametro Free di KsAddItemToObjectBag. Quando un oggetto viene chiuso, AVStream rimuove ogni elemento dal contenitore di oggetti e chiama le routine di pulizia associate.

  • Condivisione dinamica dei dati allocati tra diversi oggetti AVStream.

    Un minidriver può condividere dati allocati in modo dinamico tra diversi oggetti AVStream inserendo un determinato elemento in più di un contenitore di oggetti. In questo caso, AVStream non rilascia l'elemento specificato finché non è più contenuto in alcun contenitore di oggetti. L'unica limitazione al numero di elementi che un contenitore di oggetti può contenere è la memoria disponibile.

  • Determinazione delle strutture che è possibile modificare con descrittori.

    Se un minidriver alloca dinamicamente un descrittore o una sottostruttura del descrittore, il minidriver inserisce il descrittore nel contenitore di oggetti pertinente. La funzione _KsEdit usa quindi queste informazioni per determinare se è possibile modificare una determinata struttura.

AVStream rimuove automaticamente gli elementi da un contenitore di oggetti se l'oggetto proprietario viene eliminato.

I minidriver possono rimuovere singoli elementi da un contenitore di oggetti chiamando KsRemoveItemFromObjectBag o KsDiscard.