Sacos de objeto

O AVStream gerencia um constructo chamado de recipiente de objetos para cada objeto AVStream visível para o minidriver. Um recipiente de objetos é um contêiner genérico para manter a memória alocada dinamicamente associada a um determinado objeto.

As estruturas a seguir têm membros do tipo KSOBJECT_BAG, que é equivalente a PVOID: KSDEVICE, KSFILTERFACTORY, KSFILTER e KSPIN.

Os usos de sacos de objeto incluem:

  • Gerenciamento de memória.

    Os minidrivers podem usar sacos de objetos para gerenciamento de memória para reduzir o trabalho de limpeza. Para fazer isso, um minidriver deve primeiro chamar ExAllocatePoolWithTag para alocar memória dinâmica e associá-la a um determinado objeto. Em seguida, o minidriver adiciona a memória alocada ao recipiente de objetos chamando KsAddItemToObjectBag.

    Quando o minidriver chama KsAddItemToObjectBag, o AVStream associa uma função de limpeza padrão (normalmente ExFreePool) ao objeto . Como alternativa, o minidriver pode incluir um ponteiro para uma rotina de limpeza fornecida pelo minidriver no parâmetro Free de KsAddItemToObjectBag. Quando um objeto é fechado, o AVStream remove todos os itens do recipiente de objetos e chama as rotinas de limpeza associadas.

  • Compartilhar dados alocados dinamicamente entre vários objetos AVStream.

    Um minidriver pode compartilhar dados alocados dinamicamente entre vários objetos AVStream colocando um determinado item em mais de um recipiente de objetos. Nesse caso, o AVStream não libera o item fornecido até que ele não esteja mais contido em nenhum recipiente de objetos. A única limitação no número de itens que um recipiente de objetos pode conter é a memória disponível.

  • Determinando quais estruturas podem ser editadas com descritores.

    Se um minidriver alocar dinamicamente um descritor ou uma subestrutura de descritor, o minidriver colocará o descritor no recipiente de objetos relevante. A função _KsEdit usa essas informações para determinar se uma determinada estrutura pode ser editada.

O AVStream removerá automaticamente os itens de um recipiente de objetos se o objeto proprietário for excluído.

Os minidrivers podem remover itens individuais de um recipiente de objetos chamando KsRemoveItemFromObjectBag ou KsDiscard.