8 /* Helper macro to enable gcc's extension. */
9 #ifndef __GNU_EXTENSION
11 #define __GNU_EXTENSION __extension__
13 #define __GNU_EXTENSION
17 #define STREAMAPI __stdcall
18 #define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF)
34 #define DebugPrint(x) StreamClassDebugPrint x
35 #define DEBUG_BREAKPOINT() DbgBreakPoint()
36 #define DEBUG_ASSERT(exp) \
38 StreamClassDebugAssert( __FILE__, __LINE__, #exp, exp); \
43 #define DEBUG_BREAKPOINT()
44 #define DEBUG_ASSERT(exp)
48 typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS
, *PSTREAM_PHYSICAL_ADDRESS
;
49 __GNU_EXTENSION
typedef unsigned __int64 STREAM_SYSTEM_TIME
, *PSTREAM_SYSTEM_TIME
;
50 __GNU_EXTENSION
typedef unsigned __int64 STREAM_TIMESTAMP
, *PSTREAM_TIMESTAMP
;
55 TIME_READ_ONBOARD_CLOCK
,
56 TIME_SET_ONBOARD_CLOCK
59 typedef struct _HW_TIME_CONTEXT
61 struct _HW_DEVICE_EXTENSION
*HwDeviceExtension
;
62 struct _HW_STREAM_OBJECT
*HwStreamObject
;
63 TIME_FUNCTION Function
;
66 }HW_TIME_CONTEXT
, *PHW_TIME_CONTEXT
;
68 typedef struct _HW_EVENT_DESCRIPTOR
71 PKSEVENT_ENTRY EventEntry
;
72 PKSEVENTDATA EventData
;
75 struct _HW_STREAM_OBJECT
* StreamObject
;
76 struct _HW_DEVICE_EXTENSION
*DeviceExtension
;
78 ULONG EnableEventSetIndex
;
79 PVOID HwInstanceExtension
;
81 } HW_EVENT_DESCRIPTOR
, *PHW_EVENT_DESCRIPTOR
;
83 struct _HW_STREAM_REQUEST_BLOCK
;
85 typedef VOID (STREAMAPI
* PHW_RECEIVE_STREAM_DATA_SRB
) (IN
struct _HW_STREAM_REQUEST_BLOCK
* SRB
);
86 typedef VOID (STREAMAPI
* PHW_RECEIVE_STREAM_CONTROL_SRB
) (IN
struct _HW_STREAM_REQUEST_BLOCK
* SRB
);
87 typedef NTSTATUS (STREAMAPI
* PHW_EVENT_ROUTINE
) (IN PHW_EVENT_DESCRIPTOR EventDescriptor
);
88 typedef VOID (STREAMAPI
* PHW_CLOCK_FUNCTION
) (IN PHW_TIME_CONTEXT HwTimeContext
);
90 typedef struct _HW_CLOCK_OBJECT
92 PHW_CLOCK_FUNCTION HwClockFunction
;
93 ULONG ClockSupportFlags
;
95 } HW_CLOCK_OBJECT
, *PHW_CLOCK_OBJECT
;
97 #define CLOCK_SUPPORT_CAN_SET_ONBOARD_CLOCK 0x1
98 #define CLOCK_SUPPORT_CAN_READ_ONBOARD_CLOCK 0x2
99 #define CLOCK_SUPPORT_CAN_RETURN_STREAM_TIME 0x4
101 typedef struct _HW_STREAM_OBJECT
103 ULONG SizeOfThisPacket
;
105 PVOID HwStreamExtension
;
106 PHW_RECEIVE_STREAM_DATA_SRB ReceiveDataPacket
;
107 PHW_RECEIVE_STREAM_CONTROL_SRB ReceiveControlPacket
;
108 HW_CLOCK_OBJECT HwClockObject
;
111 PVOID HwDeviceExtension
;
112 ULONG StreamHeaderMediaSpecific
;
113 ULONG StreamHeaderWorkspace
;
115 PHW_EVENT_ROUTINE HwEventRoutine
;
117 } HW_STREAM_OBJECT
, *PHW_STREAM_OBJECT
;
119 typedef struct _HW_STREAM_HEADER
121 ULONG NumberOfStreams
;
122 ULONG SizeOfHwStreamInformation
;
123 ULONG NumDevPropArrayEntries
;
124 PKSPROPERTY_SET DevicePropertiesArray
;
125 ULONG NumDevEventArrayEntries
;
126 PKSEVENT_SET DeviceEventsArray
;
127 PKSTOPOLOGY Topology
;
128 PHW_EVENT_ROUTINE DeviceEventRoutine
;
129 LONG NumDevMethodArrayEntries
;
130 PKSMETHOD_SET DeviceMethodsArray
;
131 }HW_STREAM_HEADER
, *PHW_STREAM_HEADER
;
133 typedef struct _HW_STREAM_INFORMATION
135 ULONG NumberOfPossibleInstances
;
136 KSPIN_DATAFLOW DataFlow
;
137 BOOLEAN DataAccessible
;
138 ULONG NumberOfFormatArrayEntries
;
139 PKSDATAFORMAT
* StreamFormatsArray
;
140 PVOID ClassReserved
[4];
141 ULONG NumStreamPropArrayEntries
;
142 PKSPROPERTY_SET StreamPropertiesArray
;
143 ULONG NumStreamEventArrayEntries
;
144 PKSEVENT_SET StreamEventsArray
;
148 const KSPIN_MEDIUM
* Mediums
;
149 BOOLEAN BridgeStream
;
151 }HW_STREAM_INFORMATION
, *PHW_STREAM_INFORMATION
;
154 typedef struct _HW_STREAM_DESCRIPTOR
156 HW_STREAM_HEADER StreamHeader
;
157 HW_STREAM_INFORMATION StreamInfo
;
158 } HW_STREAM_DESCRIPTOR
, *PHW_STREAM_DESCRIPTOR
;
160 typedef struct _STREAM_TIME_REFERENCE
162 STREAM_TIMESTAMP CurrentOnboardClockValue
;
163 LARGE_INTEGER OnboardClockFrequency
;
164 LARGE_INTEGER CurrentSystemTime
;
166 }STREAM_TIME_REFERENCE
, *PSTREAM_TIME_REFERENCE
;
168 typedef struct _STREAM_DATA_INTERSECT_INFO
171 PKSDATARANGE DataRange
;
172 PVOID DataFormatBuffer
;
173 ULONG SizeOfDataFormatBuffer
;
175 }STREAM_DATA_INTERSECT_INFO
, *PSTREAM_DATA_INTERSECT_INFO
;
177 typedef struct _STREAM_PROPERTY_DESCRIPTOR
179 PKSPROPERTY Property
;
182 ULONG PropertyInputSize
;
183 ULONG PropertyOutputSize
;
184 }STREAM_PROPERTY_DESCRIPTOR
, *PSTREAM_PROPERTY_DESCRIPTOR
;
186 typedef struct _STREAM_METHOD_DESCRIPTOR
191 LONG MethodInputSize
;
192 LONG MethodOutputSize
;
193 } STREAM_METHOD_DESCRIPTOR
, *PSTREAM_METHOD_DESCRIPTOR
;
195 #define STREAM_REQUEST_BLOCK_SIZE sizeof(STREAM_REQUEST_BLOCK)
197 typedef enum _SRB_COMMAND
201 SRB_GET_STREAM_STATE
,
202 SRB_SET_STREAM_STATE
,
203 SRB_SET_STREAM_PROPERTY
,
204 SRB_GET_STREAM_PROPERTY
,
205 SRB_OPEN_MASTER_CLOCK
,
207 SRB_INDICATE_MASTER_CLOCK
,
208 SRB_UNKNOWN_STREAM_COMMAND
,
210 SRB_PROPOSE_DATA_FORMAT
,
211 SRB_CLOSE_MASTER_CLOCK
,
212 SRB_PROPOSE_STREAM_RATE
,
218 SRB_GET_STREAM_INFO
= 0x100,
221 SRB_OPEN_DEVICE_INSTANCE
,
222 SRB_CLOSE_DEVICE_INSTANCE
,
223 SRB_GET_DEVICE_PROPERTY
,
224 SRB_SET_DEVICE_PROPERTY
,
225 SRB_INITIALIZE_DEVICE
,
226 SRB_CHANGE_POWER_STATE
,
227 SRB_UNINITIALIZE_DEVICE
,
228 SRB_UNKNOWN_DEVICE_COMMAND
,
229 SRB_PAGING_OUT_DRIVER
,
230 SRB_GET_DATA_INTERSECTION
,
231 SRB_INITIALIZATION_COMPLETE
,
234 #if (NTDDI_VERSION >= NTDDI_WINXP)
239 #if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
241 ,SRB_NOTIFY_IDLE_STATE
251 PHYSICAL_ADDRESS PhysicalAddress
;
253 } KSSCATTER_GATHER
, *PKSSCATTER_GATHER
;
256 typedef struct _HW_STREAM_REQUEST_BLOCK
258 ULONG SizeOfThisPacket
;
261 PHW_STREAM_OBJECT StreamObject
;
262 PVOID HwDeviceExtension
;
267 PKSSTREAM_HEADER DataBufferArray
;
268 PHW_STREAM_DESCRIPTOR StreamBuffer
;
270 PSTREAM_TIME_REFERENCE TimeReference
;
271 PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo
;
272 PKSDATAFORMAT OpenFormat
;
273 struct _PORT_CONFIGURATION_INFORMATION
*ConfigInfo
;
274 HANDLE MasterClockHandle
;
275 DEVICE_POWER_STATE DeviceState
;
276 PSTREAM_DATA_INTERSECT_INFO IntersectInfo
;
278 #if (NTDDI_VERSION >= NTDDI_WINXP)
280 LONG FilterTypeIndex
;
281 #if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
288 ULONG NumberOfBuffers
;
289 ULONG TimeoutCounter
;
290 ULONG TimeoutOriginal
;
291 struct _HW_STREAM_REQUEST_BLOCK
*NextSRB
;
295 PVOID HwInstanceExtension
;
297 __GNU_EXTENSION
union
299 ULONG NumberOfBytesToTransfer
;
300 ULONG ActualBytesTransferred
;
303 PKSSCATTER_GATHER ScatterGatherBuffer
;
304 ULONG NumberOfPhysicalPages
;
305 ULONG NumberOfScatterGatherElements
;
308 }HW_STREAM_REQUEST_BLOCK
, *PHW_STREAM_REQUEST_BLOCK
;
310 #define SRB_HW_FLAGS_DATA_TRANSFER 0x01
311 #define SRB_HW_FLAGS_STREAM_REQUEST 0x2
320 typedef struct _ACCESS_RANGE
322 STREAM_PHYSICAL_ADDRESS RangeStart
;
324 BOOLEAN RangeInMemory
;
326 }ACCESS_RANGE
, *PACCESS_RANGE
;
328 typedef struct _PORT_CONFIGURATION_INFORMATION
330 ULONG SizeOfThisPacket
;
331 PVOID HwDeviceExtension
;
332 PDEVICE_OBJECT ClassDeviceObject
;
333 PDEVICE_OBJECT PhysicalDeviceObject
;
334 ULONG SystemIoBusNumber
;
335 INTERFACE_TYPE AdapterInterfaceType
;
336 ULONG BusInterruptLevel
;
337 ULONG BusInterruptVector
;
338 KINTERRUPT_MODE InterruptMode
;
340 ULONG NumberOfAccessRanges
;
341 PACCESS_RANGE AccessRanges
;
342 ULONG StreamDescriptorSize
;
344 PKINTERRUPT InterruptObject
;
345 PADAPTER_OBJECT DmaAdapterObject
;
346 PDEVICE_OBJECT RealPhysicalDeviceObject
;
348 }PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
350 typedef VOID (STREAMAPI
* PHW_RECEIVE_DEVICE_SRB
) (IN PHW_STREAM_REQUEST_BLOCK SRB
);
351 typedef VOID (STREAMAPI
* PHW_CANCEL_SRB
) (IN PHW_STREAM_REQUEST_BLOCK SRB
);
352 typedef VOID (STREAMAPI
* PHW_REQUEST_TIMEOUT_HANDLER
) (IN PHW_STREAM_REQUEST_BLOCK SRB
);
353 typedef BOOLEAN (STREAMAPI
* PHW_INTERRUPT
) (IN PVOID DeviceExtension
);
354 typedef VOID (STREAMAPI
* PHW_TIMER_ROUTINE
) (IN PVOID Context
);
355 typedef VOID (STREAMAPI
* PHW_PRIORITY_ROUTINE
) (IN PVOID Context
);
356 typedef VOID (STREAMAPI
* PHW_QUERY_CLOCK_ROUTINE
) (IN PHW_TIME_CONTEXT TimeContext
);
357 typedef BOOLEAN (STREAMAPI
* PHW_RESET_ADAPTER
) (IN PVOID DeviceExtension
);
359 typedef enum _STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
361 ReadyForNextStreamDataRequest
,
362 ReadyForNextStreamControlRequest
,
364 StreamRequestComplete
,
365 SignalMultipleStreamEvents
,
368 StreamNotificationMaximum
369 }STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
, *PSTREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
;
371 typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
373 ReadyForNextDeviceRequest
,
374 DeviceRequestComplete
,
375 SignalMultipleDeviceEvents
,
378 #if (NTDDI_VERSION >= NTDDI_WINXP)
379 SignalMultipleDeviceInstanceEvents
,
381 DeviceNotificationMaximum
382 } STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
, *PSTREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
;
384 #define STREAM_CLASS_VERSION_20 0x0200
386 typedef struct _HW_INITIALIZATION_DATA
{
387 #if (NTDDI_VERSION >= NTDDI_WINXP)
388 __GNU_EXTENSION
union
390 ULONG HwInitializationDataSize
;
391 __GNU_EXTENSION
struct
393 USHORT SizeOfThisPacket
;
394 USHORT StreamClassVersion
;
398 ULONG HwInitializationDataSize
;
401 PHW_INTERRUPT HwInterrupt
;
402 PHW_RECEIVE_DEVICE_SRB HwReceivePacket
;
403 PHW_CANCEL_SRB HwCancelPacket
;
404 PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler
;
405 ULONG DeviceExtensionSize
;
406 ULONG PerRequestExtensionSize
;
407 ULONG PerStreamExtensionSize
;
408 ULONG FilterInstanceExtensionSize
;
409 BOOLEAN BusMasterDMA
;
410 BOOLEAN Dma24BitAddresses
;
411 ULONG BufferAlignment
;
412 BOOLEAN TurnOffSynchronization
;
415 #if (NTDDI_VERSION >= NTDDI_WINXP)
416 ULONG NumNameExtensions
;
417 PWCHAR
*NameExtensionArray
;
421 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
423 typedef enum _STREAM_PRIORITY
429 }STREAM_PRIORITY
, *PSTREAM_PRIORITY
;
433 StreamClassAbortOutstandingRequests(
434 IN PVOID HwDeviceExtension
,
435 IN PHW_STREAM_OBJECT HwStreamObject
,
441 StreamClassCallAtNewPriority(
442 IN PHW_STREAM_OBJECT StreamObject
,
443 IN PVOID HwDeviceExtension
,
444 IN STREAM_PRIORITY Priority
,
445 IN PHW_PRIORITY_ROUTINE PriorityRoutine
,
451 StreamClassCompleteRequestAndMarkQueueReady(
452 IN PHW_STREAM_REQUEST_BLOCK Srb
457 StreamClassDebugAssert(
466 StreamClassDebugPrint(
467 IN STREAM_DEBUG_LEVEL DebugPrintLevel
,
468 IN PCCHAR DebugMessage
,
474 StreamClassDeviceNotification(
475 IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType
,
476 IN PVOID HwDeviceExtension
,
477 IN PHW_STREAM_REQUEST_BLOCK pSrb
,
478 IN PKSEVENT_ENTRY EventEntry
,
485 StreamClassFilterReenumerateStreams(
486 IN PVOID HwInstanceExtension
,
487 IN ULONG StreamDescriptorSize
492 StreamClassGetDmaBuffer(
493 IN PVOID HwDeviceExtension
498 StreamClassGetNextEvent(
499 IN PVOID HwInstanceExtension_OR_HwDeviceExtension
,
500 IN PHW_STREAM_OBJECT HwStreamObject
,
503 IN PKSEVENT_ENTRY CurrentEvent
506 STREAM_PHYSICAL_ADDRESS
508 StreamClassGetPhysicalAddress(
509 IN PVOID HwDeviceExtension
,
510 IN PHW_STREAM_REQUEST_BLOCK HwSRB
,
511 IN PVOID VirtualAddress
,
512 IN STREAM_BUFFER_TYPE Type
,
517 StreamClassQueryMasterClock(
518 IN PHW_STREAM_OBJECT HwStreamObject
,
519 IN HANDLE MasterClockHandle
,
520 IN TIME_FUNCTION TimeFunction
,
521 IN PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine
526 StreamClassQueryMasterClockSync(
527 IN HANDLE MasterClockHandle
,
528 IN PHW_TIME_CONTEXT TimeContext
533 StreamClassReadWriteConfig(
534 IN PVOID HwDeviceExtension
,
543 StreamClassReenumerateStreams(
544 IN PVOID HwDeviceExtension
,
545 IN ULONG StreamDescriptorSize
550 StreamClassRegisterAdapter(
553 IN PHW_INITIALIZATION_DATA HwInitializationData
556 #define StreamClassRegisterMinidriver StreamClassRegisterAdapter
559 StreamClassRegisterFilterWithNoKSPins(
560 IN PDEVICE_OBJECT DeviceObject
,
561 IN
const GUID
* InterfaceClassGUID
,
563 IN BOOLEAN
* PinDirection
,
564 IN KSPIN_MEDIUM
* MediumList
,
565 IN GUID
* CategoryList
570 StreamClassScheduleTimer(
571 IN PHW_STREAM_OBJECT StreamObject
,
572 IN PVOID HwDeviceExtension
,
573 IN ULONG NumberOfMicroseconds
,
574 IN PHW_TIMER_ROUTINE TimerRoutine
,
580 StreamClassStreamNotification(
581 IN STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType
,
582 IN PHW_STREAM_OBJECT StreamObject
,