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 PKSFILTER_DESCRIPTOR FilterDescriptor
;
266 DPRINT("BdaCreateFilterFactoryEx\n");
268 FilterDescriptor
= AllocateItem(NonPagedPool
, sizeof(KSFILTER_DESCRIPTOR
));
269 if (!FilterDescriptor
)
272 return STATUS_INSUFFICIENT_RESOURCES
;
275 /* copy filter descriptor template */
276 RtlMoveMemory(FilterDescriptor
, pFilterDescriptor
, sizeof(KSFILTER_DESCRIPTOR
));
278 /* merge the automation tables */
279 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&FilterDescriptor
->AutomationTable
, (PKSAUTOMATION_TABLE
)pFilterDescriptor
->AutomationTable
, &FilterAutomationTable
, NULL
);
281 /* check for success */
282 if (!NT_SUCCESS(Status
))
284 DPRINT1("KsMergeAutomationTables failed with %lx\n", Status
);
285 FreeItem(FilterDescriptor
);
289 /* allocate filter instance */
290 FilterInstance
= AllocateItem(NonPagedPool
, sizeof(BDA_FILTER_INSTANCE_ENTRY
));
293 /* not enough memory */
294 FreeItem(FilterDescriptor
);
295 return STATUS_INSUFFICIENT_RESOURCES
;
298 /* create the filter factory */
299 Status
= KsCreateFilterFactory(pKSDevice
->FunctionalDeviceObject
, FilterDescriptor
, NULL
, NULL
, 0, NULL
, NULL
, &FilterFactory
);
301 /* check for success */
302 if (NT_SUCCESS(Status
))
305 /* add the item to filter object bag */
306 Status
= KsAddItemToObjectBag(FilterFactory
->Bag
, FilterInstance
, FreeFilterInstance
);
307 if (!NT_SUCCESS(Status
))
309 /* destroy filter instance */
310 DPRINT1("KsAddItemToObjectBag failed with %lx\n", Status
);
311 FreeItem(FilterDescriptor
);
312 FreeItem(FilterInstance
);
313 KsDeleteFilterFactory(FilterFactory
);
317 /* initialize filter instance entry */
318 FilterInstance
->FilterFactoryInstance
= FilterFactory
;
319 FilterInstance
->FilterTemplate
= (BDA_FILTER_TEMPLATE
*)BdaFilterTemplate
;
321 /* acquire list lock */
322 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
324 /* insert factory at the end */
325 InsertTailList(&g_Settings
.FilterFactoryInstanceList
, &FilterInstance
->Entry
);
327 /* release spin lock */
328 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
331 if (ppKSFilterFactory
)
334 *ppKSFilterFactory
= FilterFactory
;
339 /* failed to create filter factory */
340 FreeItem(FilterInstance
);
341 DPRINT1("KsCreateFilterFactory failed with %lx\n", Status
);
345 DPRINT("BdaCreateFilterFactoryEx Status %x\n", Status
);
355 IN PKSFILTER pKSFilter
,
359 PKSPIN_DESCRIPTOR_EX PinDescriptor
;
360 PKSFILTERFACTORY FilterFactory
;
361 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
364 PKSPIN_DESCRIPTOR_EX NewPinDescriptor
;
366 DPRINT("BdaCreatePin\n");
368 if (!pulPinId
|| !pKSFilter
)
369 return STATUS_INVALID_PARAMETER
;
371 /* get parent filter factory */
372 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
375 ASSERT(FilterFactory
);
377 /* find instance entry */
378 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
382 /* the filter was not initialized with BDA */
383 return STATUS_NOT_FOUND
;
387 ASSERT(InstanceEntry
->FilterTemplate
);
388 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
);
390 /* does the filter support any pins */
391 if (!InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
393 /* no pins supported */
394 DPRINT("BdaCreatePin NoPins supported\n");
395 return STATUS_UNSUCCESSFUL
;
398 /* is pin factory still existing */
399 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
<= ulPinType
)
401 /* pin request is out of bounds */
402 DPRINT("BdaCreatePin ulPinType %lu >= PinDescriptorCount %lu\n", ulPinType
, InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
);
403 return STATUS_INVALID_PARAMETER
;
406 /* FIXME custom pin descriptors */
407 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorSize
== sizeof(KSPIN_DESCRIPTOR_EX
));
409 /* get pin descriptor */
410 PinDescriptor
= (PKSPIN_DESCRIPTOR_EX
)&InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptors
[ulPinType
];
412 /* allocate pin descriptor */
413 NewPinDescriptor
= AllocateItem(NonPagedPool
, sizeof(KSPIN_DESCRIPTOR_EX
));
414 if (!NewPinDescriptor
)
417 DPRINT("BdaCreatePin OutOfMemory\n");
418 return STATUS_INSUFFICIENT_RESOURCES
;
421 /* make a copy of the pin descriptor */
422 RtlMoveMemory(NewPinDescriptor
, PinDescriptor
, sizeof(KSPIN_DESCRIPTOR_EX
));
424 /* merge the automation tables */
425 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&NewPinDescriptor
->AutomationTable
, (PKSAUTOMATION_TABLE
)PinDescriptor
->AutomationTable
, &PinAutomationTable
, pKSFilter
->Bag
);
427 /* check for success */
428 if (NT_SUCCESS(Status
))
430 /* create the pin factory */
431 Status
= KsFilterCreatePinFactory(pKSFilter
, NewPinDescriptor
, &PinId
);
433 /* check for success */
434 if (NT_SUCCESS(Status
))
442 DPRINT("BdaCreatePin Result %x PinId %u\n", Status
, PinId
);
453 IN KSMETHOD
*pKSMethod
,
454 OUT ULONG
*pulPinFactoryID
)
459 DPRINT("BdaMethodCreatePin\n");
463 /* invalid parameter */
464 return STATUS_INVALID_PARAMETER
;
467 /* get filter from irp */
468 Filter
= KsGetFilterFromIrp(Irp
);
474 /* get method request */
475 Pin
= (PKSM_PIN
)pKSMethod
;
478 return BdaCreatePin(Filter
, Pin
->PinId
, pulPinFactoryID
);
487 IN PKSFILTER pKSFilter
,
488 IN
const BDA_FILTER_TEMPLATE
*pBdaFilterTemplate
)
490 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
491 PKSFILTERFACTORY FilterFactory
;
493 NTSTATUS Status
= STATUS_SUCCESS
;
495 DPRINT("BdaInitFilter %p\n", pBdaFilterTemplate
);
497 /* check input parameters */
499 return STATUS_INVALID_PARAMETER
;
501 /* get parent filter factory */
502 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
505 ASSERT(FilterFactory
);
507 /* find instance entry */
508 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
511 ASSERT(InstanceEntry
);
513 if (!pBdaFilterTemplate
)
515 /* use template from BdaCreateFilterFactoryEx */
516 pBdaFilterTemplate
= InstanceEntry
->FilterTemplate
;
519 /* now create the pins */
520 for(Index
= 0; Index
< pBdaFilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
523 Status
= BdaCreatePin(pKSFilter
, Index
, &PinId
);
525 /* check for success */
526 if (!NT_SUCCESS(Status
))
542 IN PKSFILTER pKSFilter
,
544 IN ULONG OutputPinId
)
546 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
547 PKSFILTERFACTORY FilterFactory
;
548 KSTOPOLOGY_CONNECTION Connection
;
550 DPRINT("BdaCreateTopology\n");
552 /* check input parameters */
554 return STATUS_INVALID_PARAMETER
;
556 /* get parent filter factory */
557 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
560 ASSERT(FilterFactory
);
562 /* find instance entry */
563 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
567 /* the filter was not initialized with BDA */
568 return STATUS_NOT_FOUND
;
571 if (InputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
||
572 OutputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
575 return STATUS_INVALID_PARAMETER
;
578 /* initialize topology connection */
579 Connection
.FromNode
= KSFILTER_NODE
;
580 Connection
.ToNode
= KSFILTER_NODE
;
581 Connection
.FromNodePin
= InputPinId
;
582 Connection
.ToNodePin
= OutputPinId
;
584 /* add the connection */
585 return KsFilterAddTopologyConnections(pKSFilter
, 1, &Connection
);
594 IN PKSFILTER pKSFilter
,
598 DPRINT("BdaDeletePin\n");
599 return STATUS_NOT_IMPLEMENTED
;
607 BdaFilterFactoryUpdateCacheData(
608 IN PKSFILTERFACTORY FilterFactory
,
609 IN
const KSFILTER_DESCRIPTOR
*FilterDescriptor OPTIONAL
)
611 DPRINT("BdaFilterFactoryUpdateCacheData\n");
612 return KsFilterFactoryUpdateCacheData(FilterFactory
, FilterDescriptor
);
622 OUT BDA_CHANGE_STATE
*ChangeState
)
624 DPRINT("BdaGetChangeState\n");
626 if (Irp
&& ChangeState
)
628 *ChangeState
= BDA_CHANGES_COMPLETE
;
629 return STATUS_SUCCESS
;
632 /* invalid parameters supplied */
633 return STATUS_INVALID_PARAMETER
;
642 BdaMethodCreateTopology(
644 IN KSMETHOD
*pKSMethod
,
645 OPTIONAL PVOID pvIgnored
)
648 PKSP_BDA_NODE_PIN Node
;
650 DPRINT("BdaMethodCreateTopology\n");
652 /* check input parameters */
653 if (!Irp
|| !pKSMethod
)
654 return STATUS_INVALID_PARAMETER
;
657 Filter
= KsGetFilterFromIrp(Irp
);
662 /* get method request */
663 Node
= (PKSP_BDA_NODE_PIN
)pKSMethod
;
665 /* create the topology */
666 return BdaCreateTopology(Filter
, Node
->ulInputPinId
, Node
->ulOutputPinId
);
676 IN KSMETHOD
*pKSMethod
,
677 OPTIONAL PVOID pvIgnored
)
679 DPRINT("BdaMethodDeletePin\n");
682 return STATUS_INVALID_PARAMETER
;
684 return STATUS_SUCCESS
;
692 BdaPropertyGetControllingPinId(
694 IN KSP_BDA_NODE_PIN
*pProperty
,
695 OUT ULONG
*pulControllingPinId
)
698 DPRINT("BdaPropertyGetControllingPinId\n");
699 return STATUS_NOT_IMPLEMENTED
;
707 BdaPropertyGetPinControl(
709 IN KSPROPERTY
*pKSProperty
,
710 OUT ULONG
*pulProperty
)
714 PKSFILTERFACTORY FilterFactory
;
715 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
717 DPRINT("BdaPropertyGetPinControl\n");
719 /* first get the pin */
720 Pin
= KsGetPinFromIrp(Irp
);
723 /* now get the parent filter */
724 Filter
= KsPinGetParentFilter(Pin
);
727 /* get parent filter factory */
728 FilterFactory
= KsFilterGetParentFilterFactory(Filter
);
729 ASSERT(FilterFactory
);
731 /* find instance entry */
732 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
733 ASSERT(InstanceEntry
);
737 ASSERT(pKSProperty
->Id
== KSPROPERTY_BDA_PIN_TYPE
);
740 *pulProperty
= Pin
->Id
;
742 return STATUS_SUCCESS
;
750 BdaPropertyNodeDescriptors(
752 IN KSPROPERTY
*pKSProperty
,
753 OUT BDANODE_DESCRIPTOR
*pNodeDescriptorProperty
)
756 DPRINT("BdaPropertyNodeDescriptors\n");
757 return STATUS_NOT_IMPLEMENTED
;
765 BdaPropertyNodeEvents(
767 IN KSP_NODE
*pKSProperty
,
768 OUT GUID
*pguidProperty
)
771 DPRINT("BdaPropertyNodeEvents\n");
772 return STATUS_NOT_IMPLEMENTED
;
780 BdaPropertyNodeMethods(
782 IN KSP_NODE
*pKSProperty
,
783 OUT GUID
*pguidProperty
)
786 DPRINT("BdaPropertyNodeMethods\n");
787 return STATUS_NOT_IMPLEMENTED
;
795 BdaPropertyNodeProperties(
797 IN KSP_NODE
*pKSProperty
,
798 OUT GUID
*pguidProperty
)
801 DPRINT("BdaPropertyNodeProperties\n");
802 return STATUS_NOT_IMPLEMENTED
;
810 BdaPropertyNodeTypes(
812 IN KSPROPERTY
*pKSProperty
,
813 OUT ULONG
*pulProperty
)
815 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
816 PKSFILTERFACTORY FilterFactory
;
818 PIO_STACK_LOCATION IoStack
;
821 DPRINT("BdaPropertyNodeTypes\n");
823 /* check input parameter */
824 if (!Irp
|| !pKSProperty
)
825 return STATUS_INVALID_PARAMETER
;
827 /* first get the filter */
828 pKSFilter
= KsGetFilterFromIrp(Irp
);
833 /* get parent filter factory */
834 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
837 ASSERT(FilterFactory
);
839 /* find instance entry */
840 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
841 ASSERT(InstanceEntry
);
843 /* get current irp stack */
844 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
846 /* are there node types provided */
849 /* no node entry array provided */
850 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
851 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
852 return STATUS_MORE_ENTRIES
;
855 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
857 /* buffer too small */
858 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
859 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
860 return STATUS_BUFFER_TOO_SMALL
;
863 /* now copy all descriptors */
864 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
; Index
++)
866 /* use the index as the type */
867 pulProperty
[Index
] = Index
;
870 return STATUS_SUCCESS
;
880 IN KSPROPERTY
*pKSProperty
,
881 OUT ULONG
*pulProperty
)
883 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
884 PKSFILTERFACTORY FilterFactory
;
886 PIO_STACK_LOCATION IoStack
;
889 DPRINT("BdaPropertyPinTypes\n");
891 /* check input parameter */
892 if (!Irp
|| !pKSProperty
)
893 return STATUS_INVALID_PARAMETER
;
895 /* first get the filter */
896 pKSFilter
= KsGetFilterFromIrp(Irp
);
901 /* get parent filter factory */
902 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
905 ASSERT(FilterFactory
);
907 /* find instance entry */
908 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
909 ASSERT(InstanceEntry
);
911 /* get current irp stack */
912 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
914 /* are there node types provided */
917 /* no node entry array provided */
918 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
919 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
920 return STATUS_MORE_ENTRIES
;
923 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
925 /* buffer too small */
926 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
927 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
928 return STATUS_BUFFER_TOO_SMALL
;
931 /* now copy all descriptors */
932 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
934 /* use the index as the type */
935 pulProperty
[Index
] = Index
;
938 return STATUS_SUCCESS
;
946 BdaPropertyTemplateConnections(
948 IN KSPROPERTY
*pKSProperty
,
949 OUT KSTOPOLOGY_CONNECTION
*pConnectionProperty
)
951 PBDA_FILTER_INSTANCE_ENTRY FilterInstance
;
953 PIO_STACK_LOCATION IoStack
;
956 DPRINT("BdaPropertyTemplateConnections\n");
958 /* validate parameters */
959 if (!Irp
|| !pKSProperty
)
960 return STATUS_INVALID_PARAMETER
;
962 /* first get the filter */
963 Filter
= KsGetFilterFromIrp(Irp
);
968 /* verify filter has been registered with BDA */
969 FilterInstance
= GetFilterInstanceEntry(KsFilterGetParentFilterFactory(Filter
));
972 return STATUS_INVALID_PARAMETER
;
974 /* get current irp stack */
975 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
977 if (!pConnectionProperty
)
979 /* caller needs the size first */
980 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
981 Irp
->IoStatus
.Status
= STATUS_BUFFER_OVERFLOW
;
982 return STATUS_BUFFER_OVERFLOW
;
986 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
) <= IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
);
988 for(Index
= 0; Index
< FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
; Index
++)
991 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
);
993 /* copy connection */
994 RtlMoveMemory(pConnectionProperty
, &FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
[Index
], sizeof(KSTOPOLOGY_CONNECTION
));
998 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
999 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1002 return STATUS_SUCCESS
;
1011 BdaStartChanges(IN PIRP Irp
)
1013 DPRINT("BdaStartChanges\n");
1016 return STATUS_SUCCESS
;
1018 return STATUS_INVALID_PARAMETER
;
1027 BdaUninitFilter(IN PKSFILTER pKSFilter
)
1029 DPRINT("BdaUninitFilter\n");
1030 return STATUS_SUCCESS
;
1038 BdaValidateNodeProperty(
1040 IN KSPROPERTY
*KSProperty
)
1042 DPRINT("BdaValidateNodeProperty\n");
1044 /* check for valid parameter */
1045 if (Irp
&& KSProperty
)
1046 return STATUS_SUCCESS
;
1048 return STATUS_INVALID_PARAMETER
;