}
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI
VOID
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);
}
/*
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
*/
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);
+
+
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);
KSOBJECTTYPE Type;
PKSDEVICE KsDevice;
KMUTEX ControlMutex;
+ LIST_ENTRY EventList;
+ KSPIN_LOCK EventListLock;
+
union
{
PKSDEVICE KsDevice;
KMUTEX ProcessingMutex;
PFILE_OBJECT FileObject;
+ PKSGATE AttachedGate;
+ BOOL OrGate;
+
PFNKSPINPOWER Sleep;
PFNKSPINPOWER Wake;
PFNKSPINHANDSHAKE Handshake;
}
/*
- @unimplemented
+ @implemented
*/
VOID
NTAPI
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
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
*/
return STATUS_NOT_IMPLEMENTED;
}
-/*
- @unimplemented
-*/
-PKSGATE
-NTAPI
-KsPinGetAndGate(
- IN PKSPIN Pin)
-{
- UNIMPLEMENTED
- return NULL;
-}
-
/*
@implemented
*/
KsDispatchFastReadFailure
};
-
NTSTATUS
KspCreatePin(
IN PDEVICE_OBJECT DeviceObject,
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;