[KS]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 20 Oct 2016 20:02:43 +0000 (20:02 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 20 Oct 2016 20:02:43 +0000 (20:02 +0000)
- implement support for KSPROPSETID_General

svn path=/trunk/; revision=72999

reactos/drivers/ksfilter/ks/filter.c
reactos/drivers/ksfilter/ks/pin.c
reactos/drivers/ksfilter/ks/precomp.h
reactos/drivers/ksfilter/ks/property.c

index 5fb686d..7441e59 100644 (file)
@@ -45,6 +45,7 @@ const GUID IID_IKsControl = {0x28F54685L, 0x06FD, 0x11D2, {0xB2, 0x7A, 0x00, 0xA
 const GUID IID_IKsFilter  = {0x3ef6ee44L, 0x0D41, 0x11d2, {0xbe, 0xDA, 0x00, 0xc0, 0x4f, 0x8e, 0xF4, 0x57}};
 const GUID KSPROPSETID_Topology                = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
 const GUID KSPROPSETID_Pin                     = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
+const GUID KSPROPSETID_General =                 {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
 
 VOID
 IKsFilter_RemoveFilterFromFilterFactory(
@@ -53,10 +54,11 @@ IKsFilter_RemoveFilterFromFilterFactory(
 
 NTSTATUS NTAPI FilterTopologyPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER  Request, IN OUT PVOID  Data);
 NTSTATUS NTAPI FilterPinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER  Request, IN OUT PVOID  Data);
-
+NTSTATUS NTAPI FilterGeneralComponentIdHandler(IN PIRP Irp, IN PKSIDENTIFIER  Request, IN OUT PVOID  Data);
 
 DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, FilterTopologyPropertyHandler);
 DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, FilterPinPropertyHandler, FilterPinPropertyHandler, FilterPinPropertyHandler);
+DEFINE_KSPROPERTY_GENEREAL_COMPONENTID(IKsFilterGeneralSet, FilterGeneralComponentIdHandler);
 
 KSPROPERTY_SET FilterPropertySet[] =
 {
@@ -73,6 +75,13 @@ KSPROPERTY_SET FilterPropertySet[] =
         (const KSPROPERTY_ITEM*)&IKsFilterPinSet,
         0,
         NULL
+    },
+    {
+        &KSPROPSETID_General,
+        sizeof(IKsFilterGeneralSet) / sizeof(KSPROPERTY_ITEM),
+        (const KSPROPERTY_ITEM*)&IKsFilterGeneralSet,
+        0,
+        NULL
     }
 };
 
@@ -906,6 +915,39 @@ FilterTopologyPropertyHandler(
 
 }
 
+NTSTATUS
+NTAPI
+FilterGeneralComponentIdHandler(
+    IN PIRP Irp,
+    IN PKSIDENTIFIER  Request,
+    IN OUT PVOID  Data)
+{
+    PIO_STACK_LOCATION IoStack;
+    IKsFilterImpl * This;
+
+    /* get filter implementation */
+    This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
+
+    /* sanity check */
+    ASSERT(This);
+
+    /* get current stack location */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+    ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(KSCOMPONENTID));
+
+    if (This->Filter.Descriptor->ComponentId != NULL)
+    {
+        RtlMoveMemory(Data, This->Filter.Descriptor->ComponentId, sizeof(KSCOMPONENTID));
+        Irp->IoStatus.Information = sizeof(KSCOMPONENTID);
+        return STATUS_SUCCESS;
+    }
+    else
+    {
+        /* not valid */
+        return STATUS_NOT_FOUND;
+    }
+
+}
 
 NTSTATUS
 NTAPI
