From 9042c879edc40879e7256fcf09a465250ed9e0bd Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 30 Jul 2009 07:31:41 +0000 Subject: [PATCH] - Implement KsAddEvent, KsDefaultAddEventHandler, KsPinAttachAndGate, KsPinAttachOrGate, KsPinGetAndGate svn path=/trunk/; revision=42296 --- reactos/drivers/ksfilter/ks/event.c | 31 +++++++++++-- reactos/drivers/ksfilter/ks/filter.c | 4 ++ reactos/drivers/ksfilter/ks/filterfactory.c | 6 +++ reactos/drivers/ksfilter/ks/kstypes.h | 3 ++ reactos/drivers/ksfilter/ks/pin.c | 50 ++++++++++++++------- 5 files changed, 73 insertions(+), 21 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/event.c b/reactos/drivers/ksfilter/ks/event.c index f29ea2fc780..54680b34239 100644 --- a/reactos/drivers/ksfilter/ks/event.c +++ b/reactos/drivers/ksfilter/ks/event.c @@ -138,7 +138,7 @@ KsGenerateEventList( } /* - @unimplemented + @implemented */ KSDDKAPI VOID @@ -147,7 +147,9 @@ KsAddEvent( IN PVOID Object, IN PKSEVENT_ENTRY EventEntry) { - UNIMPLEMENTED + PKSBASIC_HEADER Header = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); + + ExInterlockedInsertTailList(&Header->EventList, &EventEntry->ListEntry, &Header->EventListLock); } /* @@ -160,10 +162,31 @@ KsDefaultAddEventHandler( IN PKSEVENTDATA EventData, IN OUT PKSEVENT_ENTRY EventEntry) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + PIO_STACK_LOCATION IoStack; + PKSIOBJECT_HEADER ObjectHeader; + PKSBASIC_HEADER Header; + + /* first get the io stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* now get the object header */ + ObjectHeader =(PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + + /* sanity check */ + ASSERT(ObjectHeader->ObjectType); + + /* obtain basic header */ + Header = (PKSBASIC_HEADER)((ULONG_PTR)ObjectHeader->ObjectType - sizeof(KSBASIC_HEADER)); + + /* now insert the event entry */ + ExInterlockedInsertTailList(&Header->EventList, &EventEntry->ListEntry, &Header->EventListLock); + + /* done */ + return STATUS_SUCCESS; } + + /* @unimplemented */ diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index 2167baeb8ee..198bbed5d55 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -1060,6 +1060,10 @@ KspCreateFilter( This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface); This->Header.Type = KsObjectTypeFilter; KeInitializeMutex(&This->Header.ControlMutex, 0); + InitializeListHead(&This->Header.EventList); + KeInitializeSpinLock(&This->Header.EventListLock); + + diff --git a/reactos/drivers/ksfilter/ks/filterfactory.c b/reactos/drivers/ksfilter/ks/filterfactory.c index ab9a3e4b935..39cce79bbfe 100644 --- a/reactos/drivers/ksfilter/ks/filterfactory.c +++ b/reactos/drivers/ksfilter/ks/filterfactory.c @@ -189,6 +189,12 @@ IKsFilterFactory_fnInitialize( This->Header.Parent.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->DeviceHeader = DeviceExtension->DeviceHeader; + /* unused fields */ + KeInitializeMutex(&This->Header.ControlMutex, 0); + InitializeListHead(&This->Header.EventList); + KeInitializeSpinLock(&This->Header.EventListLock); + + InitializeListHead(&This->SymbolicLinkList); InitializeListHead(&This->FilterInstanceList); diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 1908e7c6341..bd23b17336d 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -60,6 +60,9 @@ typedef struct KSOBJECTTYPE Type; PKSDEVICE KsDevice; KMUTEX ControlMutex; + LIST_ENTRY EventList; + KSPIN_LOCK EventListLock; + union { PKSDEVICE KsDevice; diff --git a/reactos/drivers/ksfilter/ks/pin.c b/reactos/drivers/ksfilter/ks/pin.c index f2331477ba6..e955603a09a 100644 --- a/reactos/drivers/ksfilter/ks/pin.c +++ b/reactos/drivers/ksfilter/ks/pin.c @@ -22,6 +22,9 @@ typedef struct KMUTEX ProcessingMutex; PFILE_OBJECT FileObject; + PKSGATE AttachedGate; + BOOL OrGate; + PFNKSPINPOWER Sleep; PFNKSPINPOWER Wake; PFNKSPINHANDSHAKE Handshake; @@ -262,7 +265,7 @@ KsPinAcquireProcessingMutex( } /* - @unimplemented + @implemented */ VOID NTAPI @@ -270,11 +273,16 @@ KsPinAttachAndGate( IN PKSPIN Pin, IN PKSGATE AndGate OPTIONAL) { - UNIMPLEMENTED + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + /* FIXME attach to filter's and gate (filter-centric processing) */ + + This->AttachedGate = AndGate; + This->OrGate = FALSE; } /* - @unimplemented + @implemented */ VOID NTAPI @@ -282,8 +290,27 @@ KsPinAttachOrGate( IN PKSPIN Pin, IN PKSGATE OrGate OPTIONAL) { - UNIMPLEMENTED + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + /* FIXME attach to filter's and gate (filter-centric processing) */ + + This->AttachedGate = OrGate; + This->OrGate = TRUE; } + +/* + @implemented +*/ +PKSGATE +NTAPI +KsPinGetAndGate( + IN PKSPIN Pin) +{ + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); + + return This->AttachedGate; +} + /* @unimplemented */ @@ -324,18 +351,6 @@ KsPinGetConnectedFilterInterface( return STATUS_NOT_IMPLEMENTED; } -/* - @unimplemented -*/ -PKSGATE -NTAPI -KsPinGetAndGate( - IN PKSPIN Pin) -{ - UNIMPLEMENTED - return NULL; -} - /* @implemented */ @@ -887,7 +902,6 @@ static KSDISPATCH_TABLE PinDispatchTable = KsDispatchFastReadFailure }; - NTSTATUS KspCreatePin( IN PDEVICE_OBJECT DeviceObject, @@ -940,6 +954,8 @@ KspCreatePin( This->BasicHeader.Type = KsObjectTypePin; This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter); KeInitializeMutex(&This->BasicHeader.ControlMutex, 0); + InitializeListHead(&This->BasicHeader.EventList); + KeInitializeSpinLock(&This->BasicHeader.EventListLock); /* initialize pin */ This->lpVtbl = &vt_IKsPin;