4 const GUID KSPROPSETID_BdaPinControl
= {0xded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}};
5 const GUID KSMETHODSETID_BdaDeviceConfiguration
= {0x71985f45, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
6 const GUID KSPROPSETID_BdaTopology
= {0xa14ee835, 0x0a23, 0x11d3, {0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}};
8 BDA_GLOBAL g_Settings
=
15 KSPROPERTY_ITEM FilterPropertyItem
[] =
17 DEFINE_KSPROPERTY_ITEM_BDA_NODE_TYPES(BdaPropertyNodeTypes
, NULL
),
18 DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPES( BdaPropertyPinTypes
, NULL
),
19 DEFINE_KSPROPERTY_ITEM_BDA_TEMPLATE_CONNECTIONS(BdaPropertyTemplateConnections
, NULL
),
20 DEFINE_KSPROPERTY_ITEM_BDA_NODE_METHODS(BdaPropertyNodeMethods
, NULL
),
21 DEFINE_KSPROPERTY_ITEM_BDA_NODE_PROPERTIES(BdaPropertyNodeProperties
, NULL
),
22 DEFINE_KSPROPERTY_ITEM_BDA_NODE_EVENTS(BdaPropertyNodeEvents
, NULL
),
23 DEFINE_KSPROPERTY_ITEM_BDA_CONTROLLING_PIN_ID(BdaPropertyGetControllingPinId
, NULL
),
24 DEFINE_KSPROPERTY_ITEM_BDA_NODE_DESCRIPTORS(BdaPropertyNodeDescriptors
, NULL
)
28 KSPROPERTY_SET FilterPropertySet
=
30 &KSPROPSETID_BdaTopology
,
37 KSMETHOD_ITEM FilterMethodItem
[] =
39 //DEFINE_KSMETHOD_ITEM_BDA_CREATE_PIN_FACTORY(BdaMethodCreatePin, NULL),
40 DEFINE_KSMETHOD_ITEM_BDA_CREATE_TOPOLOGY(BdaMethodCreateTopology
, NULL
)
43 KSMETHOD_SET FilterMethodSet
=
45 &KSMETHODSETID_BdaDeviceConfiguration
,
52 KSAUTOMATION_TABLE FilterAutomationTable
=
55 sizeof(KSPROPERTY_ITEM
),
58 sizeof(KSMETHOD_ITEM
),
65 KSPROPERTY_ITEM PinPropertyItem
[] =
67 DEFINE_KSPROPERTY_ITEM_BDA_PIN_ID(BdaPropertyGetPinControl
, NULL
),
68 DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPE(BdaPropertyGetPinControl
, NULL
)
71 KSPROPERTY_SET PinPropertySet
=
73 &KSPROPSETID_BdaPinControl
,
80 KSAUTOMATION_TABLE PinAutomationTable
=
83 sizeof(KSPROPERTY_ITEM
),
86 sizeof(KSMETHOD_ITEM
),
96 IN POOL_TYPE PoolType
,
97 IN SIZE_T NumberOfBytes
)
99 PVOID Item
= ExAllocatePool(PoolType
, NumberOfBytes
);
103 RtlZeroMemory(Item
, NumberOfBytes
);
115 PBDA_FILTER_INSTANCE_ENTRY
116 GetFilterInstanceEntry(
117 IN PKSFILTERFACTORY FilterFactory
)
119 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
= NULL
;
123 /* acquire list lock */
124 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
126 /* point to first entry */
127 Entry
= g_Settings
.FilterFactoryInstanceList
.Flink
;
129 while(Entry
!= &g_Settings
.FilterFactoryInstanceList
)
131 /* get instance entry from list entry offset */
132 InstanceEntry
= (PBDA_FILTER_INSTANCE_ENTRY
)CONTAINING_RECORD(Entry
, BDA_FILTER_INSTANCE_ENTRY
, Entry
);
134 /* is the instance entry the requested one */
135 if (InstanceEntry
->FilterFactoryInstance
== FilterFactory
)
138 /* move to next entry */
139 Entry
= Entry
->Flink
;
140 /* set to null as it has not been found */
141 InstanceEntry
= NULL
;
145 /* release spin lock */
146 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
149 return InstanceEntry
;
158 PUNICODE_STRING RegistryPath
)
160 DPRINT("BDASUP::DllInitialize\n");
162 KeInitializeSpinLock(&g_Settings
.FilterFactoryInstanceListLock
);
163 InitializeListHead(&g_Settings
.FilterFactoryInstanceList
);
164 g_Settings
.Initialized
= TRUE
;
166 return STATUS_SUCCESS
;
174 BdaCheckChanges(IN PIRP Irp
)
176 DPRINT("BdaCheckChanges\n");
179 return STATUS_INVALID_PARAMETER
;
181 return STATUS_SUCCESS
;
189 BdaCommitChanges(IN PIRP Irp
)
191 DPRINT("BdaCommitChanges\n");
194 return STATUS_INVALID_PARAMETER
;
196 return STATUS_SUCCESS
;
204 BdaCreateFilterFactory(
205 IN PKSDEVICE pKSDevice
,
206 IN
const KSFILTER_DESCRIPTOR
*pFilterDescriptor
,
207 IN
const BDA_FILTER_TEMPLATE
*pBdaFilterTemplate
)
209 return BdaCreateFilterFactoryEx(pKSDevice
, pFilterDescriptor
, pBdaFilterTemplate
, NULL
);
217 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
= NULL
;
221 /* acquire list lock */
222 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
224 /* point to first entry */
225 Entry
= g_Settings
.FilterFactoryInstanceList
.Flink
;
227 while(Entry
!= &g_Settings
.FilterFactoryInstanceList
)
229 /* get instance entry from list entry offset */
230 InstanceEntry
= (PBDA_FILTER_INSTANCE_ENTRY
)CONTAINING_RECORD(Entry
, BDA_FILTER_INSTANCE_ENTRY
, Entry
);
232 /* is the instance entry the requested one */
233 if (InstanceEntry
== (PBDA_FILTER_INSTANCE_ENTRY
)Context
)
235 RemoveEntryList(&InstanceEntry
->Entry
);
236 FreeItem(InstanceEntry
);
240 /* move to next entry */
241 Entry
= Entry
->Flink
;
244 /* release spin lock */
245 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
254 BdaCreateFilterFactoryEx(
255 IN PKSDEVICE pKSDevice
,
256 IN
const KSFILTER_DESCRIPTOR
*pFilterDescriptor
,
257 IN
const BDA_FILTER_TEMPLATE
*BdaFilterTemplate
,
258 OUT PKSFILTERFACTORY
*ppKSFilterFactory
)
260 PKSFILTERFACTORY FilterFactory
;
261 PBDA_FILTER_INSTANCE_ENTRY FilterInstance
;
264 KSFILTER_DESCRIPTOR FilterDescriptor
;
266 DPRINT("BdaCreateFilterFactoryEx\n");
267 /* backup filter descriptor */
268 RtlMoveMemory(&FilterDescriptor
, pFilterDescriptor
, sizeof(KSFILTER_DESCRIPTOR
));
270 /* merge the automation tables */
271 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&FilterDescriptor
.AutomationTable
, (PKSAUTOMATION_TABLE
)pFilterDescriptor
->AutomationTable
, &FilterAutomationTable
, NULL
);
273 /* check for success */
274 if (!NT_SUCCESS(Status
))
276 DPRINT1("KsMergeAutomationTables failed with %lx\n", Status
);
280 /* allocate filter instance */
281 FilterInstance
= AllocateItem(NonPagedPool
, sizeof(BDA_FILTER_INSTANCE_ENTRY
));
284 /* not enough memory */
285 return STATUS_INSUFFICIENT_RESOURCES
;
288 /* create the filter factory */
289 Status
= KsCreateFilterFactory(pKSDevice
->FunctionalDeviceObject
, &FilterDescriptor
, NULL
, NULL
, 0, NULL
, NULL
, &FilterFactory
);
291 /* check for success */
292 if (NT_SUCCESS(Status
))
295 /* add the item to filter object bag */
296 Status
= KsAddItemToObjectBag(FilterFactory
->Bag
, FilterInstance
, FreeFilterInstance
);
297 if (!NT_SUCCESS(Status
))
299 /* destroy filter instance */
300 DPRINT1("KsAddItemToObjectBag failed with %lx\n", Status
);
301 FreeItem(FilterInstance
);
302 KsDeleteFilterFactory(FilterFactory
);
306 /* initialize filter instance entry */
307 FilterInstance
->FilterFactoryInstance
= FilterFactory
;
308 FilterInstance
->FilterTemplate
= (BDA_FILTER_TEMPLATE
*)BdaFilterTemplate
;
310 /* acquire list lock */
311 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
313 /* insert factory at the end */
314 InsertTailList(&g_Settings
.FilterFactoryInstanceList
, &FilterInstance
->Entry
);
316 /* release spin lock */
317 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
320 if (ppKSFilterFactory
)
323 *ppKSFilterFactory
= FilterFactory
;
328 /* failed to create filter factory */
329 FreeItem(FilterInstance
);
330 DPRINT1("KsCreateFilterFactory failed with %lx\n", Status
);
334 DPRINT("BdaCreateFilterFactoryEx Status %x\n", Status
);
344 IN PKSFILTER pKSFilter
,
348 PKSPIN_DESCRIPTOR_EX PinDescriptor
;
349 PKSFILTERFACTORY FilterFactory
;
350 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
353 KSPIN_DESCRIPTOR_EX NewPinDescriptor
;
355 DPRINT("BdaCreatePin\n");
357 if (!pulPinId
|| !pKSFilter
)
358 return STATUS_INVALID_PARAMETER
;
360 /* get parent filter factory */
361 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
364 ASSERT(FilterFactory
);
366 /* find instance entry */
367 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
371 /* the filter was not initialized with BDA */
372 return STATUS_NOT_FOUND
;
376 ASSERT(InstanceEntry
->FilterTemplate
);
377 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
);
379 /* does the filter support any pins */
380 if (!InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
382 /* no pins supported */
383 return STATUS_UNSUCCESSFUL
;
386 /* is pin factory still existing */
387 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
<= ulPinType
)
389 /* pin request is out of bounds */
390 return STATUS_INVALID_PARAMETER
;
393 /* FIXME custom pin descriptors */
394 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorSize
== sizeof(KSPIN_DESCRIPTOR_EX
));
396 /* get pin descriptor */
397 PinDescriptor
= (PKSPIN_DESCRIPTOR_EX
)&InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptors
[ulPinType
];
399 /* make a copy of the pin descriptor */
400 RtlMoveMemory(&NewPinDescriptor
, PinDescriptor
, sizeof(KSPIN_DESCRIPTOR_EX
));
402 /* merge the automation tables */
403 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&NewPinDescriptor
.AutomationTable
, (PKSAUTOMATION_TABLE
)PinDescriptor
->AutomationTable
, &PinAutomationTable
, pKSFilter
->Bag
);
405 /* check for success */
406 if (NT_SUCCESS(Status
))
408 /* create the pin factory */
409 Status
= KsFilterCreatePinFactory(pKSFilter
, &NewPinDescriptor
, &PinId
);
411 /* check for success */
412 if (NT_SUCCESS(Status
))
420 DPRINT("BdaCreatePin Result %x\n", Status
);
431 IN KSMETHOD
*pKSMethod
,
432 OUT ULONG
*pulPinFactoryID
)
437 DPRINT("BdaMethodCreatePin\n");
441 /* invalid parameter */
442 return STATUS_INVALID_PARAMETER
;
445 /* get filter from irp */
446 Filter
= KsGetFilterFromIrp(Irp
);
452 /* get method request */
453 Pin
= (PKSM_PIN
)pKSMethod
;
456 return BdaCreatePin(Filter
, Pin
->PinId
, pulPinFactoryID
);
465 IN PKSFILTER pKSFilter
,
466 IN
const BDA_FILTER_TEMPLATE
*pBdaFilterTemplate
)
468 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
469 PKSFILTERFACTORY FilterFactory
;
471 NTSTATUS Status
= STATUS_SUCCESS
;
473 DPRINT("BdaInitFilter\n");
475 /* check input parameters */
477 return STATUS_INVALID_PARAMETER
;
479 /* get parent filter factory */
480 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
483 ASSERT(FilterFactory
);
485 /* find instance entry */
486 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
489 ASSERT(InstanceEntry
);
490 ASSERT(InstanceEntry
->FilterTemplate
== pBdaFilterTemplate
);
492 /* now create the pins */
493 for(Index
= 0; Index
< pBdaFilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
496 Status
= BdaCreatePin(pKSFilter
, Index
, &PinId
);
498 /* check for success */
499 if (!NT_SUCCESS(Status
))
515 IN PKSFILTER pKSFilter
,
517 IN ULONG OutputPinId
)
519 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
520 PKSFILTERFACTORY FilterFactory
;
521 KSTOPOLOGY_CONNECTION Connection
;
523 DPRINT("BdaCreateTopology\n");
525 /* check input parameters */
527 return STATUS_INVALID_PARAMETER
;
529 /* get parent filter factory */
530 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
533 ASSERT(FilterFactory
);
535 /* find instance entry */
536 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
540 /* the filter was not initialized with BDA */
541 return STATUS_NOT_FOUND
;
544 if (InputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
||
545 OutputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
548 return STATUS_INVALID_PARAMETER
;
551 /* initialize topology connection */
552 Connection
.FromNode
= KSFILTER_NODE
;
553 Connection
.ToNode
= KSFILTER_NODE
;
554 Connection
.FromNodePin
= InputPinId
;
555 Connection
.ToNodePin
= OutputPinId
;
557 /* add the connection */
558 return KsFilterAddTopologyConnections(pKSFilter
, 1, &Connection
);
567 IN PKSFILTER pKSFilter
,
571 DPRINT("BdaDeletePin\n");
572 return STATUS_NOT_IMPLEMENTED
;
580 BdaFilterFactoryUpdateCacheData(
581 IN PKSFILTERFACTORY FilterFactory
,
582 IN
const KSFILTER_DESCRIPTOR
*FilterDescriptor OPTIONAL
)
584 DPRINT("BdaFilterFactoryUpdateCacheData\n");
585 return KsFilterFactoryUpdateCacheData(FilterFactory
, FilterDescriptor
);
595 OUT BDA_CHANGE_STATE
*ChangeState
)
597 DPRINT("BdaGetChangeState\n");
599 if (Irp
&& ChangeState
)
601 *ChangeState
= BDA_CHANGES_COMPLETE
;
602 return STATUS_SUCCESS
;
605 /* invalid parameters supplied */
606 return STATUS_INVALID_PARAMETER
;
615 BdaMethodCreateTopology(
617 IN KSMETHOD
*pKSMethod
,
618 OPTIONAL PVOID pvIgnored
)
621 PKSP_BDA_NODE_PIN Node
;
623 DPRINT("BdaMethodCreateTopology\n");
625 /* check input parameters */
626 if (!Irp
|| !pKSMethod
)
627 return STATUS_INVALID_PARAMETER
;
630 Filter
= KsGetFilterFromIrp(Irp
);
635 /* get method request */
636 Node
= (PKSP_BDA_NODE_PIN
)pKSMethod
;
638 /* create the topology */
639 return BdaCreateTopology(Filter
, Node
->ulInputPinId
, Node
->ulOutputPinId
);
649 IN KSMETHOD
*pKSMethod
,
650 OPTIONAL PVOID pvIgnored
)
652 DPRINT("BdaMethodDeletePin\n");
655 return STATUS_INVALID_PARAMETER
;
657 return STATUS_SUCCESS
;
665 BdaPropertyGetControllingPinId(
667 IN KSP_BDA_NODE_PIN
*pProperty
,
668 OUT ULONG
*pulControllingPinId
)
671 DPRINT("BdaPropertyGetControllingPinId\n");
672 return STATUS_NOT_IMPLEMENTED
;
680 BdaPropertyGetPinControl(
682 IN KSPROPERTY
*pKSProperty
,
683 OUT ULONG
*pulProperty
)
687 PKSFILTERFACTORY FilterFactory
;
688 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
690 DPRINT("BdaPropertyGetPinControl\n");
692 /* first get the pin */
693 Pin
= KsGetPinFromIrp(Irp
);
696 /* now get the parent filter */
697 Filter
= KsPinGetParentFilter(Pin
);
700 /* get parent filter factory */
701 FilterFactory
= KsFilterGetParentFilterFactory(Filter
);
702 ASSERT(FilterFactory
);
704 /* find instance entry */
705 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
706 ASSERT(InstanceEntry
);
710 ASSERT(pKSProperty
->Id
== KSPROPERTY_BDA_PIN_TYPE
);
713 *pulProperty
= Pin
->Id
;
715 return STATUS_SUCCESS
;
723 BdaPropertyNodeDescriptors(
725 IN KSPROPERTY
*pKSProperty
,
726 OUT BDANODE_DESCRIPTOR
*pNodeDescriptorProperty
)
729 DPRINT("BdaPropertyNodeDescriptors\n");
730 return STATUS_NOT_IMPLEMENTED
;
738 BdaPropertyNodeEvents(
740 IN KSP_NODE
*pKSProperty
,
741 OUT GUID
*pguidProperty
)
744 DPRINT("BdaPropertyNodeEvents\n");
745 return STATUS_NOT_IMPLEMENTED
;
753 BdaPropertyNodeMethods(
755 IN KSP_NODE
*pKSProperty
,
756 OUT GUID
*pguidProperty
)
759 DPRINT("BdaPropertyNodeMethods\n");
760 return STATUS_NOT_IMPLEMENTED
;
768 BdaPropertyNodeProperties(
770 IN KSP_NODE
*pKSProperty
,
771 OUT GUID
*pguidProperty
)
774 DPRINT("BdaPropertyNodeProperties\n");
775 return STATUS_NOT_IMPLEMENTED
;
783 BdaPropertyNodeTypes(
785 IN KSPROPERTY
*pKSProperty
,
786 OUT ULONG
*pulProperty
)
788 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
789 PKSFILTERFACTORY FilterFactory
;
791 PIO_STACK_LOCATION IoStack
;
794 DPRINT("BdaPropertyNodeTypes\n");
796 /* check input parameter */
797 if (!Irp
|| !pKSProperty
)
798 return STATUS_INVALID_PARAMETER
;
800 /* first get the filter */
801 pKSFilter
= KsGetFilterFromIrp(Irp
);
806 /* get parent filter factory */
807 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
810 ASSERT(FilterFactory
);
812 /* find instance entry */
813 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
814 ASSERT(InstanceEntry
);
816 /* get current irp stack */
817 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
819 /* are there node types provided */
822 /* no node entry array provided */
823 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
824 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
825 return STATUS_MORE_ENTRIES
;
828 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
830 /* buffer too small */
831 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
832 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
833 return STATUS_BUFFER_TOO_SMALL
;
836 /* now copy all descriptors */
837 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
; Index
++)
839 /* use the index as the type */
840 pulProperty
[Index
] = Index
;
843 return STATUS_SUCCESS
;
853 IN KSPROPERTY
*pKSProperty
,
854 OUT ULONG
*pulProperty
)
856 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
857 PKSFILTERFACTORY FilterFactory
;
859 PIO_STACK_LOCATION IoStack
;
862 DPRINT("BdaPropertyPinTypes\n");
864 /* check input parameter */
865 if (!Irp
|| !pKSProperty
)
866 return STATUS_INVALID_PARAMETER
;
868 /* first get the filter */
869 pKSFilter
= KsGetFilterFromIrp(Irp
);
874 /* get parent filter factory */
875 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
878 ASSERT(FilterFactory
);
880 /* find instance entry */
881 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
882 ASSERT(InstanceEntry
);
884 /* get current irp stack */
885 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
887 /* are there node types provided */
890 /* no node entry array provided */
891 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
892 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
893 return STATUS_MORE_ENTRIES
;
896 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
898 /* buffer too small */
899 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
900 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
901 return STATUS_BUFFER_TOO_SMALL
;
904 /* now copy all descriptors */
905 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
907 /* use the index as the type */
908 pulProperty
[Index
] = Index
;
911 return STATUS_SUCCESS
;
919 BdaPropertyTemplateConnections(
921 IN KSPROPERTY
*pKSProperty
,
922 OUT KSTOPOLOGY_CONNECTION
*pConnectionProperty
)
924 PBDA_FILTER_INSTANCE_ENTRY FilterInstance
;
926 PIO_STACK_LOCATION IoStack
;
929 DPRINT("BdaPropertyTemplateConnections\n");
931 /* validate parameters */
932 if (!Irp
|| !pKSProperty
)
933 return STATUS_INVALID_PARAMETER
;
935 /* first get the filter */
936 Filter
= KsGetFilterFromIrp(Irp
);
941 /* verify filter has been registered with BDA */
942 FilterInstance
= GetFilterInstanceEntry(KsFilterGetParentFilterFactory(Filter
));
945 return STATUS_INVALID_PARAMETER
;
947 /* get current irp stack */
948 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
950 if (!pConnectionProperty
)
952 /* caller needs the size first */
953 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
954 Irp
->IoStatus
.Status
= STATUS_BUFFER_OVERFLOW
;
955 return STATUS_BUFFER_OVERFLOW
;
959 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
) <= IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
);
961 for(Index
= 0; Index
< FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
; Index
++)
964 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
);
966 /* copy connection */
967 RtlMoveMemory(pConnectionProperty
, &FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
[Index
], sizeof(KSTOPOLOGY_CONNECTION
));
971 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
972 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
975 return STATUS_SUCCESS
;
984 BdaStartChanges(IN PIRP Irp
)
986 DPRINT("BdaStartChanges\n");
989 return STATUS_SUCCESS
;
991 return STATUS_INVALID_PARAMETER
;
1000 BdaUninitFilter(IN PKSFILTER pKSFilter
)
1002 DPRINT("BdaUninitFilter\n");
1003 return STATUS_SUCCESS
;
1011 BdaValidateNodeProperty(
1013 IN KSPROPERTY
*KSProperty
)
1015 DPRINT("BdaValidateNodeProperty\n");
1017 /* check for valid parameter */
1018 if (Irp
&& KSProperty
)
1019 return STATUS_SUCCESS
;
1021 return STATUS_INVALID_PARAMETER
;