Home | History | Annotate | Download | only in ddk
      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