- Store KSPROPERTY_SET in Irp when using KsPropertyHandler
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Sun, 11 Oct 2009 09:49:10 +0000 (09:49 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Sun, 11 Oct 2009 09:49:10 +0000 (09:49 +0000)
- Fix a bug in KsPinDataIntersection

svn path=/trunk/; revision=43369

reactos/drivers/ksfilter/ks/connectivity.c
reactos/drivers/ksfilter/ks/misc.c
reactos/drivers/ksfilter/ks/property.c

index 3aa55b9..56f7fe7 100644 (file)
@@ -291,7 +291,7 @@ KsPinPropertyHandler(
     IoStack = IoGetCurrentIrpStackLocation(Irp);
     Buffer = Irp->UserBuffer;
 
-    DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %x\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id);
+    DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id);
 
     switch(Property->Id)
     {
@@ -584,6 +584,24 @@ KsPinPropertyHandler(
     return Status;
 }
 
+/*
+    @unimplemented
+*/
+KSDDKAPI NTSTATUS NTAPI
+KsPinDataIntersectionEx(
+    IN  PIRP Irp,
+    IN  PKSP_PIN Pin,
+    OUT PVOID Data,
+    IN  ULONG DescriptorsCount,
+    IN  const KSPIN_DESCRIPTOR* Descriptor,
+    IN  ULONG DescriptorSize,
+    IN  PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
+    IN  PVOID HandlerContext OPTIONAL)
+{
+    UNIMPLEMENTED;
+    return STATUS_UNSUCCESSFUL;
+}
+
 /*
     @implemented
 */
@@ -627,7 +645,7 @@ KsPinDataIntersection(
     }
 
     /* get start item */
-    Item = (KSMULTIPLE_ITEM*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+    Item = (KSMULTIPLE_ITEM*)(Pin + 1);
     /* get first data range */
     DataRange = (KSDATARANGE*)(Item + 1);
     /* iterate through all data ranges */
index c746602..2e77824 100644 (file)
@@ -81,25 +81,6 @@ KspForwardIrpSynchronous(
     return Status;
 }
 
-/*
-    @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsPinDataIntersectionEx(
-    IN  PIRP Irp,
-    IN  PKSP_PIN Pin,
-    OUT PVOID Data,
-    IN  ULONG DescriptorsCount,
-    IN  const KSPIN_DESCRIPTOR* Descriptor,
-    IN  ULONG DescriptorSize,
-    IN  PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
-    IN  PVOID HandlerContext OPTIONAL)
-{
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
-}
-
-
 NTSTATUS
 KspCopyCreateRequest(
     IN PIRP Irp,
index 5204586..d239395 100644 (file)
@@ -18,7 +18,8 @@ FindPropertyHandler(
     IN ULONG InputBufferLength,
     IN ULONG OutputBufferLength,
     OUT PVOID OutputBuffer,
-    OUT PFNKSHANDLER *PropertyHandler)
+    OUT PFNKSHANDLER *PropertyHandler,
+    OUT PKSPROPERTY_SET * Set)
 {
     ULONG Index, ItemIndex;
     //PULONG Flags;
@@ -93,6 +94,7 @@ FindPropertyHandler(
                     if (Property->Flags & KSPROPERTY_TYPE_GET)
                         *PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
 
+                    *Set = (PKSPROPERTY_SET)&PropertySet[Index];
                     return STATUS_SUCCESS;
                 }
             }
@@ -111,6 +113,7 @@ KspPropertyHandler(
     IN  ULONG PropertyItemSize OPTIONAL)
 {
     PKSPROPERTY Property;
+    PKSPROPERTY_SET Set;
     PIO_STACK_LOCATION IoStack;
     NTSTATUS Status;
     PFNKSHANDLER PropertyHandler = NULL;
@@ -139,11 +142,12 @@ KspPropertyHandler(
     ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM));
 
     /* find the property handler */
-    Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &PropertyHandler);
+    Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &PropertyHandler, &Set);
 
     if (NT_SUCCESS(Status) && PropertyHandler)
     {
         /* call property handler */
+        KSPROPERTY_SET_IRP_STORAGE(Irp) = Set;
         Status = PropertyHandler(Irp, Property, Irp->UserBuffer);
 
         if (Status == STATUS_BUFFER_TOO_SMALL)