Reactos
1#ifndef _STREAM_H
2#define _STREAM_H
3
4#include <ntddk.h>
5#include <windef.h>
6#include <ks.h>
7
8#define STREAMAPI __stdcall
9#define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF)
10
11typedef enum {
12 DebugLevelFatal = 0,
13 DebugLevelError,
14 DebugLevelWarning,
15 DebugLevelInfo,
16 DebugLevelTrace,
17 DebugLevelVerbose,
18 DebugLevelMaximum
19} STREAM_DEBUG_LEVEL;
20
21#if DBG
22
23#define DebugPrint(x) StreamClassDebugPrint x
24#define DEBUG_BREAKPOINT() DbgBreakPoint()
25#define DEBUG_ASSERT(exp) \
26 if ( !(exp) ) { \
27 StreamClassDebugAssert( __FILE__, __LINE__, #exp, exp); \
28 }
29#else
30
31#define DebugPrint(x)
32#define DEBUG_BREAKPOINT()
33#define DEBUG_ASSERT(exp)
34
35#endif
36
37typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS;
38__GNU_EXTENSION typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME;
39__GNU_EXTENSION typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP;
40
41typedef enum {
42 TIME_GET_STREAM_TIME,
43 TIME_READ_ONBOARD_CLOCK,
44 TIME_SET_ONBOARD_CLOCK
45} TIME_FUNCTION;
46
47typedef struct _HW_TIME_CONTEXT {
48 struct _HW_DEVICE_EXTENSION *HwDeviceExtension;
49 struct _HW_STREAM_OBJECT *HwStreamObject;
50 TIME_FUNCTION Function;
51 ULONGLONG Time;
52 ULONGLONG SystemTime;
53} HW_TIME_CONTEXT, *PHW_TIME_CONTEXT;
54
55typedef struct _HW_EVENT_DESCRIPTOR {
56 BOOLEAN Enable;
57 PKSEVENT_ENTRY EventEntry;
58 PKSEVENTDATA EventData;
59 __GNU_EXTENSION union {
60 struct _HW_STREAM_OBJECT * StreamObject;
61 struct _HW_DEVICE_EXTENSION *DeviceExtension;
62 };
63 ULONG EnableEventSetIndex;
64 PVOID HwInstanceExtension;
65 ULONG Reserved;
66} HW_EVENT_DESCRIPTOR, *PHW_EVENT_DESCRIPTOR;
67
68struct _HW_STREAM_REQUEST_BLOCK;
69
70typedef VOID (STREAMAPI *PHW_RECEIVE_STREAM_DATA_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK *SRB);
71typedef VOID (STREAMAPI *PHW_RECEIVE_STREAM_CONTROL_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK *SRB);
72typedef NTSTATUS (STREAMAPI *PHW_EVENT_ROUTINE) (IN PHW_EVENT_DESCRIPTOR EventDescriptor);
73typedef VOID (STREAMAPI *PHW_CLOCK_FUNCTION) (IN PHW_TIME_CONTEXT HwTimeContext);
74
75typedef struct _HW_CLOCK_OBJECT {
76 PHW_CLOCK_FUNCTION HwClockFunction;
77 ULONG ClockSupportFlags;
78 ULONG Reserved[2];
79} HW_CLOCK_OBJECT, *PHW_CLOCK_OBJECT;
80
81#define CLOCK_SUPPORT_CAN_SET_ONBOARD_CLOCK 0x1
82#define CLOCK_SUPPORT_CAN_READ_ONBOARD_CLOCK 0x2
83#define CLOCK_SUPPORT_CAN_RETURN_STREAM_TIME 0x4
84
85typedef struct _HW_STREAM_OBJECT {
86 ULONG SizeOfThisPacket;
87 ULONG StreamNumber;
88 PVOID HwStreamExtension;
89 PHW_RECEIVE_STREAM_DATA_SRB ReceiveDataPacket;
90 PHW_RECEIVE_STREAM_CONTROL_SRB ReceiveControlPacket;
91 HW_CLOCK_OBJECT HwClockObject;
92 BOOLEAN Dma;
93 BOOLEAN Pio;
94 PVOID HwDeviceExtension;
95 ULONG StreamHeaderMediaSpecific;
96 ULONG StreamHeaderWorkspace;
97 BOOLEAN Allocator;
98 PHW_EVENT_ROUTINE HwEventRoutine;
99 ULONG Reserved[2];
100} HW_STREAM_OBJECT, *PHW_STREAM_OBJECT;
101
102typedef struct _HW_STREAM_HEADER {
103 ULONG NumberOfStreams;
104 ULONG SizeOfHwStreamInformation;
105 ULONG NumDevPropArrayEntries;
106 PKSPROPERTY_SET DevicePropertiesArray;
107 ULONG NumDevEventArrayEntries;
108 PKSEVENT_SET DeviceEventsArray;
109 PKSTOPOLOGY Topology;
110 PHW_EVENT_ROUTINE DeviceEventRoutine;
111 LONG NumDevMethodArrayEntries;
112 PKSMETHOD_SET DeviceMethodsArray;
113} HW_STREAM_HEADER, *PHW_STREAM_HEADER;
114
115typedef struct _HW_STREAM_INFORMATION {
116 ULONG NumberOfPossibleInstances;
117 KSPIN_DATAFLOW DataFlow;
118 BOOLEAN DataAccessible;
119 ULONG NumberOfFormatArrayEntries;
120 _Field_size_(NumberOfFormatArrayEntries) PKSDATAFORMAT* StreamFormatsArray;
121 PVOID ClassReserved[4];
122 ULONG NumStreamPropArrayEntries;
123 _Field_size_(NumStreamPropArrayEntries) PKSPROPERTY_SET StreamPropertiesArray;
124 ULONG NumStreamEventArrayEntries;
125 _Field_size_(NumStreamEventArrayEntries) PKSEVENT_SET StreamEventsArray;
126 GUID* Category;
127 GUID* Name;
128 ULONG MediumsCount;
129 _Field_size_(MediumsCount) const KSPIN_MEDIUM* Mediums;
130 BOOLEAN BridgeStream;
131 ULONG Reserved[2];
132} HW_STREAM_INFORMATION, *PHW_STREAM_INFORMATION;
133
134typedef struct _HW_STREAM_DESCRIPTOR {
135 HW_STREAM_HEADER StreamHeader;
136 HW_STREAM_INFORMATION StreamInfo;
137} HW_STREAM_DESCRIPTOR, *PHW_STREAM_DESCRIPTOR;
138
139typedef struct _STREAM_TIME_REFERENCE {
140 STREAM_TIMESTAMP CurrentOnboardClockValue;
141 LARGE_INTEGER OnboardClockFrequency;
142 LARGE_INTEGER CurrentSystemTime;
143 ULONG Reserved[2];
144} STREAM_TIME_REFERENCE, *PSTREAM_TIME_REFERENCE;
145
146typedef struct _STREAM_DATA_INTERSECT_INFO {
147 ULONG StreamNumber;
148 PKSDATARANGE DataRange;
149 _Field_size_bytes_(SizeOfDataFormatBuffer) PVOID DataFormatBuffer;
150 ULONG SizeOfDataFormatBuffer;
151} STREAM_DATA_INTERSECT_INFO, *PSTREAM_DATA_INTERSECT_INFO;
152
153typedef struct _STREAM_PROPERTY_DESCRIPTOR {
154 PKSPROPERTY Property;
155 ULONG PropertySetID;
156 PVOID PropertyInfo;
157 ULONG PropertyInputSize;
158 ULONG PropertyOutputSize;
159} STREAM_PROPERTY_DESCRIPTOR, *PSTREAM_PROPERTY_DESCRIPTOR;
160
161typedef struct _STREAM_METHOD_DESCRIPTOR {
162 ULONG MethodSetID;
163 PKSMETHOD Method;
164 PVOID MethodInfo;
165 LONG MethodInputSize;
166 LONG MethodOutputSize;
167} STREAM_METHOD_DESCRIPTOR, *PSTREAM_METHOD_DESCRIPTOR;
168
169#define STREAM_REQUEST_BLOCK_SIZE sizeof(STREAM_REQUEST_BLOCK)
170
171typedef enum _SRB_COMMAND {
172 SRB_READ_DATA,
173 SRB_WRITE_DATA,
174 SRB_GET_STREAM_STATE,
175 SRB_SET_STREAM_STATE,
176 SRB_SET_STREAM_PROPERTY,
177 SRB_GET_STREAM_PROPERTY,
178 SRB_OPEN_MASTER_CLOCK,
179
180 SRB_INDICATE_MASTER_CLOCK,
181 SRB_UNKNOWN_STREAM_COMMAND,
182 SRB_SET_STREAM_RATE,
183 SRB_PROPOSE_DATA_FORMAT,
184 SRB_CLOSE_MASTER_CLOCK,
185 SRB_PROPOSE_STREAM_RATE,
186 SRB_SET_DATA_FORMAT,
187 SRB_GET_DATA_FORMAT,
188 SRB_BEGIN_FLUSH,
189 SRB_END_FLUSH,
190
191 SRB_GET_STREAM_INFO = 0x100,
192 SRB_OPEN_STREAM,
193 SRB_CLOSE_STREAM,
194 SRB_OPEN_DEVICE_INSTANCE,
195 SRB_CLOSE_DEVICE_INSTANCE,
196 SRB_GET_DEVICE_PROPERTY,
197 SRB_SET_DEVICE_PROPERTY,
198 SRB_INITIALIZE_DEVICE,
199 SRB_CHANGE_POWER_STATE,
200 SRB_UNINITIALIZE_DEVICE,
201 SRB_UNKNOWN_DEVICE_COMMAND,
202 SRB_PAGING_OUT_DRIVER,
203 SRB_GET_DATA_INTERSECTION,
204 SRB_INITIALIZATION_COMPLETE,
205 SRB_SURPRISE_REMOVAL
206
207#if (NTDDI_VERSION >= NTDDI_WINXP)
208 ,SRB_DEVICE_METHOD
209 ,SRB_STREAM_METHOD
210#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
211 ,SRB_NOTIFY_IDLE_STATE
212#endif
213#endif
214} SRB_COMMAND;
215
216typedef struct {
217 PHYSICAL_ADDRESS PhysicalAddress;
218 ULONG Length;
219} KSSCATTER_GATHER, *PKSSCATTER_GATHER;
220
221
222typedef struct _HW_STREAM_REQUEST_BLOCK {
223 ULONG SizeOfThisPacket;
224 SRB_COMMAND Command;
225 NTSTATUS Status;
226 PHW_STREAM_OBJECT StreamObject;
227 PVOID HwDeviceExtension;
228 PVOID SRBExtension;
229
230 union _CommandData {
231 _Field_size_(_Inexpressible_(NumberOfBuffers)) PKSSTREAM_HEADER DataBufferArray;
232 PHW_STREAM_DESCRIPTOR StreamBuffer;
233 KSSTATE StreamState;
234 PSTREAM_TIME_REFERENCE TimeReference;
235 PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo;
236 PKSDATAFORMAT OpenFormat;
237 struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo;
238 HANDLE MasterClockHandle;
239 DEVICE_POWER_STATE DeviceState;
240 PSTREAM_DATA_INTERSECT_INFO IntersectInfo;
241
242#if (NTDDI_VERSION >= NTDDI_WINXP)
243 PVOID MethodInfo;
244 LONG FilterTypeIndex;
245#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
246 BOOLEAN Idle;
247#endif
248#endif
249 } CommandData;
250
251 ULONG NumberOfBuffers;
252 ULONG TimeoutCounter;
253 ULONG TimeoutOriginal;
254 struct _HW_STREAM_REQUEST_BLOCK *NextSRB;
255
256 PIRP Irp;
257 ULONG Flags;
258 PVOID HwInstanceExtension;
259
260 __GNU_EXTENSION union {
261 ULONG NumberOfBytesToTransfer;
262 ULONG ActualBytesTransferred;
263 };
264
265 _Field_size_(NumberOfScatterGatherElements) PKSSCATTER_GATHER ScatterGatherBuffer;
266 ULONG NumberOfPhysicalPages;
267 ULONG NumberOfScatterGatherElements;
268 ULONG Reserved[1];
269} HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK;
270
271#define SRB_HW_FLAGS_DATA_TRANSFER 0x01
272#define SRB_HW_FLAGS_STREAM_REQUEST 0x2
273
274typedef enum {
275 PerRequestExtension,
276 DmaBuffer,
277 SRBDataBuffer
278} STREAM_BUFFER_TYPE;
279
280typedef struct _ACCESS_RANGE {
281 _Field_size_bytes_(RangeLength) STREAM_PHYSICAL_ADDRESS RangeStart;
282 ULONG RangeLength;
283 BOOLEAN RangeInMemory;
284 ULONG Reserved;
285} ACCESS_RANGE, *PACCESS_RANGE;
286
287typedef struct _PORT_CONFIGURATION_INFORMATION {
288 ULONG SizeOfThisPacket;
289 PVOID HwDeviceExtension;
290 PDEVICE_OBJECT ClassDeviceObject;
291 PDEVICE_OBJECT PhysicalDeviceObject;
292 ULONG SystemIoBusNumber;
293 INTERFACE_TYPE AdapterInterfaceType;
294 ULONG BusInterruptLevel;
295 ULONG BusInterruptVector;
296 KINTERRUPT_MODE InterruptMode;
297 ULONG DmaChannel;
298 ULONG NumberOfAccessRanges;
299 _Field_size_(NumberOfAccessRanges) PACCESS_RANGE AccessRanges;
300 ULONG StreamDescriptorSize;
301 PIRP Irp;
302 PKINTERRUPT InterruptObject;
303 PADAPTER_OBJECT DmaAdapterObject;
304 PDEVICE_OBJECT RealPhysicalDeviceObject;
305 ULONG Reserved[1];
306} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
307
308typedef VOID (STREAMAPI *PHW_RECEIVE_DEVICE_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB);
309typedef VOID (STREAMAPI *PHW_CANCEL_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB);
310typedef VOID (STREAMAPI *PHW_REQUEST_TIMEOUT_HANDLER) (IN PHW_STREAM_REQUEST_BLOCK SRB);
311typedef BOOLEAN (STREAMAPI *PHW_INTERRUPT) (IN PVOID DeviceExtension);
312typedef VOID (STREAMAPI *PHW_TIMER_ROUTINE) (IN PVOID Context);
313typedef VOID (STREAMAPI *PHW_PRIORITY_ROUTINE) (IN PVOID Context);
314typedef VOID (STREAMAPI *PHW_QUERY_CLOCK_ROUTINE) (IN PHW_TIME_CONTEXT TimeContext);
315typedef BOOLEAN (STREAMAPI *PHW_RESET_ADAPTER) (IN PVOID DeviceExtension);
316
317typedef enum _STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE {
318 ReadyForNextStreamDataRequest,
319 ReadyForNextStreamControlRequest,
320 HardwareStarved,
321 StreamRequestComplete,
322 SignalMultipleStreamEvents,
323 SignalStreamEvent,
324 DeleteStreamEvent,
325 StreamNotificationMaximum
326} STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE;
327
328typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE {
329 ReadyForNextDeviceRequest,
330 DeviceRequestComplete,
331 SignalMultipleDeviceEvents,
332 SignalDeviceEvent,
333 DeleteDeviceEvent,
334#if (NTDDI_VERSION >= NTDDI_WINXP)
335 SignalMultipleDeviceInstanceEvents,
336#endif
337 DeviceNotificationMaximum
338} STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE;
339
340#define STREAM_CLASS_VERSION_20 0x0200
341
342typedef struct _HW_INITIALIZATION_DATA {
343#if (NTDDI_VERSION >= NTDDI_WINXP)
344 __GNU_EXTENSION union {
345 ULONG HwInitializationDataSize;
346 __GNU_EXTENSION struct {
347 USHORT SizeOfThisPacket;
348 USHORT StreamClassVersion;
349 };
350 };
351#else
352 ULONG HwInitializationDataSize;
353#endif /* NTDDI_VERSION >= NTDDI_WINXP */
354
355 PHW_INTERRUPT HwInterrupt;
356 PHW_RECEIVE_DEVICE_SRB HwReceivePacket;
357 PHW_CANCEL_SRB HwCancelPacket;
358 PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler;
359 ULONG DeviceExtensionSize;
360 ULONG PerRequestExtensionSize;
361 ULONG PerStreamExtensionSize;
362 ULONG FilterInstanceExtensionSize;
363 BOOLEAN BusMasterDMA;
364 BOOLEAN Dma24BitAddresses;
365 ULONG BufferAlignment;
366 BOOLEAN TurnOffSynchronization;
367 ULONG DmaBufferSize;
368
369#if (NTDDI_VERSION >= NTDDI_WINXP)
370 ULONG NumNameExtensions;
371 _Field_size_(NumNameExtensions) PWCHAR *NameExtensionArray;
372#else
373 ULONG Reserved[2];
374#endif
375} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
376
377typedef enum _STREAM_PRIORITY {
378 High,
379 Dispatch,
380 Low,
381 LowToHigh
382} STREAM_PRIORITY, *PSTREAM_PRIORITY;
383
384
385VOID
386StreamClassAbortOutstandingRequests(
387 _In_ PVOID HwDeviceExtension,
388 _In_opt_ PHW_STREAM_OBJECT HwStreamObject,
389 _In_ NTSTATUS Status);
390
391VOID
392STREAMAPI
393StreamClassCallAtNewPriority(
394 _In_opt_ PHW_STREAM_OBJECT StreamObject,
395 _In_ PVOID HwDeviceExtension,
396 _In_ STREAM_PRIORITY Priority,
397 _In_ PHW_PRIORITY_ROUTINE PriorityRoutine,
398 _In_ PVOID Context);
399
400VOID
401STREAMAPI
402StreamClassCompleteRequestAndMarkQueueReady(
403 _In_ PHW_STREAM_REQUEST_BLOCK Srb);
404
405__analysis_noreturn
406VOID
407STREAMAPI
408StreamClassDebugAssert(
409 _In_ PCHAR File,
410 _In_ ULONG Line,
411 _In_ PCHAR AssertText,
412 _In_ ULONG AssertValue);
413
414VOID
415__cdecl
416StreamClassDebugPrint(
417 _In_ STREAM_DEBUG_LEVEL DebugPrintLevel,
418 _In_ PCCHAR DebugMessage,
419 ...);
420
421VOID
422__cdecl
423StreamClassDeviceNotification(
424 IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType,
425 IN PVOID HwDeviceExtension,
426 IN PHW_STREAM_REQUEST_BLOCK pSrb,
427 IN PKSEVENT_ENTRY EventEntry,
428 IN GUID *EventSet,
429 IN ULONG EventId);
430
431VOID
432STREAMAPI
433StreamClassFilterReenumerateStreams(
434 _In_ PVOID HwInstanceExtension,
435 _In_ ULONG StreamDescriptorSize);
436
437PVOID
438STREAMAPI
439StreamClassGetDmaBuffer(
440 _In_ PVOID HwDeviceExtension);
441
442
443PKSEVENT_ENTRY
444StreamClassGetNextEvent(
445 _In_opt_ PVOID HwInstanceExtension_OR_HwDeviceExtension,
446 _In_opt_ PHW_STREAM_OBJECT HwStreamObject,
447 _In_opt_ GUID *EventGuid,
448 _In_ ULONG EventItem,
449 _In_opt_ PKSEVENT_ENTRY CurrentEvent);
450
451STREAM_PHYSICAL_ADDRESS
452STREAMAPI
453StreamClassGetPhysicalAddress(
454 _In_ PVOID HwDeviceExtension,
455 _In_opt_ PHW_STREAM_REQUEST_BLOCK HwSRB,
456 _In_ PVOID VirtualAddress,
457 _In_ STREAM_BUFFER_TYPE Type,
458 _Out_ ULONG *Length);
459
460VOID
461StreamClassQueryMasterClock(
462 _In_ PHW_STREAM_OBJECT HwStreamObject,
463 _In_ HANDLE MasterClockHandle,
464 _In_ TIME_FUNCTION TimeFunction,
465 _In_ PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine);
466
467_IRQL_requires_max_(DISPATCH_LEVEL)
468VOID
469STREAMAPI
470StreamClassQueryMasterClockSync(
471 _In_ HANDLE MasterClockHandle,
472 _Inout_ PHW_TIME_CONTEXT TimeContext);
473
474_IRQL_requires_max_(PASSIVE_LEVEL)
475BOOLEAN
476STREAMAPI
477StreamClassReadWriteConfig(
478 _In_ PVOID HwDeviceExtension,
479 _In_ BOOLEAN Read,
480 _Inout_updates_bytes_(Length) PVOID Buffer,
481 _In_ ULONG Offset,
482 _In_ ULONG Length);
483
484VOID
485STREAMAPI
486StreamClassReenumerateStreams(
487 _In_ PVOID HwDeviceExtension,
488 _In_ ULONG StreamDescriptorSize);
489
490_IRQL_requires_max_(PASSIVE_LEVEL)
491NTSTATUS
492STREAMAPI
493StreamClassRegisterAdapter(
494 _In_ PVOID Argument1,
495 _In_ PVOID Argument2,
496 _In_ PHW_INITIALIZATION_DATA HwInitializationData);
497
498#define StreamClassRegisterMinidriver StreamClassRegisterAdapter
499
500_IRQL_requires_max_(APC_LEVEL)
501NTSTATUS
502StreamClassRegisterFilterWithNoKSPins(
503 _In_ PDEVICE_OBJECT DeviceObject,
504 _In_ const GUID *InterfaceClassGUID,
505 _In_ ULONG PinCount,
506 _In_reads_(PinCount) BOOL *PinDirection,
507 _In_reads_(PinCount) KSPIN_MEDIUM *MediumList,
508 _In_reads_opt_(PinCount) GUID *CategoryList);
509
510VOID
511STREAMAPI
512StreamClassScheduleTimer(
513 _In_opt_ PHW_STREAM_OBJECT StreamObject,
514 _In_ PVOID HwDeviceExtension,
515 _In_ ULONG NumberOfMicroseconds,
516 _In_ PHW_TIMER_ROUTINE TimerRoutine,
517 _In_ PVOID Context);
518
519VOID
520__cdecl
521StreamClassStreamNotification(
522 _In_ STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType,
523 _In_ PHW_STREAM_OBJECT StreamObject,
524 ...);
525
526#endif /* _STREAM_H */