[ros-diffs] [janderwald] 42277: - Implement KsFilterAcquireProcessingMutex, KsFilterReleaseProcessingMutex, KsFilterGetChildPinCount, KsFilterRegisterPowerCallbacks, KsGetFilterFromIrp

janderwald at svn.reactos.org janderwald at svn.reactos.org
Tue Jul 28 19:01:36 CEST 2009


Author: janderwald
Date: Tue Jul 28 19:01:36 2009
New Revision: 42277

URL: http://svn.reactos.org/svn/reactos?rev=42277&view=rev
Log:
- Implement KsFilterAcquireProcessingMutex, KsFilterReleaseProcessingMutex, KsFilterGetChildPinCount, KsFilterRegisterPowerCallbacks, KsGetFilterFromIrp

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

Modified: trunk/reactos/drivers/ksfilter/ks/filter.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filter.c?rev=42277&r1=42276&r2=42277&view=diff
==============================================================================
--- trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] Tue Jul 28 19:01:36 2009
@@ -25,7 +25,11 @@
     ULONG PinDescriptorCount;
     PKSFILTERFACTORY Factory;
     PFILE_OBJECT FileObject;
-
+    KMUTEX ProcessingMutex;
+
+
+    PFNKSFILTERPOWER Sleep;
+    PFNKSFILTERPOWER Wake;
 
     ULONG *PinInstanceCount;
 }IKsFilterImpl;
@@ -882,6 +886,8 @@
     This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
     This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface);
     This->Header.Type = KsObjectTypeFilter;
+    KeInitializeMutex(&This->ProcessingMutex, 0);
+
 
     /* allocate the stream descriptors */
     Status = IKsFilter_CreateDescriptors(This, (PKSFILTER_DESCRIPTOR)Factory->FilterDescriptor);
@@ -943,15 +949,46 @@
 }
 
 /*
+    @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFilterAcquireProcessingMutex(
+    IN PKSFILTER Filter)
+{
+    IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
+
+    KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL);
+}
+
+/*
+    @implemented
+*/
+KSDDKAPI
+VOID
+NTAPI
+KsFilterReleaseProcessingMutex(
+    IN PKSFILTER Filter)
+{
+    IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
+
+    KeReleaseMutex(&This->ProcessingMutex, FALSE);
+}
+
+/*
     @unimplemented
 */
 KSDDKAPI
-VOID
-NTAPI
-KsFilterAcquireProcessingMutex(
-    IN PKSFILTER Filter)
-{
-    UNIMPLEMENTED
+NTSTATUS
+NTAPI
+KsFilterAddTopologyConnections (
+    IN PKSFILTER Filter,
+    IN ULONG NewConnectionsCount,
+    IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections)
+{
+    UNIMPLEMENTED
+    return STATUS_NOT_IMPLEMENTED;
 }
 
 /*
@@ -960,33 +997,6 @@
 KSDDKAPI
 VOID
 NTAPI
-KsFilterReleaseProcessingMutex(
-    IN PKSFILTER Filter)
-{
-    UNIMPLEMENTED
-}
-
-/*
-    @unimplemented
-*/
-KSDDKAPI
-NTSTATUS
-NTAPI
-KsFilterAddTopologyConnections (
-    IN PKSFILTER Filter,
-    IN ULONG NewConnectionsCount,
-    IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections)
-{
-    UNIMPLEMENTED
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-/*
-    @unimplemented
-*/
-KSDDKAPI
-VOID
-NTAPI
 KsFilterAttemptProcessing(
     IN PKSFILTER Filter,
     IN BOOLEAN Asynchronous)
@@ -1038,7 +1048,7 @@
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 ULONG
@@ -1047,8 +1057,15 @@
     IN PKSFILTER Filter,
     IN ULONG PinId)
 {
-    UNIMPLEMENTED
-    return 0;
+    IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
+
+    if (PinId >= This->PinDescriptorCount)
+    {
+        /* index is out of bounds */
+        return 0;
+    }
+    /* return pin instance count */
+    return This->PinInstanceCount[PinId];
 }
 
 /*
@@ -1066,7 +1083,7 @@
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 VOID
@@ -1076,11 +1093,14 @@
     IN PFNKSFILTERPOWER Sleep OPTIONAL,
     IN PFNKSFILTERPOWER Wake OPTIONAL)
 {
-    UNIMPLEMENTED
+    IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
+
+    This->Sleep = Sleep;
+    This->Wake = Wake;
 }
 
 /*
-    @unimplemented
+    @implemented
 */
 KSDDKAPI
 PKSFILTER
@@ -1088,7 +1108,31 @@
 KsGetFilterFromIrp(
     IN PIRP Irp)
 {
-    UNIMPLEMENTED
-    return NULL;
-}
-
+    PIO_STACK_LOCATION IoStack;
+    PKSIOBJECT_HEADER ObjectHeader;
+
+    /* get current irp stack location */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* sanity check */
+    ASSERT(IoStack->FileObject);
+
+    /* get object header */
+    ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
+
+    if (ObjectHeader->Type == KsObjectTypeFilter)
+    {
+        /* irp is targeted at the filter */
+        return (PKSFILTER)ObjectHeader->ObjectType;
+    }
+    else if (ObjectHeader->Type == KsObjectTypePin)
+    {
+        /* irp is for a pin */
+        return KsPinGetParentFilter((PKSPIN)ObjectHeader->ObjectType);
+    }
+    else
+    {
+        /* irp is unappropiate to retrieve a filter */
+        return NULL;
+    }
+}




More information about the Ros-diffs mailing list