Контейнеры объектов

AVStream управляет конструкцией, называемой контейнером объектов, для каждого объекта AVStream, видимого для мини-драйвера. Контейнер объектов — это универсальный контейнер для хранения динамически выделенной памяти, связанной с заданным объектом.

Следующие структуры имеют члены типа KSOBJECT_BAG, что эквивалентно PVOID: KSDEVICE, KSFILTERFACTORY, KSFILTER и KSPIN.

К использованию контейнеров объектов относятся:

  • Управление памятью

    Мини-драйверы могут использовать контейнеры объектов для управления памятью, чтобы сократить работу по очистке. Для этого мини-диск должен сначала вызвать ExAllocatePoolWithTag , чтобы выделить динамическую память и связать ее с заданным объектом. Затем мини-диск добавляет выделенную память в контейнер объектов, вызывая KsAddItemToObjectBag.

    Когда мини-driver вызывает KsAddItemToObjectBag, AVStream связывает функцию очистки по умолчанию (обычно ExFreePool) с объектом . Кроме того, мини-диск может включать указатель на процедуру очистки, предоставляемую мини-driver, в параметре Freeэлемента KsAddItemToObjectBag. При закрытии объекта AVStream удаляет каждый элемент из контейнера объектов и вызывает связанные процедуры очистки.

  • Совместное использование динамически выделенных данных между несколькими объектами AVStream.

    Мини-накопитель может совместно использовать динамически выделенные данные между несколькими объектами AVStream, поместив данный элемент в несколько объектов. В этом случае AVStream не освобождает заданный элемент, пока он не будет содержаться в контейнере объектов. Единственным ограничением на количество элементов, которые может содержать контейнер объектов, является доступная память.

  • Определение структур, которые можно изменять с помощью дескрипторов.

    Если мини-диск динамически выделяет дескриптор или подструктуру дескриптора, он помещает дескриптор в соответствующий контейнер объектов. Затем функция _KsEdit использует эти сведения для определения возможности редактирования данной структуры.

AVStream автоматически удаляет элементы из контейнера объектов, если объект-владеющий удаляется.

Мини-накопители могут удалять отдельные элементы из контейнера объектов, вызывая KsRemoveItemFromObjectBag или KsDiscard.