对象包

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

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

对象包的用法包括:

  • 内存管理。

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

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

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

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

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

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

如果删除了拥有的对象,AVStream 会自动从对象包中删除项目。

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