オブジェクト バッグ

AVStream は、ミニドライバーに表示される各 AVStream オブジェクトのオブジェクト バッグと呼ばれるコンストラクトを管理します。 オブジェクト バッグは、特定のオブジェクトに関連し、動的に割り当てられたメモリを保持するための汎用コンテナーです。

次の構造体は KSOBJECT_BAG 型のメンバーを持ち、これは PVOID に相当します。KSDEVICEKSFILTERFACTORYKSFILTER、およびKSPINがあります。

オブジェクト バッグの使用用途は次のとおりです。

  • メモリ管理

    ミニドライバーは、メモリ管理にオブジェクト バッグを使用して、クリーンアップ作業を削減できます。 これを実行するには、ミニドライバーは最初に ExAllocatePoolWithTag を呼び出し、動的メモリを割り当て、特定のオブジェクトに関連付ける必要があります。 次に、ミニドライバーは、KsAddItemToObjectBag 呼び出し、割り当てられたメモリをオブジェクト バッグに追加します。

    ミニドライバーが KsAddItemToObjectBagを呼び出すと、AVStream はデフォルトのクリーンアップ関数 (通常は ExFreePool) をオブジェクトに関連付けます。 代わりに、ミニドライバーが提供するクリーンアップ ルーチンへのポインターを KsAddItemToObjectBagFree パラメーターに含めることもできます。 オブジェクトが閉じると、AVStream はオブジェクト バッグからすべてのアイテムを削除し、関連するクリーンアップ ルーチンを呼び出します。

  • 複数の AVStream オブジェクト間で、動的に割り当てられたデータを共有する。

    ミニドライバーは、特定の項目を複数のオブジェクト バッグに配置することで、動的に割り当てられたデータを複数の AVStream オブジェクト間で共有できます。 この場合、AVStream は、オブジェクト バッグに含まれていない限り、指定された項目を解放しません。 オブジェクト バッグに含めることができる項目の数に関する制限は、使用可能なメモリのみです。

  • 記述子を使用して編集できる構造体を決定する。

    ミニドライバーが記述子または記述子のサブ構造体を動的に割り当てる場合、ミニドライバーは、関連するオブジェクト バッグに記述子を配置します。 次に、_KsEdit 関数はこの情報を使用して、指定された構造体が編集可能かどうかを判断します。

AVStream は、所有するオブジェクトが削除されると、オブジェクト バッグから自動的に項目を削除します。

ミニドライバーは、KsRemoveItemFromObjectBag または KsDiscardを呼び出し、オブジェクト バッグから個々の項目を削除できます。