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