对象包

AVStream 负责管理一个称为对象袋的构造,该对象袋用于每个对微型驱动程序可见的 AVStream 对象。 对象包是一个通用容器,用于保存与给定对象关联的动态分配内存。

以下结构具有类型为 KSOBJECT_BAG 的成员,其等效于 PVOID: KSDEVICEKSFILTERFACTORYKSFILTERKSPIN

对象包的用途包括:

  • 内存管理。

    微型驱动程序可以使用对象包进行内存管理,以减少清理工作。 为此,微型驱动程序必须首先调用 ExAllocatePoolWithTag 来分配动态内存并将其与给定对象相关联。 然后,微型驱动程序通过调用 KsAddItemToObjectBag 将分配的内存添加到对象包。

    当微型驱动程序调用 KsAddItemToObjectBag 时,AVStream 会将默认清理函数(通常 为 ExFreePool)与对象相关联。 或者,微型驱动程序可以在 KsAddItemToObjectBagFree 参数中包含指向微型驱动程序提供的清理例程的指针。 关闭对象后,AVStream 会从对象包中删除每个项目,并调用关联的清理例程。

  • 动态分配的数据在多个 AVStream 对象之间共享。

    微型驱动程序可以通过将给定项目放置在多个对象包中,在多个 AVStream 对象之间动态分配数据。 在这种情况下,AVStream 不会释放给定项目,直到它不再包含在任何对象包中。 对象包可以包含的项目数的唯一限制是可用内存。

  • 确定可以使用描述符编辑哪些结构。

    如果微型驱动程序动态分配描述符或描述符子结构,微型驱动程序会将描述符放置在相关对象包中。 然后 ,_KsEdit 函数使用此信息来确定是否可以编辑给定结构。

当拥有对象被删除时,AVStream 会自动从对象包里移除项目。

微型驱动程序可以通过调用 KsRemoveItemFromObjectBagKsDiscard 从对象包中删除单个项。