[ros-diffs] [janderwald] 55989: [KS] - Fix property item merge in KsMergeAutomationTable

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sun Mar 4 04:44:49 UTC 2012


Author: janderwald
Date: Sun Mar  4 04:44:48 2012
New Revision: 55989

URL: http://svn.reactos.org/svn/reactos?rev=55989&view=rev
Log:
[KS]
- Fix property item merge in KsMergeAutomationTable

 

Modified:
    trunk/reactos/drivers/ksfilter/ks/api.c
    trunk/reactos/drivers/ksfilter/ks/filter.c

Modified: trunk/reactos/drivers/ksfilter/ks/api.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/api.c?rev=55989&r1=55988&r2=55989&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] Sun Mar  4 04:44:48 2012
@@ -2087,15 +2087,100 @@
     return STATUS_SUCCESS;
 }
 
+VOID
+KspAddPropertyItem(
+    OUT PKSPROPERTY_SET OutPropertySet,
+    IN PKSPROPERTY_ITEM PropertyItem,
+    IN ULONG PropertyItemSize)
+{
+    PKSPROPERTY_ITEM CurrentPropertyItem;
+    ULONG Index;
+
+    // check if the property item is already present
+    CurrentPropertyItem = (PKSPROPERTY_ITEM)OutPropertySet->PropertyItem;
+    for(Index = 0; Index < OutPropertySet->PropertiesCount; Index++)
+    {
+        if (CurrentPropertyItem->PropertyId == PropertyItem->PropertyId)
+        {
+            // item already present
+            return;
+        }
+
+        // next item
+        CurrentPropertyItem = (PKSPROPERTY_ITEM)((ULONG_PTR)CurrentPropertyItem + PropertyItemSize);
+    }
+    // add item
+    RtlCopyMemory(CurrentPropertyItem, PropertyItem, PropertyItemSize);
+    OutPropertySet->PropertiesCount++;
+}
+
+NTSTATUS
+KspMergePropertySet(
+    OUT PKSAUTOMATION_TABLE  Table,
+    OUT PKSPROPERTY_SET OutPropertySet,
+    IN PKSPROPERTY_SET PropertySetA,
+    IN PKSPROPERTY_SET PropertySetB,
+    IN KSOBJECT_BAG  Bag OPTIONAL)
+{
+    ULONG PropertyCount, Index;
+    PKSPROPERTY_ITEM PropertyItem, CurrentPropertyItem;
+    NTSTATUS Status;
+
+    // max properties 
+    PropertyCount = PropertySetA->PropertiesCount + PropertySetB->PropertiesCount;
+
+    // allocate items
+    PropertyItem = AllocateItem(NonPagedPool, Table->PropertyItemSize * PropertyCount);
+    if (!PropertyItem)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    if (Bag)
+    {
+        /* add table to object bag */
+        Status = KsAddItemToObjectBag(Bag, PropertyItem, NULL);
+        /* check for success */
+        if (!NT_SUCCESS(Status))
+        {
+            /* free table */
+            FreeItem(Table);
+            return Status;
+        }
+    }
+
+    // copy entries from dominant table
+    RtlCopyMemory(PropertyItem, PropertySetA->PropertyItem, Table->PropertyItemSize * PropertySetA->PropertiesCount);
+
+    // init property set
+    OutPropertySet->PropertiesCount = PropertySetA->PropertiesCount;
+    OutPropertySet->PropertyItem = PropertyItem;
+
+    // copy other entries
+    CurrentPropertyItem = (PKSPROPERTY_ITEM)PropertySetB->PropertyItem;
+    for(Index = 0; Index < PropertySetB->PropertiesCount; Index++)
+    {
+
+        // add entries
+        KspAddPropertyItem(OutPropertySet, CurrentPropertyItem, Table->PropertyItemSize);
+
+        // next entry
+        CurrentPropertyItem = (PKSPROPERTY_ITEM)((ULONG_PTR)CurrentPropertyItem + Table->PropertyItemSize);
+    }
+
+    // done
+    return STATUS_SUCCESS;
+}
+
 
 NTSTATUS
 KspCopyPropertySets(
     OUT PKSAUTOMATION_TABLE  Table,
     IN PKSAUTOMATION_TABLE  AutomationTableA OPTIONAL,
-    IN PKSAUTOMATION_TABLE  AutomationTableB OPTIONAL)
+    IN PKSAUTOMATION_TABLE  AutomationTableB OPTIONAL,
+    IN KSOBJECT_BAG  Bag OPTIONAL)
 {
     ULONG Index, SubIndex, Count;
     BOOL bFound;
+    NTSTATUS Status;
 
     if (!AutomationTableA)
     {
@@ -2137,6 +2222,17 @@
             RtlMoveMemory((PVOID)&Table->PropertySets[Count], &AutomationTableB->PropertySets[Index], sizeof(KSPROPERTY_SET));
             Count++;
         }
+        else
+        {
+            // merge property sets
+            Status = KspMergePropertySet(Table, (PKSPROPERTY_SET)&Table->PropertySets[SubIndex], (PKSPROPERTY_SET)&AutomationTableA->PropertySets[SubIndex], (PKSPROPERTY_SET)&AutomationTableB->PropertySets[Index], Bag);
+            if (!NT_SUCCESS(Status))
+            {
+                // failed to merge
+                DPRINT1("[KS] Failed to merge %x\n", Status);
+                return Status;
+            }
+        }
     }
 
     return STATUS_SUCCESS;