@@ -977,6 +1019,7 @@ IKsFilter_DispatchDeviceIoControl(
     UNICODE_STRING GuidString;
     PKSPROPERTY Property;
     ULONG SetCount = 0;
+    //PKSP_NODE NodeProperty;
 
     /* obtain filter from object header */
     Status = IKsFilter_GetFilterFromIrp(Irp, &Filter);
@@ -1024,8 +1067,20 @@ IKsFilter_DispatchDeviceIoControl(
     {
         const KSPROPERTY_SET *PropertySet = NULL;
         ULONG PropertyItemSize = 0;
-
+#if 0
         /* check if the driver supports method sets */
+        if (Property->Flags & KSPROPERTY_TYPE_TOPOLOGY)
+        {
+            NodeProperty = (PKSP_NODE)Property;
+            if (FilterInstance->Descriptor->NodeDescriptors[NodeProperty->NodeId].AutomationTable != NULL)
+            {
+                SetCount = FilterInstance->Descriptor->NodeDescriptors[NodeProperty->NodeId].AutomationTable->PropertySetsCount;
+                PropertySet = FilterInstance->Descriptor->NodeDescriptors[NodeProperty->NodeId].AutomationTable->PropertySets;
+                PropertyItemSize = 0;
+            }
+                
+        } else 
+#endif
         if (FilterInstance->Descriptor->AutomationTable->PropertySetsCount)
         {
             SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount;
@@ -1267,7 +1322,7 @@ IKsFilter_CopyFilterDescriptor(
 
     /* setup filter property sets */
     AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM);
-    AutomationTable.PropertySetsCount = 2;
+    AutomationTable.PropertySetsCount = 3;
     AutomationTable.PropertySets = FilterPropertySet;
 
     /* merge filter automation table */
index f3b5356..258e7ea 100644 (file)
@@ -1466,7 +1466,7 @@ KsStreamPointerUnlock(
 {
     PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer);
 
-    DPRINT("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject);
+    DPRINT1("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject);
 
     Pointer->Irp = NULL;
 }
@@ -1483,7 +1483,7 @@ KsStreamPointerAdvanceOffsetsAndUnlock(
     IN ULONG OutUsed,
     IN BOOLEAN Eject)
 {
-    DPRINT("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject);
+    DPRINT1("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject);
     DbgBreakPoint();
     UNIMPLEMENTED
 }
@@ -2636,8 +2636,8 @@ KspCreatePin(
     {
         /* failed to create pin, release resources */
         IKsFilter_RemovePin(Filter->lpVtbl->GetStruct(Filter), &This->Pin);
-        KsFreeObjectHeader((KSOBJECT_HEADER)This->ObjectHeader);
         KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag);
+        KsFreeObjectHeader((KSOBJECT_HEADER)This->ObjectHeader);
         FreeItem(This);
 
         /* return failure code */
index 738176c..d90bcdb 100644 (file)
@@ -33,6 +33,11 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
     DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
     DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
 }
+#define DEFINE_KSPROPERTY_GENEREAL_COMPONENTID(PinSet,\
+    PropGeneral)\
+DEFINE_KSPROPERTY_TABLE(PinSet) {\
+DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(PropGeneral)\
+}
 
 #define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\
     PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\
index 0290435..72f6089 100644 (file)
@@ -30,6 +30,8 @@ FindPropertyHandler(
     OUT PKSPROPERTY_ITEM *PropertyItem)
 {
     ULONG Index, ItemIndex;
+    PULONG Flags;
+    PKSPROPERTY_DESCRIPTION Description;
 
     for(Index = 0; Index < PropertySetCount; Index++)
     {
@@ -39,46 +41,16 @@ FindPropertyHandler(
         {
             for(ItemIndex = 0; ItemIndex < PropertySet[Index].PropertiesCount; ItemIndex++)
             {
-                if (PropertySet[Index].PropertyItem[ItemIndex].PropertyId == Property->Id)
-                {
-                    if (PropertySet[Index].PropertyItem[ItemIndex].MinProperty > InputBufferLength)
-                    {
-                        /* too small input buffer */
-                        IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinProperty;
-                        return STATUS_INVALID_PARAMETER;
-                    }
-
-                    if (PropertySet[Index].PropertyItem[ItemIndex].MinData > OutputBufferLength)
-                    {
-                        /* too small output buffer */
-                        IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
-                        return STATUS_MORE_ENTRIES;
-                    }
-
-                    /* store property set */
-                    *Set = (PKSPROPERTY_SET)&PropertySet[Index];
-                    *PropertyItem = (PKSPROPERTY_ITEM)&PropertySet[Index].PropertyItem[ItemIndex];
 
-                    if (Property->Flags & KSPROPERTY_TYPE_SET)
-                    {
-                        /* store property handler */
-                        *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
-                        return STATUS_SUCCESS;
-                    }
-
-                    if (Property->Flags & KSPROPERTY_TYPE_GET)
-                    {
-                        /* store property handler */
-                        *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
-                        return STATUS_SUCCESS;
-                    }
+                /* store property set */
+                *Set = (PKSPROPERTY_SET)&PropertySet[Index];
+                *PropertyItem = (PKSPROPERTY_ITEM)&PropertySet[Index].PropertyItem[ItemIndex];
 
 
+                if (PropertySet[Index].PropertyItem[ItemIndex].PropertyId == Property->Id)
+                {
                     if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT)
                     {
-                        PULONG Flags;
-                        PKSPROPERTY_DESCRIPTION Description;
-
                         if (sizeof(ULONG) > OutputBufferLength)
                         {
                             /* too small buffer */
@@ -123,6 +95,37 @@ FindPropertyHandler(
                         }
                         return STATUS_SUCCESS;
                     }
+
+                    if (PropertySet[Index].PropertyItem[ItemIndex].MinProperty > InputBufferLength)
+                    {
+                        /* too small input buffer */
+                        IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinProperty;
+                        return STATUS_INVALID_PARAMETER;
+                    }
+
+                    if (PropertySet[Index].PropertyItem[ItemIndex].MinData > OutputBufferLength)
+                    {
+                        /* too small output buffer */
+                        IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
+                        return STATUS_MORE_ENTRIES;
+                    }
+
+
+                    if (Property->Flags & KSPROPERTY_TYPE_SET)
+                    {
+                        /* store property handler */
+                        *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
+                        return STATUS_SUCCESS;
+                    }
+
+                    if (Property->Flags & KSPROPERTY_TYPE_GET)
+                    {
+                        /* store property handler */
+                        *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
+                        return STATUS_SUCCESS;
+                    }
+
+
                 }
             }
         }