8 #define STREAMAPI __stdcall
9 #define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF)
25 #define DebugPrint(x) StreamClassDebugPrint x
26 #define DEBUG_BREAKPOINT() DbgBreakPoint()
27 #define DEBUG_ASSERT(exp) \
29 StreamClassDebugAssert( __FILE__, __LINE__, #exp, exp); \
34 #define DEBUG_BREAKPOINT()
35 #define DEBUG_ASSERT(exp)
39 typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS
, *PSTREAM_PHYSICAL_ADDRESS
;
40 typedef unsigned __int64 STREAM_SYSTEM_TIME
, *PSTREAM_SYSTEM_TIME
;
41 typedef unsigned __int64 STREAM_TIMESTAMP
, *PSTREAM_TIMESTAMP
;
46 TIME_READ_ONBOARD_CLOCK
,
47 TIME_SET_ONBOARD_CLOCK
50 typedef struct _HW_TIME_CONTEXT
52 struct _HW_DEVICE_EXTENSION
*HwDeviceExtension
;
53 struct _HW_STREAM_OBJECT
*HwStreamObject
;
54 TIME_FUNCTION Function
;
57 }HW_TIME_CONTEXT
, *PHW_TIME_CONTEXT
;
59 typedef struct _HW_EVENT_DESCRIPTOR
62 PKSEVENT_ENTRY EventEntry
;
63 PKSEVENTDATA EventData
;
66 struct _HW_STREAM_OBJECT
* StreamObject
;
67 struct _HW_DEVICE_EXTENSION
*DeviceExtension
;
69 ULONG EnableEventSetIndex
;
70 PVOID HwInstanceExtension
;
72 } HW_EVENT_DESCRIPTOR
, *PHW_EVENT_DESCRIPTOR
;
74 struct _HW_STREAM_REQUEST_BLOCK
;
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
);
81 typedef struct _HW_CLOCK_OBJECT
83 PHW_CLOCK_FUNCTION HwClockFunction
;
84 ULONG ClockSupportFlags
;
86 } HW_CLOCK_OBJECT
, *PHW_CLOCK_OBJECT
;
88 #define CLOCK_SUPPORT_CAN_SET_ONBOARD_CLOCK 0x1
89 #define CLOCK_SUPPORT_CAN_READ_ONBOARD_CLOCK 0x2
90 #define CLOCK_SUPPORT_CAN_RETURN_STREAM_TIME 0x4
92 typedef struct _HW_STREAM_OBJECT
94 ULONG SizeOfThisPacket
;
96 PVOID HwStreamExtension
;
97 PHW_RECEIVE_STREAM_DATA_SRB ReceiveDataPacket
;
98 PHW_RECEIVE_STREAM_CONTROL_SRB ReceiveControlPacket
;
99 HW_CLOCK_OBJECT HwClockObject
;
102 PVOID HwDeviceExtension
;
103 ULONG StreamHeaderMediaSpecific
;
104 ULONG StreamHeaderWorkspace
;
106 PHW_EVENT_ROUTINE HwEventRoutine
;
108 } HW_STREAM_OBJECT
, *PHW_STREAM_OBJECT
;
110 typedef struct _HW_STREAM_HEADER
112 ULONG NumberOfStreams
;
113 ULONG SizeOfHwStreamInformation
;
114 ULONG NumDevPropArrayEntries
;
115 PKSPROPERTY_SET DevicePropertiesArray
;
116 ULONG NumDevEventArrayEntries
;
117 PKSEVENT_SET DeviceEventsArray
;
118 PKSTOPOLOGY Topology
;
119 PHW_EVENT_ROUTINE DeviceEventRoutine
;
120 LONG NumDevMethodArrayEntries
;
121 PKSMETHOD_SET DeviceMethodsArray
;
122 }HW_STREAM_HEADER
, *PHW_STREAM_HEADER
;
124 typedef struct _HW_STREAM_INFORMATION
126 ULONG NumberOfPossibleInstances
;
127 KSPIN_DATAFLOW DataFlow
;
128 BOOLEAN DataAccessible
;
129 ULONG NumberOfFormatArrayEntries
;
130 PKSDATAFORMAT
* StreamFormatsArray
;
131 PVOID ClassReserved
[4];
132 ULONG NumStreamPropArrayEntries
;
133 PKSPROPERTY_SET StreamPropertiesArray
;
134 ULONG NumStreamEventArrayEntries
;
135 PKSEVENT_SET StreamEventsArray
;
139 const KSPIN_MEDIUM
* Mediums
;
140 BOOLEAN BridgeStream
;
142 }HW_STREAM_INFORMATION
, *PHW_STREAM_INFORMATION
;
145 typedef struct _HW_STREAM_DESCRIPTOR
147 HW_STREAM_HEADER StreamHeader
;
148 HW_STREAM_INFORMATION StreamInfo
;
149 } HW_STREAM_DESCRIPTOR
, *PHW_STREAM_DESCRIPTOR
;
151 typedef struct _STREAM_TIME_REFERENCE
153 STREAM_TIMESTAMP CurrentOnboardClockValue
;
154 LARGE_INTEGER OnboardClockFrequency
;
155 LARGE_INTEGER CurrentSystemTime
;
157 }STREAM_TIME_REFERENCE
, *PSTREAM_TIME_REFERENCE
;
159 typedef struct _STREAM_DATA_INTERSECT_INFO
162 PKSDATARANGE DataRange
;
163 PVOID DataFormatBuffer
;
164 ULONG SizeOfDataFormatBuffer
;
166 }STREAM_DATA_INTERSECT_INFO
, *PSTREAM_DATA_INTERSECT_INFO
;
168 typedef struct _STREAM_PROPERTY_DESCRIPTOR
170 PKSPROPERTY Property
;
173 ULONG PropertyInputSize
;
174 ULONG PropertyOutputSize
;
175 }STREAM_PROPERTY_DESCRIPTOR
, *PSTREAM_PROPERTY_DESCRIPTOR
;
177 typedef struct _STREAM_METHOD_DESCRIPTOR
182 LONG MethodInputSize
;
183 LONG MethodOutputSize
;
184 } STREAM_METHOD_DESCRIPTOR
, *PSTREAM_METHOD_DESCRIPTOR
;
186 #define STREAM_REQUEST_BLOCK_SIZE sizeof(STREAM_REQUEST_BLOCK)
188 typedef enum _SRB_COMMAND
192 SRB_GET_STREAM_STATE
,
193 SRB_SET_STREAM_STATE
,
194 SRB_SET_STREAM_PROPERTY
,
195 SRB_GET_STREAM_PROPERTY
,
196 SRB_OPEN_MASTER_CLOCK
,
198 SRB_INDICATE_MASTER_CLOCK
,
199 SRB_UNKNOWN_STREAM_COMMAND
,
201 SRB_PROPOSE_DATA_FORMAT
,
202 SRB_CLOSE_MASTER_CLOCK
,
203 SRB_PROPOSE_STREAM_RATE
,
209 SRB_GET_STREAM_INFO
= 0x100,
212 SRB_OPEN_DEVICE_INSTANCE
,
213 SRB_CLOSE_DEVICE_INSTANCE
,
214 SRB_GET_DEVICE_PROPERTY
,
215 SRB_SET_DEVICE_PROPERTY
,
216 SRB_INITIALIZE_DEVICE
,
217 SRB_CHANGE_POWER_STATE
,
218 SRB_UNINITIALIZE_DEVICE
,
219 SRB_UNKNOWN_DEVICE_COMMAND
,
220 SRB_PAGING_OUT_DRIVER
,
221 SRB_GET_DATA_INTERSECTION
,
222 SRB_INITIALIZATION_COMPLETE
,
225 #if (NTDDI_VERSION >= NTDDI_WINXP)
230 #if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
232 ,SRB_NOTIFY_IDLE_STATE
242 PHYSICAL_ADDRESS PhysicalAddress
;
244 } KSSCATTER_GATHER
, *PKSSCATTER_GATHER
;
247 typedef struct _HW_STREAM_REQUEST_BLOCK
249 ULONG SizeOfThisPacket
;
252 PHW_STREAM_OBJECT StreamObject
;
253 PVOID HwDeviceExtension
;
258 PKSSTREAM_HEADER DataBufferArray
;
259 PHW_STREAM_DESCRIPTOR StreamBuffer
;
261 PSTREAM_TIME_REFERENCE TimeReference
;
262 PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo
;
263 PKSDATAFORMAT OpenFormat
;
264 struct _PORT_CONFIGURATION_INFORMATION
*ConfigInfo
;
265 HANDLE MasterClockHandle
;
266 DEVICE_POWER_STATE DeviceState
;
267 PSTREAM_DATA_INTERSECT_INFO IntersectInfo
;
269 #if (NTDDI_VERSION >= NTDDI_WINXP)
271 LONG FilterTypeIndex
;
272 #if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
279 ULONG NumberOfBuffers
;
280 ULONG TimeoutCounter
;
281 ULONG TimeoutOriginal
;
282 struct _HW_STREAM_REQUEST_BLOCK
*NextSRB
;
286 PVOID HwInstanceExtension
;
290 ULONG NumberOfBytesToTransfer
;
291 ULONG ActualBytesTransferred
;
294 PKSSCATTER_GATHER ScatterGatherBuffer
;
295 ULONG NumberOfPhysicalPages
;
296 ULONG NumberOfScatterGatherElements
;
299 }HW_STREAM_REQUEST_BLOCK
, *PHW_STREAM_REQUEST_BLOCK
;
301 #define SRB_HW_FLAGS_DATA_TRANSFER 0x01
302 #define SRB_HW_FLAGS_STREAM_REQUEST 0x2
311 typedef struct _ACCESS_RANGE
313 STREAM_PHYSICAL_ADDRESS RangeStart
;
315 BOOLEAN RangeInMemory
;
317 }ACCESS_RANGE
, *PACCESS_RANGE
;
319 typedef struct _PORT_CONFIGURATION_INFORMATION
321 ULONG SizeOfThisPacket
;
322 PVOID HwDeviceExtension
;
323 PDEVICE_OBJECT ClassDeviceObject
;
324 PDEVICE_OBJECT PhysicalDeviceObject
;
325 ULONG SystemIoBusNumber
;
326 INTERFACE_TYPE AdapterInterfaceType
;
327 ULONG BusInterruptLevel
;
328 ULONG BusInterruptVector
;
329 KINTERRUPT_MODE InterruptMode
;
331 ULONG NumberOfAccessRanges
;
332 PACCESS_RANGE AccessRanges
;
333 ULONG StreamDescriptorSize
;
335 PKINTERRUPT InterruptObject
;
336 PADAPTER_OBJECT DmaAdapterObject
;
337 PDEVICE_OBJECT RealPhysicalDeviceObject
;
339 }PORT_CONFIGURATION_INFORMATION
, *PPORT_CONFIGURATION_INFORMATION
;
341 typedef VOID (STREAMAPI
* PHW_RECEIVE_DEVICE_SRB
) (IN PHW_STREAM_REQUEST_BLOCK SRB
);
342 typedef VOID (STREAMAPI
* PHW_CANCEL_SRB
) (IN PHW_STREAM_REQUEST_BLOCK SRB
);
343 typedef VOID (STREAMAPI
* PHW_REQUEST_TIMEOUT_HANDLER
) (IN PHW_STREAM_REQUEST_BLOCK SRB
);
344 typedef BOOLEAN (STREAMAPI
* PHW_INTERRUPT
) (IN PVOID DeviceExtension
);
345 typedef VOID (STREAMAPI
* PHW_TIMER_ROUTINE
) (IN PVOID Context
);
346 typedef VOID (STREAMAPI
* PHW_PRIORITY_ROUTINE
) (IN PVOID Context
);
347 typedef VOID (STREAMAPI
* PHW_QUERY_CLOCK_ROUTINE
) (IN PHW_TIME_CONTEXT TimeContext
);
348 typedef BOOLEAN (STREAMAPI
* PHW_RESET_ADAPTER
) (IN PVOID DeviceExtension
);
350 typedef enum _STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
352 ReadyForNextStreamDataRequest
,
353 ReadyForNextStreamControlRequest
,
355 StreamRequestComplete
,
356 SignalMultipleStreamEvents
,
359 StreamNotificationMaximum
360 }STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
, *PSTREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE
;
362 typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
364 ReadyForNextDeviceRequest
,
365 DeviceRequestComplete
,
366 SignalMultipleDeviceEvents
,
369 #if (NTDDI_VERSION >= NTDDI_WINXP)
370 SignalMultipleDeviceInstanceEvents
,
372 DeviceNotificationMaximum
373 } STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
, *PSTREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE
;
375 #define STREAM_CLASS_VERSION_20 0x0200
377 typedef struct _HW_INITIALIZATION_DATA
{
378 #if (NTDDI_VERSION >= NTDDI_WINXP)
381 ULONG HwInitializationDataSize
;
384 USHORT SizeOfThisPacket
;
385 USHORT StreamClassVersion
;
389 ULONG HwInitializationDataSize
;
392 PHW_INTERRUPT HwInterrupt
;
393 PHW_RECEIVE_DEVICE_SRB HwReceivePacket
;
394 PHW_CANCEL_SRB HwCancelPacket
;
395 PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler
;
396 ULONG DeviceExtensionSize
;
397 ULONG PerRequestExtensionSize
;
398 ULONG PerStreamExtensionSize
;
399 ULONG FilterInstanceExtensionSize
;
400 BOOLEAN BusMasterDMA
;
401 BOOLEAN Dma24BitAddresses
;
402 ULONG BufferAlignment
;
403 BOOLEAN TurnOffSynchronization
;
406 #if (NTDDI_VERSION >= NTDDI_WINXP)
407 ULONG NumNameExtensions
;
408 PWCHAR
*NameExtensionArray
;
412 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
414 typedef enum _STREAM_PRIORITY
420 }STREAM_PRIORITY
, *PSTREAM_PRIORITY
;
424 StreamClassAbortOutstandingRequests(
425 IN PVOID HwDeviceExtension
,
426 IN PHW_STREAM_OBJECT HwStreamObject
,
432 StreamClassCallAtNewPriority(
433 IN PHW_STREAM_OBJECT StreamObject
,
434 IN PVOID HwDeviceExtension
,
435 IN STREAM_PRIORITY Priority
,
436 IN PHW_PRIORITY_ROUTINE PriorityRoutine
,
442 StreamClassCompleteRequestAndMarkQueueReady(
443 IN PHW_STREAM_REQUEST_BLOCK Srb
448 StreamClassDebugAssert(
457 StreamClassDebugPrint(
458 IN STREAM_DEBUG_LEVEL DebugPrintLevel
,
459 IN PCCHAR DebugMessage
,
465 StreamClassDeviceNotification(
466 IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType
,
467 IN PVOID HwDeviceExtension
,
468 IN PHW_STREAM_REQUEST_BLOCK pSrb
,
469 IN PKSEVENT_ENTRY EventEntry
,
476 StreamClassFilterReenumerateStreams(
477 IN PVOID HwInstanceExtension
,
478 IN ULONG StreamDescriptorSize
483 StreamClassGetDmaBuffer(
484 IN PVOID HwDeviceExtension
489 StreamClassGetNextEvent(
490 IN PVOID HwInstanceExtension_OR_HwDeviceExtension
,
491 IN PHW_STREAM_OBJECT HwStreamObject
,
494 IN PKSEVENT_ENTRY CurrentEvent
497 STREAM_PHYSICAL_ADDRESS
499 StreamClassGetPhysicalAddress(
500 IN PVOID HwDeviceExtension
,
501 IN PHW_STREAM_REQUEST_BLOCK HwSRB
,
502 IN PVOID VirtualAddress
,
503 IN STREAM_BUFFER_TYPE Type
,
508 StreamClassQueryMasterClock(
509 IN PHW_STREAM_OBJECT HwStreamObject
,
510 IN HANDLE MasterClockHandle
,
511 IN TIME_FUNCTION TimeFunction
,
512 IN PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine
517 StreamClassQueryMasterClockSync(
518 IN HANDLE MasterClockHandle
,
519 IN PHW_TIME_CONTEXT TimeContext
524 StreamClassReadWriteConfig(
525 IN PVOID HwDeviceExtension
,
534 StreamClassReenumerateStreams(
535 IN PVOID HwDeviceExtension
,
536 IN ULONG StreamDescriptorSize
541 StreamClassRegisterAdapter(
544 IN PHW_INITIALIZATION_DATA HwInitializationData
547 #define StreamClassRegisterMinidriver StreamClassRegisterAdapter
550 StreamClassRegisterFilterWithNoKSPins(
551 IN PDEVICE_OBJECT DeviceObject
,
552 IN
const GUID
* InterfaceClassGUID
,
554 IN BOOLEAN
* PinDirection
,
555 IN KSPIN_MEDIUM
* MediumList
,
556 IN GUID
* CategoryList
561 StreamClassScheduleTimer(
562 IN PHW_STREAM_OBJECT StreamObject
,
563 IN PVOID HwDeviceExtension
,
564 IN ULONG NumberOfMicroseconds
,
565 IN PHW_TIMER_ROUTINE TimerRoutine
,
571 StreamClassStreamNotification(
572 IN STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType
,
573 IN PHW_STREAM_OBJECT StreamObject
,