- Implement KsAcquireResetValue, KsCompletePendingRequest, KsAllocateExtraData
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 30 Jul 2009 14:20:13 +0000 (14:20 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 30 Jul 2009 14:20:13 +0000 (14:20 +0000)
svn path=/trunk/; revision=42302

reactos/drivers/ksfilter/ks/api.c
reactos/drivers/ksfilter/ks/device.c
reactos/drivers/ksfilter/ks/filter.c
reactos/drivers/ksfilter/ks/irp.c

index 0795a8b..33fcae4 100644 (file)
@@ -10,7 +10,7 @@
 #include "priv.h"
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 NTSTATUS
@@ -19,8 +19,40 @@ KsAcquireResetValue(
     IN  PIRP Irp,
     OUT KSRESET* ResetValue)
 {
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
+    PIO_STACK_LOCATION IoStack;
+    KSRESET* Value;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* check if there is reset value provided */
+    if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSRESET))
+        return STATUS_INVALID_PARAMETER;
+
+    if (Irp->RequestorMode == UserMode)
+    {
+        /* need to probe the buffer */
+        _SEH2_TRY
+        {
+            ProbeForRead(IoStack->Parameters.DeviceIoControl.Type3InputBuffer, sizeof(KSRESET), sizeof(UCHAR));
+            Value = (KSRESET*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+            *ResetValue = *Value;
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            /* Exception, get the error code */
+            Status = _SEH2_GetExceptionCode();
+        }
+        _SEH2_END;
+    }
+    else
+    {
+        Value = (KSRESET*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+        *ResetValue = *Value;
+    }
+
+    return Status;
 }
 
 /*
@@ -1551,10 +1583,8 @@ KsTerminateDevice(
     }
 }
 
-
-
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 VOID
@@ -1562,7 +1592,35 @@ NTAPI
 KsCompletePendingRequest(
     IN PIRP Irp)
 {
+    PIO_STACK_LOCATION IoStack;
+
+    /* get current irp stack location */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* sanity check */
+    ASSERT(Irp->IoStatus.Status != STATUS_PENDING);
+
+    if (IoStack->MajorFunction != IRP_MJ_CLOSE)
+    {
+        /* can be completed immediately */
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return;
+    }
+
+    /* did close operation fail */
+    if (!NT_SUCCESS(Irp->IoStatus.Status))
+    {
+        /* closing failed, complete irp */
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return;
+    }
+
+    /* FIXME 
+     * delete object / device header 
+     * remove dead pin / filter instance
+     */
     UNIMPLEMENTED
+
 }
 
 /*
index 8f48814..82024ca 100644 (file)
@@ -597,32 +597,22 @@ IKsDevice_Create(
             /* increment create item reference count */
             InterlockedIncrement(&CreateItemEntry->ReferenceCount);
         }
-
-        /* acquire list lock */
-        IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
-
-        return Status;
     }
 
     /* acquire list lock */
     IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
 
-    DPRINT1("No item found for Request %p\n", IoStack->FileObject->FileName.Buffer);
+    if (Status != STATUS_PENDING)
+    {
+        Irp->IoStatus.Information = 0;
+        /* set return status */
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
 
-    Irp->IoStatus.Information = 0;
-    /* set return status */
-    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return STATUS_UNSUCCESSFUL;
+    return Status;
 
-    /* release lock */
-    IKsDevice_fnRelease((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
 
-    Irp->IoStatus.Information = 0;
-    /* set return status */
-    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-    return STATUS_UNSUCCESSFUL;
 }
 
 /*
index 198bbed..7dd9d01 100644 (file)
@@ -430,7 +430,7 @@ IKsFilter_DispatchClose(
         Status = This->Factory->FilterDescriptor->Dispatch->Close(&This->Filter, Irp);
     }
 
-    if (Status != STATUS_PENDING)
+    if (NT_SUCCESS(Status) && Status != STATUS_PENDING)
     {
         /* save the result */
         Irp->IoStatus.Status = Status;
@@ -440,9 +440,6 @@ IKsFilter_DispatchClose(
         /* remove our instance from the filter factory */
         This->FilterFactory->lpVtbl->RemoveFilterInstance(This->FilterFactory, Filter);
 
-        /* now release the acquired interface */
-        Filter->lpVtbl->Release(Filter);
-
         /* free object header */
         KsFreeObjectHeader(This->ObjectHeader);
     }
index 2c9118d..da135eb 100644 (file)
@@ -594,7 +594,7 @@ KsProbeStreamIrp(
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 NTSTATUS
@@ -604,8 +604,60 @@ KsAllocateExtraData(
     IN  ULONG ExtraSize,
     OUT PVOID* ExtraBuffer)
 {
-    UNIMPLEMENTED;
-    return STATUS_UNSUCCESSFUL;
+    PIO_STACK_LOCATION IoStack;
+    ULONG Count, Index;
+    PUCHAR Buffer, BufferOrg;
+    PKSSTREAM_HEADER Header;
+    NTSTATUS Status = STATUS_SUCCESS;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* sanity check */
+    ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSSTREAM_HEADER));
+
+    /* get total length */
+    Count = IoStack->Parameters.DeviceIoControl.InputBufferLength / sizeof(KSSTREAM_HEADER);
+
+    /* allocate buffer */
+    Buffer = BufferOrg = AllocateItem(NonPagedPool, Count * (sizeof(KSSTREAM_HEADER) + ExtraSize));
+    if (!Buffer)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    _SEH2_TRY
+    {
+        /* get input buffer */
+        Header = (PKSSTREAM_HEADER)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
+        for(Index = 0; Index < Count; Index++)
+        {
+            /* copy stream header */
+            RtlMoveMemory(Buffer, Header, sizeof(KSSTREAM_HEADER));
+
+            /* move to next header */
+            Header++;
+            /* increment output buffer offset */
+            Buffer += sizeof(KSSTREAM_HEADER) + ExtraSize;
+        }
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        /* Exception, get the error code */
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    if (!NT_SUCCESS(Status))
+    {
+        /* free buffer on exception */
+        FreeItem(Buffer);
+        return Status;
+    }
+
+    /* store result */
+    *ExtraBuffer = BufferOrg;
+
+    /* done */
+    return STATUS_SUCCESS;
 }
 
 /*