- Implement dynamic unregistration of physical connections
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / private.h
1 /*
2 PortCls FDO Extension
3
4 by Andrew Greenwood
5 */
6
7 #ifndef PORTCLS_PRIVATE_H
8 #define PORTCLS_PRIVATE_H
9
10 //#define _KS_NO_ANONYMOUS_STRUCTURES_
11
12 #include <ntddk.h>
13 #include <portcls.h>
14 #define NDEBUG
15 #include <debug.h>
16
17 #include <dmusicks.h>
18
19 #include "interfaces.h"
20 #include <ks.h>
21 #include <ksmedia.h>
22 #include <stdio.h>
23 #include <math.h>
24 #include <intrin.h>
25
26 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
27 #define TAG_PORTCLASS TAG('P', 'C', 'L', 'S')
28
29 #ifdef _MSC_VER
30 #define STDCALL
31 #define DDKAPI
32 #endif
33
34 #define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
35
36 NTSTATUS
37 NTAPI
38 PortClsCreate(
39 IN PDEVICE_OBJECT DeviceObject,
40 IN PIRP Irp);
41
42 NTSTATUS
43 NTAPI
44 PortClsPnp(
45 IN PDEVICE_OBJECT DeviceObject,
46 IN PIRP Irp);
47
48 NTSTATUS
49 NTAPI
50 PortClsPower(
51 IN PDEVICE_OBJECT DeviceObject,
52 IN PIRP Irp);
53
54 NTSTATUS
55 NTAPI
56 PortClsSysControl(
57 IN PDEVICE_OBJECT DeviceObject,
58 IN PIRP Irp);
59
60 NTSTATUS NewMiniportDMusUART(
61 OUT PMINIPORT* OutMiniport,
62 IN REFCLSID ClassId);
63
64 NTSTATUS NewMiniportFmSynth(
65 OUT PMINIPORT* OutMiniport,
66 IN REFCLSID ClassId);
67
68 NTSTATUS NewPortDMus(
69 OUT PPORT* OutPort);
70
71 NTSTATUS NewPortTopology(
72 OUT PPORT* OutPort);
73
74 NTSTATUS NewPortWaveCyclic(
75 OUT PPORT* OutPort);
76
77 NTSTATUS NewPortWavePci(
78 OUT PPORT* OutPort);
79
80 NTSTATUS NewIDrmPort(
81 OUT PDRMPORT2 *OutPort);
82
83 NTSTATUS NewPortClsVersion(
84 OUT PPORTCLSVERSION * OutVersion);
85
86 NTSTATUS NewPortFilterWaveCyclic(
87 OUT IPortFilterWaveCyclic ** OutFilter);
88
89 NTSTATUS NewPortPinWaveCyclic(
90 OUT IPortPinWaveCyclic ** OutPin);
91
92 NTSTATUS
93 NewPortFilterWavePci(
94 OUT IPortFilterWavePci ** OutFilter);
95
96 NTSTATUS NewPortPinWavePci(
97 OUT IPortPinWavePci ** OutPin);
98
99 PDEVICE_OBJECT
100 GetDeviceObjectFromWaveCyclic(
101 IPortWavePci* iface);
102
103 PDEVICE_OBJECT
104 GetDeviceObjectFromPortWavePci(
105 IPortWavePci* iface);
106
107 PMINIPORTWAVEPCI
108 GetWavePciMiniport(
109 PPORTWAVEPCI Port);
110
111 NTSTATUS
112 NewPortFilterDMus(
113 OUT PPORTFILTERDMUS * OutFilter);
114
115 NTSTATUS NewPortPinDMus(
116 OUT PPORTPINDMUS * OutPin);
117
118 VOID
119 GetDMusMiniport(
120 IN IPortDMus * iface,
121 IN PMINIPORTDMUS * Miniport,
122 IN PMINIPORTMIDI * MidiMiniport);
123
124 #if (NTDDI_VERSION >= NTDDI_VISTA)
125
126 NTSTATUS
127 NewPortFilterWaveRT(
128 OUT IPortFilterWaveRT ** OutFilter);
129
130 NTSTATUS NewPortPinWaveRT(
131 OUT IPortPinWaveRT ** OutPin);
132
133 PMINIPORTWAVERT
134 GetWaveRTMiniport(
135 IN IPortWaveRT* iface);
136
137 PDEVICE_OBJECT
138 GetDeviceObjectFromPortWaveRT(
139 IPortWaveRT* iface);
140
141 NTSTATUS
142 NewPortWaveRTStream(
143 PPORTWAVERTSTREAM *OutStream);
144
145 NTSTATUS
146 NewPortWaveRT(
147 OUT PPORT* OutPort);
148
149
150 #endif
151
152 NTSTATUS
153 NewPortFilterTopology(
154 OUT IPortFilterTopology ** OutFilter);
155
156 PMINIPORTTOPOLOGY
157 GetTopologyMiniport(
158 PPORTTOPOLOGY Port);
159
160 NTSTATUS
161 NTAPI
162 NewDispatchObject(
163 IN PIRP Irp,
164 IN IIrpTarget * Target,
165 IN LPWSTR Name);
166
167 PMINIPORTWAVECYCLIC
168 GetWaveCyclicMiniport(
169 IN IPortWaveCyclic* iface);
170
171 PVOID
172 AllocateItem(
173 IN POOL_TYPE PoolType,
174 IN SIZE_T NumberOfBytes,
175 IN ULONG Tag);
176
177 VOID
178 FreeItem(
179 IN PVOID Item,
180 IN ULONG Tag);
181
182 NTSTATUS
183 NTAPI
184 NewIrpQueue(
185 IN IIrpQueue **Queue);
186
187 NTSTATUS
188 NTAPI
189 TopologyPropertyHandler(
190 IN PIRP Irp,
191 IN PKSIDENTIFIER Request,
192 IN OUT PVOID Data);
193
194 NTSTATUS
195 NTAPI
196 PinPropertyHandler(
197 IN PIRP Irp,
198 IN PKSIDENTIFIER Request,
199 IN OUT PVOID Data);
200
201 NTSTATUS
202 NTAPI
203 PcDmaMasterDescription(
204 IN PRESOURCELIST ResourceList OPTIONAL,
205 IN BOOLEAN ScatterGather,
206 IN BOOLEAN Dma32BitAddresses,
207 IN BOOLEAN IgnoreCount,
208 IN BOOLEAN Dma64BitAddresses,
209 IN DMA_WIDTH DmaWidth,
210 IN DMA_SPEED DmaSpeed,
211 IN ULONG MaximumLength,
212 IN ULONG DmaPort,
213 OUT PDEVICE_DESCRIPTION DeviceDescription);
214
215 NTSTATUS
216 NTAPI
217 PcDmaSlaveDescription(
218 IN PRESOURCELIST ResourceList OPTIONAL,
219 IN ULONG DmaIndex,
220 IN BOOL DemandMode,
221 IN ULONG AutoInitialize,
222 IN DMA_SPEED DmaSpeed,
223 IN ULONG MaximumLength,
224 IN ULONG DmaPort,
225 OUT PDEVICE_DESCRIPTION DeviceDescription);
226
227 NTSTATUS
228 NTAPI
229 PcCreateSubdeviceDescriptor(
230 OUT SUBDEVICE_DESCRIPTOR ** OutSubdeviceDescriptor,
231 IN ULONG InterfaceCount,
232 IN GUID * InterfaceGuids,
233 IN ULONG IdentifierCount,
234 IN KSIDENTIFIER *Identifier,
235 IN ULONG FilterPropertiesCount,
236 IN KSPROPERTY_SET * FilterProperties,
237 IN ULONG Unknown1,
238 IN ULONG Unknown2,
239 IN ULONG PinPropertiesCount,
240 IN KSPROPERTY_SET * PinProperties,
241 IN ULONG EventSetCount,
242 IN KSEVENT_SET * EventSet,
243 IN PPCFILTER_DESCRIPTOR FilterDescription);
244
245 NTSTATUS
246 NTAPI
247 PcValidateConnectRequest(
248 IN PIRP Irp,
249 IN KSPIN_FACTORY * Descriptor,
250 OUT PKSPIN_CONNECT* Connect);
251
252 NTSTATUS
253 NTAPI
254 PcCreateItemDispatch(
255 IN PDEVICE_OBJECT DeviceObject,
256 IN PIRP Irp);
257
258 NTSTATUS
259 NTAPI
260 PcPropertyHandler(
261 IN PIRP Irp,
262 IN PSUBDEVICE_DESCRIPTOR Descriptor);
263
264 NTSTATUS
265 NTAPI
266 FastPropertyHandler(
267 IN PFILE_OBJECT FileObject,
268 IN PKSPROPERTY UNALIGNED Property,
269 IN ULONG PropertyLength,
270 IN OUT PVOID UNALIGNED Data,
271 IN ULONG DataLength,
272 OUT PIO_STATUS_BLOCK IoStatus,
273 IN ULONG PropertySetsCount,
274 IN const KSPROPERTY_SET *PropertySet,
275 IN PSUBDEVICE_DESCRIPTOR Descriptor,
276 IN ISubdevice *SubDevice);
277
278 PDEVICE_OBJECT
279 GetDeviceObject(
280 IPortWaveCyclic* iface);
281
282 IIrpQueue*
283 NTAPI
284 IPortWavePciStream_GetIrpQueue(
285 IN IPortWavePciStream *iface);
286
287 NTSTATUS
288 NTAPI
289 NewIPortWavePciStream(
290 OUT PPORTWAVEPCISTREAM *Stream);
291
292 VOID
293 NTAPI
294 PcIoTimerRoutine(
295 IN PDEVICE_OBJECT DeviceObject,
296 IN PVOID Context);
297
298 NTSTATUS
299 NTAPI
300 NewIUnregisterSubdevice(
301 OUT PUNREGISTERSUBDEVICE *OutDevice);
302
303 NTSTATUS
304 NTAPI
305 NewIUnregisterPhysicalConnection(
306 OUT PUNREGISTERPHYSICALCONNECTION *OutConnection);
307
308 #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\
309 PropGeneral, PropInstances, PropIntersection)\
310 DEFINE_KSPROPERTY_TABLE(PinSet) {\
311 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
312 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
313 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
314 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
315 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
316 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
317 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
318 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
319 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
320 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
321 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
322 DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
323 }
324
325 typedef struct
326 {
327 LIST_ENTRY Entry;
328 UNICODE_STRING SymbolicLink;
329 }SYMBOLICLINK_ENTRY, *PSYMBOLICLINK_ENTRY;
330
331
332 typedef struct
333 {
334 LIST_ENTRY Entry;
335 ISubdevice *SubDevice;
336 UNICODE_STRING Name;
337 LIST_ENTRY SymbolicLinkList;
338 }SUBDEVICE_ENTRY, *PSUBDEVICE_ENTRY;
339
340 typedef struct
341 {
342 LIST_ENTRY Entry;
343 ISubdevice * FromSubDevice;
344 UNICODE_STRING FromUnicodeString;
345 ULONG FromPin;
346 ISubdevice * ToSubDevice;
347 UNICODE_STRING ToUnicodeString;
348 ULONG ToPin;
349 }PHYSICAL_CONNECTION, *PPHYSICAL_CONNECTION;
350
351 typedef struct
352 {
353 KSDEVICE_HEADER KsDeviceHeader;
354 PDEVICE_OBJECT PhysicalDeviceObject;
355 PDEVICE_OBJECT PrevDeviceObject;
356 PCPFNSTARTDEVICE StartDevice;
357 ULONG_PTR Unused[4];
358 IAdapterPowerManagement * AdapterPowerManagement;
359 ULONG MaxSubDevices;
360 KSOBJECT_CREATE_ITEM * CreateItems;
361
362 IResourceList* resources;
363 LIST_ENTRY SubDeviceList;
364 LIST_ENTRY PhysicalConnectionList;
365
366 LIST_ENTRY TimerList;
367 KSPIN_LOCK TimerListLock;
368
369 } PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION;
370
371
372 typedef struct
373 {
374 KSSTREAM_HEADER Header;
375 PIRP Irp;
376 }CONTEXT_WRITE, *PCONTEXT_WRITE;
377
378 typedef struct
379 {
380 PVOID Pin;
381 PIO_WORKITEM WorkItem;
382 PIRP Irp;
383 }CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT;
384
385 typedef struct
386 {
387 LIST_ENTRY Entry;
388 PIO_TIMER_ROUTINE pTimerRoutine;
389 PVOID Context;
390 }TIMER_CONTEXT, *PTIMER_CONTEXT;
391
392 #endif