Bolsas de objetos

AVStream administra una construcción denominada contenedor de objetos para cada objeto AVStream visible para el minidriver. Un contenedor de objetos es un contenedor genérico para mantener la memoria asignada dinámicamente asociada a un objeto determinado.

Las estructuras siguientes tienen miembros de tipo KSOBJECT_BAG, que equivalen a PVOID: KSDEVICE, KSFILTERFACTORY, KSFILTER y KSPIN.

Los usos de bolsas de objetos incluyen:

  • Administración de la memoria.

    Los minicontroladores pueden usar bolsas de objetos para la administración de memoria para reducir el trabajo de limpieza. Para ello, un minidriver debe llamar primero a ExAllocatePoolWithTag para asignar memoria dinámica y asociarla a un objeto determinado. A continuación, el minidriver agrega la memoria asignada al contenedor de objetos mediante una llamada a KsAddItemToObjectBag.

    Cuando el minidriver llama a KsAddItemToObjectBag, AVStream asocia una función de limpieza predeterminada (normalmente ExFreePool) con el objeto . Como alternativa, el minidriver puede incluir un puntero a una rutina de limpieza proporcionada por minidriver en el parámetro Free de KsAddItemToObjectBag. Cuando se cierra un objeto, AVStream quita todos los elementos del contenedor de objetos y llama a las rutinas de limpieza asociadas.

  • Compartir datos asignados dinámicamente entre varios objetos AVStream.

    Un minidriver puede compartir datos asignados dinámicamente entre varios objetos AVStream colocando un elemento determinado en más de un contenedor de objetos. En este caso, AVStream no libera el elemento especificado hasta que ya no está contenido en ningún contenedor de objetos. La única limitación del número de elementos que puede contener un contenedor de objetos es la memoria disponible.

  • Determinar qué estructuras se pueden editar con descriptores.

    Si un minidriver asigna dinámicamente un descriptor o una subestructura de descriptor, el minidriver coloca el descriptor en el contenedor de objetos pertinente. A continuación, la función _KsEdit usa esta información para determinar si se puede editar una estructura determinada.

AVStream quita automáticamente los elementos de un contenedor de objetos si se elimina el objeto propietario.

Los minidrivers pueden quitar elementos individuales de un contenedor de objetos llamando a KsRemoveItemFromObjectBag o KsDiscard.