From: Johannes Anderwald Date: Thu, 20 Aug 2009 13:21:24 +0000 (+0000) Subject: - Implement KsCopyObjectBagItems X-Git-Tag: ReactOS-0.3.11~1075 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=0d280a8bdeaa9be11638f3d7295eb194fb99498a - Implement KsCopyObjectBagItems svn path=/trunk/; revision=42805 --- diff --git a/reactos/drivers/ksfilter/ks/bag.c b/reactos/drivers/ksfilter/ks/bag.c index 8c418078777..ec352d25dbe 100644 --- a/reactos/drivers/ksfilter/ks/bag.c +++ b/reactos/drivers/ksfilter/ks/bag.c @@ -235,7 +235,7 @@ KsRemoveItemFromObjectBag( } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS @@ -244,8 +244,55 @@ KsCopyObjectBagItems( IN KSOBJECT_BAG ObjectBagDestination, IN KSOBJECT_BAG ObjectBagSource) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + PKSIOBJECT_BAG ObjectBagDest, ObjectBagSrc; + PLIST_ENTRY Entry; + PKSIOBJECT_BAG_ENTRY BagEntry; + NTSTATUS Status = STATUS_SUCCESS; + + /* get object bag src */ + ObjectBagSrc = (PKSIOBJECT_BAG)ObjectBagSource; + + /* get object bag dst */ + ObjectBagDest = (PKSIOBJECT_BAG)ObjectBagDestination; + + /* acquire source mutex */ + KeWaitForSingleObject(ObjectBagSrc->BagMutex, Executive, KernelMode, FALSE, NULL); + + if (ObjectBagSrc->BagMutex != ObjectBagDest->BagMutex) + { + /* acquire destination mutex */ + KeWaitForSingleObject(ObjectBagDest->BagMutex, Executive, KernelMode, FALSE, NULL); + } + + /* point to first item */ + Entry = ObjectBagSrc->ObjectList.Flink; + /* first scan the list if the item is already inserted */ + while(Entry != &ObjectBagSrc->ObjectList) + { + /* get bag entry */ + BagEntry = (PKSIOBJECT_BAG_ENTRY)CONTAINING_RECORD(Entry, KSIOBJECT_BAG_ENTRY, Entry); + + /* add the item */ + Status = KsAddItemToObjectBag(ObjectBagDestination, BagEntry->Item, BagEntry->Free); + + /* check for success */ + if (!NT_SUCCESS(Status)) + break; + + /* move to next entry */ + Entry = Entry->Flink; + } + + if (ObjectBagSrc->BagMutex != ObjectBagDest->BagMutex) + { + /* release destination mutex */ + KeReleaseMutex(ObjectBagDest->BagMutex, FALSE); + } + + /* release source mutex */ + KeReleaseMutex(ObjectBagSrc->BagMutex, FALSE); + + return Status; } /*