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