@@ -2249,6 +2345,12 @@
         {
             /* use item size from 2nd automation table */
             Table->PropertyItemSize = AutomationTableB->PropertyItemSize;
+        }
+
+        if (AutomationTableA && AutomationTableB)
+        {
+            // FIXME handle different propery item sizes
+            ASSERT(AutomationTableA->PropertyItemSize == AutomationTableB->PropertyItemSize);
         }
 
         /* now allocate the property sets */
@@ -2272,7 +2374,7 @@
             }
         }
         /* now copy the property sets */
-        Status = KspCopyPropertySets(Table, AutomationTableA, AutomationTableB);
+        Status = KspCopyPropertySets(Table, AutomationTableA, AutomationTableB, Bag);
         if(!NT_SUCCESS(Status))
             goto cleanup;
 

Modified: trunk/reactos/drivers/ksfilter/ks/filter.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filter.c?rev=55989&r1=55988&r2=55989&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] Sun Mar  4 04:44:48 2012
@@ -955,7 +955,7 @@
             UNIMPLEMENTED
             Status = STATUS_NOT_FOUND;
     }
-    //DPRINT("KspPinPropertyHandler Pins %lu Request->Id %lu Status %lx\n", This->PinDescriptorCount, Request->Id, Status);
+    DPRINT("KspPinPropertyHandler Pins %lu Request->Id %lu Status %lx\n", This->Filter.Descriptor->PinDescriptorsCount, Request->Id, Status);
 
 
     return Status;
@@ -1029,6 +1029,9 @@
             SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount;
             PropertySet = FilterInstance->Descriptor->AutomationTable->PropertySets;
             PropertyItemSize = FilterInstance->Descriptor->AutomationTable->PropertyItemSize;
+            // FIXME: handle variable sized property items
+            ASSERT(PropertyItemSize == sizeof(KSPROPERTY_ITEM));
+            PropertyItemSize = 0;
         }
 
         /* needed for our property handlers */
@@ -1063,6 +1066,7 @@
     }
 
     RtlStringFromGUID(&Property->Set, &GuidString);
+    DPRINT("IKsFilter_DispatchDeviceIoControl property PinCount %x\n", FilterInstance->Descriptor->PinDescriptorsCount);
     DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information);
     RtlFreeUnicodeString(&GuidString);
 




More information about the Ros-diffs mailing list