Objekttaschen

AVStream verwaltet ein Konstrukt, das als Objekttasche bezeichnet wird, für jedes AVStream-Objekt, das für den Minidriver sichtbar ist. Ein Objektbehälter ist ein generischer Container zum Speichern von dynamisch zugeordnetem Speicher, der einem bestimmten Objekt zugeordnet ist.

Die folgenden Strukturen verfügen über Elemente vom Typ KSOBJECT_BAG, die dem PVOID entsprechen: KSDEVICE, KSFILTERFACTORY, KSFILTER und KSPIN.

Zu den Verwendungsmöglichkeiten von Objektsäcken gehören:

  • Speicherverwaltung.

    Minidriver können Objekttaschen für die Speicherverwaltung verwenden, um die Bereinigung zu reduzieren. Dazu muss ein Minidriver zuerst ExAllocatePoolWithTag aufrufen, um dynamischen Arbeitsspeicher zuzuweisen und ihn einem bestimmten Objekt zuzuordnen. Der Minidriver fügt dann den zugewiesenen Arbeitsspeicher der Objekttasche hinzu, indem KsAddItemToObjectBag aufgerufen wird.

    Wenn der Minidriver KsAddItemToObjectBag aufruft, ordnet AVStream dem -Objekt eine Standardbereinigungsfunktion (in der Regel ExFreePool) zu. Alternativ kann der Minidriver einen Zeiger auf eine minidriver-bereitgestellte Bereinigungsroutine im Free-Parameter von KsAddItemToObjectBag enthalten. Wenn ein Objekt geschlossen wird, entfernt AVStream jedes Element aus dem Objektbehälter und ruft die zugehörigen Bereinigungsroutinen auf.

  • Freigeben dynamisch zugeordneter Daten zwischen mehreren AVStream-Objekten.

    Ein Minidriver kann dynamisch zugeordnete Daten für mehrere AVStream-Objekte freigeben, indem ein bestimmtes Element in mehr als einem Objektbehälter platziert wird. In diesem Fall gibt AVStream das angegebene Element erst dann frei, wenn es nicht mehr in einem Objektbehälter enthalten ist. Die einzige Einschränkung für die Anzahl der Elemente, die ein Objektbehälter enthalten kann, ist der verfügbare Arbeitsspeicher.

  • Bestimmen, welche Strukturen mit Deskriptoren bearbeitet werden können.

    Wenn ein Minidriver einen Deskriptor oder eine Deskriptorunterstruktur dynamisch zuordnet, platziert der Minidriver den Deskriptor in der entsprechenden Objekttasche. Die _KsEdit-Funktion verwendet diese Informationen dann, um zu bestimmen, ob eine bestimmte Struktur bearbeitet werden kann.

AVStream entfernt Elemente automatisch aus einem Objektbehälter, wenn das besitzende Objekt gelöscht wird.

Minidriver können einzelne Elemente aus einer Objekttasche entfernen, indem sie KsRemoveItemFromObjectBag oder KsDiscard aufrufen.