オブジェクト バッグ
AVStream は、ミニドライバーに表示される各 AVStream オブジェクトのオブジェクト バッグと呼ばれるコンストラクトを管理します。 オブジェクト バッグは、特定のオブジェクトに関連し、動的に割り当てられたメモリを保持するための汎用コンテナーです。
次の構造体は KSOBJECT_BAG 型のメンバーを持ち、これは PVOID に相当します。KSDEVICE、KSFILTERFACTORY、KSFILTER、およびKSPINがあります。
オブジェクト バッグの使用用途は次のとおりです。
メモリ管理
ミニドライバーは、メモリ管理にオブジェクト バッグを使用して、クリーンアップ作業を削減できます。 これを実行するには、ミニドライバーは最初に ExAllocatePoolWithTag を呼び出し、動的メモリを割り当て、特定のオブジェクトに関連付ける必要があります。 次に、ミニドライバーは、KsAddItemToObjectBag 呼び出し、割り当てられたメモリをオブジェクト バッグに追加します。
ミニドライバーが KsAddItemToObjectBagを呼び出すと、AVStream はデフォルトのクリーンアップ関数 (通常は ExFreePool) をオブジェクトに関連付けます。 代わりに、ミニドライバーが提供するクリーンアップ ルーチンへのポインターを KsAddItemToObjectBag の Free パラメーターに含めることもできます。 オブジェクトが閉じると、AVStream はオブジェクト バッグからすべてのアイテムを削除し、関連するクリーンアップ ルーチンを呼び出します。
複数の AVStream オブジェクト間で、動的に割り当てられたデータを共有する。
ミニドライバーは、特定の項目を複数のオブジェクト バッグに配置することで、動的に割り当てられたデータを複数の AVStream オブジェクト間で共有できます。 この場合、AVStream は、オブジェクト バッグに含まれていない限り、指定された項目を解放しません。 オブジェクト バッグに含めることができる項目の数に関する制限は、使用可能なメモリのみです。
記述子を使用して編集できる構造体を決定する。
ミニドライバーが記述子または記述子のサブ構造体を動的に割り当てる場合、ミニドライバーは、関連するオブジェクト バッグに記述子を配置します。 次に、_KsEdit 関数はこの情報を使用して、指定された構造体が編集可能かどうかを判断します。
AVStream は、所有するオブジェクトが削除されると、オブジェクト バッグから自動的に項目を削除します。
ミニドライバーは、KsRemoveItemFromObjectBag または KsDiscardを呼び出し、オブジェクト バッグから個々の項目を削除できます。