mirror of
https://github.com/reactos/reactos.git
synced 2024-07-04 19:54:58 +00:00
[KS]
- Fix a bad cast in KsGetDevice which led to a crash - Store IKsFilter in create item storage which is needed later by the pin property handler - There is no need to copy the existing pin factories, just add pin factories which are added dynamically - Handle possible null values for node types & names - Put allocated objects into object bags which can be released later automatically - Fix access IKsFilterFactory interface in IKsFilterFactory_Create - graphedt can now 'open' tv tuner and enumerate pins / communication / interface. Code required for devenum not yet commited svn path=/trunk/; revision=46634
This commit is contained in:
parent
40c15eccb7
commit
453f43bf77
|
@ -1621,7 +1621,10 @@ KsAcquireDevice(
|
|||
IN PKSDEVICE Device)
|
||||
{
|
||||
IKsDevice *KsDevice;
|
||||
PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice);
|
||||
PKSIDEVICE_HEADER DeviceHeader;
|
||||
|
||||
|
||||
DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice);
|
||||
|
||||
/* get device interface*/
|
||||
KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
|
||||
|
|
|
@ -18,7 +18,7 @@ KspSetDeviceInterfacesState(
|
|||
/* set device interface state */
|
||||
Status = IoSetDeviceInterfaceState(&SymEntry->SymbolicLink, Enable);
|
||||
|
||||
DPRINT("KspSetDeviceInterfacesState SymbolicLink %S Status %lx\n", SymEntry->SymbolicLink.Buffer, Status, Enable);
|
||||
DPRINT("KspSetDeviceInterfacesState SymbolicLink '%S' Status %lx\n", SymEntry->SymbolicLink.Buffer, Status, Enable);
|
||||
|
||||
/* check for success */
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
|
|
@ -37,11 +37,12 @@ NTAPI
|
|||
KsGetDevice(
|
||||
IN PVOID Object)
|
||||
{
|
||||
PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)(ULONG_PTR)Object - sizeof(KSBASIC_HEADER);
|
||||
PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER));
|
||||
|
||||
DPRINT("KsGetDevice %p\n", Object);
|
||||
DPRINT("KsGetDevice %p BasicHeader %p Type %x\n", Object, BasicHeader, BasicHeader->Type);
|
||||
|
||||
ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == BasicHeader->Type);
|
||||
ASSERT(BasicHeader->KsDevice);
|
||||
|
||||
return BasicHeader->KsDevice;
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ typedef struct
|
|||
|
||||
PKSIOBJECT_HEADER ObjectHeader;
|
||||
KSTOPOLOGY Topology;
|
||||
KSPIN_DESCRIPTOR_EX * PinDescriptorsEx;
|
||||
KSPIN_DESCRIPTOR * PinDescriptors;
|
||||
ULONG PinDescriptorCount;
|
||||
PKSFILTERFACTORY Factory;
|
||||
|
@ -695,7 +696,6 @@ KspPinPropertyHandler(
|
|||
UNIMPLEMENTED
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -736,6 +736,7 @@ IKsFilter_DispatchDeviceIoControl(
|
|||
}
|
||||
|
||||
/* call property handler supported by ks */
|
||||
KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This;
|
||||
Status = KspPropertyHandler(Irp, 2, FilterPropertySet, NULL, sizeof(KSPROPERTY_ITEM));
|
||||
|
||||
if (Status == STATUS_NOT_FOUND)
|
||||
|
@ -785,41 +786,12 @@ IKsFilter_CreateDescriptors(
|
|||
ULONG Index = 0;
|
||||
|
||||
/* initialize pin descriptors */
|
||||
if (FilterDescriptor->PinDescriptorsCount)
|
||||
{
|
||||
/* allocate pin instance count array */
|
||||
This->PinInstanceCount = AllocateItem(NonPagedPool, sizeof(ULONG) * FilterDescriptor->PinDescriptorsCount);
|
||||
if(!This->PinDescriptors)
|
||||
{
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* allocate first pin array */
|
||||
This->FirstPin = AllocateItem(NonPagedPool, sizeof(PKSPIN) * FilterDescriptor->PinDescriptorsCount);
|
||||
if(!This->FirstPin)
|
||||
{
|
||||
FreeItem(This->PinDescriptors);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
/* allocate pin descriptor array */
|
||||
This->PinDescriptors = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount);
|
||||
if(!This->PinDescriptors)
|
||||
{
|
||||
FreeItem(This->PinInstanceCount);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* set pin count */
|
||||
This->PinDescriptorCount = FilterDescriptor->PinDescriptorsCount;
|
||||
/* now copy those pin descriptors over */
|
||||
for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++)
|
||||
{
|
||||
/* copy one pin per time */
|
||||
RtlMoveMemory(&This->PinDescriptors[Index], &FilterDescriptor->PinDescriptors[Index].PinDescriptor, sizeof(KSPIN_DESCRIPTOR));
|
||||
}
|
||||
}
|
||||
This->PinInstanceCount = NULL;
|
||||
This->FirstPin = NULL;
|
||||
This->PinInstanceCount = NULL;
|
||||
This->PinDescriptors = NULL;
|
||||
This->PinDescriptorsEx = NULL;
|
||||
This->PinDescriptorCount = 0;
|
||||
|
||||
/* initialize topology descriptor */
|
||||
This->Topology.CategoriesCount = FilterDescriptor->CategoriesCount;
|
||||
|
@ -828,30 +800,45 @@ IKsFilter_CreateDescriptors(
|
|||
This->Topology.TopologyConnectionsCount = FilterDescriptor->ConnectionsCount;
|
||||
This->Topology.TopologyConnections = FilterDescriptor->Connections;
|
||||
|
||||
if (This->Topology.TopologyNodesCount > 0)
|
||||
if (FilterDescriptor->NodeDescriptorsCount)
|
||||
{
|
||||
This->Topology.TopologyNodes = AllocateItem(NonPagedPool, sizeof(GUID) * This->Topology.TopologyNodesCount);
|
||||
/* sanity check */
|
||||
ASSERT(FilterDescriptor->NodeDescriptors);
|
||||
|
||||
/* FIXME handle variable sized node descriptors */
|
||||
ASSERT(FilterDescriptor->NodeDescriptorSize == sizeof(KSNODE_DESCRIPTOR));
|
||||
|
||||
This->Topology.TopologyNodes = AllocateItem(NonPagedPool, sizeof(GUID) * FilterDescriptor->NodeDescriptorsCount);
|
||||
/* allocate topology node types array */
|
||||
if (!This->Topology.TopologyNodes)
|
||||
{
|
||||
DPRINT("IKsFilter_CreateDescriptors OutOfMemory TopologyNodesCount %lu\n", FilterDescriptor->NodeDescriptorsCount);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
This->Topology.TopologyNodesNames = AllocateItem(NonPagedPool, sizeof(GUID) * This->Topology.TopologyNodesCount);
|
||||
This->Topology.TopologyNodesNames = AllocateItem(NonPagedPool, sizeof(GUID) * FilterDescriptor->NodeDescriptorsCount);
|
||||
/* allocate topology names array */
|
||||
if (!This->Topology.TopologyNodesNames)
|
||||
{
|
||||
FreeItem((PVOID)This->Topology.TopologyNodes);
|
||||
DPRINT("IKsFilter_CreateDescriptors OutOfMemory TopologyNodesCount %lu\n", FilterDescriptor->NodeDescriptorsCount);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
for(Index = 0; Index < This->Topology.TopologyNodesCount; Index++)
|
||||
DPRINT("NodeDescriptorCount %lu\n", FilterDescriptor->NodeDescriptorsCount);
|
||||
for(Index = 0; Index < FilterDescriptor->NodeDescriptorsCount; Index++)
|
||||
{
|
||||
DPRINT("Index %lu Type %p Name %p\n", Index, FilterDescriptor->NodeDescriptors[Index].Type, FilterDescriptor->NodeDescriptors[Index].Name);
|
||||
|
||||
/* copy topology type */
|
||||
RtlMoveMemory((PVOID)&This->Topology.TopologyNodes[Index], FilterDescriptor->NodeDescriptors[Index].Type, sizeof(GUID));
|
||||
if (FilterDescriptor->NodeDescriptors[Index].Type)
|
||||
RtlMoveMemory((PVOID)&This->Topology.TopologyNodes[Index], FilterDescriptor->NodeDescriptors[Index].Type, sizeof(GUID));
|
||||
|
||||
/* copy topology name */
|
||||
RtlMoveMemory((PVOID)&This->Topology.TopologyNodesNames[Index], FilterDescriptor->NodeDescriptors[Index].Name, sizeof(GUID));
|
||||
if (FilterDescriptor->NodeDescriptors[Index].Name)
|
||||
RtlMoveMemory((PVOID)&This->Topology.TopologyNodesNames[Index], FilterDescriptor->NodeDescriptors[Index].Name, sizeof(GUID));
|
||||
}
|
||||
}
|
||||
|
||||
/* done! */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -861,72 +848,24 @@ IKsFilter_CopyFilterDescriptor(
|
|||
IKsFilterImpl * This,
|
||||
const KSFILTER_DESCRIPTOR* FilterDescriptor)
|
||||
{
|
||||
This->Filter.Descriptor = (const KSFILTER_DESCRIPTOR*)AllocateItem(NonPagedPool, sizeof(KSFILTER_DESCRIPTOR));
|
||||
NTSTATUS Status;
|
||||
|
||||
This->Filter.Descriptor = AllocateItem(NonPagedPool, sizeof(KSFILTER_DESCRIPTOR));
|
||||
if (!This->Filter.Descriptor)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
/* copy all fields */
|
||||
Status = KsAddItemToObjectBag(This->Filter.Bag, (PVOID)This->Filter.Descriptor, NULL);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
FreeItem((PVOID)This->Filter.Descriptor);
|
||||
This->Filter.Descriptor = NULL;
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* copy filter descriptor 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;
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1118,37 +1057,47 @@ KspCreateFilter(
|
|||
}
|
||||
|
||||
/* allocate filter instance */
|
||||
This = AllocateItem(NonPagedPool, sizeof(IKsFilterFactory));
|
||||
This = AllocateItem(NonPagedPool, sizeof(IKsFilterImpl));
|
||||
if (!This)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
/* copy filter descriptor */
|
||||
Status = IKsFilter_CopyFilterDescriptor(This, Factory->FilterDescriptor);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* not enough memory */
|
||||
FreeItem(This);
|
||||
DPRINT("KspCreateFilter OutOfMemory\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* get current irp stack */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* initialize object bag */
|
||||
This->Filter.Bag = AllocateItem(NonPagedPool, sizeof(KSIOBJECT_BAG));
|
||||
if (!This->Filter.Bag)
|
||||
{
|
||||
/* no memory */
|
||||
FreeItem(This);
|
||||
DPRINT("KspCreateFilter OutOfMemory\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice;
|
||||
KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->Filter.Bag, NULL);
|
||||
|
||||
/* copy filter descriptor */
|
||||
Status = IKsFilter_CopyFilterDescriptor(This, Factory->FilterDescriptor);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* not enough memory */
|
||||
FreeItem(This->Filter.Bag);
|
||||
FreeItem(This);
|
||||
DPRINT("KspCreateFilter IKsFilter_CopyFilterDescriptor failed %lx\n", Status);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* get current irp stack */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* allocate create items */
|
||||
CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM) * 2);
|
||||
if (!CreateItem)
|
||||
{
|
||||
/* no memory */
|
||||
FreeItem(This->Filter.Bag);
|
||||
FreeItem(This);
|
||||
DPRINT("KspCreateFilter OutOfMemory\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
@ -1164,9 +1113,6 @@ KspCreateFilter(
|
|||
RtlInitUnicodeString(&CreateItem[1].ObjectClass, KSSTRING_TopologyNode);
|
||||
|
||||
|
||||
KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice;
|
||||
KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->Filter.Bag, NULL);
|
||||
|
||||
/* initialize filter instance */
|
||||
This->ref = 1;
|
||||
This->lpVtbl = &vt_IKsFilter;
|
||||
|
@ -1192,6 +1138,7 @@ KspCreateFilter(
|
|||
/* what can go wrong, goes wrong */
|
||||
FreeItem(This);
|
||||
FreeItem(CreateItem);
|
||||
DPRINT("IKsFilter_CreateDescriptors failed with %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -1202,6 +1149,8 @@ KspCreateFilter(
|
|||
if (Factory->FilterDescriptor->Dispatch->Create)
|
||||
{
|
||||
/* now let driver initialize the filter instance */
|
||||
DPRINT("Before instantiating filter Filter %p This %p KSBASIC_HEADER %u\n", &This->Filter, This, sizeof(KSBASIC_HEADER));
|
||||
ASSERT(This->Header.KsDevice);
|
||||
Status = Factory->FilterDescriptor->Dispatch->Create(&This->Filter, Irp);
|
||||
|
||||
if (!NT_SUCCESS(Status) && Status != STATUS_PENDING)
|
||||
|
@ -1236,6 +1185,7 @@ KspCreateFilter(
|
|||
IKsFilter_AttachFilterToFilterFactory(This, This->Header.Parent.KsFilterFactory);
|
||||
|
||||
/* completed initialization */
|
||||
DPRINT("KspCreateFilter done %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -1355,77 +1305,57 @@ KsFilterCreatePinFactory (
|
|||
OUT PULONG PinID)
|
||||
{
|
||||
ULONG Count;
|
||||
ULONG *PinInstanceCount;
|
||||
KSPIN_DESCRIPTOR_EX * PinDescriptorsEx;
|
||||
KSPIN_DESCRIPTOR * PinDescriptors;
|
||||
PKSPIN *FirstPin;
|
||||
NTSTATUS Status;
|
||||
IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter);
|
||||
|
||||
/* calculate existing count */
|
||||
DPRINT("KsFilterCreatePinFactory\n");
|
||||
|
||||
/* calculate new 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;
|
||||
/* sanity check */
|
||||
ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX));
|
||||
|
||||
/* allocate pin instance count array */
|
||||
PinInstanceCount = AllocateItem(NonPagedPool, sizeof(ULONG) * Count);
|
||||
if (!PinInstanceCount)
|
||||
/* allocate pin descriptors ex array */
|
||||
Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptorsEx, Count * sizeof(KSPIN_DESCRIPTOR_EX), This->PinDescriptorCount * sizeof(KSPIN_DESCRIPTOR_EX), 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* not enough memory */
|
||||
FreeItem(PinDescriptorsEx);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
/* failed */
|
||||
DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* allocate pin descriptor array for pin property handling */
|
||||
PinDescriptors = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR) * Count);
|
||||
if (!PinDescriptors)
|
||||
/* allocate pin descriptors array */
|
||||
Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptors, Count * sizeof(KSPIN_DESCRIPTOR), This->PinDescriptorCount * sizeof(KSPIN_DESCRIPTOR), 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* not enough memory */
|
||||
FreeItem(PinDescriptorsEx);
|
||||
FreeItem(PinInstanceCount);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
/* failed */
|
||||
DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/* allocate pin instance count array */
|
||||
Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->PinInstanceCount, sizeof(ULONG) * Count, sizeof(ULONG) * This->PinDescriptorCount, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* failed */
|
||||
DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* allocate first pin array */
|
||||
FirstPin = AllocateItem(NonPagedPool, sizeof(PKSPIN) * Count);
|
||||
if (!FirstPin)
|
||||
Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->FirstPin, sizeof(PKSPIN) * Count, sizeof(PKSPIN) * This->PinDescriptorCount, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* not enough memory */
|
||||
FreeItem(PinDescriptorsEx);
|
||||
FreeItem(PinInstanceCount);
|
||||
FreeItem(PinDescriptors);
|
||||
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);
|
||||
RtlMoveMemory(FirstPin, This->FirstPin, sizeof(PKSPIN) * This->PinDescriptorCount);
|
||||
|
||||
/* now free old descriptors */
|
||||
FreeItem(This->PinInstanceCount);
|
||||
FreeItem((PVOID)This->Filter.Descriptor->PinDescriptors);
|
||||
FreeItem(This->PinDescriptors);
|
||||
FreeItem(This->FirstPin);
|
||||
/* failed */
|
||||
DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
This->FirstPin = FirstPin;
|
||||
RtlMoveMemory(&This->PinDescriptorsEx[This->PinDescriptorCount], InPinDescriptor, sizeof(KSPIN_DESCRIPTOR_EX));
|
||||
RtlMoveMemory(&This->PinDescriptors[This->PinDescriptorCount], &InPinDescriptor->PinDescriptor, sizeof(KSPIN_DESCRIPTOR));
|
||||
|
||||
/* store new pin id */
|
||||
*PinID = This->PinDescriptorCount;
|
||||
|
@ -1433,6 +1363,8 @@ KsFilterCreatePinFactory (
|
|||
/* increment pin descriptor count */
|
||||
This->PinDescriptorCount++;
|
||||
|
||||
|
||||
DPRINT("KsFilterCreatePinFactory done\n");
|
||||
return STATUS_SUCCESS;
|
||||
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ IKsFilterFactory_Create(
|
|||
IN PIRP Irp)
|
||||
{
|
||||
PKSOBJECT_CREATE_ITEM CreateItem;
|
||||
IKsFilterFactoryImpl * Factory;
|
||||
IKsFilterFactory * iface;
|
||||
NTSTATUS Status;
|
||||
|
||||
|
@ -53,7 +54,10 @@ IKsFilterFactory_Create(
|
|||
}
|
||||
|
||||
/* get filter factory interface */
|
||||
iface = (IKsFilterFactory*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory);
|
||||
Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory);
|
||||
|
||||
/* get interface */
|
||||
iface = (IKsFilterFactory*)&Factory->lpVtbl;
|
||||
|
||||
/* create a filter instance */
|
||||
Status = KspCreateFilter(DeviceObject, Irp, iface);
|
||||
|
@ -253,6 +257,8 @@ IKsFilterFactory_fnInitialize(
|
|||
FreeString = TRUE;
|
||||
}
|
||||
|
||||
DPRINT("IKsFilterFactory_fnInitialize CategoriesCount %u ReferenceString '%S'\n", Descriptor->CategoriesCount,ReferenceString.Buffer);
|
||||
|
||||
/* now register the device interface */
|
||||
Status = KspRegisterDeviceInterfaces(DeviceExtension->DeviceHeader->KsDevice.PhysicalDeviceObject,
|
||||
Descriptor->CategoriesCount,
|
||||
|
@ -365,6 +371,10 @@ KspCreateFilterFactory(
|
|||
}
|
||||
|
||||
/* return result */
|
||||
DPRINT("KsCreateFilterFactory %x\n", Status);
|
||||
/* sanity check */
|
||||
ASSERT(Status == STATUS_SUCCESS);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
|
|
@ -339,6 +339,7 @@ KsPinAttemptProcessing(
|
|||
IN PKSPIN Pin,
|
||||
IN BOOLEAN Asynchronous)
|
||||
{
|
||||
DPRINT("KsPinAttemptProcessing\n");
|
||||
UNIMPLEMENTED
|
||||
}
|
||||
|
||||
|
@ -456,6 +457,7 @@ NTAPI
|
|||
OUT PIKSREFERENCECLOCK* Interface)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
DPRINT("KsPinGetReferenceClockInterface Pin %p Interface %p\n", Pin, Interface);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
|
@ -547,6 +549,8 @@ KsGetPinFromIrp(
|
|||
PKSIOBJECT_HEADER ObjectHeader;
|
||||
PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
DPRINT("KsGetPinFromIrp\n");
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
/* return object type */
|
||||
|
@ -624,6 +628,7 @@ KsPinGetLeadingEdgeStreamPointer(
|
|||
IN KSSTREAM_POINTER_STATE State)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x\n", Pin, State);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -679,6 +684,7 @@ KsStreamPointerUnlock(
|
|||
IN BOOLEAN Eject)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
DPRINT("KsStreamPointerUnlock\n");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -693,6 +699,8 @@ KsStreamPointerAdvanceOffsetsAndUnlock(
|
|||
IN ULONG OutUsed,
|
||||
IN BOOLEAN Eject)
|
||||
{
|
||||
DPRINT("KsStreamPointerAdvanceOffsets\n");
|
||||
|
||||
UNIMPLEMENTED
|
||||
}
|
||||
|
||||
|
@ -709,6 +717,8 @@ KsStreamPointerDelete(
|
|||
PKSISTREAM_POINTER Cur, Last;
|
||||
PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer;
|
||||
|
||||
DPRINT("KsStreamPointerDelete\n");
|
||||
|
||||
This = (IKsPinImpl*)CONTAINING_RECORD(Pointer->StreamPointer.Pin, IKsPinImpl, Pin);
|
||||
|
||||
/* point to first stream pointer */
|
||||
|
@ -755,6 +765,7 @@ KsStreamPointerClone(
|
|||
OUT PKSSTREAM_POINTER* CloneStreamPointer)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
DPRINT("KsStreamPointerClone\n");
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
@ -864,7 +875,11 @@ NTAPI
|
|||
KsPinGetFirstCloneStreamPointer(
|
||||
IN PKSPIN Pin)
|
||||
{
|
||||
IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin);
|
||||
IKsPinImpl * This;
|
||||
|
||||
DPRINT("KsPinGetFirstCloneStreamPointer %p\n", Pin);
|
||||
|
||||
This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin);
|
||||
/* return first cloned stream pointer */
|
||||
return &This->ClonedStreamPointer->StreamPointer;
|
||||
}
|
||||
|
@ -880,6 +895,8 @@ KsStreamPointerGetNextClone(
|
|||
{
|
||||
PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer;
|
||||
|
||||
DPRINT("KsStreamPointerGetNextClone\n");
|
||||
|
||||
/* is there a another cloned stream pointer */
|
||||
if (!Pointer->Next)
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in a new issue