| #ifndef _STREAM_H | |
| #define _STREAM_H | |
| #include <ntddk.h> | |
| #include <windef.h> | |
| #include <ks.h> | |
| #if defined(_ARM_) | |
| #define STREAMAPI | |
| #else | |
| #define STREAMAPI __stdcall | |
| #endif | |
| #define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF) | |
| typedef enum { | |
| DebugLevelFatal = 0, | |
| DebugLevelError, | |
| DebugLevelWarning, | |
| DebugLevelInfo, | |
| DebugLevelTrace, | |
| DebugLevelVerbose, | |
| DebugLevelMaximum | |
| } STREAM_DEBUG_LEVEL; | |
| #if DBG | |
| #define DebugPrint(x) StreamClassDebugPrint x | |
| #define DEBUG_BREAKPOINT() DbgBreakPoint() | |
| #define DEBUG_ASSERT(exp) \ | |
| if ( !(exp) ) { \ | |
| StreamClassDebugAssert( __FILE__, __LINE__, #exp, exp); \ | |
| } | |
| #else | |
| #define DebugPrint(x) | |
| #define DEBUG_BREAKPOINT() | |
| #define DEBUG_ASSERT(exp) | |
| #endif | |
| typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS; | |
| __GNU_EXTENSION typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME; | |
| __GNU_EXTENSION typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP; | |
| typedef enum { | |
| TIME_GET_STREAM_TIME, | |
| TIME_READ_ONBOARD_CLOCK, | |
| TIME_SET_ONBOARD_CLOCK | |
| } TIME_FUNCTION; | |
| typedef struct _HW_TIME_CONTEXT { | |
| struct _HW_DEVICE_EXTENSION *HwDeviceExtension; | |
| struct _HW_STREAM_OBJECT *HwStreamObject; | |
| TIME_FUNCTION Function; | |
| ULONGLONG Time; | |
| ULONGLONG SystemTime; | |
| } HW_TIME_CONTEXT, *PHW_TIME_CONTEXT; | |
| typedef struct _HW_EVENT_DESCRIPTOR { | |
| BOOLEAN Enable; | |
| PKSEVENT_ENTRY EventEntry; | |
| PKSEVENTDATA EventData; | |
| __GNU_EXTENSION union { | |
| struct _HW_STREAM_OBJECT * StreamObject; | |
| struct _HW_DEVICE_EXTENSION *DeviceExtension; | |
| }; | |
| ULONG EnableEventSetIndex; | |
| PVOID HwInstanceExtension; | |
| ULONG Reserved; | |
| } HW_EVENT_DESCRIPTOR, *PHW_EVENT_DESCRIPTOR; | |
| struct _HW_STREAM_REQUEST_BLOCK; | |
| typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_DATA_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB); | |
| typedef VOID (STREAMAPI * PHW_RECEIVE_STREAM_CONTROL_SRB) (IN struct _HW_STREAM_REQUEST_BLOCK * SRB); | |
| typedef NTSTATUS (STREAMAPI * PHW_EVENT_ROUTINE) (IN PHW_EVENT_DESCRIPTOR EventDescriptor); | |
| typedef VOID (STREAMAPI * PHW_CLOCK_FUNCTION) (IN PHW_TIME_CONTEXT HwTimeContext); | |
| typedef struct _HW_CLOCK_OBJECT { | |
| PHW_CLOCK_FUNCTION HwClockFunction; | |
| ULONG ClockSupportFlags; | |
| ULONG Reserved[2]; | |
| } HW_CLOCK_OBJECT, *PHW_CLOCK_OBJECT; | |
| #define CLOCK_SUPPORT_CAN_SET_ONBOARD_CLOCK 0x1 | |
| #define CLOCK_SUPPORT_CAN_READ_ONBOARD_CLOCK 0x2 | |
| #define CLOCK_SUPPORT_CAN_RETURN_STREAM_TIME 0x4 | |
| typedef struct _HW_STREAM_OBJECT { | |
| ULONG SizeOfThisPacket; | |
| ULONG StreamNumber; | |
| PVOID HwStreamExtension; | |
| PHW_RECEIVE_STREAM_DATA_SRB ReceiveDataPacket; | |
| PHW_RECEIVE_STREAM_CONTROL_SRB ReceiveControlPacket; | |
| HW_CLOCK_OBJECT HwClockObject; | |
| BOOLEAN Dma; | |
| BOOLEAN Pio; | |
| PVOID HwDeviceExtension; | |
| ULONG StreamHeaderMediaSpecific; | |
| ULONG StreamHeaderWorkspace; | |
| BOOLEAN Allocator; | |
| PHW_EVENT_ROUTINE HwEventRoutine; | |
| ULONG Reserved[2]; | |
| } HW_STREAM_OBJECT, *PHW_STREAM_OBJECT; | |
| typedef struct _HW_STREAM_HEADER { | |
| ULONG NumberOfStreams; | |
| ULONG SizeOfHwStreamInformation; | |
| ULONG NumDevPropArrayEntries; | |
| PKSPROPERTY_SET DevicePropertiesArray; | |
| ULONG NumDevEventArrayEntries; | |
| PKSEVENT_SET DeviceEventsArray; | |
| PKSTOPOLOGY Topology; | |
| PHW_EVENT_ROUTINE DeviceEventRoutine; | |
| LONG NumDevMethodArrayEntries; | |
| PKSMETHOD_SET DeviceMethodsArray; | |
| } HW_STREAM_HEADER, *PHW_STREAM_HEADER; | |
| typedef struct _HW_STREAM_INFORMATION { | |
| ULONG NumberOfPossibleInstances; | |
| KSPIN_DATAFLOW DataFlow; | |
| BOOLEAN DataAccessible; | |
| ULONG NumberOfFormatArrayEntries; | |
| PKSDATAFORMAT* StreamFormatsArray; | |
| PVOID ClassReserved[4]; | |
| ULONG NumStreamPropArrayEntries; | |
| PKSPROPERTY_SET StreamPropertiesArray; | |
| ULONG NumStreamEventArrayEntries; | |
| PKSEVENT_SET StreamEventsArray; | |
| GUID* Category; | |
| GUID* Name; | |
| ULONG MediumsCount; | |
| const KSPIN_MEDIUM* Mediums; | |
| BOOLEAN BridgeStream; | |
| ULONG Reserved[2]; | |
| } HW_STREAM_INFORMATION, *PHW_STREAM_INFORMATION; | |
| typedef struct _HW_STREAM_DESCRIPTOR { | |
| HW_STREAM_HEADER StreamHeader; | |
| HW_STREAM_INFORMATION StreamInfo; | |
| } HW_STREAM_DESCRIPTOR, *PHW_STREAM_DESCRIPTOR; | |
| typedef struct _STREAM_TIME_REFERENCE { | |
| STREAM_TIMESTAMP CurrentOnboardClockValue; | |
| LARGE_INTEGER OnboardClockFrequency; | |
| LARGE_INTEGER CurrentSystemTime; | |
| ULONG Reserved[2]; | |
| } STREAM_TIME_REFERENCE, *PSTREAM_TIME_REFERENCE; | |
| typedef struct _STREAM_DATA_INTERSECT_INFO { | |
| ULONG StreamNumber; | |
| PKSDATARANGE DataRange; | |
| PVOID DataFormatBuffer; | |
| ULONG SizeOfDataFormatBuffer; | |
| } STREAM_DATA_INTERSECT_INFO, *PSTREAM_DATA_INTERSECT_INFO; | |
| typedef struct _STREAM_PROPERTY_DESCRIPTOR { | |
| PKSPROPERTY Property; | |
| ULONG PropertySetID; | |
| PVOID PropertyInfo; | |
| ULONG PropertyInputSize; | |
| ULONG PropertyOutputSize; | |
| } STREAM_PROPERTY_DESCRIPTOR, *PSTREAM_PROPERTY_DESCRIPTOR; | |
| typedef struct _STREAM_METHOD_DESCRIPTOR { | |
| ULONG MethodSetID; | |
| PKSMETHOD Method; | |
| PVOID MethodInfo; | |
| LONG MethodInputSize; | |
| LONG MethodOutputSize; | |
| } STREAM_METHOD_DESCRIPTOR, *PSTREAM_METHOD_DESCRIPTOR; | |
| #define STREAM_REQUEST_BLOCK_SIZE sizeof(STREAM_REQUEST_BLOCK) | |
| typedef enum _SRB_COMMAND { | |
| SRB_READ_DATA, | |
| SRB_WRITE_DATA, | |
| SRB_GET_STREAM_STATE, | |
| SRB_SET_STREAM_STATE, | |
| SRB_SET_STREAM_PROPERTY, | |
| SRB_GET_STREAM_PROPERTY, | |
| SRB_OPEN_MASTER_CLOCK, | |
| SRB_INDICATE_MASTER_CLOCK, | |
| SRB_UNKNOWN_STREAM_COMMAND, | |
| SRB_SET_STREAM_RATE, | |
| SRB_PROPOSE_DATA_FORMAT, | |
| SRB_CLOSE_MASTER_CLOCK, | |
| SRB_PROPOSE_STREAM_RATE, | |
| SRB_SET_DATA_FORMAT, | |
| SRB_GET_DATA_FORMAT, | |
| SRB_BEGIN_FLUSH, | |
| SRB_END_FLUSH, | |
| SRB_GET_STREAM_INFO = 0x100, | |
| SRB_OPEN_STREAM, | |
| SRB_CLOSE_STREAM, | |
| SRB_OPEN_DEVICE_INSTANCE, | |
| SRB_CLOSE_DEVICE_INSTANCE, | |
| SRB_GET_DEVICE_PROPERTY, | |
| SRB_SET_DEVICE_PROPERTY, | |
| SRB_INITIALIZE_DEVICE, | |
| SRB_CHANGE_POWER_STATE, | |
| SRB_UNINITIALIZE_DEVICE, | |
| SRB_UNKNOWN_DEVICE_COMMAND, | |
| SRB_PAGING_OUT_DRIVER, | |
| SRB_GET_DATA_INTERSECTION, | |
| SRB_INITIALIZATION_COMPLETE, | |
| SRB_SURPRISE_REMOVAL | |
| #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| ,SRB_DEVICE_METHOD | |
| ,SRB_STREAM_METHOD | |
| #if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1) | |
| ,SRB_NOTIFY_IDLE_STATE | |
| #endif | |
| #endif | |
| } SRB_COMMAND; | |
| typedef struct { | |
| PHYSICAL_ADDRESS PhysicalAddress; | |
| ULONG Length; | |
| } KSSCATTER_GATHER, *PKSSCATTER_GATHER; | |
| typedef struct _HW_STREAM_REQUEST_BLOCK { | |
| ULONG SizeOfThisPacket; | |
| SRB_COMMAND Command; | |
| NTSTATUS Status; | |
| PHW_STREAM_OBJECT StreamObject; | |
| PVOID HwDeviceExtension; | |
| PVOID SRBExtension; | |
| union _CommandData { | |
| PKSSTREAM_HEADER DataBufferArray; | |
| PHW_STREAM_DESCRIPTOR StreamBuffer; | |
| KSSTATE StreamState; | |
| PSTREAM_TIME_REFERENCE TimeReference; | |
| PSTREAM_PROPERTY_DESCRIPTOR PropertyInfo; | |
| PKSDATAFORMAT OpenFormat; | |
| struct _PORT_CONFIGURATION_INFORMATION *ConfigInfo; | |
| HANDLE MasterClockHandle; | |
| DEVICE_POWER_STATE DeviceState; | |
| PSTREAM_DATA_INTERSECT_INFO IntersectInfo; | |
| #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| PVOID MethodInfo; | |
| LONG FilterTypeIndex; | |
| #if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1) | |
| BOOLEAN Idle; | |
| #endif | |
| #endif | |
| } CommandData; | |
| ULONG NumberOfBuffers; | |
| ULONG TimeoutCounter; | |
| ULONG TimeoutOriginal; | |
| struct _HW_STREAM_REQUEST_BLOCK *NextSRB; | |
| PIRP Irp; | |
| ULONG Flags; | |
| PVOID HwInstanceExtension; | |
| __GNU_EXTENSION union { | |
| ULONG NumberOfBytesToTransfer; | |
| ULONG ActualBytesTransferred; | |
| }; | |
| PKSSCATTER_GATHER ScatterGatherBuffer; | |
| ULONG NumberOfPhysicalPages; | |
| ULONG NumberOfScatterGatherElements; | |
| ULONG Reserved[1]; | |
| } HW_STREAM_REQUEST_BLOCK, *PHW_STREAM_REQUEST_BLOCK; | |
| #define SRB_HW_FLAGS_DATA_TRANSFER 0x01 | |
| #define SRB_HW_FLAGS_STREAM_REQUEST 0x2 | |
| typedef enum { | |
| PerRequestExtension, | |
| DmaBuffer, | |
| SRBDataBuffer | |
| } STREAM_BUFFER_TYPE; | |
| typedef struct _ACCESS_RANGE { | |
| STREAM_PHYSICAL_ADDRESS RangeStart; | |
| ULONG RangeLength; | |
| BOOLEAN RangeInMemory; | |
| ULONG Reserved; | |
| } ACCESS_RANGE, *PACCESS_RANGE; | |
| typedef struct _PORT_CONFIGURATION_INFORMATION { | |
| ULONG SizeOfThisPacket; | |
| PVOID HwDeviceExtension; | |
| PDEVICE_OBJECT ClassDeviceObject; | |
| PDEVICE_OBJECT PhysicalDeviceObject; | |
| ULONG SystemIoBusNumber; | |
| INTERFACE_TYPE AdapterInterfaceType; | |
| ULONG BusInterruptLevel; | |
| ULONG BusInterruptVector; | |
| KINTERRUPT_MODE InterruptMode; | |
| ULONG DmaChannel; | |
| ULONG NumberOfAccessRanges; | |
| PACCESS_RANGE AccessRanges; | |
| ULONG StreamDescriptorSize; | |
| PIRP Irp; | |
| PKINTERRUPT InterruptObject; | |
| PADAPTER_OBJECT DmaAdapterObject; | |
| PDEVICE_OBJECT RealPhysicalDeviceObject; | |
| ULONG Reserved[1]; | |
| } PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION; | |
| typedef VOID (STREAMAPI * PHW_RECEIVE_DEVICE_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB); | |
| typedef VOID (STREAMAPI * PHW_CANCEL_SRB) (IN PHW_STREAM_REQUEST_BLOCK SRB); | |
| typedef VOID (STREAMAPI * PHW_REQUEST_TIMEOUT_HANDLER) (IN PHW_STREAM_REQUEST_BLOCK SRB); | |
| typedef BOOLEAN (STREAMAPI * PHW_INTERRUPT) (IN PVOID DeviceExtension); | |
| typedef VOID (STREAMAPI * PHW_TIMER_ROUTINE) (IN PVOID Context); | |
| typedef VOID (STREAMAPI * PHW_PRIORITY_ROUTINE) (IN PVOID Context); | |
| typedef VOID (STREAMAPI * PHW_QUERY_CLOCK_ROUTINE) (IN PHW_TIME_CONTEXT TimeContext); | |
| typedef BOOLEAN (STREAMAPI * PHW_RESET_ADAPTER) (IN PVOID DeviceExtension); | |
| typedef enum _STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE { | |
| ReadyForNextStreamDataRequest, | |
| ReadyForNextStreamControlRequest, | |
| HardwareStarved, | |
| StreamRequestComplete, | |
| SignalMultipleStreamEvents, | |
| SignalStreamEvent, | |
| DeleteStreamEvent, | |
| StreamNotificationMaximum | |
| } STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE; | |
| typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE { | |
| ReadyForNextDeviceRequest, | |
| DeviceRequestComplete, | |
| SignalMultipleDeviceEvents, | |
| SignalDeviceEvent, | |
| DeleteDeviceEvent, | |
| #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| SignalMultipleDeviceInstanceEvents, | |
| #endif | |
| DeviceNotificationMaximum | |
| } STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE, *PSTREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE; | |
| #define STREAM_CLASS_VERSION_20 0x0200 | |
| typedef struct _HW_INITIALIZATION_DATA { | |
| #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| __GNU_EXTENSION union { | |
| ULONG HwInitializationDataSize; | |
| __GNU_EXTENSION struct { | |
| USHORT SizeOfThisPacket; | |
| USHORT StreamClassVersion; | |
| }; | |
| }; | |
| #else | |
| ULONG HwInitializationDataSize; | |
| #endif /* NTDDI_VERSION >= NTDDI_WINXP */ | |
| PHW_INTERRUPT HwInterrupt; | |
| PHW_RECEIVE_DEVICE_SRB HwReceivePacket; | |
| PHW_CANCEL_SRB HwCancelPacket; | |
| PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler; | |
| ULONG DeviceExtensionSize; | |
| ULONG PerRequestExtensionSize; | |
| ULONG PerStreamExtensionSize; | |
| ULONG FilterInstanceExtensionSize; | |
| BOOLEAN BusMasterDMA; | |
| BOOLEAN Dma24BitAddresses; | |
| ULONG BufferAlignment; | |
| BOOLEAN TurnOffSynchronization; | |
| ULONG DmaBufferSize; | |
| #if (NTDDI_VERSION >= NTDDI_WINXP) | |
| ULONG NumNameExtensions; | |
| PWCHAR *NameExtensionArray; | |
| #else | |
| ULONG Reserved[2]; | |
| #endif | |
| } HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA; | |
| typedef enum _STREAM_PRIORITY { | |
| High, | |
| Dispatch, | |
| Low, | |
| LowToHigh | |
| } STREAM_PRIORITY, *PSTREAM_PRIORITY; | |
| VOID | |
| StreamClassAbortOutstandingRequests( | |
| IN PVOID HwDeviceExtension, | |
| IN PHW_STREAM_OBJECT HwStreamObject, | |
| IN NTSTATUS Status | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassCallAtNewPriority( | |
| IN PHW_STREAM_OBJECT StreamObject, | |
| IN PVOID HwDeviceExtension, | |
| IN STREAM_PRIORITY Priority, | |
| IN PHW_PRIORITY_ROUTINE PriorityRoutine, | |
| IN PVOID Context | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassCompleteRequestAndMarkQueueReady( | |
| IN PHW_STREAM_REQUEST_BLOCK Srb | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassDebugAssert( | |
| IN PCHAR File, | |
| IN ULONG Line, | |
| IN PCHAR AssertText, | |
| IN ULONG AssertValue | |
| ); | |
| VOID | |
| __cdecl | |
| StreamClassDebugPrint( | |
| IN STREAM_DEBUG_LEVEL DebugPrintLevel, | |
| IN PCCHAR DebugMessage, | |
| ... | |
| ); | |
| VOID | |
| __cdecl | |
| StreamClassDeviceNotification( | |
| IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType, | |
| IN PVOID HwDeviceExtension, | |
| IN PHW_STREAM_REQUEST_BLOCK pSrb, | |
| IN PKSEVENT_ENTRY EventEntry, | |
| IN GUID *EventSet, | |
| IN ULONG EventId | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassFilterReenumerateStreams( | |
| IN PVOID HwInstanceExtension, | |
| IN ULONG StreamDescriptorSize | |
| ); | |
| PVOID | |
| STREAMAPI | |
| StreamClassGetDmaBuffer( | |
| IN PVOID HwDeviceExtension | |
| ); | |
| PKSEVENT_ENTRY | |
| StreamClassGetNextEvent( | |
| IN PVOID HwInstanceExtension_OR_HwDeviceExtension, | |
| IN PHW_STREAM_OBJECT HwStreamObject, | |
| IN GUID * EventGuid, | |
| IN ULONG EventItem, | |
| IN PKSEVENT_ENTRY CurrentEvent | |
| ); | |
| STREAM_PHYSICAL_ADDRESS | |
| STREAMAPI | |
| StreamClassGetPhysicalAddress( | |
| IN PVOID HwDeviceExtension, | |
| IN PHW_STREAM_REQUEST_BLOCK HwSRB, | |
| IN PVOID VirtualAddress, | |
| IN STREAM_BUFFER_TYPE Type, | |
| IN ULONG * Length | |
| ); | |
| VOID | |
| StreamClassQueryMasterClock( | |
| IN PHW_STREAM_OBJECT HwStreamObject, | |
| IN HANDLE MasterClockHandle, | |
| IN TIME_FUNCTION TimeFunction, | |
| IN PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassQueryMasterClockSync( | |
| IN HANDLE MasterClockHandle, | |
| IN PHW_TIME_CONTEXT TimeContext | |
| ); | |
| BOOLEAN | |
| STREAMAPI | |
| StreamClassReadWriteConfig( | |
| IN PVOID HwDeviceExtension, | |
| IN BOOLEAN Read, | |
| IN PVOID Buffer, | |
| IN ULONG Offset, | |
| IN ULONG Length | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassReenumerateStreams( | |
| IN PVOID HwDeviceExtension, | |
| IN ULONG StreamDescriptorSize | |
| ); | |
| NTSTATUS | |
| STREAMAPI | |
| StreamClassRegisterAdapter( | |
| IN PVOID Argument1, | |
| IN PVOID Argument2, | |
| IN PHW_INITIALIZATION_DATA HwInitializationData | |
| ); | |
| #define StreamClassRegisterMinidriver StreamClassRegisterAdapter | |
| NTSTATUS | |
| StreamClassRegisterFilterWithNoKSPins( | |
| IN PDEVICE_OBJECT DeviceObject, | |
| IN const GUID * InterfaceClassGUID, | |
| IN ULONG PinCount, | |
| IN BOOLEAN * PinDirection, | |
| IN KSPIN_MEDIUM * MediumList, | |
| IN GUID * CategoryList | |
| ); | |
| VOID | |
| STREAMAPI | |
| StreamClassScheduleTimer( | |
| IN PHW_STREAM_OBJECT StreamObject, | |
| IN PVOID HwDeviceExtension, | |
| IN ULONG NumberOfMicroseconds, | |
| IN PHW_TIMER_ROUTINE TimerRoutine, | |
| IN PVOID Context | |
| ); | |
| VOID | |
| __cdecl | |
| StreamClassStreamNotification( | |
| IN STREAM_MINIDRIVER_STREAM_NOTIFICATION_TYPE NotificationType, | |
| IN PHW_STREAM_OBJECT StreamObject, | |
| IN ... | |
| ); | |
| #endif /* _STREAM_H */ | |