mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 15:52:57 +00:00
- Copy Filter descriptor for each instantiated filter
- Implement KsFilterAddTopologyConnections, KsFilterCreatePinFactory svn path=/trunk/; revision=42278
This commit is contained in:
parent
5372462044
commit
52e5cc0ba2
1 changed files with 190 additions and 9 deletions
|
@ -773,7 +773,6 @@ IKsFilter_CreateDescriptors(
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* allocate pin descriptor array */
|
/* allocate pin descriptor array */
|
||||||
This->PinDescriptors = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount);
|
This->PinDescriptors = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount);
|
||||||
if(!This->PinDescriptors)
|
if(!This->PinDescriptors)
|
||||||
|
@ -827,6 +826,80 @@ IKsFilter_CreateDescriptors(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
IKsFilter_CopyFilterDescriptor(
|
||||||
|
IKsFilterImpl * This,
|
||||||
|
const KSFILTER_DESCRIPTOR* FilterDescriptor)
|
||||||
|
{
|
||||||
|
This->Filter.Descriptor = (const KSFILTER_DESCRIPTOR*)AllocateItem(NonPagedPool, sizeof(KSFILTER_DESCRIPTOR));
|
||||||
|
if (!This->Filter.Descriptor)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* copy all fields */
|
||||||
|
RtlMoveMemory((PVOID)This->Filter.Descriptor, FilterDescriptor, sizeof(KSFILTER_DESCRIPTOR));
|
||||||
|
|
||||||
|
|
||||||
|
/* perform deep copy of pin descriptors */
|
||||||
|
if (FilterDescriptor->PinDescriptorsCount)
|
||||||
|
{
|
||||||
|
KSPIN_DESCRIPTOR_EX * PinDescriptors = (KSPIN_DESCRIPTOR_EX *)AllocateItem(NonPagedPool, FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount);
|
||||||
|
|
||||||
|
|
||||||
|
if (!PinDescriptors)
|
||||||
|
{
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
RtlMoveMemory((PVOID)PinDescriptors, FilterDescriptor->PinDescriptors, FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount);
|
||||||
|
|
||||||
|
/* brain-dead gcc hack */
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->PinDescriptors, PinDescriptors, sizeof(PKSPIN_DESCRIPTOR_EX));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* perform deep copy of node descriptors */
|
||||||
|
if (FilterDescriptor->NodeDescriptorsCount)
|
||||||
|
{
|
||||||
|
KSNODE_DESCRIPTOR* NodeDescriptor = AllocateItem(NonPagedPool, FilterDescriptor->NodeDescriptorsCount * FilterDescriptor->NodeDescriptorSize);
|
||||||
|
if (!NodeDescriptor)
|
||||||
|
{
|
||||||
|
if (This->Filter.Descriptor->PinDescriptors)
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor->PinDescriptors);
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
RtlMoveMemory((PVOID)NodeDescriptor, FilterDescriptor->NodeDescriptors, FilterDescriptor->NodeDescriptorsCount * FilterDescriptor->NodeDescriptorSize);
|
||||||
|
|
||||||
|
/* brain-dead gcc hack */
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->NodeDescriptors, NodeDescriptor, sizeof(PKSNODE_DESCRIPTOR));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* perform deep copy of connections descriptors */
|
||||||
|
if (FilterDescriptor->NodeDescriptorsCount)
|
||||||
|
{
|
||||||
|
KSTOPOLOGY_CONNECTION* Connections = AllocateItem(NonPagedPool, sizeof(KSTOPOLOGY_CONNECTION) * FilterDescriptor->ConnectionsCount);
|
||||||
|
if (!Connections)
|
||||||
|
{
|
||||||
|
if (This->Filter.Descriptor->PinDescriptors)
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor->PinDescriptors);
|
||||||
|
|
||||||
|
if (This->Filter.Descriptor->NodeDescriptors)
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor->PinDescriptors);
|
||||||
|
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlMoveMemory((PVOID)Connections, FilterDescriptor->Connections, sizeof(KSTOPOLOGY_CONNECTION) * FilterDescriptor->ConnectionsCount);
|
||||||
|
|
||||||
|
/* brain-dead gcc hack */
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections, Connections, sizeof(PKSTOPOLOGY_CONNECTION));
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
KspCreateFilter(
|
KspCreateFilter(
|
||||||
|
@ -858,6 +931,15 @@ KspCreateFilter(
|
||||||
if (!This)
|
if (!This)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* copy filter descriptor */
|
||||||
|
Status = IKsFilter_CopyFilterDescriptor(This, Factory->FilterDescriptor);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* not enough memory */
|
||||||
|
FreeItem(This);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
/* get current irp stack */
|
/* get current irp stack */
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
|
||||||
|
@ -871,6 +953,8 @@ KspCreateFilter(
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice;
|
KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice;
|
||||||
KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->Filter.Bag, NULL);
|
KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->Filter.Bag, NULL);
|
||||||
|
|
||||||
|
@ -977,7 +1061,7 @@ KsFilterReleaseProcessingMutex(
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI
|
KSDDKAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -987,8 +1071,41 @@ KsFilterAddTopologyConnections (
|
||||||
IN ULONG NewConnectionsCount,
|
IN ULONG NewConnectionsCount,
|
||||||
IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections)
|
IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
ULONG Count;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
KSTOPOLOGY_CONNECTION * Connections;
|
||||||
|
IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
|
||||||
|
|
||||||
|
Count = This->Filter.Descriptor->ConnectionsCount + NewConnectionsCount;
|
||||||
|
|
||||||
|
/* allocate array */
|
||||||
|
Connections = AllocateItem(NonPagedPool, Count * sizeof(KSTOPOLOGY_CONNECTION));
|
||||||
|
if (!Connections)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* FIXME verify connections */
|
||||||
|
|
||||||
|
if (This->Filter.Descriptor->ConnectionsCount)
|
||||||
|
{
|
||||||
|
/* copy old connections */
|
||||||
|
RtlMoveMemory(Connections, This->Filter.Descriptor->Connections, sizeof(KSTOPOLOGY_CONNECTION) * This->Filter.Descriptor->ConnectionsCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add new connections */
|
||||||
|
RtlMoveMemory((PVOID)(Connections + This->Filter.Descriptor->ConnectionsCount), NewTopologyConnections, NewConnectionsCount);
|
||||||
|
|
||||||
|
/* add the new connections */
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->ConnectionsCount, &Count, sizeof(ULONG)); /* brain-dead gcc hack */
|
||||||
|
|
||||||
|
/* free old connections array */
|
||||||
|
if (This->Filter.Descriptor->ConnectionsCount)
|
||||||
|
{
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor->Connections);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* brain-dead gcc hack */
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections, Connections, sizeof(KSTOPOLOGY_CONNECTION*));
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1020,18 +1137,82 @@ KsFilterCreateNode (
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI
|
KSDDKAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
KsFilterCreatePinFactory (
|
KsFilterCreatePinFactory (
|
||||||
IN PKSFILTER Filter,
|
IN PKSFILTER Filter,
|
||||||
IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
|
IN const KSPIN_DESCRIPTOR_EX *const InPinDescriptor,
|
||||||
OUT PULONG PinID)
|
OUT PULONG PinID)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
ULONG Count;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
ULONG *PinInstanceCount;
|
||||||
|
KSPIN_DESCRIPTOR_EX * PinDescriptorsEx;
|
||||||
|
KSPIN_DESCRIPTOR * PinDescriptors;
|
||||||
|
IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
|
||||||
|
|
||||||
|
/* calculate existing count */
|
||||||
|
Count = This->PinDescriptorCount + 1;
|
||||||
|
|
||||||
|
/* allocate pin descriptors array */
|
||||||
|
PinDescriptorsEx = AllocateItem(NonPagedPool, max(This->Filter.Descriptor->PinDescriptorSize, sizeof(KSPIN_DESCRIPTOR_EX)) * Count);
|
||||||
|
if (!PinDescriptorsEx)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* allocate pin instance count array */
|
||||||
|
PinInstanceCount = AllocateItem(NonPagedPool, sizeof(ULONG) * Count);
|
||||||
|
if (!PinInstanceCount)
|
||||||
|
{
|
||||||
|
/* not enough memory */
|
||||||
|
FreeItem(PinDescriptorsEx);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate pin descriptor array for pin property handling */
|
||||||
|
PinDescriptors = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * Count);
|
||||||
|
if (!PinDescriptors)
|
||||||
|
{
|
||||||
|
/* not enough memory */
|
||||||
|
FreeItem(PinDescriptorsEx);
|
||||||
|
FreeItem(PinInstanceCount);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now copy all fields */
|
||||||
|
if (Count > 1)
|
||||||
|
{
|
||||||
|
/* copy old descriptors */
|
||||||
|
RtlMoveMemory(PinDescriptorsEx, This->Filter.Descriptor->PinDescriptors, max(This->Filter.Descriptor->PinDescriptorSize, sizeof(KSPIN_DESCRIPTOR_EX)) * This->PinDescriptorCount);
|
||||||
|
RtlMoveMemory(PinInstanceCount, This->PinInstanceCount, This->PinDescriptorCount * sizeof(ULONG));
|
||||||
|
RtlMoveMemory(PinDescriptors, This->PinDescriptors, sizeof(KSPIN_DESCRIPTOR) * This->PinDescriptorCount);
|
||||||
|
|
||||||
|
/* now free old descriptors */
|
||||||
|
FreeItem(This->PinInstanceCount);
|
||||||
|
FreeItem((PVOID)This->Filter.Descriptor->PinDescriptors);
|
||||||
|
FreeItem(This->PinDescriptors);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add new pin factory */
|
||||||
|
RtlMoveMemory((PVOID)((ULONG_PTR)PinDescriptorsEx + max(This->Filter.Descriptor->PinDescriptorSize, sizeof(KSPIN_DESCRIPTOR_EX)) * This->PinDescriptorCount), InPinDescriptor, sizeof(KSPIN_DESCRIPTOR));
|
||||||
|
RtlMoveMemory((PVOID)(PinDescriptors + This->PinDescriptorCount), &InPinDescriptor->PinDescriptor, sizeof(KSPIN_DESCRIPTOR));
|
||||||
|
|
||||||
|
/* replace old descriptor by using a gcc-compliant hack */
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->PinDescriptors, PinDescriptorsEx, sizeof(KSPIN_DESCRIPTOR_EX*));
|
||||||
|
RtlMoveMemory((PVOID)&This->Filter.Descriptor->PinDescriptorsCount, &Count, sizeof(ULONG));
|
||||||
|
|
||||||
|
This->PinDescriptors = PinDescriptors;
|
||||||
|
This->PinInstanceCount = PinInstanceCount;
|
||||||
|
|
||||||
|
/* store new pin id */
|
||||||
|
*PinID = This->PinDescriptorCount;
|
||||||
|
|
||||||
|
/* increment pin descriptor count */
|
||||||
|
This->PinDescriptorCount++;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue