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
; Index
++)
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
);
323 // allocate a property request
324 PropertyRequest
= (PPCPROPERTY_REQUEST
)AllocateItem(NonPagedPool
, sizeof(PCPROPERTY_REQUEST
), TAG_PORTCLASS
);
325 if (!PropertyRequest
)
326 return STATUS_INSUFFICIENT_RESOURCES
;
328 PropertyRequest
->MajorTarget
= SubDeviceDescriptor
->UnknownMiniport
;
329 PropertyRequest
->MinorTarget
= SubDeviceDescriptor
->UnknownStream
;
330 PropertyRequest
->Irp
= Irp
;
331 PropertyRequest
->Node
= Property
->NodeId
;
332 PropertyRequest
->PropertyItem
= PropertyItem
;
333 PropertyRequest
->Verb
= Property
->Property
.Flags
;
334 PropertyRequest
->InstanceSize
= IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
- sizeof(KSNODEPROPERTY
);
335 PropertyRequest
->Instance
= (PVOID
)((ULONG_PTR
)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
+ sizeof(KSNODEPROPERTY
));
336 PropertyRequest
->ValueSize
= IoStack
->Parameters
.DeviceIoControl
.OutputBufferLength
;
337 PropertyRequest
->Value
= Irp
->UserBuffer
;
339 Status
= PropertyItem
->Handler(PropertyRequest
);
341 if (Status
!= STATUS_PENDING
)
344 Irp
->IoStatus
.Information
= PropertyRequest
->ValueSize
;
345 ExFreePool(PropertyRequest
);
349 DPRINT("Status %x\n", Status
);
355 PcHandlePropertyWithTable(
357 IN ULONG PropertySetCount
,
358 IN PKSPROPERTY_SET PropertySet
,
359 IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
)
363 // try handle it as node property request
364 Status
= PcHandleNodePropertyRequest(Irp
, SubDeviceDescriptor
);
366 if (Status
== STATUS_NOT_FOUND
)
368 // store device descriptor
369 KSPROPERTY_ITEM_IRP_STORAGE(Irp
) = (PKSPROPERTY_ITEM
)SubDeviceDescriptor
;
371 /* then try KsPropertyHandler */
372 Status
= KsPropertyHandler(Irp
, PropertySetCount
, PropertySet
);
380 PcAcquireFormatResources(
401 return STATUS_NOT_IMPLEMENTED
;
405 PcAddToPropertyTable(
413 return STATUS_NOT_IMPLEMENTED
;
424 return STATUS_NOT_IMPLEMENTED
;
428 DumpFilterDescriptor(
429 IN PPCFILTER_DESCRIPTOR FilterDescription
)
431 ULONG Index
, SubIndex
;
432 PPCPROPERTY_ITEM PropertyItem
;
433 PPCEVENT_ITEM EventItem
;
434 PPCNODE_DESCRIPTOR NodeDescriptor
;
435 UNICODE_STRING GuidString
;
439 DPRINT1("======================\n");
440 DPRINT1("Descriptor Automation Table%p\n",FilterDescription
->AutomationTable
);
442 if (FilterDescription
->AutomationTable
)
444 DPRINT1("FilterPropertiesCount %u FilterPropertySize %u Expected %u Events %u EventItemSize %u expected %u\n", FilterDescription
->AutomationTable
->PropertyCount
, FilterDescription
->AutomationTable
->PropertyItemSize
, sizeof(PCPROPERTY_ITEM
),
445 FilterDescription
->AutomationTable
->EventCount
, FilterDescription
->AutomationTable
->EventItemSize
, sizeof(PCEVENT_ITEM
));
446 if (FilterDescription
->AutomationTable
->PropertyCount
)
448 PropertyItem
= (PPCPROPERTY_ITEM
)FilterDescription
->AutomationTable
->Properties
;
450 for(Index
= 0; Index
< FilterDescription
->AutomationTable
->PropertyCount
; Index
++)
452 RtlStringFromGUID(*PropertyItem
->Set
, &GuidString
);
453 DPRINT("Property Index %u GUID %S Id %u Flags %x\n", Index
, GuidString
.Buffer
, PropertyItem
->Id
, PropertyItem
->Flags
);
455 PropertyItem
= (PPCPROPERTY_ITEM
)((ULONG_PTR
)PropertyItem
+ FilterDescription
->AutomationTable
->PropertyItemSize
);
458 EventItem
= (PPCEVENT_ITEM
)FilterDescription
->AutomationTable
->Events
;
459 for(Index
= 0; Index
< FilterDescription
->AutomationTable
->EventCount
; Index
++)
461 RtlStringFromGUID(*EventItem
->Set
, &GuidString
);
462 DPRINT1("EventIndex %u GUID %S Id %u Flags %x\n", Index
, GuidString
.Buffer
, EventItem
->Id
, EventItem
->Flags
);
464 EventItem
= (PPCEVENT_ITEM
)((ULONG_PTR
)EventItem
+ FilterDescription
->AutomationTable
->EventItemSize
);
470 if (FilterDescription
->Nodes
)
472 DPRINT1("NodeCount %u NodeSize %u expected %u\n", FilterDescription
->NodeCount
, FilterDescription
->NodeSize
, sizeof(PCNODE_DESCRIPTOR
));
473 NodeDescriptor
= (PPCNODE_DESCRIPTOR
)FilterDescription
->Nodes
;
474 for(Index
= 0; Index
< FilterDescription
->NodeCount
; Index
++)
476 DPRINT("Index %u AutomationTable %p\n", Index
, NodeDescriptor
->AutomationTable
);
478 if (NodeDescriptor
->AutomationTable
)
480 DPRINT1("Index %u EventCount %u\n", Index
, NodeDescriptor
->AutomationTable
->EventCount
);
481 EventItem
= (PPCEVENT_ITEM
)NodeDescriptor
->AutomationTable
->Events
;
482 for(SubIndex
= 0; SubIndex
< NodeDescriptor
->AutomationTable
->EventCount
; SubIndex
++)
484 RtlStringFromGUID(*EventItem
->Set
, &GuidString
);
485 DPRINT1("EventIndex %u GUID %S Id %u Flags %x\n", Index
, GuidString
.Buffer
, EventItem
->Id
, EventItem
->Flags
);
487 EventItem
= (PPCEVENT_ITEM
)((ULONG_PTR
)EventItem
+ NodeDescriptor
->AutomationTable
->EventItemSize
);
493 NodeDescriptor
= (PPCNODE_DESCRIPTOR
)((ULONG_PTR
)NodeDescriptor
+ FilterDescription
->NodeSize
);
502 DPRINT1("======================\n");
507 PcCreateSubdeviceDescriptor(
508 OUT SUBDEVICE_DESCRIPTOR
** OutSubdeviceDescriptor
,
509 IN ULONG InterfaceCount
,
510 IN GUID
* InterfaceGuids
,
511 IN ULONG IdentifierCount
,
512 IN KSIDENTIFIER
*Identifier
,
513 IN ULONG FilterPropertiesCount
,
514 IN KSPROPERTY_SET
* FilterProperties
,
517 IN ULONG PinPropertiesCount
,
518 IN KSPROPERTY_SET
* PinProperties
,
519 IN ULONG EventSetCount
,
520 IN KSEVENT_SET
* EventSet
,
521 IN PPCFILTER_DESCRIPTOR FilterDescription
)
523 SUBDEVICE_DESCRIPTOR
* Descriptor
;
525 NTSTATUS Status
= STATUS_INSUFFICIENT_RESOURCES
;
526 PPCPIN_DESCRIPTOR SrcDescriptor
;
528 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(SUBDEVICE_DESCRIPTOR
), TAG_PORTCLASS
);
530 return STATUS_INSUFFICIENT_RESOURCES
;
532 // initialize physical / symbolic link connection list
533 InitializeListHead(&Descriptor
->SymbolicLinkList
);
534 InitializeListHead(&Descriptor
->PhysicalConnectionList
);
536 Descriptor
->Interfaces
= (GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * InterfaceCount
, TAG_PORTCLASS
);
537 if (!Descriptor
->Interfaces
)
540 // copy interface guids
541 RtlCopyMemory(Descriptor
->Interfaces
, InterfaceGuids
, sizeof(GUID
) * InterfaceCount
);
542 Descriptor
->InterfaceCount
= InterfaceCount
;
544 if (FilterPropertiesCount
)
547 /// handle driver properties
549 //DumpFilterDescriptor(FilterDescription);
551 Descriptor
->FilterPropertySet
= (PKSPROPERTY_SET
)AllocateItem(NonPagedPool
, sizeof(KSPROPERTY_SET
) * FilterPropertiesCount
, TAG_PORTCLASS
);
552 if (! Descriptor
->FilterPropertySet
)
555 Descriptor
->FilterPropertySetCount
= FilterPropertiesCount
;
556 for(Index
= 0; Index
< FilterPropertiesCount
; Index
++)
558 RtlMoveMemory(&Descriptor
->FilterPropertySet
[Index
], &FilterProperties
[Index
], sizeof(KSPROPERTY_SET
));
562 Descriptor
->Topology
= (PKSTOPOLOGY
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY
), TAG_PORTCLASS
);
563 if (!Descriptor
->Topology
)
566 if (FilterDescription
->ConnectionCount
)
568 Descriptor
->Topology
->TopologyConnections
= (PKSTOPOLOGY_CONNECTION
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY_CONNECTION
) * FilterDescription
->ConnectionCount
, TAG_PORTCLASS
);
569 if (!Descriptor
->Topology
->TopologyConnections
)
572 RtlMoveMemory((PVOID
)Descriptor
->Topology
->TopologyConnections
, FilterDescription
->Connections
, FilterDescription
->ConnectionCount
* sizeof(PCCONNECTION_DESCRIPTOR
));
573 Descriptor
->Topology
->TopologyConnectionsCount
= FilterDescription
->ConnectionCount
;
576 if (FilterDescription
->NodeCount
)
578 Descriptor
->Topology
->TopologyNodes
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
579 if (!Descriptor
->Topology
->TopologyNodes
)
582 Descriptor
->Topology
->TopologyNodesNames
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
583 if (!Descriptor
->Topology
->TopologyNodesNames
)
586 for(Index
= 0; Index
< FilterDescription
->NodeCount
; Index
++)
588 if (FilterDescription
->Nodes
[Index
].Type
)
590 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodes
[Index
], FilterDescription
->Nodes
[Index
].Type
, sizeof(GUID
));
592 if (FilterDescription
->Nodes
[Index
].Name
)
594 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodesNames
[Index
], FilterDescription
->Nodes
[Index
].Name
, sizeof(GUID
));
597 Descriptor
->Topology
->TopologyNodesCount
= FilterDescription
->NodeCount
;
600 if (FilterDescription
->PinCount
)
602 Descriptor
->Factory
.KsPinDescriptor
= (PKSPIN_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(KSPIN_DESCRIPTOR
) * FilterDescription
->PinCount
, TAG_PORTCLASS
);
603 if (!Descriptor
->Factory
.KsPinDescriptor
)
606 Descriptor
->Factory
.Instances
= (PPIN_INSTANCE_INFO
)AllocateItem(NonPagedPool
, FilterDescription
->PinCount
* sizeof(PIN_INSTANCE_INFO
), TAG_PORTCLASS
);
607 if (!Descriptor
->Factory
.Instances
)
610 Descriptor
->Factory
.PinDescriptorCount
= FilterDescription
->PinCount
;
611 Descriptor
->Factory
.PinDescriptorSize
= sizeof(KSPIN_DESCRIPTOR
);
613 SrcDescriptor
= (PPCPIN_DESCRIPTOR
)FilterDescription
->Pins
;
614 DPRINT("Size %u Expected %u Ex Size %u\n", FilterDescription
->PinSize
, sizeof(KSPIN_DESCRIPTOR
), sizeof(KSPIN_DESCRIPTOR_EX
));
616 // copy pin factories
617 for(Index
= 0; Index
< FilterDescription
->PinCount
; Index
++)
619 RtlMoveMemory(&Descriptor
->Factory
.KsPinDescriptor
[Index
], &SrcDescriptor
->KsPinDescriptor
, sizeof(KSPIN_DESCRIPTOR
));
621 Descriptor
->Factory
.KsPinDescriptor
[Index
].Interfaces
= PinInterfaces
;
622 Descriptor
->Factory
.KsPinDescriptor
[Index
].InterfacesCount
= sizeof(PinInterfaces
) / sizeof(KSPIN_INTERFACE
);
624 DPRINT("Index %u DataRangeCount %u\n", Index
, SrcDescriptor
->KsPinDescriptor
.DataRangesCount
);
626 Descriptor
->Factory
.Instances
[Index
].CurrentPinInstanceCount
= 0;
627 Descriptor
->Factory
.Instances
[Index
].MaxFilterInstanceCount
= SrcDescriptor
->MaxFilterInstanceCount
;
628 Descriptor
->Factory
.Instances
[Index
].MaxGlobalInstanceCount
= SrcDescriptor
->MaxGlobalInstanceCount
;
629 Descriptor
->Factory
.Instances
[Index
].MinFilterInstanceCount
= SrcDescriptor
->MinFilterInstanceCount
;
630 SrcDescriptor
= (PPCPIN_DESCRIPTOR
)((ULONG_PTR
)SrcDescriptor
+ FilterDescription
->PinSize
);
634 Descriptor
->DeviceDescriptor
= FilterDescription
;
635 *OutSubdeviceDescriptor
= Descriptor
;
636 return STATUS_SUCCESS
;
641 if (Descriptor
->Interfaces
)
642 FreeItem(Descriptor
->Interfaces
, TAG_PORTCLASS
);
644 if (Descriptor
->Factory
.KsPinDescriptor
)
645 FreeItem(Descriptor
->Factory
.KsPinDescriptor
, TAG_PORTCLASS
);
647 FreeItem(Descriptor
, TAG_PORTCLASS
);
654 PcValidateConnectRequest(
656 IN KSPIN_FACTORY
* Factory
,
657 OUT PKSPIN_CONNECT
* Connect
)
659 return KsValidateConnectRequest(Irp
, Factory
->PinDescriptorCount
, Factory
->KsPinDescriptor
, Connect
);