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 /* erase pin / nodes / connections from filter descriptor */
279 FilterDescriptor
->PinDescriptorsCount
= 0;
280 FilterDescriptor
->PinDescriptors
= NULL
;
281 FilterDescriptor
->NodeDescriptorsCount
= 0;
282 FilterDescriptor
->NodeDescriptors
= NULL
;
283 FilterDescriptor
->ConnectionsCount
= 0;
284 FilterDescriptor
->Connections
= NULL
;
286 /* merge the automation tables */
287 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&FilterDescriptor
->AutomationTable
, (PKSAUTOMATION_TABLE
)pFilterDescriptor
->AutomationTable
, &FilterAutomationTable
, NULL
);
289 /* check for success */
290 if (!NT_SUCCESS(Status
))
292 DPRINT1("KsMergeAutomationTables failed with %lx\n", Status
);
293 FreeItem(FilterDescriptor
);
297 /* allocate filter instance */
298 FilterInstance
= AllocateItem(NonPagedPool
, sizeof(BDA_FILTER_INSTANCE_ENTRY
));
301 /* not enough memory */
302 FreeItem(FilterDescriptor
);
303 return STATUS_INSUFFICIENT_RESOURCES
;
306 /* create the filter factory */
307 Status
= KsCreateFilterFactory(pKSDevice
->FunctionalDeviceObject
, FilterDescriptor
, NULL
, NULL
, 0, NULL
, NULL
, &FilterFactory
);
309 /* check for success */
310 if (NT_SUCCESS(Status
))
312 if (FilterDescriptor
->AutomationTable
!= &FilterAutomationTable
)
314 /* add the item to filter object bag */
315 KsAddItemToObjectBag(FilterFactory
->Bag
, (PVOID
)FilterDescriptor
->AutomationTable
, FreeFilterInstance
);
319 /* make sure the automation table is not-read only */
320 Status
= _KsEdit(FilterFactory
->Bag
, (PVOID
*)&FilterDescriptor
->AutomationTable
, sizeof(KSAUTOMATION_TABLE
), sizeof(KSAUTOMATION_TABLE
), 0);
323 ASSERT(Status
== STATUS_SUCCESS
);
325 /* add to object bag */
326 KsAddItemToObjectBag(FilterFactory
->Bag
, (PVOID
)FilterDescriptor
->AutomationTable
, FreeFilterInstance
);
329 /* initialize filter instance entry */
330 FilterInstance
->FilterFactoryInstance
= FilterFactory
;
331 FilterInstance
->FilterTemplate
= (BDA_FILTER_TEMPLATE
*)BdaFilterTemplate
;
333 /* acquire list lock */
334 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
336 /* insert factory at the end */
337 InsertTailList(&g_Settings
.FilterFactoryInstanceList
, &FilterInstance
->Entry
);
339 /* release spin lock */
340 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
343 if (ppKSFilterFactory
)
346 *ppKSFilterFactory
= FilterFactory
;
351 /* failed to create filter factory */
352 FreeItem(FilterInstance
);
353 FreeItem(FilterDescriptor
);
357 DPRINT("BdaCreateFilterFactoryEx Status %x\n", Status
);
367 IN PKSFILTER pKSFilter
,
371 PKSPIN_DESCRIPTOR_EX PinDescriptor
;
372 PKSFILTERFACTORY FilterFactory
;
373 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
376 PKSPIN_DESCRIPTOR_EX NewPinDescriptor
;
378 DPRINT("BdaCreatePin\n");
380 if (!pulPinId
|| !pKSFilter
)
381 return STATUS_INVALID_PARAMETER
;
383 /* get parent filter factory */
384 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
387 ASSERT(FilterFactory
);
389 /* find instance entry */
390 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
394 /* the filter was not initialized with BDA */
395 return STATUS_NOT_FOUND
;
399 ASSERT(InstanceEntry
->FilterTemplate
);
400 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
);
402 /* does the filter support any pins */
403 if (!InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
405 /* no pins supported */
406 DPRINT("BdaCreatePin NoPins supported\n");
407 return STATUS_UNSUCCESSFUL
;
410 /* is pin factory still existing */
411 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
<= ulPinType
)
413 /* pin request is out of bounds */
414 DPRINT("BdaCreatePin ulPinType %lu >= PinDescriptorCount %lu\n", ulPinType
, InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
);
415 return STATUS_INVALID_PARAMETER
;
418 /* FIXME custom pin descriptors */
419 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorSize
== sizeof(KSPIN_DESCRIPTOR_EX
));
421 /* get pin descriptor */
422 PinDescriptor
= (PKSPIN_DESCRIPTOR_EX
)&InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptors
[ulPinType
];
424 /* allocate pin descriptor */
425 NewPinDescriptor
= AllocateItem(NonPagedPool
, sizeof(KSPIN_DESCRIPTOR_EX
));
426 if (!NewPinDescriptor
)
429 DPRINT("BdaCreatePin OutOfMemory\n");
430 return STATUS_INSUFFICIENT_RESOURCES
;
433 /* make a copy of the pin descriptor */
434 RtlMoveMemory(NewPinDescriptor
, PinDescriptor
, sizeof(KSPIN_DESCRIPTOR_EX
));
436 /* merge the automation tables */
437 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&NewPinDescriptor
->AutomationTable
, (PKSAUTOMATION_TABLE
)PinDescriptor
->AutomationTable
, &PinAutomationTable
, pKSFilter
->Bag
);
439 /* check for success */
440 if (NT_SUCCESS(Status
))
442 /* create the pin factory */
443 Status
= KsFilterCreatePinFactory(pKSFilter
, NewPinDescriptor
, &PinId
);
445 /* check for success */
446 if (NT_SUCCESS(Status
))
454 DPRINT("BdaCreatePin Result %x PinId %u\n", Status
, PinId
);
465 IN KSMETHOD
*pKSMethod
,
466 OUT ULONG
*pulPinFactoryID
)
471 DPRINT("BdaMethodCreatePin\n");
475 /* invalid parameter */
476 return STATUS_INVALID_PARAMETER
;
479 /* get filter from irp */
480 Filter
= KsGetFilterFromIrp(Irp
);
486 /* get method request */
487 Pin
= (PKSM_PIN
)pKSMethod
;
490 return BdaCreatePin(Filter
, Pin
->PinId
, pulPinFactoryID
);
499 IN PKSFILTER pKSFilter
,
500 IN
const BDA_FILTER_TEMPLATE
*pBdaFilterTemplate
)
502 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
503 PKSFILTERFACTORY FilterFactory
;
505 NTSTATUS Status
= STATUS_SUCCESS
;
507 DPRINT("BdaInitFilter %p\n", pBdaFilterTemplate
);
509 /* check input parameters */
511 return STATUS_INVALID_PARAMETER
;
513 /* get parent filter factory */
514 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
517 ASSERT(FilterFactory
);
519 /* find instance entry */
520 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
523 ASSERT(InstanceEntry
);
525 if (!pBdaFilterTemplate
)
527 /* use template from BdaCreateFilterFactoryEx */
528 pBdaFilterTemplate
= InstanceEntry
->FilterTemplate
;
531 /* now create the pins */
532 for(Index
= 0; Index
< pBdaFilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
535 Status
= BdaCreatePin(pKSFilter
, Index
, &PinId
);
537 /* check for success */
538 if (!NT_SUCCESS(Status
))
554 IN PKSFILTER pKSFilter
,
556 IN ULONG OutputPinId
)
558 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
559 PKSFILTERFACTORY FilterFactory
;
560 KSTOPOLOGY_CONNECTION Connection
;
562 DPRINT("BdaCreateTopology\n");
564 /* check input parameters */
566 return STATUS_INVALID_PARAMETER
;
568 /* get parent filter factory */
569 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
572 ASSERT(FilterFactory
);
574 /* find instance entry */
575 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
579 /* the filter was not initialized with BDA */
580 return STATUS_NOT_FOUND
;
583 if (InputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
||
584 OutputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
587 return STATUS_INVALID_PARAMETER
;
590 /* initialize topology connection */
591 Connection
.FromNode
= KSFILTER_NODE
;
592 Connection
.ToNode
= KSFILTER_NODE
;
593 Connection
.FromNodePin
= InputPinId
;
594 Connection
.ToNodePin
= OutputPinId
;
596 /* add the connection */
597 return KsFilterAddTopologyConnections(pKSFilter
, 1, &Connection
);
606 IN PKSFILTER pKSFilter
,
610 DPRINT("BdaDeletePin\n");
611 return STATUS_NOT_IMPLEMENTED
;
619 BdaFilterFactoryUpdateCacheData(
620 IN PKSFILTERFACTORY FilterFactory
,
621 IN
const KSFILTER_DESCRIPTOR
*FilterDescriptor OPTIONAL
)
623 DPRINT("BdaFilterFactoryUpdateCacheData\n");
624 return KsFilterFactoryUpdateCacheData(FilterFactory
, FilterDescriptor
);
634 OUT BDA_CHANGE_STATE
*ChangeState
)
636 DPRINT("BdaGetChangeState\n");
638 if (Irp
&& ChangeState
)
640 *ChangeState
= BDA_CHANGES_COMPLETE
;
641 return STATUS_SUCCESS
;
644 /* invalid parameters supplied */
645 return STATUS_INVALID_PARAMETER
;
654 BdaMethodCreateTopology(
656 IN KSMETHOD
*pKSMethod
,
657 OPTIONAL PVOID pvIgnored
)
660 PKSP_BDA_NODE_PIN Node
;
662 DPRINT("BdaMethodCreateTopology\n");
664 /* check input parameters */
665 if (!Irp
|| !pKSMethod
)
666 return STATUS_INVALID_PARAMETER
;
669 Filter
= KsGetFilterFromIrp(Irp
);
674 /* get method request */
675 Node
= (PKSP_BDA_NODE_PIN
)pKSMethod
;
677 /* create the topology */
678 return BdaCreateTopology(Filter
, Node
->ulInputPinId
, Node
->ulOutputPinId
);
688 IN KSMETHOD
*pKSMethod
,
689 OPTIONAL PVOID pvIgnored
)
691 DPRINT("BdaMethodDeletePin\n");
694 return STATUS_INVALID_PARAMETER
;
696 return STATUS_SUCCESS
;
704 BdaPropertyGetControllingPinId(
706 IN KSP_BDA_NODE_PIN
*pProperty
,
707 OUT ULONG
*pulControllingPinId
)
710 DPRINT("BdaPropertyGetControllingPinId\n");
711 return STATUS_NOT_IMPLEMENTED
;
719 BdaPropertyGetPinControl(
721 IN KSPROPERTY
*pKSProperty
,
722 OUT ULONG
*pulProperty
)
726 PKSFILTERFACTORY FilterFactory
;
727 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
729 DPRINT("BdaPropertyGetPinControl\n");
731 /* first get the pin */
732 Pin
= KsGetPinFromIrp(Irp
);
735 /* now get the parent filter */
736 Filter
= KsPinGetParentFilter(Pin
);
739 /* get parent filter factory */
740 FilterFactory
= KsFilterGetParentFilterFactory(Filter
);
741 ASSERT(FilterFactory
);
743 /* find instance entry */
744 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
745 ASSERT(InstanceEntry
);
749 ASSERT(pKSProperty
->Id
== KSPROPERTY_BDA_PIN_TYPE
);
752 *pulProperty
= Pin
->Id
;
754 return STATUS_SUCCESS
;
762 BdaPropertyNodeDescriptors(
764 IN KSPROPERTY
*pKSProperty
,
765 OUT BDANODE_DESCRIPTOR
*pNodeDescriptorProperty
)
768 DPRINT("BdaPropertyNodeDescriptors\n");
769 return STATUS_NOT_IMPLEMENTED
;
777 BdaPropertyNodeEvents(
779 IN KSP_NODE
*pKSProperty
,
780 OUT GUID
*pguidProperty
)
783 DPRINT("BdaPropertyNodeEvents\n");
784 return STATUS_NOT_IMPLEMENTED
;
792 BdaPropertyNodeMethods(
794 IN KSP_NODE
*pKSProperty
,
795 OUT GUID
*pguidProperty
)
798 DPRINT("BdaPropertyNodeMethods\n");
799 return STATUS_NOT_IMPLEMENTED
;
807 BdaPropertyNodeProperties(
809 IN KSP_NODE
*pKSProperty
,
810 OUT GUID
*pguidProperty
)
813 DPRINT("BdaPropertyNodeProperties\n");
814 return STATUS_NOT_IMPLEMENTED
;
822 BdaPropertyNodeTypes(
824 IN KSPROPERTY
*pKSProperty
,
825 OUT ULONG
*pulProperty
)
827 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
828 PKSFILTERFACTORY FilterFactory
;
830 PIO_STACK_LOCATION IoStack
;
833 DPRINT("BdaPropertyNodeTypes\n");
835 /* check input parameter */
836 if (!Irp
|| !pKSProperty
)
837 return STATUS_INVALID_PARAMETER
;
839 /* first get the filter */
840 pKSFilter
= KsGetFilterFromIrp(Irp
);
845 /* get parent filter factory */
846 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
849 ASSERT(FilterFactory
);
851 /* find instance entry */
852 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
853 ASSERT(InstanceEntry
);
855 /* get current irp stack */
856 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
858 /* are there node types provided */
861 /* no node entry array provided */
862 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
863 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
864 return STATUS_MORE_ENTRIES
;
867 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
869 /* buffer too small */
870 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
871 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
872 return STATUS_BUFFER_TOO_SMALL
;
875 /* now copy all descriptors */
876 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
; Index
++)
878 /* use the index as the type */
879 pulProperty
[Index
] = Index
;
882 return STATUS_SUCCESS
;
892 IN KSPROPERTY
*pKSProperty
,
893 OUT ULONG
*pulProperty
)
895 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
896 PKSFILTERFACTORY FilterFactory
;
898 PIO_STACK_LOCATION IoStack
;
901 DPRINT("BdaPropertyPinTypes\n");
903 /* check input parameter */
904 if (!Irp
|| !pKSProperty
)
905 return STATUS_INVALID_PARAMETER
;
907 /* first get the filter */
908 pKSFilter
= KsGetFilterFromIrp(Irp
);
913 /* get parent filter factory */
914 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
917 ASSERT(FilterFactory
);
919 /* find instance entry */
920 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
921 ASSERT(InstanceEntry
);
923 /* get current irp stack */
924 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
926 /* are there node types provided */
929 /* no node entry array provided */
930 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
931 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
932 return STATUS_MORE_ENTRIES
;
935 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
937 /* buffer too small */
938 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
939 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
940 return STATUS_BUFFER_TOO_SMALL
;
943 /* now copy all descriptors */
944 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
946 /* use the index as the type */
947 pulProperty
[Index
] = Index
;
950 return STATUS_SUCCESS
;
958 BdaPropertyTemplateConnections(
960 IN KSPROPERTY
*pKSProperty
,
961 OUT KSTOPOLOGY_CONNECTION
*pConnectionProperty
)
963 PBDA_FILTER_INSTANCE_ENTRY FilterInstance
;
965 PIO_STACK_LOCATION IoStack
;
968 DPRINT("BdaPropertyTemplateConnections\n");
970 /* validate parameters */
971 if (!Irp
|| !pKSProperty
)
972 return STATUS_INVALID_PARAMETER
;
974 /* first get the filter */
975 Filter
= KsGetFilterFromIrp(Irp
);
980 /* verify filter has been registered with BDA */
981 FilterInstance
= GetFilterInstanceEntry(KsFilterGetParentFilterFactory(Filter
));
984 return STATUS_INVALID_PARAMETER
;
986 /* get current irp stack */
987 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
989 if (!pConnectionProperty
)
991 /* caller needs the size first */
992 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
993 Irp
->IoStatus
.Status
= STATUS_BUFFER_OVERFLOW
;
994 return STATUS_BUFFER_OVERFLOW
;
998 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
) <= IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
);
1000 for(Index
= 0; Index
< FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
; Index
++)
1003 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
);
1005 /* copy connection */
1006 RtlMoveMemory(pConnectionProperty
, &FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
[Index
], sizeof(KSTOPOLOGY_CONNECTION
));
1010 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
1011 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1014 return STATUS_SUCCESS
;
1023 BdaStartChanges(IN PIRP Irp
)
1025 DPRINT("BdaStartChanges\n");
1028 return STATUS_SUCCESS
;
1030 return STATUS_INVALID_PARAMETER
;
1039 BdaUninitFilter(IN PKSFILTER pKSFilter
)
1041 DPRINT("BdaUninitFilter\n");
1042 return STATUS_SUCCESS
;
1050 BdaValidateNodeProperty(
1052 IN KSPROPERTY
*KSProperty
)
1054 DPRINT("BdaValidateNodeProperty\n");
1056 /* check for valid parameter */
1057 if (Irp
&& KSProperty
)
1058 return STATUS_SUCCESS
;
1060 return STATUS_INVALID_PARAMETER
;