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_SET
),
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_SET
),
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 KeInitializeSpinLock(&g_Settings
.FilterFactoryInstanceListLock
);
161 InitializeListHead(&g_Settings
.FilterFactoryInstanceList
);
162 g_Settings
.Initialized
= TRUE
;
164 return STATUS_SUCCESS
;
172 BdaCheckChanges(IN PIRP Irp
)
175 return STATUS_INVALID_PARAMETER
;
177 return STATUS_SUCCESS
;
185 BdaCommitChanges(IN PIRP Irp
)
188 return STATUS_INVALID_PARAMETER
;
190 return STATUS_SUCCESS
;
198 BdaCreateFilterFactory(
199 IN PKSDEVICE pKSDevice
,
200 IN
const KSFILTER_DESCRIPTOR
*pFilterDescriptor
,
201 IN
const BDA_FILTER_TEMPLATE
*pBdaFilterTemplate
)
203 return BdaCreateFilterFactoryEx(pKSDevice
, pFilterDescriptor
, pBdaFilterTemplate
, NULL
);
211 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
= NULL
;
215 /* acquire list lock */
216 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
218 /* point to first entry */
219 Entry
= g_Settings
.FilterFactoryInstanceList
.Flink
;
221 while(Entry
!= &g_Settings
.FilterFactoryInstanceList
)
223 /* get instance entry from list entry offset */
224 InstanceEntry
= (PBDA_FILTER_INSTANCE_ENTRY
)CONTAINING_RECORD(Entry
, BDA_FILTER_INSTANCE_ENTRY
, Entry
);
226 /* is the instance entry the requested one */
227 if (InstanceEntry
== (PBDA_FILTER_INSTANCE_ENTRY
)Context
)
229 RemoveEntryList(&InstanceEntry
->Entry
);
230 FreeItem(InstanceEntry
);
234 /* move to next entry */
235 Entry
= Entry
->Flink
;
238 /* release spin lock */
239 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
248 BdaCreateFilterFactoryEx(
249 IN PKSDEVICE pKSDevice
,
250 IN
const KSFILTER_DESCRIPTOR
*pFilterDescriptor
,
251 IN
const BDA_FILTER_TEMPLATE
*BdaFilterTemplate
,
252 OUT PKSFILTERFACTORY
*ppKSFilterFactory
)
254 PKSFILTERFACTORY FilterFactory
;
255 PBDA_FILTER_INSTANCE_ENTRY FilterInstance
;
258 KSFILTER_DESCRIPTOR FilterDescriptor
;
260 /* backup filter descriptor */
261 RtlMoveMemory(&FilterDescriptor
, pFilterDescriptor
, sizeof(KSFILTER_DESCRIPTOR
));
263 /* merge the automation tables */
264 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&FilterDescriptor
.AutomationTable
, (PKSAUTOMATION_TABLE
)pFilterDescriptor
->AutomationTable
, &FilterAutomationTable
, NULL
);
266 /* check for success */
267 if (!NT_SUCCESS(Status
))
270 /* allocate filter instance */
271 FilterInstance
= AllocateItem(NonPagedPool
, sizeof(BDA_FILTER_INSTANCE_ENTRY
));
274 /* not enough memory */
275 return STATUS_INSUFFICIENT_RESOURCES
;
278 /* create the filter factory */
279 Status
= KsCreateFilterFactory(pKSDevice
->FunctionalDeviceObject
, &FilterDescriptor
, NULL
, NULL
, 0, NULL
, NULL
, &FilterFactory
);
281 /* check for success */
282 if (NT_SUCCESS(Status
))
285 /* add the item to filter object bag */
286 Status
= KsAddItemToObjectBag(FilterFactory
->Bag
, FilterInstance
, FreeFilterInstance
);
287 if (!NT_SUCCESS(Status
))
289 /* destroy filter instance */
290 FreeItem(FilterInstance
);
291 KsDeleteFilterFactory(FilterFactory
);
295 /* initialize filter instance entry */
296 FilterInstance
->FilterFactoryInstance
= FilterFactory
;
297 FilterInstance
->FilterTemplate
= (BDA_FILTER_TEMPLATE
*)BdaFilterTemplate
;
299 /* acquire list lock */
300 KeAcquireSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, &OldLevel
);
302 /* insert factory at the end */
303 InsertTailList(&g_Settings
.FilterFactoryInstanceList
, &FilterInstance
->Entry
);
305 /* release spin lock */
306 KeReleaseSpinLock(&g_Settings
.FilterFactoryInstanceListLock
, OldLevel
);
309 if (ppKSFilterFactory
)
312 *ppKSFilterFactory
= FilterFactory
;
317 /* failed to create filter factory */
318 FreeItem(FilterInstance
);
331 IN PKSFILTER pKSFilter
,
335 PKSPIN_DESCRIPTOR_EX PinDescriptor
;
336 PKSFILTERFACTORY FilterFactory
;
337 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
340 KSPIN_DESCRIPTOR_EX NewPinDescriptor
;
342 if (!pulPinId
|| !pKSFilter
)
343 return STATUS_INVALID_PARAMETER
;
345 /* get parent filter factory */
346 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
349 ASSERT(FilterFactory
);
351 /* find instance entry */
352 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
356 /* the filter was not initialized with BDA */
357 return STATUS_NOT_FOUND
;
361 ASSERT(InstanceEntry
->FilterTemplate
);
362 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
);
364 /* does the filter support any pins */
365 if (!InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
367 /* no pins supported */
368 return STATUS_UNSUCCESSFUL
;
371 /* is pin factory still existing */
372 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
<= ulPinType
)
374 /* pin request is out of bounds */
375 return STATUS_INVALID_PARAMETER
;
378 /* FIXME custom pin descriptors */
379 ASSERT(InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorSize
== sizeof(KSPIN_DESCRIPTOR_EX
));
381 /* get pin descriptor */
382 PinDescriptor
= (PKSPIN_DESCRIPTOR_EX
)&InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptors
[ulPinType
];
384 /* make a copy of the pin descriptor */
385 RtlMoveMemory(&NewPinDescriptor
, PinDescriptor
, sizeof(KSPIN_DESCRIPTOR_EX
));
387 /* merge the automation tables */
388 Status
= KsMergeAutomationTables((PKSAUTOMATION_TABLE
*)&NewPinDescriptor
.AutomationTable
, (PKSAUTOMATION_TABLE
)PinDescriptor
->AutomationTable
, &PinAutomationTable
, pKSFilter
->Bag
);
390 /* check for success */
391 if (NT_SUCCESS(Status
))
393 /* create the pin factory */
394 Status
= KsFilterCreatePinFactory(pKSFilter
, &NewPinDescriptor
, &PinId
);
396 /* check for success */
397 if (NT_SUCCESS(Status
))
405 DPRINT("BdaCreatePin Result %x\n", Status
);
416 IN KSMETHOD
*pKSMethod
,
417 OUT ULONG
*pulPinFactoryID
)
424 /* invalid parameter */
425 return STATUS_INVALID_PARAMETER
;
428 /* get filter from irp */
429 Filter
= KsGetFilterFromIrp(Irp
);
435 /* get method request */
436 Pin
= (PKSM_PIN
)pKSMethod
;
439 return BdaCreatePin(Filter
, Pin
->PinId
, pulPinFactoryID
);
448 IN PKSFILTER pKSFilter
,
449 IN
const BDA_FILTER_TEMPLATE
*pBdaFilterTemplate
)
451 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
452 PKSFILTERFACTORY FilterFactory
;
454 NTSTATUS Status
= STATUS_SUCCESS
;
456 /* check input parameters */
458 return STATUS_INVALID_PARAMETER
;
460 /* get parent filter factory */
461 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
464 ASSERT(FilterFactory
);
466 /* find instance entry */
467 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
470 ASSERT(InstanceEntry
);
471 ASSERT(InstanceEntry
->FilterTemplate
== pBdaFilterTemplate
);
473 /* now create the pins */
474 for(Index
= 0; Index
< pBdaFilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
477 Status
= BdaCreatePin(pKSFilter
, Index
, &PinId
);
479 /* check for success */
480 if (!NT_SUCCESS(Status
))
496 IN PKSFILTER pKSFilter
,
498 IN ULONG OutputPinId
)
500 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
501 PKSFILTERFACTORY FilterFactory
;
502 KSTOPOLOGY_CONNECTION Connection
;
504 /* check input parameters */
506 return STATUS_INVALID_PARAMETER
;
508 /* get parent filter factory */
509 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
512 ASSERT(FilterFactory
);
514 /* find instance entry */
515 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
519 /* the filter was not initialized with BDA */
520 return STATUS_NOT_FOUND
;
523 if (InputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
||
524 OutputPinId
>= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
)
527 return STATUS_INVALID_PARAMETER
;
530 /* initialize topology connection */
531 Connection
.FromNode
= KSFILTER_NODE
;
532 Connection
.ToNode
= KSFILTER_NODE
;
533 Connection
.FromNodePin
= InputPinId
;
534 Connection
.ToNodePin
= OutputPinId
;
536 /* add the connection */
537 return KsFilterAddTopologyConnections(pKSFilter
, 1, &Connection
);
546 IN PKSFILTER pKSFilter
,
550 return STATUS_NOT_IMPLEMENTED
;
558 BdaFilterFactoryUpdateCacheData(
559 IN PKSFILTERFACTORY FilterFactory
,
560 IN
const KSFILTER_DESCRIPTOR
*FilterDescriptor OPTIONAL
)
562 return KsFilterFactoryUpdateCacheData(FilterFactory
, FilterDescriptor
);
572 OUT BDA_CHANGE_STATE
*ChangeState
)
574 if (Irp
&& ChangeState
)
576 *ChangeState
= BDA_CHANGES_COMPLETE
;
577 return STATUS_SUCCESS
;
580 /* invalid parameters supplied */
581 return STATUS_INVALID_PARAMETER
;
590 BdaMethodCreateTopology(
592 IN KSMETHOD
*pKSMethod
,
593 OPTIONAL PVOID pvIgnored
)
596 PKSP_BDA_NODE_PIN Node
;
598 /* check input parameters */
599 if (!Irp
|| !pKSMethod
)
600 return STATUS_INVALID_PARAMETER
;
603 Filter
= KsGetFilterFromIrp(Irp
);
608 /* get method request */
609 Node
= (PKSP_BDA_NODE_PIN
)pKSMethod
;
611 /* create the topology */
612 return BdaCreateTopology(Filter
, Node
->ulInputPinId
, Node
->ulOutputPinId
);
622 IN KSMETHOD
*pKSMethod
,
623 OPTIONAL PVOID pvIgnored
)
626 return STATUS_INVALID_PARAMETER
;
628 return STATUS_SUCCESS
;
636 BdaPropertyGetControllingPinId(
638 IN KSP_BDA_NODE_PIN
*pProperty
,
639 OUT ULONG
*pulControllingPinId
)
642 return STATUS_NOT_IMPLEMENTED
;
650 BdaPropertyGetPinControl(
652 IN KSPROPERTY
*pKSProperty
,
653 OUT ULONG
*pulProperty
)
657 PKSFILTERFACTORY FilterFactory
;
658 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
660 /* first get the pin */
661 Pin
= KsGetPinFromIrp(Irp
);
664 /* now get the parent filter */
665 Filter
= KsPinGetParentFilter(Pin
);
668 /* get parent filter factory */
669 FilterFactory
= KsFilterGetParentFilterFactory(Filter
);
670 ASSERT(FilterFactory
);
672 /* find instance entry */
673 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
674 ASSERT(InstanceEntry
);
678 ASSERT(pKSProperty
->Id
== KSPROPERTY_BDA_PIN_TYPE
);
681 *pulProperty
= Pin
->Id
;
683 return STATUS_SUCCESS
;
691 BdaPropertyNodeDescriptors(
693 IN KSPROPERTY
*pKSProperty
,
694 OUT BDANODE_DESCRIPTOR
*pNodeDescriptorProperty
)
697 return STATUS_NOT_IMPLEMENTED
;
705 BdaPropertyNodeEvents(
707 IN KSP_NODE
*pKSProperty
,
708 OUT GUID
*pguidProperty
)
711 return STATUS_NOT_IMPLEMENTED
;
719 BdaPropertyNodeMethods(
721 IN KSP_NODE
*pKSProperty
,
722 OUT GUID
*pguidProperty
)
725 return STATUS_NOT_IMPLEMENTED
;
733 BdaPropertyNodeProperties(
735 IN KSP_NODE
*pKSProperty
,
736 OUT GUID
*pguidProperty
)
739 return STATUS_NOT_IMPLEMENTED
;
747 BdaPropertyNodeTypes(
749 IN KSPROPERTY
*pKSProperty
,
750 OUT ULONG
*pulProperty
)
752 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
753 PKSFILTERFACTORY FilterFactory
;
755 PIO_STACK_LOCATION IoStack
;
758 /* check input parameter */
759 if (!Irp
|| !pKSProperty
)
760 return STATUS_INVALID_PARAMETER
;
762 /* first get the filter */
763 pKSFilter
= KsGetFilterFromIrp(Irp
);
768 /* get parent filter factory */
769 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
772 ASSERT(FilterFactory
);
774 /* find instance entry */
775 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
776 ASSERT(InstanceEntry
);
778 /* get current irp stack */
779 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
781 /* are there node types provided */
784 /* no node entry array provided */
785 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
786 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
787 return STATUS_MORE_ENTRIES
;
790 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
792 /* buffer too small */
793 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
* sizeof(ULONG
);
794 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
795 return STATUS_BUFFER_TOO_SMALL
;
798 /* now copy all descriptors */
799 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->NodeDescriptorsCount
; Index
++)
801 /* use the index as the type */
802 pulProperty
[Index
] = Index
;
805 return STATUS_SUCCESS
;
815 IN KSPROPERTY
*pKSProperty
,
816 OUT ULONG
*pulProperty
)
818 PBDA_FILTER_INSTANCE_ENTRY InstanceEntry
;
819 PKSFILTERFACTORY FilterFactory
;
821 PIO_STACK_LOCATION IoStack
;
824 /* check input parameter */
825 if (!Irp
|| !pKSProperty
)
826 return STATUS_INVALID_PARAMETER
;
828 /* first get the filter */
829 pKSFilter
= KsGetFilterFromIrp(Irp
);
834 /* get parent filter factory */
835 FilterFactory
= KsFilterGetParentFilterFactory(pKSFilter
);
838 ASSERT(FilterFactory
);
840 /* find instance entry */
841 InstanceEntry
= GetFilterInstanceEntry(FilterFactory
);
842 ASSERT(InstanceEntry
);
844 /* get current irp stack */
845 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
847 /* are there node types provided */
850 /* no node entry array provided */
851 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
852 Irp
->IoStatus
.Status
= STATUS_MORE_ENTRIES
;
853 return STATUS_MORE_ENTRIES
;
856 if (InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
) > IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
)
858 /* buffer too small */
859 Irp
->IoStatus
.Information
= InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
* sizeof(ULONG
);
860 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
861 return STATUS_BUFFER_TOO_SMALL
;
864 /* now copy all descriptors */
865 for(Index
= 0; Index
< InstanceEntry
->FilterTemplate
->pFilterDescriptor
->PinDescriptorsCount
; Index
++)
867 /* use the index as the type */
868 pulProperty
[Index
] = Index
;
871 return STATUS_SUCCESS
;
879 BdaPropertyTemplateConnections(
881 IN KSPROPERTY
*pKSProperty
,
882 OUT KSTOPOLOGY_CONNECTION
*pConnectionProperty
)
884 PBDA_FILTER_INSTANCE_ENTRY FilterInstance
;
886 PIO_STACK_LOCATION IoStack
;
889 /* validate parameters */
890 if (!Irp
|| !pKSProperty
)
891 return STATUS_INVALID_PARAMETER
;
893 /* first get the filter */
894 Filter
= KsGetFilterFromIrp(Irp
);
899 /* verify filter has been registered with BDA */
900 FilterInstance
= GetFilterInstanceEntry(KsFilterGetParentFilterFactory(Filter
));
903 return STATUS_INVALID_PARAMETER
;
905 /* get current irp stack */
906 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
908 if (!pConnectionProperty
)
910 /* caller needs the size first */
911 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
912 Irp
->IoStatus
.Status
= STATUS_BUFFER_OVERFLOW
;
913 return STATUS_BUFFER_OVERFLOW
;
917 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
) <= IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
);
919 for(Index
= 0; Index
< FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
; Index
++)
922 ASSERT(FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
);
924 /* copy connection */
925 RtlMoveMemory(pConnectionProperty
, &FilterInstance
->FilterTemplate
->pFilterDescriptor
->Connections
[Index
], sizeof(KSTOPOLOGY_CONNECTION
));
929 Irp
->IoStatus
.Information
= FilterInstance
->FilterTemplate
->pFilterDescriptor
->ConnectionsCount
* sizeof(KSTOPOLOGY_CONNECTION
);
930 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
933 return STATUS_SUCCESS
;
942 BdaStartChanges(IN PIRP Irp
)
945 return STATUS_SUCCESS
;
947 return STATUS_INVALID_PARAMETER
;
956 BdaUninitFilter(IN PKSFILTER pKSFilter
)
958 return STATUS_SUCCESS
;
966 BdaValidateNodeProperty(
968 IN KSPROPERTY
*KSProperty
)
970 /* check for valid parameter */
971 if (Irp
&& KSProperty
)
972 return STATUS_SUCCESS
;
974 return STATUS_INVALID_PARAMETER
;