123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- #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 */
|