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
;
164 Descriptor
= (PSUBDEVICE_DESCRIPTOR
)AllocateItem(NonPagedPool
, sizeof(SUBDEVICE_DESCRIPTOR
), TAG_PORTCLASS
);
166 return STATUS_INSUFFICIENT_RESOURCES
;
168 // initialize physical / symbolic link connection list
169 InitializeListHead(&Descriptor
->SymbolicLinkList
);
170 InitializeListHead(&Descriptor
->PhysicalConnectionList
);
172 Descriptor
->Interfaces
= (GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * InterfaceCount
, TAG_PORTCLASS
);
173 if (!Descriptor
->Interfaces
)
176 // copy interface guids
177 RtlCopyMemory(Descriptor
->Interfaces
, InterfaceGuids
, sizeof(GUID
) * InterfaceCount
);
178 Descriptor
->InterfaceCount
= InterfaceCount
;
180 if (FilterPropertiesCount
)
183 /// handle driver properties
184 Descriptor
->FilterPropertySet
.Properties
= (PKSPROPERTY_SET
)AllocateItem(NonPagedPool
, sizeof(KSPROPERTY_SET
) * FilterPropertiesCount
, TAG_PORTCLASS
);
185 if (! Descriptor
->FilterPropertySet
.Properties
)
188 Descriptor
->FilterPropertySet
.MaxKsPropertySetCount
= FilterPropertiesCount
;
189 for(Index
= 0; Index
< FilterPropertiesCount
; Index
++)
191 Status
= AddToPropertyTable(Descriptor
, &FilterProperties
[Index
]);
192 if (!NT_SUCCESS(Status
))
197 Descriptor
->Topology
= (PKSTOPOLOGY
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY
), TAG_PORTCLASS
);
198 if (!Descriptor
->Topology
)
201 if (FilterDescription
->ConnectionCount
)
203 Descriptor
->Topology
->TopologyConnections
= (PKSTOPOLOGY_CONNECTION
)AllocateItem(NonPagedPool
, sizeof(KSTOPOLOGY_CONNECTION
) * FilterDescription
->ConnectionCount
, TAG_PORTCLASS
);
204 if (!Descriptor
->Topology
->TopologyConnections
)
207 RtlMoveMemory((PVOID
)Descriptor
->Topology
->TopologyConnections
, FilterDescription
->Connections
, FilterDescription
->ConnectionCount
* sizeof(PCCONNECTION_DESCRIPTOR
));
208 Descriptor
->Topology
->TopologyConnectionsCount
= FilterDescription
->ConnectionCount
;
211 if (FilterDescription
->NodeCount
)
213 Descriptor
->Topology
->TopologyNodes
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
214 if (!Descriptor
->Topology
->TopologyNodes
)
217 Descriptor
->Topology
->TopologyNodesNames
= (const GUID
*)AllocateItem(NonPagedPool
, sizeof(GUID
) * FilterDescription
->NodeCount
, TAG_PORTCLASS
);
218 if (!Descriptor
->Topology
->TopologyNodesNames
)
221 for(Index
= 0; Index
< FilterDescription
->NodeCount
; Index
++)
223 if (FilterDescription
->Nodes
[Index
].Type
)
225 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodes
[Index
], FilterDescription
->Nodes
[Index
].Type
, sizeof(GUID
));
227 if (FilterDescription
->Nodes
[Index
].Name
)
229 RtlMoveMemory((PVOID
)&Descriptor
->Topology
->TopologyNodesNames
[Index
], FilterDescription
->Nodes
[Index
].Name
, sizeof(GUID
));
232 Descriptor
->Topology
->TopologyNodesCount
= FilterDescription
->NodeCount
;
235 if (FilterDescription
->PinCount
)
237 Descriptor
->Factory
.KsPinDescriptor
= (PKSPIN_DESCRIPTOR
)AllocateItem(NonPagedPool
, FilterDescription
->PinSize
* FilterDescription
->PinCount
, TAG_PORTCLASS
);
238 if (!Descriptor
->Factory
.KsPinDescriptor
)
241 Descriptor
->Factory
.Instances
= (PPIN_INSTANCE_INFO
)AllocateItem(NonPagedPool
, FilterDescription
->PinCount
* sizeof(PIN_INSTANCE_INFO
), TAG_PORTCLASS
);
242 if (!Descriptor
->Factory
.Instances
)
245 Descriptor
->Factory
.PinDescriptorCount
= FilterDescription
->PinCount
;
246 Descriptor
->Factory
.PinDescriptorSize
= FilterDescription
->PinSize
;
248 // copy pin factories
249 for(Index
= 0; Index
< FilterDescription
->PinCount
; Index
++)
251 RtlMoveMemory(&Descriptor
->Factory
.KsPinDescriptor
[Index
], &FilterDescription
->Pins
[Index
].KsPinDescriptor
, FilterDescription
->PinSize
);
253 if (FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRangesCount
)
255 Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRanges
= (const PKSDATARANGE
*)AllocateItem(NonPagedPool
, FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRangesCount
* sizeof(PKSDATARANGE
), TAG_PORTCLASS
);
256 if(!Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRanges
)
259 for (SubIndex
= 0; SubIndex
< FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRangesCount
; SubIndex
++)
261 DataRange
= (PKSDATARANGE
)AllocateItem(NonPagedPool
, FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRanges
[SubIndex
]->FormatSize
, TAG_PORTCLASS
);
265 RtlMoveMemory(DataRange
,
266 FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRanges
[SubIndex
],
267 FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRanges
[SubIndex
]->FormatSize
);
269 ((PKSDATAFORMAT
*)Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRanges
)[SubIndex
] = DataRange
;
273 Descriptor
->Factory
.KsPinDescriptor
[Index
].DataRangesCount
= FilterDescription
->Pins
[Index
].KsPinDescriptor
.DataRangesCount
;
276 Descriptor
->Factory
.Instances
[Index
].CurrentPinInstanceCount
= 0;
277 Descriptor
->Factory
.Instances
[Index
].MaxFilterInstanceCount
= FilterDescription
->Pins
[Index
].MaxFilterInstanceCount
;
278 Descriptor
->Factory
.Instances
[Index
].MaxGlobalInstanceCount
= FilterDescription
->Pins
[Index
].MaxGlobalInstanceCount
;
279 Descriptor
->Factory
.Instances
[Index
].MinFilterInstanceCount
= FilterDescription
->Pins
[Index
].MinFilterInstanceCount
;
282 Descriptor
->DeviceDescriptor
= FilterDescription
;
283 *OutSubdeviceDescriptor
= Descriptor
;
284 return STATUS_SUCCESS
;
289 if (Descriptor
->Interfaces
)
290 FreeItem(Descriptor
->Interfaces
, TAG_PORTCLASS
);
292 if (Descriptor
->Factory
.KsPinDescriptor
)
293 FreeItem(Descriptor
->Factory
.KsPinDescriptor
, TAG_PORTCLASS
);
295 FreeItem(Descriptor
, TAG_PORTCLASS
);
302 PcValidateConnectRequest(
304 IN KSPIN_FACTORY
* Factory
,
305 OUT PKSPIN_CONNECT
* Connect
)
307 return KsValidateConnectRequest(Irp
, Factory
->PinDescriptorCount
, Factory
->KsPinDescriptor
, Connect
);