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
13 KsoDispatchCreateWithGenericFactory(
18 return STATUS_NOT_IMPLEMENTED
;
23 KsoGetIrpTargetFromFileObject(
24 PFILE_OBJECT FileObject
)
26 PC_ASSERT(FileObject
);
28 // IrpTarget is stored in FsContext
29 return (IIrpTarget
*)FileObject
->FsContext
;
34 KsoGetIrpTargetFromIrp(
37 PKSOBJECT_CREATE_ITEM CreateItem
;
39 // access the create item
40 CreateItem
= KSCREATE_ITEM_IRP_STORAGE(Irp
);
42 // IIrpTarget is stored in Context member
43 return (IIrpTarget
*)CreateItem
->Context
;
48 PcAcquireFormatResources(
69 return STATUS_NOT_IMPLEMENTED
;
81 return STATUS_NOT_IMPLEMENTED
;
92 return STATUS_NOT_IMPLEMENTED
;
97 IN OUT SUBDEVICE_DESCRIPTOR
* Descriptor
,
98 IN KSPROPERTY_SET
* FilterProperty
)
100 if (Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
>= Descriptor
->FilterPropertySet
.MaxKsPropertySetCount
)
103 return STATUS_UNSUCCESSFUL
;
106 RtlMoveMemory(&Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
],
108 sizeof(KSPROPERTY_SET
));
110 if (FilterProperty
->PropertiesCount
)
112 Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].PropertyItem
= (const KSPROPERTY_ITEM
*)AllocateItem(NonPagedPool
,
113 sizeof(KSPROPERTY_ITEM
) * FilterProperty
->PropertiesCount
,
116 if (!Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].PropertyItem
)
118 Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].PropertiesCount
= 0;
119 return STATUS_INSUFFICIENT_RESOURCES
;
121 RtlMoveMemory((PVOID
)Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].PropertyItem
,
122 FilterProperty
->PropertyItem
,
123 sizeof(KSPROPERTY_ITEM
) * FilterProperty
->PropertiesCount
);
126 Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].Set
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
), TAG_PORTCLASS
);
127 if (!Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].Set
)
128 return STATUS_INSUFFICIENT_RESOURCES
;
130 RtlCopyMemory((PVOID
)Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].Set
, FilterProperty
->Set
, sizeof(GUID
));
132 // ignore fast io table for now
133 Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].FastIoCount
= 0;
134 Descriptor
->FilterPropertySet
.Properties
[Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
].FastIoTable
= NULL
;
136 Descriptor
->FilterPropertySet
.FreeKsPropertySetOffset
++;
138 return STATUS_SUCCESS
;
143 PcCreateSubdeviceDescriptor(
144 OUT SUBDEVICE_DESCRIPTOR
** OutSubdeviceDescriptor
,
145 IN ULONG InterfaceCount
,
146 IN GUID
* InterfaceGuids
,
147 IN ULONG IdentifierCount
,
148 IN KSIDENTIFIER
*Identifier
,
149 IN ULONG FilterPropertiesCount
,
150 IN KSPROPERTY_SET
* FilterProperties
,
153 IN ULONG PinPropertiesCount
,
154 IN KSPROPERTY_SET
* PinProperties
,
155 IN ULONG EventSetCount
,
156 IN KSEVENT_SET
* EventSet
,
157 IN PPCFILTER_DESCRIPTOR FilterDescription
)
159 SUBDEVICE_DESCRIPTOR
* Descriptor
;
160 ULONG Index
, SubIndex
;
161 PKSDATARANGE DataRange
;
162 NTSTATUS Status
= STATUS_INSUFFICIENT_RESOURCES
;
163 PPCPIN_DESCRIPTOR SrcDescriptor
;
165 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(SUBDEVICE_DESCRIPTOR
), TAG_PORTCLASS
);
167 return STATUS_INSUFFICIENT_RESOURCES
;
169 // initialize physical / symbolic link connection list
170 InitializeListHead(&Descriptor
->SymbolicLinkList
);
171 InitializeListHead(&Descriptor
->PhysicalConnectionList
);
173 Descriptor
->Interfaces
= (GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * InterfaceCount
, TAG_PORTCLASS
);
174 if (!Descriptor
->Interfaces
)
177 // copy interface guids
178 RtlCopyMemory(Descriptor
->Interfaces
, InterfaceGuids
, sizeof(GUID
) * InterfaceCount
);
179 Descriptor
->InterfaceCount
= InterfaceCount
;
181 if (FilterPropertiesCount
)
184 /// handle driver properties
185 Descriptor
->FilterPropertySet
.Properties
= (PKSPROPERTY_SET
)AllocateItem(NonPagedPool
, sizeof(KSPROPERTY_SET
) * FilterPropertiesCount
, TAG_PORTCLASS
);
186 if (! Descriptor
->FilterPropertySet
.Properties
)
189 Descriptor
->FilterPropertySet
.MaxKsPropertySetCount
= FilterPropertiesCount
;
190 for(Index
= 0; Index
< FilterPropertiesCount
; Index
++)
192 Status
= AddToPropertyTable(Descriptor
, &FilterProperties
[Index
]);
193 if (!NT_SUCCESS(Status
))
198 Descriptor
->Topology
= (PKSTOPOLOGY
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY
), TAG_PORTCLASS
);
199 if (!Descriptor
->Topology
)
202 if (FilterDescription
->ConnectionCount
)
204 Descriptor
->Topology
->TopologyConnections
= (PKSTOPOLOGY_CONNECTION
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY_CONNECTION
) * FilterDescription
->ConnectionCount
, TAG_PORTCLASS
);
205 if (!Descriptor
->Topology
->TopologyConnections
)
208 RtlMoveMemory((PVOID
)Descriptor
->Topology
->TopologyConnections
, FilterDescription
->Connections
, FilterDescription
->ConnectionCount
* sizeof(PCCONNECTION_DESCRIPTOR
));
209 Descriptor
->Topology
->TopologyConnectionsCount
= FilterDescription
->ConnectionCount
;
212 if (FilterDescription
->NodeCount
)
214 Descriptor
->Topology
->TopologyNodes
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
215 if (!Descriptor
->Topology
->TopologyNodes
)
218 Descriptor
->Topology
->TopologyNodesNames
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
219 if (!Descriptor
->Topology
->TopologyNodesNames
)
222 for(Index
= 0; Index
< FilterDescription
->NodeCount
; Index
++)
224 if (FilterDescription
->Nodes
[Index
].Type
)
226 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodes
[Index
], FilterDescription
->Nodes
[Index
].Type
, sizeof(GUID
));
228 if (FilterDescription
->Nodes
[Index
].Name
)
230 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodesNames
[Index
], FilterDescription
->Nodes
[Index
].Name
, sizeof(GUID
));
233 Descriptor
->Topology
->TopologyNodesCount
= FilterDescription
->NodeCount
;
236 if (FilterDescription
->PinCount
)
238 Descriptor
->Factory
.KsPinDescriptor
= (PKSPIN_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(KSPIN_DESCRIPTOR
) * FilterDescription
->PinCount
, TAG_PORTCLASS
);
239 if (!Descriptor
->Factory
.KsPinDescriptor
)
242 Descriptor
->Factory
.Instances
= (PPIN_INSTANCE_INFO
)AllocateItem(NonPagedPool
, FilterDescription
->PinCount
* sizeof(PIN_INSTANCE_INFO
), TAG_PORTCLASS
);
243 if (!Descriptor
->Factory
.Instances
)
246 Descriptor
->Factory
.PinDescriptorCount
= FilterDescription
->PinCount
;
247 Descriptor
->Factory
.PinDescriptorSize
= sizeof(KSPIN_DESCRIPTOR
);
249 SrcDescriptor
= (PPCPIN_DESCRIPTOR
)FilterDescription
->Pins
;
250 DPRINT("Size %u Expected %u Ex Size %u\n", FilterDescription
->PinSize
, sizeof(KSPIN_DESCRIPTOR
), sizeof(KSPIN_DESCRIPTOR_EX
));
252 // copy pin factories
253 for(Index
= 0; Index
< FilterDescription
->PinCount
; Index
++)
255 RtlMoveMemory(&Descriptor
->Factory
.KsPinDescriptor
[Index
], &SrcDescriptor
->KsPinDescriptor
, sizeof(KSPIN_DESCRIPTOR
));
257 if (SrcDescriptor
->KsPinDescriptor
.DataRangesCount
)
259 Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRanges
= (const PKSDATARANGE
*)AllocateItem(NonPagedPool
, SrcDescriptor
->KsPinDescriptor
.DataRangesCount
* sizeof(PKSDATARANGE
), TAG_PORTCLASS
);
260 if(!Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRanges
)
263 for (SubIndex
= 0; SubIndex
< FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRangesCount
; SubIndex
++)
265 DataRange
= (PKSDATARANGE
)AllocateItem(NonPagedPool
, SrcDescriptor
->KsPinDescriptor
.DataRanges
[SubIndex
]->FormatSize
, TAG_PORTCLASS
);
269 RtlMoveMemory(DataRange
,
270 SrcDescriptor
->KsPinDescriptor
.DataRanges
[SubIndex
],
271 SrcDescriptor
->KsPinDescriptor
.DataRanges
[SubIndex
]->FormatSize
);
273 ((PKSDATAFORMAT
*)Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRanges
)[SubIndex
] = DataRange
;
277 Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRangesCount
= SrcDescriptor
->KsPinDescriptor
.DataRangesCount
;
280 Descriptor
->Factory
.Instances
[Index
].CurrentPinInstanceCount
= 0;
281 Descriptor
->Factory
.Instances
[Index
].MaxFilterInstanceCount
= FilterDescription
->Pins
[Index
].MaxFilterInstanceCount
;
282 Descriptor
->Factory
.Instances
[Index
].MaxGlobalInstanceCount
= FilterDescription
->Pins
[Index
].MaxGlobalInstanceCount
;
283 Descriptor
->Factory
.Instances
[Index
].MinFilterInstanceCount
= FilterDescription
->Pins
[Index
].MinFilterInstanceCount
;
284 SrcDescriptor
= (PPCPIN_DESCRIPTOR
)((ULONG_PTR
)SrcDescriptor
+ FilterDescription
->PinSize
);
287 Descriptor
->DeviceDescriptor
= FilterDescription
;
288 *OutSubdeviceDescriptor
= Descriptor
;
289 return STATUS_SUCCESS
;
294 if (Descriptor
->Interfaces
)
295 FreeItem(Descriptor
->Interfaces
, TAG_PORTCLASS
);
297 if (Descriptor
->Factory
.KsPinDescriptor
)
298 FreeItem(Descriptor
->Factory
.KsPinDescriptor
, TAG_PORTCLASS
);
300 FreeItem(Descriptor
, TAG_PORTCLASS
);
307 PcValidateConnectRequest(
309 IN KSPIN_FACTORY
* Factory
,
310 OUT PKSPIN_CONNECT
* Connect
)
312 return KsValidateConnectRequest(Irp
, Factory
->PinDescriptorCount
, Factory
->KsPinDescriptor
, Connect
);