2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/api.cpp
5 * PURPOSE: Port api functions
6 * PROGRAMMER: Johannes Anderwald
12 KSPIN_INTERFACE PinInterfaces
[] =
15 {STATIC_KSINTERFACESETID_Standard
},
16 KSINTERFACE_STANDARD_STREAMING
,
20 {STATIC_KSINTERFACESETID_Standard
},
21 KSINTERFACE_STANDARD_LOOPED_STREAMING
,
29 KsoDispatchCreateWithGenericFactory(
34 return STATUS_NOT_IMPLEMENTED
;
39 KsoGetIrpTargetFromFileObject(
40 PFILE_OBJECT FileObject
)
42 PC_ASSERT(FileObject
);
44 // IrpTarget is stored in FsContext
45 return (IIrpTarget
*)FileObject
->FsContext
;
50 KsoGetIrpTargetFromIrp(
53 PIO_STACK_LOCATION IoStack
;
55 // get current irp stack location
56 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
58 // IIrpTarget is stored in Context member
59 return (IIrpTarget
*)IoStack
->FileObject
->FsContext
;
64 PcHandleEnableEventWithTable(
66 IN PSUBDEVICE_DESCRIPTOR Descriptor
)
69 KSEVENT_ITEM_IRP_STORAGE(Irp
) = (PKSEVENT_ITEM
)Descriptor
;
72 return KsEnableEvent(Irp
, Descriptor
->EventSetCount
, Descriptor
->EventSet
, NULL
, KSEVENTS_NONE
, NULL
);
77 PcHandleDisableEventWithTable(
79 IN PSUBDEVICE_DESCRIPTOR Descriptor
)
82 KSEVENT_ITEM_IRP_STORAGE(Irp
) = (PKSEVENT_ITEM
)Descriptor
;
86 return KsDisableEvent(Irp
, Descriptor
->EventList
, KSEVENTS_SPINLOCK
, (PVOID
)Descriptor
->EventListLock
);
90 PcHandleGuidNullRequest(
92 IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
)
94 PPCNODE_DESCRIPTOR Node
;
95 PPCPROPERTY_ITEM PropertyItem
;
96 PIO_STACK_LOCATION IoStack
;
99 ULONG Count
= 0, SubIndex
, Index
;
101 // get current irp stack location
102 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
106 Property
= (PKSP_NODE
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
108 if (Property
->NodeId
>= SubDeviceDescriptor
->DeviceDescriptor
->NodeCount
)
110 // request is out of bounds
111 Irp
->IoStatus
.Information
= 0;
112 return STATUS_INVALID_PARAMETER
;
115 Node
= (PPCNODE_DESCRIPTOR
)((ULONG_PTR
)SubDeviceDescriptor
->DeviceDescriptor
->Nodes
+ (Property
->NodeId
* SubDeviceDescriptor
->DeviceDescriptor
->NodeSize
));
117 if (!Node
->AutomationTable
)
119 // request is out of bounds
120 Irp
->IoStatus
.Information
= 0;
121 return STATUS_INVALID_PARAMETER
;
124 PC_ASSERT(Node
->AutomationTable
);
125 PC_ASSERT(Node
->AutomationTable
->PropertyCount
);
126 PC_ASSERT(Node
->AutomationTable
->PropertyItemSize
);
128 Buffer
= (LPGUID
)AllocateItem(NonPagedPool
, sizeof (GUID
) * Node
->AutomationTable
->PropertyCount
, TAG_PORTCLASS
);
130 return STATUS_INSUFFICIENT_RESOURCES
;
132 PropertyItem
= (PCPROPERTY_ITEM
*)Node
->AutomationTable
->Properties
;
133 for (Index
= 0; Index
< Node
->AutomationTable
->PropertyCount
; Index
++)
136 for (SubIndex
= 0; SubIndex
< Count
; SubIndex
++)
138 if (IsEqualGUIDAligned(Buffer
[SubIndex
], *PropertyItem
->Set
))
146 RtlMoveMemory(&Buffer
[Count
], PropertyItem
->Set
, sizeof (GUID
));
149 PropertyItem
= (PPCPROPERTY_ITEM
)((ULONG_PTR
)PropertyItem
+ Node
->AutomationTable
->PropertyItemSize
);
152 // store result length
153 Irp
->IoStatus
.Information
= sizeof (GUID
) * Count
;
154 if (IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
< sizeof (GUID
) * Count
)
157 FreeItem(Buffer
, TAG_PORTCLASS
);
158 return STATUS_MORE_ENTRIES
;
161 RtlMoveMemory(Irp
->UserBuffer
, Buffer
, sizeof (GUID
) * Count
);
162 FreeItem(Buffer
, TAG_PORTCLASS
);
163 return STATUS_SUCCESS
;
167 PcFindNodePropertyHandler(
169 PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
,
170 OUT PPCPROPERTY_ITEM
* OutPropertyItem
)
172 PPCNODE_DESCRIPTOR Node
;
173 PPCPROPERTY_ITEM PropertyItem
;
174 PIO_STACK_LOCATION IoStack
;
178 // get current irp stack location
179 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
182 Property
= (PKSP_NODE
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
184 if (Property
->NodeId
>= SubDeviceDescriptor
->DeviceDescriptor
->NodeCount
)
186 // request is out of bounds
187 DPRINT("InvalidIndex %u %u\n", Property
->NodeId
, SubDeviceDescriptor
->DeviceDescriptor
->NodeCount
);
188 return STATUS_INVALID_PARAMETER
;
191 Node
= (PPCNODE_DESCRIPTOR
)((ULONG_PTR
)SubDeviceDescriptor
->DeviceDescriptor
->Nodes
+ (Property
->NodeId
* SubDeviceDescriptor
->DeviceDescriptor
->NodeSize
));
193 if (!Node
->AutomationTable
)
195 // request is out of bounds
196 Irp
->IoStatus
.Information
= 0;
197 return STATUS_NOT_FOUND
;
201 PC_ASSERT(Node
->AutomationTable
);
202 PC_ASSERT(Node
->AutomationTable
->PropertyCount
);
203 PC_ASSERT(Node
->AutomationTable
->PropertyItemSize
);
205 PropertyItem
= (PCPROPERTY_ITEM
*)Node
->AutomationTable
->Properties
;
207 DPRINT("NodeId %u PropertyCount %u\n", Property
->NodeId
, Node
->AutomationTable
->PropertyCount
);
208 for(Index
= 0; Index
< Node
->AutomationTable
->PropertyCount
; Index
++)
210 if (IsEqualGUIDAligned(*PropertyItem
->Set
, Property
->Property
.Set
) && PropertyItem
->Id
== Property
->Property
.Id
)
212 //found property handler
213 *OutPropertyItem
= PropertyItem
;
214 return STATUS_SUCCESS
;
216 PropertyItem
= (PPCPROPERTY_ITEM
)((ULONG_PTR
)PropertyItem
+ Node
->AutomationTable
->PropertyItemSize
);
219 // no handler yet found
220 DPRINT("NotFound\n");
221 return STATUS_NOT_FOUND
;
225 PcNodeBasicSupportHandler(
227 PPCPROPERTY_ITEM PropertyItem
)
230 PIO_STACK_LOCATION IoStack
;
231 PKSPROPERTY_DESCRIPTION Description
;
234 // get current irp stack location
235 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
238 Property
= (PKSP_NODE
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
240 PC_ASSERT(IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
>= sizeof(ULONG
));
241 Flags
= (PULONG
)Irp
->UserBuffer
;
246 if (PropertyItem
->Flags
& KSPROPERTY_TYPE_SET
)
247 *Flags
|= KSPROPERTY_TYPE_SET
;
249 if (PropertyItem
->Flags
& KSPROPERTY_TYPE_GET
)
250 *Flags
|= KSPROPERTY_TYPE_GET
;
252 // store result length
253 Irp
->IoStatus
.Information
= sizeof(ULONG
);
255 if (IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
>= sizeof(KSPROPERTY_DESCRIPTION
))
258 Description
= (PKSPROPERTY_DESCRIPTION
)Irp
->UserBuffer
;
261 Description
->DescriptionSize
= sizeof(KSPROPERTY_DESCRIPTION
);
262 Description
->PropTypeSet
.Set
= KSPROPTYPESETID_General
;
263 Description
->PropTypeSet
.Id
= 0;
264 Description
->PropTypeSet
.Flags
= 0;
265 Description
->MembersListCount
= 0;
266 Description
->Reserved
= 0;
268 Irp
->IoStatus
.Information
= sizeof(KSPROPERTY_DESCRIPTION
);
270 return STATUS_SUCCESS
;
275 PcHandleNodePropertyRequest(
277 IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
)
279 PIO_STACK_LOCATION IoStack
;
280 PPCPROPERTY_ITEM PropertyItem
;
281 PPCPROPERTY_REQUEST PropertyRequest
;
285 // get current irp stack location
286 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
288 if (IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(KSP_NODE
))
290 // certainly not a node property request
291 return STATUS_NOT_FOUND
;
295 Property
= (PKSP_NODE
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
297 if (IsEqualGUIDAligned(Property
->Property
.Set
, GUID_NULL
) && Property
->Property
.Id
== 0 && Property
->Property
.Flags
== (KSPROPERTY_TYPE_SETSUPPORT
| KSPROPERTY_TYPE_TOPOLOGY
))
299 return PcHandleGuidNullRequest(Irp
, SubDeviceDescriptor
);
302 // find property handler
303 Status
= PcFindNodePropertyHandler(Irp
, SubDeviceDescriptor
, &PropertyItem
);
306 if (!NT_SUCCESS(Status
))
308 // might not be a node property request
309 DPRINT("NotFound\n");
310 return STATUS_NOT_FOUND
;
313 if (Property
->Property
.Flags
& KSPROPERTY_TYPE_BASICSUPPORT
)
315 // caller issued a basic property request
316 if (!(PropertyItem
->Flags
& KSPROPERTY_TYPE_BASICSUPPORT
))
318 // driver does not have a basic support handler
319 return PcNodeBasicSupportHandler(Irp
, PropertyItem
);
324 PC_ASSERT(SubDeviceDescriptor
->UnknownMiniport
);
326 // allocate a property request
327 PropertyRequest
= (PPCPROPERTY_REQUEST
)AllocateItem(NonPagedPool
, sizeof(PCPROPERTY_REQUEST
), TAG_PORTCLASS
);
328 if (!PropertyRequest
)
329 return STATUS_INSUFFICIENT_RESOURCES
;
331 // initialize property request
332 PropertyRequest
->MajorTarget
= SubDeviceDescriptor
->UnknownMiniport
;
333 PropertyRequest
->MinorTarget
= SubDeviceDescriptor
->UnknownStream
;
334 PropertyRequest
->Irp
= Irp
;
335 PropertyRequest
->Node
= Property
->NodeId
;
336 PropertyRequest
->PropertyItem
= PropertyItem
;
337 PropertyRequest
->Verb
= Property
->Property
.Flags
;
338 PropertyRequest
->InstanceSize
= IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
- sizeof(KSNODEPROPERTY
);
339 PropertyRequest
->Instance
= (PVOID
)((ULONG_PTR
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
+ sizeof(KSNODEPROPERTY
));
340 PropertyRequest
->ValueSize
= IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
;
341 PropertyRequest
->Value
= Irp
->UserBuffer
;
343 Status
= PropertyItem
->Handler(PropertyRequest
);
345 if (Status
!= STATUS_PENDING
)
348 Irp
->IoStatus
.Information
= PropertyRequest
->ValueSize
;
349 FreeItem(PropertyRequest
, TAG_PORTCLASS
);
353 DPRINT("Status %x\n", Status
);
359 PcHandlePropertyWithTable(
361 IN ULONG PropertySetCount
,
362 IN PKSPROPERTY_SET PropertySet
,
363 IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
)
367 // try handle it as node property request
368 Status
= PcHandleNodePropertyRequest(Irp
, SubDeviceDescriptor
);
370 if (Status
== STATUS_NOT_FOUND
)
372 // store device descriptor
373 KSPROPERTY_ITEM_IRP_STORAGE(Irp
) = (PKSPROPERTY_ITEM
)SubDeviceDescriptor
;
375 /* then try KsPropertyHandler */
376 Status
= KsPropertyHandler(Irp
, PropertySetCount
, PropertySet
);
384 PcAcquireFormatResources(
405 return STATUS_NOT_IMPLEMENTED
;
409 PcAddToPropertyTable(
417 return STATUS_NOT_IMPLEMENTED
;
428 return STATUS_NOT_IMPLEMENTED
;
432 DumpFilterDescriptor(
433 IN PPCFILTER_DESCRIPTOR FilterDescription
)
435 ULONG Index
, SubIndex
;
436 PPCPROPERTY_ITEM PropertyItem
;
437 PPCEVENT_ITEM EventItem
;
438 PPCNODE_DESCRIPTOR NodeDescriptor
;
439 UNICODE_STRING GuidString
;
443 DPRINT("======================\n");
444 DPRINT("Descriptor Automation Table %p\n",FilterDescription
->AutomationTable
);
446 if (FilterDescription
->AutomationTable
)
448 DPRINT("FilterPropertiesCount %u FilterPropertySize %u Expected %u Events %u EventItemSize %u expected %u\n", FilterDescription
->AutomationTable
->PropertyCount
, FilterDescription
->AutomationTable
->PropertyItemSize
, sizeof(PCPROPERTY_ITEM
),
449 FilterDescription
->AutomationTable
->EventCount
, FilterDescription
->AutomationTable
->EventItemSize
, sizeof(PCEVENT_ITEM
));
450 if (FilterDescription
->AutomationTable
->PropertyCount
)
452 PropertyItem
= (PPCPROPERTY_ITEM
)FilterDescription
->AutomationTable
->Properties
;
454 for(Index
= 0; Index
< FilterDescription
->AutomationTable
->PropertyCount
; Index
++)
456 RtlStringFromGUID(*PropertyItem
->Set
, &GuidString
);
457 DPRINT("Property Index %u GUID %S Id %u Flags %x\n", Index
, GuidString
.Buffer
, PropertyItem
->Id
, PropertyItem
->Flags
);
459 PropertyItem
= (PPCPROPERTY_ITEM
)((ULONG_PTR
)PropertyItem
+ FilterDescription
->AutomationTable
->PropertyItemSize
);
462 EventItem
= (PPCEVENT_ITEM
)FilterDescription
->AutomationTable
->Events
;
463 for(Index
= 0; Index
< FilterDescription
->AutomationTable
->EventCount
; Index
++)
465 RtlStringFromGUID(*EventItem
->Set
, &GuidString
);
466 DPRINT("EventIndex %u GUID %S Id %u Flags %x\n", Index
, GuidString
.Buffer
, EventItem
->Id
, EventItem
->Flags
);
468 EventItem
= (PPCEVENT_ITEM
)((ULONG_PTR
)EventItem
+ FilterDescription
->AutomationTable
->EventItemSize
);
474 if (FilterDescription
->Nodes
)
476 DPRINT("NodeCount %u NodeSize %u expected %u\n", FilterDescription
->NodeCount
, FilterDescription
->NodeSize
, sizeof(PCNODE_DESCRIPTOR
));
477 NodeDescriptor
= (PPCNODE_DESCRIPTOR
)FilterDescription
->Nodes
;
478 for(Index
= 0; Index
< FilterDescription
->NodeCount
; Index
++)
480 DPRINT("Index %u AutomationTable %p\n", Index
, NodeDescriptor
->AutomationTable
);
482 if (NodeDescriptor
->AutomationTable
)
484 DPRINT(" Index %u EventCount %u\n", Index
, NodeDescriptor
->AutomationTable
->EventCount
);
485 EventItem
= (PPCEVENT_ITEM
)NodeDescriptor
->AutomationTable
->Events
;
486 for(SubIndex
= 0; SubIndex
< NodeDescriptor
->AutomationTable
->EventCount
; SubIndex
++)
488 RtlStringFromGUID(*EventItem
->Set
, &GuidString
);
489 DPRINT(" EventIndex %u GUID %S Id %u Flags %x\n", SubIndex
, GuidString
.Buffer
, EventItem
->Id
, EventItem
->Flags
);
491 EventItem
= (PPCEVENT_ITEM
)((ULONG_PTR
)EventItem
+ NodeDescriptor
->AutomationTable
->EventItemSize
);
497 NodeDescriptor
= (PPCNODE_DESCRIPTOR
)((ULONG_PTR
)NodeDescriptor
+ FilterDescription
->NodeSize
);
504 DPRINT("ConnectionCount: %lu\n", FilterDescription
->ConnectionCount
);
506 if (FilterDescription
->ConnectionCount
)
508 DPRINT("------ Start of Nodes Connections ----------------\n");
509 for(Index
= 0; Index
< FilterDescription
->ConnectionCount
; Index
++)
511 DPRINT1("Index %ld FromPin %ld FromNode %ld -> ToPin %ld ToNode %ld\n", Index
,
512 FilterDescription
->Connections
[Index
].FromNodePin
,
513 FilterDescription
->Connections
[Index
].FromNode
,
514 FilterDescription
->Connections
[Index
].ToNodePin
,
515 FilterDescription
->Connections
[Index
].ToNode
);
517 DPRINT("------ End of Nodes Connections----------------\n");
520 DPRINT1("======================\n");
525 PcCreateSubdeviceDescriptor(
526 OUT SUBDEVICE_DESCRIPTOR
** OutSubdeviceDescriptor
,
527 IN ULONG InterfaceCount
,
528 IN GUID
* InterfaceGuids
,
529 IN ULONG IdentifierCount
,
530 IN KSIDENTIFIER
*Identifier
,
531 IN ULONG FilterPropertiesCount
,
532 IN KSPROPERTY_SET
* FilterProperties
,
535 IN ULONG PinPropertiesCount
,
536 IN KSPROPERTY_SET
* PinProperties
,
537 IN ULONG EventSetCount
,
538 IN KSEVENT_SET
* EventSet
,
539 IN PPCFILTER_DESCRIPTOR FilterDescription
)
541 SUBDEVICE_DESCRIPTOR
* Descriptor
;
543 NTSTATUS Status
= STATUS_INSUFFICIENT_RESOURCES
;
544 PPCPIN_DESCRIPTOR SrcDescriptor
;
546 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(SUBDEVICE_DESCRIPTOR
), TAG_PORTCLASS
);
548 return STATUS_INSUFFICIENT_RESOURCES
;
550 // initialize physical / symbolic link connection list
551 InitializeListHead(&Descriptor
->SymbolicLinkList
);
552 InitializeListHead(&Descriptor
->PhysicalConnectionList
);
554 Descriptor
->Interfaces
= (GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * InterfaceCount
, TAG_PORTCLASS
);
555 if (!Descriptor
->Interfaces
)
558 // copy interface guids
559 RtlCopyMemory(Descriptor
->Interfaces
, InterfaceGuids
, sizeof(GUID
) * InterfaceCount
);
560 Descriptor
->InterfaceCount
= InterfaceCount
;
562 if (FilterPropertiesCount
)
565 /// handle driver properties
567 DumpFilterDescriptor(FilterDescription
);
569 Descriptor
->FilterPropertySet
= (PKSPROPERTY_SET
)AllocateItem(NonPagedPool
, sizeof(KSPROPERTY_SET
) * FilterPropertiesCount
, TAG_PORTCLASS
);
570 if (! Descriptor
->FilterPropertySet
)
573 Descriptor
->FilterPropertySetCount
= FilterPropertiesCount
;
574 for(Index
= 0; Index
< FilterPropertiesCount
; Index
++)
576 RtlMoveMemory(&Descriptor
->FilterPropertySet
[Index
], &FilterProperties
[Index
], sizeof(KSPROPERTY_SET
));
580 Descriptor
->Topology
= (PKSTOPOLOGY
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY
), TAG_PORTCLASS
);
581 if (!Descriptor
->Topology
)
584 if (FilterDescription
->ConnectionCount
)
586 Descriptor
->Topology
->TopologyConnections
= (PKSTOPOLOGY_CONNECTION
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY_CONNECTION
) * FilterDescription
->ConnectionCount
, TAG_PORTCLASS
);
587 if (!Descriptor
->Topology
->TopologyConnections
)
590 RtlMoveMemory((PVOID
)Descriptor
->Topology
->TopologyConnections
, FilterDescription
->Connections
, FilterDescription
->ConnectionCount
* sizeof(PCCONNECTION_DESCRIPTOR
));
591 Descriptor
->Topology
->TopologyConnectionsCount
= FilterDescription
->ConnectionCount
;
594 if (FilterDescription
->NodeCount
)
596 Descriptor
->Topology
->TopologyNodes
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
597 if (!Descriptor
->Topology
->TopologyNodes
)
600 Descriptor
->Topology
->TopologyNodesNames
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
601 if (!Descriptor
->Topology
->TopologyNodesNames
)
604 for(Index
= 0; Index
< FilterDescription
->NodeCount
; Index
++)
606 if (FilterDescription
->Nodes
[Index
].Type
)
608 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodes
[Index
], FilterDescription
->Nodes
[Index
].Type
, sizeof(GUID
));
610 if (FilterDescription
->Nodes
[Index
].Name
)
612 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodesNames
[Index
], FilterDescription
->Nodes
[Index
].Name
, sizeof(GUID
));
615 Descriptor
->Topology
->TopologyNodesCount
= FilterDescription
->NodeCount
;
618 if (FilterDescription
->PinCount
)
620 Descriptor
->Factory
.KsPinDescriptor
= (PKSPIN_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(KSPIN_DESCRIPTOR
) * FilterDescription
->PinCount
, TAG_PORTCLASS
);
621 if (!Descriptor
->Factory
.KsPinDescriptor
)
624 Descriptor
->Factory
.Instances
= (PPIN_INSTANCE_INFO
)AllocateItem(NonPagedPool
, FilterDescription
->PinCount
* sizeof(PIN_INSTANCE_INFO
), TAG_PORTCLASS
);
625 if (!Descriptor
->Factory
.Instances
)
628 Descriptor
->Factory
.PinDescriptorCount
= FilterDescription
->PinCount
;
629 Descriptor
->Factory
.PinDescriptorSize
= sizeof(KSPIN_DESCRIPTOR
);
631 SrcDescriptor
= (PPCPIN_DESCRIPTOR
)FilterDescription
->Pins
;
632 DPRINT("Size %u Expected %u\n", FilterDescription
->PinSize
, sizeof(PCPIN_DESCRIPTOR
));
634 // copy pin factories
635 for(Index
= 0; Index
< FilterDescription
->PinCount
; Index
++)
637 RtlMoveMemory(&Descriptor
->Factory
.KsPinDescriptor
[Index
], &SrcDescriptor
->KsPinDescriptor
, sizeof(KSPIN_DESCRIPTOR
));
639 Descriptor
->Factory
.KsPinDescriptor
[Index
].Interfaces
= PinInterfaces
;
640 Descriptor
->Factory
.KsPinDescriptor
[Index
].InterfacesCount
= sizeof(PinInterfaces
) / sizeof(KSPIN_INTERFACE
);
642 DPRINT("Index %u DataRangeCount %u\n", Index
, SrcDescriptor
->KsPinDescriptor
.DataRangesCount
);
644 Descriptor
->Factory
.Instances
[Index
].CurrentPinInstanceCount
= 0;
645 Descriptor
->Factory
.Instances
[Index
].MaxFilterInstanceCount
= SrcDescriptor
->MaxFilterInstanceCount
;
646 Descriptor
->Factory
.Instances
[Index
].MaxGlobalInstanceCount
= SrcDescriptor
->MaxGlobalInstanceCount
;
647 Descriptor
->Factory
.Instances
[Index
].MinFilterInstanceCount
= SrcDescriptor
->MinFilterInstanceCount
;
648 SrcDescriptor
= (PPCPIN_DESCRIPTOR
)((ULONG_PTR
)SrcDescriptor
+ FilterDescription
->PinSize
);
652 Descriptor
->DeviceDescriptor
= FilterDescription
;
653 *OutSubdeviceDescriptor
= Descriptor
;
654 return STATUS_SUCCESS
;
659 if (Descriptor
->Interfaces
)
660 FreeItem(Descriptor
->Interfaces
, TAG_PORTCLASS
);
662 if (Descriptor
->Factory
.KsPinDescriptor
)
663 FreeItem(Descriptor
->Factory
.KsPinDescriptor
, TAG_PORTCLASS
);
665 FreeItem(Descriptor
, TAG_PORTCLASS
);
672 PcValidateConnectRequest(
674 IN KSPIN_FACTORY
* Factory
,
675 OUT PKSPIN_CONNECT
* Connect
)
677 return KsValidateConnectRequest(Irp
, Factory
->PinDescriptorCount
, Factory
->KsPinDescriptor
, Connect
);