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