Author: janderwald
Date: Thu Aug 20 15:21:24 2009
New Revision: 42805

URL: http://svn.reactos.org/svn/reactos?rev=42805&view=rev
Log:
- Implement KsCopyObjectBagItems

Modified:
    trunk/reactos/drivers/ksfilter/ks/bag.c

Modified: trunk/reactos/drivers/ksfilter/ks/bag.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/bag.c?rev=42805&r1=42804&r2=42805&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/bag.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/bag.c [iso-8859-1] Thu Aug 20 15:21:24 
2009
@@ -235,7 +235,7 @@
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 NTSTATUS
@@ -244,8 +244,55 @@
     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;
 }
 
 /*


Reply via email to