- Implement KsAddEvent, KsDefaultAddEventHandler, KsPinAttachAndGate, KsPinAttachOrGate, KsPinGetAndGate

svn path=/trunk/; revision=42296
This commit is contained in:
Johannes Anderwald 2009-07-30 07:31:41 +00:00
parent 3aba36805e
commit 9042c879ed
5 changed files with 73 additions and 21 deletions

View file

@ -138,7 +138,7 @@ KsGenerateEventList(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
VOID VOID
@ -147,7 +147,9 @@ KsAddEvent(
IN PVOID Object, IN PVOID Object,
IN PKSEVENT_ENTRY EventEntry) 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 PKSEVENTDATA EventData,
IN OUT PKSEVENT_ENTRY EventEntry) IN OUT PKSEVENT_ENTRY EventEntry)
{ {
UNIMPLEMENTED PIO_STACK_LOCATION IoStack;
return STATUS_NOT_IMPLEMENTED; 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 @unimplemented
*/ */

View file

@ -1060,6 +1060,10 @@ KspCreateFilter(
This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface); This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface);
This->Header.Type = KsObjectTypeFilter; This->Header.Type = KsObjectTypeFilter;
KeInitializeMutex(&This->Header.ControlMutex, 0); KeInitializeMutex(&This->Header.ControlMutex, 0);
InitializeListHead(&This->Header.EventList);
KeInitializeSpinLock(&This->Header.EventListLock);

View file

@ -189,6 +189,12 @@ IKsFilterFactory_fnInitialize(
This->Header.Parent.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->Header.Parent.KsDevice = &DeviceExtension->DeviceHeader->KsDevice;
This->DeviceHeader = DeviceExtension->DeviceHeader; This->DeviceHeader = DeviceExtension->DeviceHeader;
/* unused fields */
KeInitializeMutex(&This->Header.ControlMutex, 0);
InitializeListHead(&This->Header.EventList);
KeInitializeSpinLock(&This->Header.EventListLock);
InitializeListHead(&This->SymbolicLinkList); InitializeListHead(&This->SymbolicLinkList);
InitializeListHead(&This->FilterInstanceList); InitializeListHead(&This->FilterInstanceList);

View file

@ -60,6 +60,9 @@ typedef struct
KSOBJECTTYPE Type; KSOBJECTTYPE Type;
PKSDEVICE KsDevice; PKSDEVICE KsDevice;
KMUTEX ControlMutex; KMUTEX ControlMutex;
LIST_ENTRY EventList;
KSPIN_LOCK EventListLock;
union union
{ {
PKSDEVICE KsDevice; PKSDEVICE KsDevice;

View file

@ -22,6 +22,9 @@ typedef struct
KMUTEX ProcessingMutex; KMUTEX ProcessingMutex;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
PKSGATE AttachedGate;
BOOL OrGate;
PFNKSPINPOWER Sleep; PFNKSPINPOWER Sleep;
PFNKSPINPOWER Wake; PFNKSPINPOWER Wake;
PFNKSPINHANDSHAKE Handshake; PFNKSPINHANDSHAKE Handshake;
@ -262,7 +265,7 @@ KsPinAcquireProcessingMutex(
} }
/* /*
@unimplemented @implemented
*/ */
VOID VOID
NTAPI NTAPI
@ -270,11 +273,16 @@ KsPinAttachAndGate(
IN PKSPIN Pin, IN PKSPIN Pin,
IN PKSGATE AndGate OPTIONAL) 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 VOID
NTAPI NTAPI
@ -282,8 +290,27 @@ KsPinAttachOrGate(
IN PKSPIN Pin, IN PKSPIN Pin,
IN PKSGATE OrGate OPTIONAL) 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 @unimplemented
*/ */
@ -324,18 +351,6 @@ KsPinGetConnectedFilterInterface(
return STATUS_NOT_IMPLEMENTED; return STATUS_NOT_IMPLEMENTED;
} }
/*
@unimplemented
*/
PKSGATE
NTAPI
KsPinGetAndGate(
IN PKSPIN Pin)
{
UNIMPLEMENTED
return NULL;
}
/* /*
@implemented @implemented
*/ */
@ -887,7 +902,6 @@ static KSDISPATCH_TABLE PinDispatchTable =
KsDispatchFastReadFailure KsDispatchFastReadFailure
}; };
NTSTATUS NTSTATUS
KspCreatePin( KspCreatePin(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
@ -940,6 +954,8 @@ KspCreatePin(
This->BasicHeader.Type = KsObjectTypePin; This->BasicHeader.Type = KsObjectTypePin;
This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter); This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter);
KeInitializeMutex(&This->BasicHeader.ControlMutex, 0); KeInitializeMutex(&This->BasicHeader.ControlMutex, 0);
InitializeListHead(&This->BasicHeader.EventList);
KeInitializeSpinLock(&This->BasicHeader.EventListLock);
/* initialize pin */ /* initialize pin */
This->lpVtbl = &vt_IKsPin; This->lpVtbl = &vt_IKsPin;