gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

ks.h (118098B)


      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the w64 mingw-runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef _KS_
      7 #define _KS_
      8 
      9 #if __GNUC__ >= 3
     10 #pragma GCC system_header
     11 #endif
     12 
     13 #ifndef __MINGW_EXTENSION
     14 #if defined(__GNUC__) || defined(__GNUG__)
     15 #define __MINGW_EXTENSION __extension__
     16 #else
     17 #define __MINGW_EXTENSION
     18 #endif
     19 #endif 
     20 
     21 #ifdef __TCS__
     22 #define _KS_NO_ANONYMOUS_STRUCTURES_ 1
     23 #endif
     24 
     25 #ifdef  _KS_NO_ANONYMOUS_STRUCTURES_
     26 #define _KS_ANON_STRUCT(X)			struct X
     27 #else
     28 #define _KS_ANON_STRUCT(X)	__MINGW_EXTENSION struct
     29 #endif
     30 
     31 #ifndef _NTRTL_
     32 #ifndef DEFINE_GUIDEX
     33 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
     34 #endif
     35 #ifndef STATICGUIDOF
     36 #define STATICGUIDOF(guid) STATIC_##guid
     37 #endif
     38 #endif /* _NTRTL_ */
     39 
     40 #ifndef SIZEOF_ARRAY
     41 #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0]))
     42 #endif
     43 
     44 #define DEFINE_GUIDSTRUCT(g,n) DEFINE_GUIDEX(n)
     45 #define DEFINE_GUIDNAMED(n) n
     46 
     47 #define STATIC_GUID_NULL						\
     48 	0x00000000L,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
     49 
     50 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000",GUID_NULL);
     51 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
     52 
     53 #define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS,0x000,METHOD_NEITHER,FILE_ANY_ACCESS)
     54 #define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x001,METHOD_NEITHER,FILE_ANY_ACCESS)
     55 #define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x002,METHOD_NEITHER,FILE_ANY_ACCESS)
     56 #define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS,0x003,METHOD_NEITHER,FILE_ANY_ACCESS)
     57 #define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS,0x004,METHOD_NEITHER,FILE_WRITE_ACCESS)
     58 #define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS,0x005,METHOD_NEITHER,FILE_READ_ACCESS)
     59 #define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS,0x006,METHOD_NEITHER,FILE_ANY_ACCESS)
     60 
     61 typedef enum {
     62   KSRESET_BEGIN,
     63   KSRESET_END
     64 } KSRESET;
     65 
     66 typedef enum {
     67   KSSTATE_STOP,
     68   KSSTATE_ACQUIRE,
     69   KSSTATE_PAUSE,
     70   KSSTATE_RUN
     71 } KSSTATE,*PKSSTATE;
     72 
     73 #define KSPRIORITY_LOW		0x00000001
     74 #define KSPRIORITY_NORMAL	0x40000000
     75 #define KSPRIORITY_HIGH		0x80000000
     76 #define KSPRIORITY_EXCLUSIVE	0xFFFFFFFF
     77 
     78 typedef struct {
     79   ULONG PriorityClass;
     80   ULONG PrioritySubClass;
     81 } KSPRIORITY,*PKSPRIORITY;
     82 
     83 typedef struct {
     84   __MINGW_EXTENSION union {
     85     _KS_ANON_STRUCT(_IDENTIFIER)
     86     {
     87       GUID Set;
     88       ULONG Id;
     89       ULONG Flags;
     90     };
     91     LONGLONG Alignment;
     92   };
     93 } KSIDENTIFIER,*PKSIDENTIFIER;
     94 
     95 typedef KSIDENTIFIER KSPROPERTY,*PKSPROPERTY,KSMETHOD,*PKSMETHOD,KSEVENT,*PKSEVENT;
     96 
     97 #define KSMETHOD_TYPE_NONE		0x00000000
     98 #define KSMETHOD_TYPE_READ		0x00000001
     99 #define KSMETHOD_TYPE_WRITE		0x00000002
    100 #define KSMETHOD_TYPE_MODIFY		0x00000003
    101 #define KSMETHOD_TYPE_SOURCE		0x00000004
    102 
    103 #define KSMETHOD_TYPE_SEND		0x00000001
    104 #define KSMETHOD_TYPE_SETSUPPORT	0x00000100
    105 #define KSMETHOD_TYPE_BASICSUPPORT	0x00000200
    106 
    107 #define KSMETHOD_TYPE_TOPOLOGY		0x10000000
    108 
    109 #define KSPROPERTY_TYPE_GET		0x00000001
    110 #define KSPROPERTY_TYPE_SET		0x00000002
    111 #define KSPROPERTY_TYPE_SETSUPPORT	0x00000100
    112 #define KSPROPERTY_TYPE_BASICSUPPORT	0x00000200
    113 #define KSPROPERTY_TYPE_RELATIONS	0x00000400
    114 #define KSPROPERTY_TYPE_SERIALIZESET	0x00000800
    115 #define KSPROPERTY_TYPE_UNSERIALIZESET	0x00001000
    116 #define KSPROPERTY_TYPE_SERIALIZERAW	0x00002000
    117 #define KSPROPERTY_TYPE_UNSERIALIZERAW	0x00004000
    118 #define KSPROPERTY_TYPE_SERIALIZESIZE	0x00008000
    119 #define KSPROPERTY_TYPE_DEFAULTVALUES	0x00010000
    120 
    121 #define KSPROPERTY_TYPE_TOPOLOGY	0x10000000
    122 
    123 typedef struct {
    124   KSPROPERTY Property;
    125   ULONG NodeId;
    126   ULONG Reserved;
    127 } KSP_NODE,*PKSP_NODE;
    128 
    129 typedef struct {
    130   KSMETHOD Method;
    131   ULONG NodeId;
    132   ULONG Reserved;
    133 } KSM_NODE,*PKSM_NODE;
    134 
    135 typedef struct {
    136   KSEVENT Event;
    137   ULONG NodeId;
    138   ULONG Reserved;
    139 } KSE_NODE,*PKSE_NODE;
    140 
    141 #define STATIC_KSPROPTYPESETID_General					\
    142 	0x97E99BA0L,0xBDEA,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    143 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000",KSPROPTYPESETID_General);
    144 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
    145 
    146 typedef struct {
    147   ULONG Size;
    148   ULONG Count;
    149 } KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM;
    150 
    151 typedef struct {
    152   ULONG AccessFlags;
    153   ULONG DescriptionSize;
    154   KSIDENTIFIER PropTypeSet;
    155   ULONG MembersListCount;
    156   ULONG Reserved;
    157 } KSPROPERTY_DESCRIPTION,*PKSPROPERTY_DESCRIPTION;
    158 
    159 #define KSPROPERTY_MEMBER_RANGES		0x00000001
    160 #define KSPROPERTY_MEMBER_STEPPEDRANGES		0x00000002
    161 #define KSPROPERTY_MEMBER_VALUES		0x00000003
    162 
    163 #define KSPROPERTY_MEMBER_FLAG_DEFAULT		0x00000001
    164 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002
    165 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM	0x00000004
    166 
    167 typedef struct {
    168   ULONG MembersFlags;
    169   ULONG MembersSize;
    170   ULONG MembersCount;
    171   ULONG Flags;
    172 } KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER;
    173 
    174 typedef union {
    175   _KS_ANON_STRUCT(_SIGNED)
    176   {
    177     LONG SignedMinimum;
    178     LONG SignedMaximum;
    179   };
    180   _KS_ANON_STRUCT(_UNSIGNED)
    181   {
    182     ULONG UnsignedMinimum;
    183     ULONG UnsignedMaximum;
    184   };
    185 } KSPROPERTY_BOUNDS_LONG,*PKSPROPERTY_BOUNDS_LONG;
    186 
    187 typedef union {
    188   _KS_ANON_STRUCT(_SIGNED64)
    189   {
    190     LONGLONG SignedMinimum;
    191     LONGLONG SignedMaximum;
    192   };
    193   _KS_ANON_STRUCT(_UNSIGNED64)
    194   {
    195     DWORDLONG UnsignedMinimum;
    196     DWORDLONG UnsignedMaximum;
    197   };
    198 } KSPROPERTY_BOUNDS_LONGLONG,*PKSPROPERTY_BOUNDS_LONGLONG;
    199 
    200 typedef struct {
    201   ULONG SteppingDelta;
    202   ULONG Reserved;
    203   KSPROPERTY_BOUNDS_LONG Bounds;
    204 } KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG;
    205 
    206 typedef struct {
    207   DWORDLONG SteppingDelta;
    208   KSPROPERTY_BOUNDS_LONGLONG Bounds;
    209 } KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG;
    210 
    211 #if defined(_NTDDK_)
    212 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
    213 typedef struct _KSDEVICE_DISPATCH KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
    214 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
    215 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY;
    216 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
    217 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
    218 typedef struct _KSFILTER KSFILTER, *PKSFILTER;
    219 typedef struct _KSPIN_DESCRIPTOR_EX KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
    220 typedef struct _KSPIN_DISPATCH KSPIN_DISPATCH, *PKSPIN_DISPATCH;
    221 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
    222 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
    223 typedef struct _KSPIN KSPIN, *PKSPIN;
    224 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
    225 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
    226 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
    227 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
    228 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
    229 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
    230 #endif /* _NTDDK_ */
    231 
    232 typedef PVOID PKSWORKER;
    233 
    234 
    235 typedef struct {
    236   ULONG NotificationType;
    237   __MINGW_EXTENSION union {
    238     struct {
    239       HANDLE Event;
    240       ULONG_PTR Reserved[2];
    241     } EventHandle;
    242     struct {
    243       HANDLE Semaphore;
    244       ULONG Reserved;
    245       LONG Adjustment;
    246     } SemaphoreHandle;
    247 #if defined(_NTDDK_)
    248     struct {
    249       PVOID Event;
    250       KPRIORITY Increment;
    251       ULONG_PTR Reserved;
    252     } EventObject;
    253     struct {
    254       PVOID Semaphore;
    255       KPRIORITY Increment;
    256       LONG Adjustment;
    257     } SemaphoreObject;
    258     struct {
    259       PKDPC Dpc;
    260       ULONG ReferenceCount;
    261       ULONG_PTR Reserved;
    262     } Dpc;
    263     struct {
    264       PWORK_QUEUE_ITEM WorkQueueItem;
    265       WORK_QUEUE_TYPE WorkQueueType;
    266       ULONG_PTR Reserved;
    267     } WorkItem;
    268     struct {
    269       PWORK_QUEUE_ITEM WorkQueueItem;
    270       PKSWORKER KsWorkerObject;
    271       ULONG_PTR Reserved;
    272     } KsWorkItem;
    273 #endif /* _NTDDK_ */
    274     struct {
    275       PVOID Unused;
    276       LONG_PTR Alignment[2];
    277     } Alignment;
    278   };
    279 } KSEVENTDATA,*PKSEVENTDATA;
    280 
    281 #define KSEVENTF_EVENT_HANDLE		0x00000001
    282 #define KSEVENTF_SEMAPHORE_HANDLE	0x00000002
    283 #if defined(_NTDDK_)
    284 #define KSEVENTF_EVENT_OBJECT		0x00000004
    285 #define KSEVENTF_SEMAPHORE_OBJECT	0x00000008
    286 #define KSEVENTF_DPC			0x00000010
    287 #define KSEVENTF_WORKITEM		0x00000020
    288 #define KSEVENTF_KSWORKITEM		0x00000080
    289 #endif /* _NTDDK_ */
    290 
    291 #define KSEVENT_TYPE_ENABLE		0x00000001
    292 #define KSEVENT_TYPE_ONESHOT		0x00000002
    293 #define KSEVENT_TYPE_ENABLEBUFFERED	0x00000004
    294 #define KSEVENT_TYPE_SETSUPPORT		0x00000100
    295 #define KSEVENT_TYPE_BASICSUPPORT	0x00000200
    296 #define KSEVENT_TYPE_QUERYBUFFER	0x00000400
    297 
    298 #define KSEVENT_TYPE_TOPOLOGY		0x10000000
    299 
    300 typedef struct {
    301   KSEVENT Event;
    302   PKSEVENTDATA EventData;
    303   PVOID Reserved;
    304 } KSQUERYBUFFER,*PKSQUERYBUFFER;
    305 
    306 typedef struct {
    307   ULONG Size;
    308   ULONG Flags;
    309   __MINGW_EXTENSION union {
    310     HANDLE ObjectHandle;
    311     PVOID ObjectPointer;
    312   };
    313   PVOID Reserved;
    314   KSEVENT Event;
    315   KSEVENTDATA EventData;
    316 } KSRELATIVEEVENT;
    317 
    318 #define KSRELATIVEEVENT_FLAG_HANDLE	0x00000001
    319 #define KSRELATIVEEVENT_FLAG_POINTER	0x00000002
    320 
    321 typedef struct {
    322   KSEVENTDATA EventData;
    323   LONGLONG MarkTime;
    324 } KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK;
    325 
    326 typedef struct {
    327   KSEVENTDATA EventData;
    328   LONGLONG TimeBase;
    329   LONGLONG Interval;
    330 } KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL;
    331 
    332 typedef struct {
    333   LONGLONG TimeBase;
    334   LONGLONG Interval;
    335 } KSINTERVAL,*PKSINTERVAL;
    336 
    337 #define STATIC_KSPROPSETID_General					\
    338 	0x1464EDA5L,0x6A8F,0x11D1,0x9A,0xA7,0x00,0xA0,0xC9,0x22,0x31,0x96
    339 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196",KSPROPSETID_General);
    340 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
    341 
    342 typedef enum {
    343   KSPROPERTY_GENERAL_COMPONENTID
    344 } KSPROPERTY_GENERAL;
    345 
    346 typedef struct {
    347   GUID Manufacturer;
    348   GUID Product;
    349   GUID Component;
    350   GUID Name;
    351   ULONG Version;
    352   ULONG Revision;
    353 } KSCOMPONENTID,*PKSCOMPONENTID;
    354 
    355 #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)		\
    356 	DEFINE_KSPROPERTY_ITEM(						\
    357 				KSPROPERTY_GENERAL_COMPONENTID,		\
    358 				(Handler),				\
    359 				sizeof(KSPROPERTY),			\
    360 				sizeof(KSCOMPONENTID),			\
    361 				NULL, NULL, 0, NULL, NULL, 0)
    362 
    363 #define STATIC_KSMETHODSETID_StreamIo	\
    364 	0x65D003CAL,0x1523,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
    365 DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196",KSMETHODSETID_StreamIo);
    366 #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
    367 
    368 typedef enum {
    369   KSMETHOD_STREAMIO_READ,
    370   KSMETHOD_STREAMIO_WRITE
    371 } KSMETHOD_STREAMIO;
    372 
    373 #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)			\
    374 	DEFINE_KSMETHOD_ITEM(						\
    375 				KSMETHOD_STREAMIO_READ,			\
    376 				KSMETHOD_TYPE_WRITE,			\
    377 				(Handler),				\
    378 				sizeof(KSMETHOD),			\
    379 				0,					\
    380 				NULL)
    381 
    382 #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)			\
    383 	DEFINE_KSMETHOD_ITEM(						\
    384 				KSMETHOD_STREAMIO_WRITE,		\
    385 				KSMETHOD_TYPE_READ,			\
    386 				(Handler),				\
    387 				sizeof(KSMETHOD),			\
    388 				0,					\
    389 				NULL)
    390 
    391 #define STATIC_KSPROPSETID_MediaSeeking					\
    392 	0xEE904F0CL,0xD09B,0x11D0,0xAB,0xE9,0x00,0xA0,0xC9,0x22,0x31,0x96
    393 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196",KSPROPSETID_MediaSeeking);
    394 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
    395 
    396 typedef enum {
    397   KSPROPERTY_MEDIASEEKING_CAPABILITIES,
    398   KSPROPERTY_MEDIASEEKING_FORMATS,
    399   KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
    400   KSPROPERTY_MEDIASEEKING_POSITION,
    401   KSPROPERTY_MEDIASEEKING_STOPPOSITION,
    402   KSPROPERTY_MEDIASEEKING_POSITIONS,
    403   KSPROPERTY_MEDIASEEKING_DURATION,
    404   KSPROPERTY_MEDIASEEKING_AVAILABLE,
    405   KSPROPERTY_MEDIASEEKING_PREROLL,
    406   KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
    407 } KSPROPERTY_MEDIASEEKING;
    408 
    409 typedef enum {
    410   KS_SEEKING_NoPositioning,
    411   KS_SEEKING_AbsolutePositioning,
    412   KS_SEEKING_RelativePositioning,
    413   KS_SEEKING_IncrementalPositioning,
    414   KS_SEEKING_PositioningBitsMask = 0x3,
    415   KS_SEEKING_SeekToKeyFrame,
    416   KS_SEEKING_ReturnTime = 0x8
    417 } KS_SEEKING_FLAGS;
    418 
    419 typedef enum {
    420   KS_SEEKING_CanSeekAbsolute = 0x1,
    421   KS_SEEKING_CanSeekForwards = 0x2,
    422   KS_SEEKING_CanSeekBackwards = 0x4,
    423   KS_SEEKING_CanGetCurrentPos = 0x8,
    424   KS_SEEKING_CanGetStopPos = 0x10,
    425   KS_SEEKING_CanGetDuration = 0x20,
    426   KS_SEEKING_CanPlayBackwards = 0x40
    427 } KS_SEEKING_CAPABILITIES;
    428 
    429 typedef struct {
    430   LONGLONG Current;
    431   LONGLONG Stop;
    432   KS_SEEKING_FLAGS CurrentFlags;
    433   KS_SEEKING_FLAGS StopFlags;
    434 } KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS;
    435 
    436 typedef struct {
    437   LONGLONG Earliest;
    438   LONGLONG Latest;
    439 } KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE;
    440 
    441 typedef struct {
    442   KSPROPERTY Property;
    443   GUID SourceFormat;
    444   GUID TargetFormat;
    445   LONGLONG Time;
    446 } KSP_TIMEFORMAT,*PKSP_TIMEFORMAT;
    447 
    448 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)	\
    449 	DEFINE_KSPROPERTY_ITEM(						\
    450 				KSPROPERTY_MEDIASEEKING_CAPABILITIES,	\
    451 				(Handler),				\
    452 				sizeof(KSPROPERTY),			\
    453 				sizeof(KS_SEEKING_CAPABILITIES),	\
    454 				NULL, NULL, 0, NULL, NULL, 0)
    455 
    456 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)		\
    457 	DEFINE_KSPROPERTY_ITEM(						\
    458 				KSPROPERTY_MEDIASEEKING_FORMATS,	\
    459 				(Handler),				\
    460 				sizeof(KSPROPERTY),			\
    461 				0,					\
    462 				NULL, NULL, 0, NULL, NULL, 0)
    463 
    464 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler,SetHandler) \
    465 	DEFINE_KSPROPERTY_ITEM(						\
    466 				KSPROPERTY_MEDIASEEKING_TIMEFORMAT,	\
    467 				(GetHandler),				\
    468 				sizeof(KSPROPERTY),			\
    469 				sizeof(GUID),				\
    470 				(SetHandler),				\
    471 				NULL, 0, NULL, NULL, 0)
    472 
    473 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)		\
    474 	DEFINE_KSPROPERTY_ITEM(						\
    475 				KSPROPERTY_MEDIASEEKING_POSITION,	\
    476 				(Handler),				\
    477 				sizeof(KSPROPERTY),			\
    478 				sizeof(LONGLONG),			\
    479 				NULL, NULL, 0, NULL, NULL, 0)
    480 
    481 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)	\
    482 	DEFINE_KSPROPERTY_ITEM(						\
    483 				KSPROPERTY_MEDIASEEKING_STOPPOSITION,	\
    484 				(Handler),				\
    485 				sizeof(KSPROPERTY),			\
    486 				sizeof(LONGLONG),			\
    487 				NULL, NULL, 0, NULL, NULL, 0)
    488 
    489 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)		\
    490 	DEFINE_KSPROPERTY_ITEM(						\
    491 				KSPROPERTY_MEDIASEEKING_POSITIONS,	\
    492 				NULL,					\
    493 				sizeof(KSPROPERTY),			\
    494 				sizeof(KSPROPERTY_POSITIONS),		\
    495 				(Handler),				\
    496 				NULL, 0, NULL, NULL, 0)
    497 
    498 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)		\
    499 	DEFINE_KSPROPERTY_ITEM(						\
    500 				KSPROPERTY_MEDIASEEKING_DURATION,	\
    501 				(Handler),				\
    502 				sizeof(KSPROPERTY),			\
    503 				sizeof(LONGLONG),			\
    504 				NULL, NULL, 0, NULL, NULL, 0)
    505 
    506 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)		\
    507 	DEFINE_KSPROPERTY_ITEM(						\
    508 				KSPROPERTY_MEDIASEEKING_AVAILABLE,	\
    509 				(Handler),				\
    510 				sizeof(KSPROPERTY),			\
    511 				sizeof(KSPROPERTY_MEDIAAVAILABLE),	\
    512 				NULL, NULL, 0, NULL, NULL, 0)
    513 
    514 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)		\
    515 	DEFINE_KSPROPERTY_ITEM(						\
    516 				KSPROPERTY_MEDIASEEKING_PREROLL,	\
    517 				(Handler),				\
    518 				sizeof(KSPROPERTY),			\
    519 				sizeof(LONGLONG),			\
    520 				NULL, NULL, 0, NULL, NULL, 0)
    521 
    522 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)	\
    523 	DEFINE_KSPROPERTY_ITEM(						\
    524 				KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT, \
    525 				(Handler),				\
    526 				sizeof(KSP_TIMEFORMAT),			\
    527 				sizeof(LONGLONG),			\
    528 				NULL, NULL, 0, NULL, NULL, 0)
    529 
    530 #define STATIC_KSPROPSETID_Topology					\
    531 	0x720D4AC0L,0x7533,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    532 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000",KSPROPSETID_Topology);
    533 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
    534 
    535 typedef enum {
    536   KSPROPERTY_TOPOLOGY_CATEGORIES,
    537   KSPROPERTY_TOPOLOGY_NODES,
    538   KSPROPERTY_TOPOLOGY_CONNECTIONS,
    539   KSPROPERTY_TOPOLOGY_NAME
    540 } KSPROPERTY_TOPOLOGY;
    541 
    542 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)		\
    543 	DEFINE_KSPROPERTY_ITEM(						\
    544 				KSPROPERTY_TOPOLOGY_CATEGORIES,		\
    545 				(Handler),				\
    546 				sizeof(KSPROPERTY),			\
    547 				0,					\
    548 				NULL, NULL, 0,NULL, NULL, 0)
    549 
    550 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)			\
    551 	DEFINE_KSPROPERTY_ITEM(						\
    552 				KSPROPERTY_TOPOLOGY_NODES,		\
    553 				(Handler),				\
    554 				sizeof(KSPROPERTY),			\
    555 				0,					\
    556 				NULL, NULL, 0, NULL, NULL, 0)
    557 
    558 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)		\
    559 	DEFINE_KSPROPERTY_ITEM(						\
    560 				KSPROPERTY_TOPOLOGY_CONNECTIONS,	\
    561 				(Handler),				\
    562 				sizeof(KSPROPERTY),			\
    563 				0,					\
    564 				NULL, NULL, 0, NULL, NULL, 0)
    565 
    566 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)			\
    567 	DEFINE_KSPROPERTY_ITEM(						\
    568 				KSPROPERTY_TOPOLOGY_NAME,		\
    569 				(Handler),				\
    570 				sizeof(KSP_NODE),			\
    571 				0,					\
    572 				NULL, NULL, 0, NULL, NULL, 0)
    573 
    574 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet,Handler)		\
    575 DEFINE_KSPROPERTY_TABLE(TopologySet) {					\
    576 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),		\
    577 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),			\
    578 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),		\
    579 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)			\
    580 }
    581 
    582 #define STATIC_KSCATEGORY_BRIDGE					\
    583 	0x085AFF00L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    584 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000",KSCATEGORY_BRIDGE);
    585 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
    586 
    587 #define STATIC_KSCATEGORY_CAPTURE					\
    588 	0x65E8773DL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96
    589 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_CAPTURE);
    590 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
    591 
    592 #define STATIC_KSCATEGORY_RENDER					\
    593 	0x65E8773EL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96
    594 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_RENDER);
    595 #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
    596 
    597 #define STATIC_KSCATEGORY_MIXER						\
    598 	0xAD809C00L,0x7B88,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    599 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000",KSCATEGORY_MIXER);
    600 #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
    601 
    602 #define STATIC_KSCATEGORY_SPLITTER					\
    603 	0x0A4252A0L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    604 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_SPLITTER);
    605 #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
    606 
    607 #define STATIC_KSCATEGORY_DATACOMPRESSOR				\
    608 	0x1E84C900L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    609 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATACOMPRESSOR);
    610 #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
    611 
    612 #define STATIC_KSCATEGORY_DATADECOMPRESSOR				\
    613 	0x2721AE20L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    614 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATADECOMPRESSOR);
    615 #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
    616 
    617 #define STATIC_KSCATEGORY_DATATRANSFORM					\
    618 	0x2EB07EA0L,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    619 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATATRANSFORM);
    620 #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
    621 
    622 #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM			\
    623 	0xCF1DDA2CL,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96
    624 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_COMMUNICATIONSTRANSFORM);
    625 #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
    626 
    627 #define STATIC_KSCATEGORY_INTERFACETRANSFORM				\
    628 	0xCF1DDA2DL,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96
    629 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_INTERFACETRANSFORM);
    630 #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
    631 
    632 #define STATIC_KSCATEGORY_MEDIUMTRANSFORM				\
    633 	0xCF1DDA2EL,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96
    634 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_MEDIUMTRANSFORM);
    635 #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
    636 
    637 #define STATIC_KSCATEGORY_FILESYSTEM					\
    638 	0x760FED5EL,0x9357,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96
    639 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196",KSCATEGORY_FILESYSTEM);
    640 #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
    641 
    642 #define STATIC_KSCATEGORY_CLOCK						\
    643 	0x53172480L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    644 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSCATEGORY_CLOCK);
    645 #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
    646 
    647 #define STATIC_KSCATEGORY_PROXY						\
    648 	0x97EBAACAL,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96
    649 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_PROXY);
    650 #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
    651 
    652 #define STATIC_KSCATEGORY_QUALITY					\
    653 	0x97EBAACBL,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96
    654 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_QUALITY);
    655 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
    656 
    657 typedef struct {
    658   ULONG FromNode;
    659   ULONG FromNodePin;
    660   ULONG ToNode;
    661   ULONG ToNodePin;
    662 } KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION;
    663 
    664 typedef struct {
    665   ULONG CategoriesCount;
    666   const GUID *Categories;
    667   ULONG TopologyNodesCount;
    668   const GUID *TopologyNodes;
    669   ULONG TopologyConnectionsCount;
    670   const KSTOPOLOGY_CONNECTION *TopologyConnections;
    671   const GUID *TopologyNodesNames;
    672   ULONG Reserved;
    673 } KSTOPOLOGY,*PKSTOPOLOGY;
    674 
    675 #define KSFILTER_NODE	((ULONG)-1)
    676 #define KSALL_NODES	((ULONG)-1)
    677 
    678 typedef struct {
    679   ULONG CreateFlags;
    680   ULONG Node;
    681 } KSNODE_CREATE,*PKSNODE_CREATE;
    682 
    683 #define STATIC_KSTIME_FORMAT_NONE	STATIC_GUID_NULL
    684 #define KSTIME_FORMAT_NONE		GUID_NULL
    685 
    686 #define STATIC_KSTIME_FORMAT_FRAME					\
    687 	0x7b785570L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6
    688 DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FRAME);
    689 #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME)
    690 
    691 #define STATIC_KSTIME_FORMAT_BYTE					\
    692 	0x7b785571L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6
    693 DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_BYTE);
    694 #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE)
    695 
    696 #define STATIC_KSTIME_FORMAT_SAMPLE					\
    697 	0x7b785572L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6
    698 DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_SAMPLE);
    699 #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE)
    700 
    701 #define STATIC_KSTIME_FORMAT_FIELD					\
    702 	0x7b785573L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6
    703 DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FIELD);
    704 #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD)
    705 
    706 #define STATIC_KSTIME_FORMAT_MEDIA_TIME					\
    707 	0x7b785574L,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6
    708 DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_MEDIA_TIME);
    709 #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
    710 
    711 typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE;
    712 
    713 #define STATIC_KSINTERFACESETID_Standard				\
    714 	0x1A8766A0L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    715 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000",KSINTERFACESETID_Standard);
    716 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
    717 
    718 typedef enum {
    719   KSINTERFACE_STANDARD_STREAMING,
    720   KSINTERFACE_STANDARD_LOOPED_STREAMING,
    721   KSINTERFACE_STANDARD_CONTROL
    722 } KSINTERFACE_STANDARD;
    723 
    724 #define STATIC_KSINTERFACESETID_FileIo					\
    725 	0x8C6F932CL,0xE771,0x11D0,0xB8,0xFF,0x00,0xA0,0xC9,0x22,0x31,0x96
    726 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196",KSINTERFACESETID_FileIo);
    727 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
    728 
    729 typedef enum {
    730   KSINTERFACE_FILEIO_STREAMING
    731 } KSINTERFACE_FILEIO;
    732 
    733 #define KSMEDIUM_TYPE_ANYINSTANCE		0
    734 
    735 #define STATIC_KSMEDIUMSETID_Standard					\
    736 	0x4747B320L,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
    737 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000",KSMEDIUMSETID_Standard);
    738 #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
    739 
    740 #define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE
    741 
    742 #define STATIC_KSPROPSETID_Pin						\
    743 	0x8C134960L,0x51AD,0x11CF,0x87,0x8A,0x94,0xF8,0x01,0xC1,0x00,0x00
    744 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000",KSPROPSETID_Pin);
    745 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
    746 
    747 typedef enum {
    748   KSPROPERTY_PIN_CINSTANCES,
    749   KSPROPERTY_PIN_CTYPES,
    750   KSPROPERTY_PIN_DATAFLOW,
    751   KSPROPERTY_PIN_DATARANGES,
    752   KSPROPERTY_PIN_DATAINTERSECTION,
    753   KSPROPERTY_PIN_INTERFACES,
    754   KSPROPERTY_PIN_MEDIUMS,
    755   KSPROPERTY_PIN_COMMUNICATION,
    756   KSPROPERTY_PIN_GLOBALCINSTANCES,
    757   KSPROPERTY_PIN_NECESSARYINSTANCES,
    758   KSPROPERTY_PIN_PHYSICALCONNECTION,
    759   KSPROPERTY_PIN_CATEGORY,
    760   KSPROPERTY_PIN_NAME,
    761   KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
    762   KSPROPERTY_PIN_PROPOSEDATAFORMAT
    763 } KSPROPERTY_PIN;
    764 
    765 typedef struct {
    766   KSPROPERTY Property;
    767   ULONG PinId;
    768   ULONG Reserved;
    769 } KSP_PIN,*PKSP_PIN;
    770 
    771 #define KSINSTANCE_INDETERMINATE	((ULONG)-1)
    772 
    773 typedef struct {
    774   ULONG PossibleCount;
    775   ULONG CurrentCount;
    776 } KSPIN_CINSTANCES,*PKSPIN_CINSTANCES;
    777 
    778 typedef enum {
    779   KSPIN_DATAFLOW_IN = 1,
    780   KSPIN_DATAFLOW_OUT
    781 } KSPIN_DATAFLOW,*PKSPIN_DATAFLOW;
    782 
    783 #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION	0
    784 #define KSDATAFORMAT_TEMPORAL_COMPRESSION	(1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION)
    785 #define KSDATAFORMAT_BIT_ATTRIBUTES		1
    786 #define KSDATAFORMAT_ATTRIBUTES			(1 << KSDATAFORMAT_BIT_ATTRIBUTES)
    787 
    788 #define KSDATARANGE_BIT_ATTRIBUTES		1
    789 #define KSDATARANGE_ATTRIBUTES			(1 << KSDATARANGE_BIT_ATTRIBUTES)
    790 #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES	2
    791 #define KSDATARANGE_REQUIRED_ATTRIBUTES		(1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES)
    792 
    793 typedef union {
    794   __MINGW_EXTENSION struct {
    795     ULONG FormatSize;
    796     ULONG Flags;
    797     ULONG SampleSize;
    798     ULONG Reserved;
    799     GUID MajorFormat;
    800     GUID SubFormat;
    801     GUID Specifier;
    802   };
    803   LONGLONG Alignment;
    804 } KSDATAFORMAT,*PKSDATAFORMAT,KSDATARANGE,*PKSDATARANGE;
    805 
    806 #define KSATTRIBUTE_REQUIRED		0x00000001
    807 
    808 typedef struct {
    809   ULONG Size;
    810   ULONG Flags;
    811   GUID Attribute;
    812 } KSATTRIBUTE,*PKSATTRIBUTE;
    813 
    814 #if defined(_NTDDK_)
    815 typedef struct {
    816   ULONG Count;
    817   PKSATTRIBUTE *Attributes;
    818 } KSATTRIBUTE_LIST,*PKSATTRIBUTE_LIST;
    819 #endif /* _NTDDK_ */
    820 
    821 typedef enum {
    822   KSPIN_COMMUNICATION_NONE,
    823   KSPIN_COMMUNICATION_SINK,
    824   KSPIN_COMMUNICATION_SOURCE,
    825   KSPIN_COMMUNICATION_BOTH,
    826   KSPIN_COMMUNICATION_BRIDGE
    827 } KSPIN_COMMUNICATION,*PKSPIN_COMMUNICATION;
    828 
    829 typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM;
    830 
    831 typedef struct {
    832   KSPIN_INTERFACE Interface;
    833   KSPIN_MEDIUM Medium;
    834   ULONG PinId;
    835   HANDLE PinToHandle;
    836   KSPRIORITY Priority;
    837 } KSPIN_CONNECT,*PKSPIN_CONNECT;
    838 
    839 typedef struct {
    840   ULONG Size;
    841   ULONG Pin;
    842   WCHAR SymbolicLinkName[1];
    843 } KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION;
    844 
    845 #if defined(_NTDDK_)
    846 typedef NTSTATUS (*PFNKSINTERSECTHANDLER) ( PIRP Irp, PKSP_PIN Pin,
    847 					    PKSDATARANGE DataRange,
    848 					    PVOID Data);
    849 typedef NTSTATUS (*PFNKSINTERSECTHANDLEREX)(PVOID Context, PIRP Irp,
    850 					    PKSP_PIN Pin,
    851 					    PKSDATARANGE DataRange,
    852 					    PKSDATARANGE MatchingDataRange,
    853 					    ULONG DataBufferSize,
    854 					    PVOID Data,
    855 					    PULONG DataSize);
    856 #endif /* _NTDDK_ */
    857 
    858 #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)				\
    859 	const KSPIN_INTERFACE tablename[] =
    860 
    861 #define DEFINE_KSPIN_INTERFACE_ITEM(guid,_interFace)			\
    862 	{								\
    863 		STATICGUIDOF(guid),					\
    864 		(_interFace),						\
    865 		0							\
    866 	}
    867 
    868 #define DEFINE_KSPIN_MEDIUM_TABLE(tablename)				\
    869 	const KSPIN_MEDIUM tablename[] =
    870 
    871 #define DEFINE_KSPIN_MEDIUM_ITEM(guid,medium)				\
    872 		DEFINE_KSPIN_INTERFACE_ITEM(guid,medium)
    873 
    874 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)			\
    875 	DEFINE_KSPROPERTY_ITEM(						\
    876 				KSPROPERTY_PIN_CINSTANCES,		\
    877 				(Handler),				\
    878 				sizeof(KSP_PIN),			\
    879 				sizeof(KSPIN_CINSTANCES),		\
    880 				NULL, NULL, 0, NULL, NULL, 0)
    881 
    882 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)			\
    883 	DEFINE_KSPROPERTY_ITEM(						\
    884 				KSPROPERTY_PIN_CTYPES,			\
    885 				(Handler),				\
    886 				sizeof(KSPROPERTY),			\
    887 				sizeof(ULONG),				\
    888 				NULL, NULL, 0, NULL, NULL, 0)
    889 
    890 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)			\
    891 	DEFINE_KSPROPERTY_ITEM(						\
    892 				KSPROPERTY_PIN_DATAFLOW,		\
    893 				(Handler),				\
    894 				sizeof(KSP_PIN),			\
    895 				sizeof(KSPIN_DATAFLOW),			\
    896 				NULL, NULL, 0, NULL, NULL, 0)
    897 
    898 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)			\
    899 	DEFINE_KSPROPERTY_ITEM(						\
    900 				KSPROPERTY_PIN_DATARANGES,		\
    901 				(Handler),				\
    902 				sizeof(KSP_PIN),			\
    903 				0,					\
    904 				NULL, NULL, 0, NULL, NULL, 0)
    905 
    906 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)		\
    907 	DEFINE_KSPROPERTY_ITEM(						\
    908 				KSPROPERTY_PIN_DATAINTERSECTION,	\
    909 				(Handler),				\
    910 				sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
    911 				0,					\
    912 				NULL, NULL, 0, NULL, NULL, 0)
    913 
    914 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)			\
    915 	DEFINE_KSPROPERTY_ITEM(						\
    916 				KSPROPERTY_PIN_INTERFACES,		\
    917 				(Handler),				\
    918 				sizeof(KSP_PIN),			\
    919 				0,					\
    920 				NULL, NULL, 0, NULL, NULL, 0)
    921 
    922 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)			\
    923 	DEFINE_KSPROPERTY_ITEM(						\
    924 				KSPROPERTY_PIN_MEDIUMS,			\
    925 				(Handler),				\
    926 				sizeof(KSP_PIN),			\
    927 				0,					\
    928 				NULL, NULL, 0, NULL, NULL, 0)
    929 
    930 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)		\
    931 	DEFINE_KSPROPERTY_ITEM(						\
    932 				KSPROPERTY_PIN_COMMUNICATION,		\
    933 				(Handler),				\
    934 				sizeof(KSP_PIN),			\
    935 				sizeof(KSPIN_COMMUNICATION),		\
    936 				NULL, NULL, 0, NULL, NULL, 0)
    937 
    938 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)		\
    939 	DEFINE_KSPROPERTY_ITEM(						\
    940 				KSPROPERTY_PIN_GLOBALCINSTANCES,	\
    941 				(Handler),				\
    942 				sizeof(KSP_PIN),			\
    943 				sizeof(KSPIN_CINSTANCES),		\
    944 				NULL, NULL, 0, NULL, NULL, 0)
    945 
    946 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)		\
    947 	DEFINE_KSPROPERTY_ITEM(						\
    948 				KSPROPERTY_PIN_NECESSARYINSTANCES,	\
    949 				(Handler),				\
    950 				sizeof(KSP_PIN),			\
    951 				sizeof(ULONG),				\
    952 				NULL, NULL, 0, NULL, NULL, 0)
    953 
    954 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)		\
    955 	DEFINE_KSPROPERTY_ITEM(						\
    956 				KSPROPERTY_PIN_PHYSICALCONNECTION,	\
    957 				(Handler),				\
    958 				sizeof(KSP_PIN),			\
    959 				0,					\
    960 				NULL, NULL, 0, NULL, NULL, 0)
    961 
    962 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)			\
    963 	DEFINE_KSPROPERTY_ITEM(						\
    964 				KSPROPERTY_PIN_CATEGORY,		\
    965 				(Handler),				\
    966 				sizeof(KSP_PIN),			\
    967 				sizeof(GUID),				\
    968 				NULL, NULL, 0, NULL, NULL, 0)
    969 
    970 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)			\
    971 	DEFINE_KSPROPERTY_ITEM(						\
    972 				KSPROPERTY_PIN_NAME,			\
    973 				(Handler),				\
    974 				sizeof(KSP_PIN),			\
    975 				0,					\
    976 				NULL, NULL, 0, NULL, NULL, 0)
    977 
    978 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)	\
    979 	DEFINE_KSPROPERTY_ITEM(						\
    980 				KSPROPERTY_PIN_CONSTRAINEDDATARANGES,	\
    981 				(Handler),				\
    982 				sizeof(KSP_PIN),			\
    983 				0,					\
    984 				NULL, NULL, 0, NULL, NULL, 0)
    985 
    986 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)		\
    987 	DEFINE_KSPROPERTY_ITEM(						\
    988 				KSPROPERTY_PIN_PROPOSEDATAFORMAT,	\
    989 				NULL,					\
    990 				sizeof(KSP_PIN),			\
    991 				sizeof(KSDATAFORMAT),			\
    992 				(Handler), NULL, 0, NULL, NULL, 0)
    993 
    994 #define DEFINE_KSPROPERTY_PINSET(PinSet,PropGeneral,PropInstances,PropIntersection) \
    995 DEFINE_KSPROPERTY_TABLE(PinSet) {					\
    996 	DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),		\
    997 	DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),			\
    998 	DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),		\
    999 	DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),		\
   1000 	DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),	\
   1001 	DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),		\
   1002 	DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),		\
   1003 	DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),		\
   1004 	DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),		\
   1005 	DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)			\
   1006 }
   1007 
   1008 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,PropGeneral,PropInstances,PropIntersection) \
   1009 DEFINE_KSPROPERTY_TABLE(PinSet) {					\
   1010 	DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),		\
   1011 	DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),			\
   1012 	DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),		\
   1013 	DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),		\
   1014 	DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),	\
   1015 	DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),		\
   1016 	DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),		\
   1017 	DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),		\
   1018 	DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),		\
   1019 	DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),			\
   1020 	DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)	\
   1021 }
   1022 
   1023 #define STATIC_KSNAME_Filter						\
   1024 	0x9b365890L,0x165f,0x11d0,0xa1,0x95,0x00,0x20,0xaf,0xd1,0x56,0xe4
   1025 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4",KSNAME_Filter);
   1026 #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
   1027 
   1028 #define KSSTRING_Filter		L"{9B365890-165F-11D0-A195-0020AFD156E4}"
   1029 
   1030 #define STATIC_KSNAME_Pin						\
   1031 	0x146F1A80L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1032 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000",KSNAME_Pin);
   1033 #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
   1034 
   1035 #define KSSTRING_Pin		L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
   1036 
   1037 #define STATIC_KSNAME_Clock						\
   1038 	0x53172480L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1039 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSNAME_Clock);
   1040 #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock)
   1041 
   1042 #define KSSTRING_Clock		L"{53172480-4791-11D0-A5D6-28DB04C10000}"
   1043 
   1044 #define STATIC_KSNAME_Allocator						\
   1045 	0x642F5D00L,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1046 DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000",KSNAME_Allocator);
   1047 #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator)
   1048 
   1049 #define KSSTRING_Allocator	L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
   1050 
   1051 #define KSSTRING_AllocatorEx	L"{091BB63B-603F-11D1-B067-00A0C9062802}"
   1052 
   1053 #define STATIC_KSNAME_TopologyNode					\
   1054 	0x0621061AL,0xEE75,0x11D0,0xB9,0x15,0x00,0xA0,0xC9,0x22,0x31,0x96
   1055 DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196",KSNAME_TopologyNode);
   1056 #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode)
   1057 
   1058 #define KSSTRING_TopologyNode	L"{0621061A-EE75-11D0-B915-00A0C9223196}"
   1059 
   1060 #if defined(_NTDDK_)
   1061 typedef struct {
   1062   ULONG InterfacesCount;
   1063   const KSPIN_INTERFACE *Interfaces;
   1064   ULONG MediumsCount;
   1065   const KSPIN_MEDIUM *Mediums;
   1066   ULONG DataRangesCount;
   1067   const PKSDATARANGE *DataRanges;
   1068   KSPIN_DATAFLOW DataFlow;
   1069   KSPIN_COMMUNICATION Communication;
   1070   const GUID *Category;
   1071   const GUID *Name;
   1072   __MINGW_EXTENSION union {
   1073     LONGLONG Reserved;
   1074     __MINGW_EXTENSION struct {
   1075       ULONG ConstrainedDataRangesCount;
   1076       PKSDATARANGE *ConstrainedDataRanges;
   1077     };
   1078   };
   1079 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
   1080 typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR;
   1081 
   1082 #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)			\
   1083 	const KSPIN_DESCRIPTOR tablename[] =
   1084 
   1085 #define DEFINE_KSPIN_DESCRIPTOR_ITEM(InterfacesCount,Interfaces,MediumsCount, Mediums,DataRangesCount,DataRanges,DataFlow,Communication)\
   1086 {									\
   1087 		InterfacesCount, Interfaces, MediumsCount, Mediums,	\
   1088 		DataRangesCount, DataRanges, DataFlow, Communication,	\
   1089 		NULL, NULL, 0						\
   1090 }
   1091 
   1092 #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(InterfacesCount,Interfaces,MediumsCount,Mediums,DataRangesCount,DataRanges,DataFlow,Communication,Category,Name)\
   1093 {									\
   1094 		InterfacesCount, Interfaces, MediumsCount, Mediums,	\
   1095 		DataRangesCount, DataRanges, DataFlow, Communication,	\
   1096 		Category, Name, 0					\
   1097 }
   1098 #endif /* _NTDDK_ */
   1099 
   1100 #define STATIC_KSDATAFORMAT_TYPE_WILDCARD	STATIC_GUID_NULL
   1101 #define KSDATAFORMAT_TYPE_WILDCARD		GUID_NULL
   1102 
   1103 #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD	STATIC_GUID_NULL
   1104 #define KSDATAFORMAT_SUBTYPE_WILDCARD		GUID_NULL
   1105 
   1106 #define STATIC_KSDATAFORMAT_TYPE_STREAM					\
   1107 	0xE436EB83L,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70
   1108 DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_TYPE_STREAM);
   1109 #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM)
   1110 
   1111 #define STATIC_KSDATAFORMAT_SUBTYPE_NONE				\
   1112 	0xE436EB8EL,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70
   1113 DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_SUBTYPE_NONE);
   1114 #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE)
   1115 
   1116 #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD	STATIC_GUID_NULL
   1117 #define KSDATAFORMAT_SPECIFIER_WILDCARD		GUID_NULL
   1118 
   1119 #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME				\
   1120 	0xAA797B40L,0xE974,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1121 DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000",KSDATAFORMAT_SPECIFIER_FILENAME);
   1122 #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME)
   1123 
   1124 #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE			\
   1125 	0x65E8773CL,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96
   1126 DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196",KSDATAFORMAT_SPECIFIER_FILEHANDLE);
   1127 #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE)
   1128 
   1129 #define STATIC_KSDATAFORMAT_SPECIFIER_NONE				\
   1130 	0x0F6417D6L,0xC318,0x11D0,0xA4,0x3F,0x00,0xA0,0xC9,0x22,0x31,0x96
   1131 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196",KSDATAFORMAT_SPECIFIER_NONE);
   1132 #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
   1133 
   1134 #define STATIC_KSPROPSETID_Quality					\
   1135 	0xD16AD380L,0xAC1A,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1136 DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000",KSPROPSETID_Quality);
   1137 #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
   1138 
   1139 typedef enum {
   1140   KSPROPERTY_QUALITY_REPORT,
   1141   KSPROPERTY_QUALITY_ERROR
   1142 } KSPROPERTY_QUALITY;
   1143 
   1144 #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler,SetHandler)	\
   1145 	DEFINE_KSPROPERTY_ITEM(						\
   1146 				KSPROPERTY_QUALITY_REPORT,		\
   1147 				(GetHandler),				\
   1148 				sizeof(KSPROPERTY),			\
   1149 				sizeof(KSQUALITY),			\
   1150 				(SetHandler),				\
   1151 				NULL, 0, NULL, NULL, 0)
   1152 
   1153 #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler,SetHandler)	\
   1154 	DEFINE_KSPROPERTY_ITEM(						\
   1155 				KSPROPERTY_QUALITY_ERROR,		\
   1156 				(GetHandler),				\
   1157 				sizeof(KSPROPERTY),			\
   1158 				sizeof(KSERROR),			\
   1159 				(SetHandler),				\
   1160 				NULL, 0, NULL, NULL, 0)
   1161 
   1162 #define STATIC_KSPROPSETID_Connection					\
   1163 	0x1D58C920L,0xAC9B,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1164 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000",KSPROPSETID_Connection);
   1165 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
   1166 
   1167 typedef enum {
   1168   KSPROPERTY_CONNECTION_STATE,
   1169   KSPROPERTY_CONNECTION_PRIORITY,
   1170   KSPROPERTY_CONNECTION_DATAFORMAT,
   1171   KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
   1172   KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
   1173   KSPROPERTY_CONNECTION_ACQUIREORDERING,
   1174   KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
   1175   KSPROPERTY_CONNECTION_STARTAT
   1176 } KSPROPERTY_CONNECTION;
   1177 
   1178 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler,SetHandler)	\
   1179 	DEFINE_KSPROPERTY_ITEM(						\
   1180 				KSPROPERTY_CONNECTION_STATE,		\
   1181 				(GetHandler),				\
   1182 				sizeof(KSPROPERTY),			\
   1183 				sizeof(KSSTATE),			\
   1184 				(SetHandler),				\
   1185 				NULL, 0, NULL, NULL, 0)
   1186 
   1187 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler,SetHandler) \
   1188 	DEFINE_KSPROPERTY_ITEM(						\
   1189 				KSPROPERTY_CONNECTION_PRIORITY,		\
   1190 				(GetHandler),				\
   1191 				sizeof(KSPROPERTY),			\
   1192 				sizeof(KSPRIORITY),			\
   1193 				(SetHandler),				\
   1194 				NULL, 0, NULL, NULL, 0)
   1195 
   1196 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler,SetHandler)\
   1197 	DEFINE_KSPROPERTY_ITEM(						\
   1198 				KSPROPERTY_CONNECTION_DATAFORMAT,	\
   1199 				(GetHandler),				\
   1200 				sizeof(KSPROPERTY),			\
   1201 				0,					\
   1202 				(SetHandler),				\
   1203 				NULL, 0, NULL, NULL, 0)
   1204 
   1205 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)	\
   1206 	DEFINE_KSPROPERTY_ITEM(						\
   1207 				KSPROPERTY_CONNECTION_ALLOCATORFRAMING,	\
   1208 				(Handler),				\
   1209 				sizeof(KSPROPERTY),			\
   1210 				sizeof(KSALLOCATOR_FRAMING),		\
   1211 				NULL, NULL, 0, NULL, NULL, 0)
   1212 
   1213 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)	\
   1214 	DEFINE_KSPROPERTY_ITEM(						\
   1215 				KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
   1216 				(Handler),				\
   1217 				sizeof(KSPROPERTY),			\
   1218 				0,					\
   1219 				NULL, NULL, 0, NULL, NULL, 0)
   1220 
   1221 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)	\
   1222 	DEFINE_KSPROPERTY_ITEM(						\
   1223 				KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
   1224 				NULL,					\
   1225 				sizeof(KSPROPERTY),			\
   1226 				sizeof(KSDATAFORMAT),			\
   1227 				(Handler),				\
   1228 				NULL, 0, NULL, NULL, 0)
   1229 
   1230 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)	\
   1231 	DEFINE_KSPROPERTY_ITEM(						\
   1232 				KSPROPERTY_CONNECTION_ACQUIREORDERING,	\
   1233 				(Handler),				\
   1234 				sizeof(KSPROPERTY),			\
   1235 				sizeof(int),				\
   1236 				NULL, NULL, 0, NULL, NULL, 0)
   1237 
   1238 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)		\
   1239 	DEFINE_KSPROPERTY_ITEM(						\
   1240 				KSPROPERTY_CONNECTION_STARTAT,		\
   1241 				NULL,					\
   1242 				sizeof(KSPROPERTY),			\
   1243 				sizeof(KSRELATIVEEVENT),		\
   1244 				(Handler),				\
   1245 				NULL, 0, NULL, NULL, 0)
   1246 
   1247 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER	0x00000001
   1248 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY		0x00000002
   1249 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY	0x00000004
   1250 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE		0x00000008
   1251 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY	0x80000000
   1252 
   1253 #define KSALLOCATOR_OPTIONF_COMPATIBLE			0x00000001
   1254 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY		0x00000002
   1255 #define KSALLOCATOR_OPTIONF_VALID			0x00000003
   1256 
   1257 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT		0x00000010
   1258 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC		0x00000020
   1259 #define KSALLOCATOR_FLAG_CAN_ALLOCATE			0x00000040
   1260 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO	0x00000080
   1261 #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY		0x00000100
   1262 #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT		0x00000200
   1263 #define KSALLOCATOR_FLAG_CYCLE				0x00000400
   1264 #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS		0x00000800
   1265 #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES		0x00001000
   1266 #define KSALLOCATOR_FLAG_ATTENTION_STEPPING		0x00002000
   1267 
   1268 typedef struct {
   1269   __MINGW_EXTENSION union {
   1270     ULONG OptionsFlags;
   1271     ULONG RequirementsFlags;
   1272   };
   1273 #if defined(_NTDDK_)
   1274   POOL_TYPE PoolType;
   1275 #else
   1276   ULONG PoolType;
   1277 #endif /* _NTDDK_ */
   1278   ULONG Frames;
   1279   ULONG FrameSize;
   1280   ULONG FileAlignment;
   1281   ULONG Reserved;
   1282 } KSALLOCATOR_FRAMING,*PKSALLOCATOR_FRAMING;
   1283 
   1284 #if defined(_NTDDK_)
   1285 typedef PVOID (*PFNKSDEFAULTALLOCATE)(PVOID Context);
   1286 typedef VOID (*PFNKSDEFAULTFREE)(PVOID Context, PVOID Buffer);
   1287 typedef NTSTATUS (*PFNKSINITIALIZEALLOCATOR)(PVOID InitialContext,
   1288 					PKSALLOCATOR_FRAMING AllocatorFraming,
   1289 					PVOID* Context);
   1290 typedef VOID (*PFNKSDELETEALLOCATOR) (PVOID Context);
   1291 #endif /* _NTDDK_ */
   1292 
   1293 typedef struct {
   1294   ULONG MinFrameSize;
   1295   ULONG MaxFrameSize;
   1296   ULONG Stepping;
   1297 } KS_FRAMING_RANGE,*PKS_FRAMING_RANGE;
   1298 
   1299 typedef struct {
   1300   KS_FRAMING_RANGE Range;
   1301   ULONG InPlaceWeight;
   1302   ULONG NotInPlaceWeight;
   1303 } KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED;
   1304 
   1305 typedef struct {
   1306   ULONG RatioNumerator;
   1307   ULONG RatioDenominator;
   1308   ULONG RatioConstantMargin;
   1309 } KS_COMPRESSION,*PKS_COMPRESSION;
   1310 
   1311 typedef struct {
   1312   GUID MemoryType;
   1313   GUID BusType;
   1314   ULONG MemoryFlags;
   1315   ULONG BusFlags;
   1316   ULONG Flags;
   1317   ULONG Frames;
   1318   ULONG FileAlignment;
   1319   ULONG MemoryTypeWeight;
   1320   KS_FRAMING_RANGE PhysicalRange;
   1321   KS_FRAMING_RANGE_WEIGHTED FramingRange;
   1322 } KS_FRAMING_ITEM,*PKS_FRAMING_ITEM;
   1323 
   1324 typedef struct {
   1325   ULONG CountItems;
   1326   ULONG PinFlags;
   1327   KS_COMPRESSION OutputCompression;
   1328   ULONG PinWeight;
   1329   KS_FRAMING_ITEM FramingItem[1];
   1330 } KSALLOCATOR_FRAMING_EX,*PKSALLOCATOR_FRAMING_EX;
   1331 
   1332 #define KSMEMORY_TYPE_WILDCARD		GUID_NULL
   1333 #define STATIC_KSMEMORY_TYPE_WILDCARD	STATIC_GUID_NULL
   1334 
   1335 #define KSMEMORY_TYPE_DONT_CARE		GUID_NULL
   1336 #define STATIC_KSMEMORY_TYPE_DONT_CARE	STATIC_GUID_NULL
   1337 
   1338 #define KS_TYPE_DONT_CARE		GUID_NULL
   1339 #define STATIC_KS_TYPE_DONT_CARE	STATIC_GUID_NULL
   1340 
   1341 #define STATIC_KSMEMORY_TYPE_SYSTEM					\
   1342 	0x091bb638L,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02
   1343 DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_SYSTEM);
   1344 #define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM)
   1345 
   1346 #define STATIC_KSMEMORY_TYPE_USER					\
   1347 	0x8cb0fc28L,0x7893,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02
   1348 DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802",KSMEMORY_TYPE_USER);
   1349 #define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER)
   1350 
   1351 #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED				\
   1352 	0xd833f8f8L,0x7894,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02
   1353 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_PAGED);
   1354 #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
   1355 
   1356 #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED				\
   1357 	0x4a6d5fc4L,0x7895,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02
   1358 DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_NONPAGED);
   1359 #define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED)
   1360 
   1361 #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN				\
   1362 	0x091bb639L,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02
   1363 DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_DEVICE_UNKNOWN);
   1364 #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN)
   1365 
   1366 #define DECLARE_SIMPLE_FRAMING_EX(FramingExName,MemoryType,Flags,Frames,Alignment,MinFrameSize,MaxFrameSize) \
   1367 const KSALLOCATOR_FRAMING_EX FramingExName =				\
   1368 {									\
   1369 	1,								\
   1370 	0,								\
   1371 	{								\
   1372 		1,							\
   1373 		1,							\
   1374 		0							\
   1375 	},								\
   1376 	0,								\
   1377 	{								\
   1378 		{							\
   1379 			MemoryType,					\
   1380 			STATIC_KS_TYPE_DONT_CARE,			\
   1381 			0,						\
   1382 			0,						\
   1383 			Flags,						\
   1384 			Frames,						\
   1385 			Alignment,					\
   1386 			0,						\
   1387 			{						\
   1388 				0,					\
   1389 				(ULONG)-1,				\
   1390 				1					\
   1391 			},						\
   1392 			{						\
   1393 				{					\
   1394 					MinFrameSize,			\
   1395 					MaxFrameSize,			\
   1396 					1				\
   1397 				},					\
   1398 				0,					\
   1399 				0					\
   1400 			}						\
   1401 		}							\
   1402 	}								\
   1403 }
   1404 
   1405 #define SetDefaultKsCompression(KsCompressionPointer)			\
   1406 {									\
   1407 	KsCompressionPointer->RatioNumerator = 1;			\
   1408 	KsCompressionPointer->RatioDenominator = 1;			\
   1409 	KsCompressionPointer->RatioConstantMargin = 0;			\
   1410 }
   1411 
   1412 #define SetDontCareKsFramingRange(KsFramingRangePointer)		\
   1413 {									\
   1414 	KsFramingRangePointer->MinFrameSize = 0;			\
   1415 	KsFramingRangePointer->MaxFrameSize = (ULONG) -1;		\
   1416 	KsFramingRangePointer->Stepping = 1;				\
   1417 }
   1418 
   1419 #define SetKsFramingRange(KsFramingRangePointer,P_MinFrameSize,P_MaxFrameSize) \
   1420 {									\
   1421 	KsFramingRangePointer->MinFrameSize = P_MinFrameSize;		\
   1422 	KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;		\
   1423 	KsFramingRangePointer->Stepping = 1;				\
   1424 }
   1425 
   1426 #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer,P_MinFrameSize,P_MaxFrameSize) \
   1427 {									\
   1428 	KS_FRAMING_RANGE *KsFramingRange =				\
   1429 				&KsFramingRangeWeightedPointer->Range;	\
   1430 	SetKsFramingRange(KsFramingRange,P_MinFrameSize,P_MaxFrameSize);\
   1431 	KsFramingRangeWeightedPointer->InPlaceWeight = 0;		\
   1432 	KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;		\
   1433 }
   1434 
   1435 #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer,P_MemoryType,P_Flags,P_Frames,P_Alignment,P_MinFrameSize,P_MaxFrameSize) \
   1436 {									\
   1437 	KS_COMPRESSION *KsCompression =					\
   1438 			&FramingExPointer->OutputCompression;		\
   1439 	KS_FRAMING_RANGE *KsFramingRange =				\
   1440 			&FramingExPointer->FramingItem[0].PhysicalRange;\
   1441 	KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted =		\
   1442 			&FramingExPointer->FramingItem[0].FramingRange;	\
   1443 	FramingExPointer->CountItems = 1;				\
   1444 	FramingExPointer->PinFlags = 0;					\
   1445 	SetDefaultKsCompression(KsCompression);				\
   1446 	FramingExPointer->PinWeight = 0;				\
   1447 	FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;	\
   1448 	FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;	\
   1449 	FramingExPointer->FramingItem[0].MemoryFlags = 0;		\
   1450 	FramingExPointer->FramingItem[0].BusFlags = 0;			\
   1451 	FramingExPointer->FramingItem[0].Flags = P_Flags;		\
   1452 	FramingExPointer->FramingItem[0].Frames = P_Frames;		\
   1453 	FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;	\
   1454 	FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;		\
   1455 	SetDontCareKsFramingRange(KsFramingRange);			\
   1456 	SetKsFramingRangeWeighted(KsFramingRangeWeighted,		\
   1457 				  P_MinFrameSize,P_MaxFrameSize);	\
   1458 }
   1459 
   1460 #define STATIC_KSEVENTSETID_StreamAllocator				\
   1461 	0x75d95571L,0x073c,0x11d0,0xa1,0x61,0x00,0x20,0xaf,0xd1,0x56,0xe4
   1462 DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4",KSEVENTSETID_StreamAllocator);
   1463 #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
   1464 
   1465 typedef enum {
   1466   KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
   1467   KSEVENT_STREAMALLOCATOR_FREEFRAME
   1468 } KSEVENT_STREAMALLOCATOR;
   1469 
   1470 #define STATIC_KSMETHODSETID_StreamAllocator				\
   1471 	0xcf6e4341L,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4
   1472 DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4",KSMETHODSETID_StreamAllocator);
   1473 #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
   1474 
   1475 typedef enum {
   1476   KSMETHOD_STREAMALLOCATOR_ALLOC,
   1477   KSMETHOD_STREAMALLOCATOR_FREE
   1478 } KSMETHOD_STREAMALLOCATOR;
   1479 
   1480 #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)		\
   1481 	DEFINE_KSMETHOD_ITEM(						\
   1482 				KSMETHOD_STREAMALLOCATOR_ALLOC,		\
   1483 				KSMETHOD_TYPE_WRITE,			\
   1484 				(Handler),				\
   1485 				sizeof(KSMETHOD),			\
   1486 				sizeof(PVOID),				\
   1487 				NULL)
   1488 
   1489 #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)		\
   1490 	DEFINE_KSMETHOD_ITEM(						\
   1491 				KSMETHOD_STREAMALLOCATOR_FREE,		\
   1492 				KSMETHOD_TYPE_READ,			\
   1493 				(Handler),				\
   1494 				sizeof(KSMETHOD),			\
   1495 				sizeof(PVOID),				\
   1496 				NULL)
   1497 
   1498 #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet,MethodAlloc,MethodFree)\
   1499 DEFINE_KSMETHOD_TABLE(AllocatorSet) {					\
   1500 	DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),	\
   1501 	DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)		\
   1502 }
   1503 
   1504 #define STATIC_KSPROPSETID_StreamAllocator				\
   1505 	0xcf6e4342L,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4
   1506 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4",KSPROPSETID_StreamAllocator);
   1507 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
   1508 
   1509 #if defined(_NTDDK_)
   1510 typedef enum {
   1511   KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
   1512   KSPROPERTY_STREAMALLOCATOR_STATUS
   1513 } KSPROPERTY_STREAMALLOCATOR;
   1514 
   1515 #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)	\
   1516 	DEFINE_KSPROPERTY_ITEM(						\
   1517 				KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\
   1518 				(Handler),				\
   1519 				sizeof(KSPROPERTY),			\
   1520 				sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\
   1521 				NULL, NULL, 0, NULL, NULL, 0)
   1522 
   1523 #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)		\
   1524 	DEFINE_KSPROPERTY_ITEM(						\
   1525 				KSPROPERTY_STREAMALLOCATOR_STATUS,	\
   1526 				(Handler),				\
   1527 				sizeof(KSPROPERTY),			\
   1528 				sizeof(KSSTREAMALLOCATOR_STATUS),	\
   1529 				NULL, NULL, 0, NULL, NULL, 0)
   1530 
   1531 #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet,PropFunctionTable,PropStatus)\
   1532 DEFINE_KSPROPERTY_TABLE(AllocatorSet) {					\
   1533 	DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),	\
   1534 	DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
   1535 }
   1536 
   1537 typedef NTSTATUS (*PFNALLOCATOR_ALLOCATEFRAME) (PFILE_OBJECT FileObject,
   1538 						PVOID *Frame);
   1539 typedef VOID (*PFNALLOCATOR_FREEFRAME) (PFILE_OBJECT FileObject, PVOID Frame);
   1540 
   1541 typedef struct {
   1542   PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
   1543   PFNALLOCATOR_FREEFRAME FreeFrame;
   1544 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
   1545 #endif /* _NTDDK_ */
   1546 
   1547 typedef struct {
   1548   KSALLOCATOR_FRAMING Framing;
   1549   ULONG AllocatedFrames;
   1550   ULONG Reserved;
   1551 } KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS;
   1552 
   1553 typedef struct {
   1554   KSALLOCATOR_FRAMING_EX Framing;
   1555   ULONG AllocatedFrames;
   1556   ULONG Reserved;
   1557 } KSSTREAMALLOCATOR_STATUS_EX,*PKSSTREAMALLOCATOR_STATUS_EX;
   1558 
   1559 #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT		0x00000001
   1560 #define KSSTREAM_HEADER_OPTIONSF_PREROLL		0x00000002
   1561 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY	0x00000004
   1562 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED		0x00000008
   1563 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID		0x00000010
   1564 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY	0x00000040
   1565 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE		0x00000080
   1566 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID		0x00000100
   1567 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM		0x00000200
   1568 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA		0x80000000
   1569 
   1570 typedef struct {
   1571   LONGLONG Time;
   1572   ULONG Numerator;
   1573   ULONG Denominator;
   1574 } KSTIME,*PKSTIME;
   1575 
   1576 typedef struct {
   1577   ULONG Size;
   1578   ULONG TypeSpecificFlags;
   1579   KSTIME PresentationTime;
   1580   LONGLONG Duration;
   1581   ULONG FrameExtent;
   1582   ULONG DataUsed;
   1583   PVOID Data;
   1584   ULONG OptionsFlags;
   1585 #ifdef _WIN64
   1586   ULONG Reserved;
   1587 #endif
   1588 } KSSTREAM_HEADER,*PKSSTREAM_HEADER;
   1589 
   1590 #define STATIC_KSPROPSETID_StreamInterface				\
   1591 	0x1fdd8ee1L,0x9cd3,0x11d0,0x82,0xaa,0x00,0x00,0xf8,0x22,0xfe,0x8a
   1592 DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a",KSPROPSETID_StreamInterface);
   1593 #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
   1594 
   1595 typedef enum {
   1596   KSPROPERTY_STREAMINTERFACE_HEADERSIZE
   1597 } KSPROPERTY_STREAMINTERFACE;
   1598 
   1599 #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(GetHandler)	\
   1600 	DEFINE_KSPROPERTY_ITEM(						\
   1601 				KSPROPERTY_STREAMINTERFACE_HEADERSIZE,	\
   1602 				(GetHandler),				\
   1603 				sizeof(KSPROPERTY),			\
   1604 				sizeof(ULONG),				\
   1605 				NULL,NULL,0,NULL,NULL,0)
   1606 
   1607 #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,HeaderSizeHandler) \
   1608 DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {				\
   1609 	DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(HeaderSizeHandler)\
   1610 }
   1611 
   1612 #define STATIC_KSPROPSETID_Stream					\
   1613 	0x65aaba60L,0x98ae,0x11cf,0xa1,0x0d,0x00,0x20,0xaf,0xd1,0x56,0xe4
   1614 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4",KSPROPSETID_Stream);
   1615 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
   1616 
   1617 typedef enum {
   1618   KSPROPERTY_STREAM_ALLOCATOR,
   1619   KSPROPERTY_STREAM_QUALITY,
   1620   KSPROPERTY_STREAM_DEGRADATION,
   1621   KSPROPERTY_STREAM_MASTERCLOCK,
   1622   KSPROPERTY_STREAM_TIMEFORMAT,
   1623   KSPROPERTY_STREAM_PRESENTATIONTIME,
   1624   KSPROPERTY_STREAM_PRESENTATIONEXTENT,
   1625   KSPROPERTY_STREAM_FRAMETIME,
   1626   KSPROPERTY_STREAM_RATECAPABILITY,
   1627   KSPROPERTY_STREAM_RATE,
   1628   KSPROPERTY_STREAM_PIPE_ID
   1629 } KSPROPERTY_STREAM;
   1630 
   1631 #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler,SetHandler)	\
   1632 	DEFINE_KSPROPERTY_ITEM(						\
   1633 				KSPROPERTY_STREAM_ALLOCATOR,		\
   1634 				(GetHandler),				\
   1635 				sizeof(KSPROPERTY),			\
   1636 				sizeof(HANDLE),				\
   1637 				(SetHandler),				\
   1638 				NULL, 0, NULL, NULL, 0)
   1639 
   1640 #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)			\
   1641 	DEFINE_KSPROPERTY_ITEM(						\
   1642 				KSPROPERTY_STREAM_QUALITY,		\
   1643 				(Handler),				\
   1644 				sizeof(KSPROPERTY),			\
   1645 				sizeof(KSQUALITY_MANAGER),		\
   1646 				NULL, NULL, 0, NULL, NULL, 0)
   1647 
   1648 #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler,SetHandler)\
   1649 	DEFINE_KSPROPERTY_ITEM(						\
   1650 				KSPROPERTY_STREAM_DEGRADATION,		\
   1651 				(GetHandler),				\
   1652 				sizeof(KSPROPERTY),			\
   1653 				0,					\
   1654 				(SetHandler),				\
   1655 				NULL, 0, NULL, NULL, 0)
   1656 
   1657 #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler,SetHandler)\
   1658 	DEFINE_KSPROPERTY_ITEM(						\
   1659 				KSPROPERTY_STREAM_MASTERCLOCK,		\
   1660 				(GetHandler),				\
   1661 				sizeof(KSPROPERTY),			\
   1662 				sizeof(HANDLE),				\
   1663 				(SetHandler),				\
   1664 				NULL, 0, NULL, NULL, 0)
   1665 
   1666 #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)		\
   1667 	DEFINE_KSPROPERTY_ITEM(						\
   1668 				KSPROPERTY_STREAM_TIMEFORMAT,		\
   1669 				(Handler),				\
   1670 				sizeof(KSPROPERTY),			\
   1671 				sizeof(GUID),				\
   1672 				NULL, NULL, 0, NULL, NULL, 0)
   1673 
   1674 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler,SetHandler)\
   1675 	DEFINE_KSPROPERTY_ITEM(						\
   1676 				KSPROPERTY_STREAM_PRESENTATIONTIME,	\
   1677 				(GetHandler),				\
   1678 				sizeof(KSPROPERTY),			\
   1679 				sizeof(KSTIME),				\
   1680 				(SetHandler),				\
   1681 				NULL, 0, NULL, NULL, 0)
   1682 
   1683 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)	\
   1684 	DEFINE_KSPROPERTY_ITEM(						\
   1685 				KSPROPERTY_STREAM_PRESENTATIONEXTENT,	\
   1686 				(Handler),				\
   1687 				sizeof(KSPROPERTY),			\
   1688 				sizeof(LONGLONG),			\
   1689 				NULL, NULL, 0, NULL, NULL, 0)
   1690 
   1691 #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)		\
   1692 	DEFINE_KSPROPERTY_ITEM(						\
   1693 				KSPROPERTY_STREAM_FRAMETIME,		\
   1694 				(Handler),				\
   1695 				sizeof(KSPROPERTY),			\
   1696 				sizeof(KSFRAMETIME),			\
   1697 				NULL, NULL, 0, NULL, NULL, 0)
   1698 
   1699 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)		\
   1700 	DEFINE_KSPROPERTY_ITEM(						\
   1701 				KSPROPERTY_STREAM_RATECAPABILITY,	\
   1702 				(Handler),				\
   1703 				sizeof(KSRATE_CAPABILITY),		\
   1704 				sizeof(KSRATE),				\
   1705 				NULL, NULL, 0, NULL, NULL, 0)
   1706 
   1707 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler,SetHandler)	\
   1708 	DEFINE_KSPROPERTY_ITEM(						\
   1709 				KSPROPERTY_STREAM_RATE,			\
   1710 				(GetHandler),				\
   1711 				sizeof(KSPROPERTY),			\
   1712 				sizeof(KSRATE),				\
   1713 				(SetHandler),				\
   1714 				NULL, 0, NULL, NULL, 0)
   1715 
   1716 #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler,SetHandler)	\
   1717 	DEFINE_KSPROPERTY_ITEM(						\
   1718 				KSPROPERTY_STREAM_PIPE_ID,		\
   1719 				(GetHandler),				\
   1720 				sizeof(KSPROPERTY),			\
   1721 				sizeof(HANDLE),				\
   1722 				(SetHandler),				\
   1723 				NULL, 0, NULL, NULL, 0)
   1724 
   1725 typedef struct {
   1726   HANDLE QualityManager;
   1727   PVOID Context;
   1728 } KSQUALITY_MANAGER,*PKSQUALITY_MANAGER;
   1729 
   1730 typedef struct {
   1731   LONGLONG Duration;
   1732   ULONG FrameFlags;
   1733   ULONG Reserved;
   1734 } KSFRAMETIME,*PKSFRAMETIME;
   1735 
   1736 #define KSFRAMETIME_VARIABLESIZE	0x00000001
   1737 
   1738 typedef struct {
   1739   LONGLONG PresentationStart;
   1740   LONGLONG Duration;
   1741   KSPIN_INTERFACE Interface;
   1742   LONG Rate;
   1743   ULONG Flags;
   1744 } KSRATE,*PKSRATE;
   1745 
   1746 #define KSRATE_NOPRESENTATIONSTART	0x00000001
   1747 #define KSRATE_NOPRESENTATIONDURATION	0x00000002
   1748 
   1749 typedef struct {
   1750   KSPROPERTY Property;
   1751   KSRATE Rate;
   1752 } KSRATE_CAPABILITY,*PKSRATE_CAPABILITY;
   1753 
   1754 #define STATIC_KSPROPSETID_Clock					\
   1755 	0xDF12A4C0L,0xAC17,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1756 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000",KSPROPSETID_Clock);
   1757 #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
   1758 
   1759 #define NANOSECONDS 10000000
   1760 #define KSCONVERT_PERFORMANCE_TIME(Frequency,PerformanceTime)		\
   1761 	((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS / (Frequency)) << 32) +	\
   1762 	 ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS) % (Frequency)) << 32) +\
   1763 	 ((ULONGLONG)(PerformanceTime).LowPart *NANOSECONDS)) / (Frequency)))
   1764 
   1765 typedef struct {
   1766   ULONG CreateFlags;
   1767 } KSCLOCK_CREATE,*PKSCLOCK_CREATE;
   1768 
   1769 typedef struct {
   1770   LONGLONG Time;
   1771   LONGLONG SystemTime;
   1772 } KSCORRELATED_TIME,*PKSCORRELATED_TIME;
   1773 
   1774 typedef struct {
   1775   LONGLONG Granularity;
   1776   LONGLONG Error;
   1777 } KSRESOLUTION,*PKSRESOLUTION;
   1778 
   1779 typedef enum {
   1780   KSPROPERTY_CLOCK_TIME,
   1781   KSPROPERTY_CLOCK_PHYSICALTIME,
   1782   KSPROPERTY_CLOCK_CORRELATEDTIME,
   1783   KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
   1784   KSPROPERTY_CLOCK_RESOLUTION,
   1785   KSPROPERTY_CLOCK_STATE,
   1786 #if defined(_NTDDK_)
   1787   KSPROPERTY_CLOCK_FUNCTIONTABLE
   1788 #endif /* _NTDDK_ */
   1789 } KSPROPERTY_CLOCK;
   1790 
   1791 #if defined(_NTDDK_)
   1792 typedef LONGLONG (FASTCALL *PFNKSCLOCK_GETTIME)(PFILE_OBJECT FileObject);
   1793 typedef LONGLONG (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(PFILE_OBJECT FileObject,
   1794 							PLONGLONG SystemTime);
   1795 
   1796 typedef struct {
   1797    PFNKSCLOCK_GETTIME GetTime;
   1798    PFNKSCLOCK_GETTIME GetPhysicalTime;
   1799    PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
   1800    PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
   1801 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
   1802 
   1803 typedef BOOLEAN (*PFNKSSETTIMER)(PVOID Context, PKTIMER Timer,
   1804 				 LARGE_INTEGER DueTime, PKDPC Dpc);
   1805 typedef BOOLEAN (*PFNKSCANCELTIMER) (PVOID Context, PKTIMER Timer);
   1806 typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(PVOID Context,
   1807 						 PLONGLONG SystemTime);
   1808 
   1809 typedef PVOID			PKSDEFAULTCLOCK;
   1810 
   1811 #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)			\
   1812 	DEFINE_KSPROPERTY_ITEM(						\
   1813 				KSPROPERTY_CLOCK_TIME,			\
   1814 				(Handler),				\
   1815 				sizeof(KSPROPERTY), sizeof(LONGLONG),	\
   1816 				NULL, NULL, 0, NULL, NULL, 0)
   1817 
   1818 #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)		\
   1819 	DEFINE_KSPROPERTY_ITEM(						\
   1820 				KSPROPERTY_CLOCK_PHYSICALTIME,		\
   1821 				(Handler),				\
   1822 				sizeof(KSPROPERTY), sizeof(LONGLONG),	\
   1823 				NULL, NULL, 0, NULL, NULL, 0)
   1824 
   1825 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)		\
   1826 	DEFINE_KSPROPERTY_ITEM(						\
   1827 				KSPROPERTY_CLOCK_CORRELATEDTIME,	\
   1828 				(Handler),				\
   1829 				sizeof(KSPROPERTY),			\
   1830 				sizeof(KSCORRELATED_TIME),		\
   1831 				NULL, NULL, 0, NULL, NULL, 0)
   1832 
   1833 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)	\
   1834 	DEFINE_KSPROPERTY_ITEM(						\
   1835 				KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
   1836 				(Handler),				\
   1837 				sizeof(KSPROPERTY),			\
   1838 				sizeof(KSCORRELATED_TIME),		\
   1839 				NULL, NULL, 0, NULL, NULL, 0)
   1840 
   1841 #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)		\
   1842 	DEFINE_KSPROPERTY_ITEM(						\
   1843 				KSPROPERTY_CLOCK_RESOLUTION,		\
   1844 				(Handler),				\
   1845 				sizeof(KSPROPERTY),sizeof(KSRESOLUTION),\
   1846 				NULL, NULL, 0, NULL, NULL, 0)
   1847 
   1848 #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)			\
   1849 	DEFINE_KSPROPERTY_ITEM(						\
   1850 				KSPROPERTY_CLOCK_STATE,			\
   1851 				(Handler),				\
   1852 				sizeof(KSPROPERTY), sizeof(KSSTATE),	\
   1853 				NULL, NULL, 0, NULL, NULL, 0)
   1854 
   1855 #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)		\
   1856 	DEFINE_KSPROPERTY_ITEM(						\
   1857 				KSPROPERTY_CLOCK_FUNCTIONTABLE,		\
   1858 				(Handler),				\
   1859 				sizeof(KSPROPERTY),			\
   1860 				sizeof(KSCLOCK_FUNCTIONTABLE),		\
   1861 				NULL, NULL, 0, NULL, NULL, 0)
   1862 
   1863 #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,PropTime,PropPhysicalTime,PropCorrelatedTime,PropCorrelatedPhysicalTime,PropResolution,PropState,PropFunctionTable)\
   1864 DEFINE_KSPROPERTY_TABLE(ClockSet) {					\
   1865 	DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),			\
   1866 	DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),	\
   1867 	DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
   1868 	DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
   1869 	DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),	\
   1870 	DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),			\
   1871 	DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),	\
   1872 }
   1873 #endif /* _NTDDK_ */
   1874 
   1875 #define STATIC_KSEVENTSETID_Clock					\
   1876 	0x364D8E20L,0x62C7,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1877 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000",KSEVENTSETID_Clock);
   1878 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
   1879 
   1880 typedef enum {
   1881   KSEVENT_CLOCK_INTERVAL_MARK,
   1882   KSEVENT_CLOCK_POSITION_MARK
   1883 } KSEVENT_CLOCK_POSITION;
   1884 
   1885 #define STATIC_KSEVENTSETID_Connection					\
   1886 	0x7f4bcbe0L,0x9ea5,0x11cf,0xa5,0xd6,0x28,0xdb,0x04,0xc1,0x00,0x00
   1887 DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000",KSEVENTSETID_Connection);
   1888 #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
   1889 
   1890 typedef enum {
   1891   KSEVENT_CONNECTION_POSITIONUPDATE,
   1892   KSEVENT_CONNECTION_DATADISCONTINUITY,
   1893   KSEVENT_CONNECTION_TIMEDISCONTINUITY,
   1894   KSEVENT_CONNECTION_PRIORITY,
   1895   KSEVENT_CONNECTION_ENDOFSTREAM
   1896 } KSEVENT_CONNECTION;
   1897 
   1898 typedef struct {
   1899   PVOID Context;
   1900   ULONG Proportion;
   1901   LONGLONG DeltaTime;
   1902 } KSQUALITY,*PKSQUALITY;
   1903 
   1904 typedef struct {
   1905   PVOID Context;
   1906   ULONG Status;
   1907 } KSERROR,*PKSERROR;
   1908 
   1909 typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE;
   1910 
   1911 #define STATIC_KSDEGRADESETID_Standard					\
   1912 	0x9F564180L,0x704C,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
   1913 DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000",KSDEGRADESETID_Standard);
   1914 #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
   1915 
   1916 typedef enum {
   1917   KSDEGRADE_STANDARD_SAMPLE,
   1918   KSDEGRADE_STANDARD_QUALITY,
   1919   KSDEGRADE_STANDARD_COMPUTATION,
   1920   KSDEGRADE_STANDARD_SKIP
   1921 } KSDEGRADE_STANDARD;
   1922 
   1923 #if defined(_NTDDK_)
   1924 
   1925 #define KSPROBE_STREAMREAD		0x00000000
   1926 #define KSPROBE_STREAMWRITE		0x00000001
   1927 #define KSPROBE_ALLOCATEMDL		0x00000010
   1928 #define KSPROBE_PROBEANDLOCK		0x00000020
   1929 #define KSPROBE_SYSTEMADDRESS		0x00000040
   1930 #define KSPROBE_MODIFY			0x00000200
   1931 #define KSPROBE_STREAMWRITEMODIFY	(KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
   1932 #define KSPROBE_ALLOWFORMATCHANGE	0x00000080
   1933 #define KSSTREAM_READ			KSPROBE_STREAMREAD
   1934 #define KSSTREAM_WRITE			KSPROBE_STREAMWRITE
   1935 #define KSSTREAM_PAGED_DATA		0x00000000
   1936 #define KSSTREAM_NONPAGED_DATA		0x00000100
   1937 #define KSSTREAM_SYNCHRONOUS		0x00001000
   1938 #define KSSTREAM_FAILUREEXCEPTION	0x00002000
   1939 
   1940 typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(PVOID Context, PIRP Irp);
   1941 typedef NTSTATUS (*PFNKSHANDLER)(PIRP Irp, PKSIDENTIFIER Request, PVOID Data);
   1942 typedef BOOLEAN (*PFNKSFASTHANDLER)(PFILE_OBJECT FileObject,
   1943 				    PKSIDENTIFIER Request,
   1944 				    ULONG RequestLength, PVOID Data,
   1945 				    ULONG DataLength,
   1946 				    PIO_STATUS_BLOCK IoStatus);
   1947 typedef NTSTATUS (*PFNKSALLOCATOR) (PIRP Irp, ULONG BufferSize,
   1948 				    BOOLEAN InputOperation);
   1949 
   1950 typedef struct {
   1951   KSPROPERTY_MEMBERSHEADER MembersHeader;
   1952   const VOID *Members;
   1953 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
   1954 
   1955 typedef struct {
   1956   KSIDENTIFIER PropTypeSet;
   1957   ULONG MembersListCount;
   1958   const KSPROPERTY_MEMBERSLIST *MembersList;
   1959 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
   1960 
   1961 #define DEFINE_KSPROPERTY_TABLE(tablename)				\
   1962 	const KSPROPERTY_ITEM tablename[] =
   1963 
   1964 #define DEFINE_KSPROPERTY_ITEM(PropertyId,GetHandler,MinProperty,MinData,SetHandler,Values,RelationsCount,Relations,SupportHandler,SerializedSize)\
   1965 {									\
   1966 			PropertyId, (PFNKSHANDLER)GetHandler,		\
   1967 			MinProperty, MinData,				\
   1968 			(PFNKSHANDLER)SetHandler,			\
   1969 			(PKSPROPERTY_VALUES)Values, RelationsCount,	\
   1970 			(PKSPROPERTY)Relations,				\
   1971 			(PFNKSHANDLER)SupportHandler,			\
   1972 			(ULONG)SerializedSize				\
   1973 }
   1974 
   1975 typedef struct {
   1976   ULONG PropertyId;
   1977   __MINGW_EXTENSION union {
   1978     PFNKSHANDLER GetPropertyHandler;
   1979     BOOLEAN GetSupported;
   1980   };
   1981   ULONG MinProperty;
   1982   ULONG MinData;
   1983   __MINGW_EXTENSION union {
   1984     PFNKSHANDLER SetPropertyHandler;
   1985     BOOLEAN SetSupported;
   1986   };
   1987   const KSPROPERTY_VALUES *Values;
   1988   ULONG RelationsCount;
   1989   const KSPROPERTY *Relations;
   1990   PFNKSHANDLER SupportHandler;
   1991   ULONG SerializedSize;
   1992 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
   1993 
   1994 #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)	\
   1995 {									\
   1996 			PropertyId, (PFNKSFASTHANDLER)GetHandler,	\
   1997 			(PFNKSFASTHANDLER)SetHandler, 0			\
   1998 }
   1999 
   2000 typedef struct {
   2001   ULONG PropertyId;
   2002   __MINGW_EXTENSION union {
   2003     PFNKSFASTHANDLER GetPropertyHandler;
   2004     BOOLEAN GetSupported;
   2005   };
   2006   __MINGW_EXTENSION union {
   2007     PFNKSFASTHANDLER SetPropertyHandler;
   2008     BOOLEAN SetSupported;
   2009   };
   2010   ULONG Reserved;
   2011 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
   2012 
   2013 #define DEFINE_KSPROPERTY_SET(Set,PropertiesCount,PropertyItem,FastIoCount,FastIoTable)\
   2014 {									\
   2015 			Set,						\
   2016 			PropertiesCount, PropertyItem,			\
   2017 			FastIoCount, FastIoTable			\
   2018 }
   2019 
   2020 #define DEFINE_KSPROPERTY_SET_TABLE(tablename)				\
   2021 	const KSPROPERTY_SET tablename[] =
   2022 
   2023 typedef struct {
   2024   const GUID *Set;
   2025   ULONG PropertiesCount;
   2026   const KSPROPERTY_ITEM *PropertyItem;
   2027   ULONG FastIoCount;
   2028   const KSFASTPROPERTY_ITEM *FastIoTable;
   2029 } KSPROPERTY_SET, *PKSPROPERTY_SET;
   2030 
   2031 #define DEFINE_KSMETHOD_TABLE(tablename)				\
   2032 	const KSMETHOD_ITEM tablename[] =
   2033 
   2034 #define DEFINE_KSMETHOD_ITEM(MethodId,Flags,MethodHandler,MinMethod,MinData,SupportHandler)\
   2035 {									\
   2036 			MethodId, (PFNKSHANDLER)MethodHandler,		\
   2037 			MinMethod, MinData,				\
   2038 			SupportHandler, Flags				\
   2039 }
   2040 
   2041 typedef struct {
   2042   ULONG MethodId;
   2043   __MINGW_EXTENSION union {
   2044     PFNKSHANDLER MethodHandler;
   2045     BOOLEAN MethodSupported;
   2046   };
   2047   ULONG MinMethod;
   2048   ULONG MinData;
   2049   PFNKSHANDLER SupportHandler;
   2050   ULONG Flags;
   2051 } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
   2052 
   2053 #define DEFINE_KSFASTMETHOD_ITEM(MethodId,MethodHandler)		\
   2054 {									\
   2055 			MethodId, (PFNKSFASTHANDLER)MethodHandler	\
   2056 }
   2057 
   2058 typedef struct {
   2059   ULONG MethodId;
   2060   __MINGW_EXTENSION union {
   2061     PFNKSFASTHANDLER MethodHandler;
   2062     BOOLEAN MethodSupported;
   2063   };
   2064 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
   2065 
   2066 #define DEFINE_KSMETHOD_SET(Set,MethodsCount,MethodItem,FastIoCount,FastIoTable)\
   2067 {									\
   2068 			Set,						\
   2069 			MethodsCount, MethodItem,			\
   2070 			FastIoCount, FastIoTable			\
   2071 }
   2072 
   2073 #define DEFINE_KSMETHOD_SET_TABLE(tablename)				\
   2074 	const KSMETHOD_SET tablename[] =
   2075 
   2076 typedef struct {
   2077   const GUID *Set;
   2078   ULONG MethodsCount;
   2079   const KSMETHOD_ITEM *MethodItem;
   2080   ULONG FastIoCount;
   2081   const KSFASTMETHOD_ITEM *FastIoTable;
   2082 } KSMETHOD_SET, *PKSMETHOD_SET;
   2083 
   2084 typedef struct _KSEVENT_ENTRY	KSEVENT_ENTRY, *PKSEVENT_ENTRY;
   2085 typedef NTSTATUS (*PFNKSADDEVENT)(PIRP Irp, PKSEVENTDATA EventData,
   2086 				  struct _KSEVENT_ENTRY* EventEntry);
   2087 typedef VOID (*PFNKSREMOVEEVENT)(PFILE_OBJECT FileObject,
   2088 				 struct _KSEVENT_ENTRY* EventEntry);
   2089 
   2090 #define DEFINE_KSEVENT_TABLE(tablename)					\
   2091 	const KSEVENT_ITEM tablename[] =
   2092 
   2093 #define DEFINE_KSEVENT_ITEM(EventId,DataInput,ExtraEntryData,AddHandler,RemoveHandler,SupportHandler)\
   2094 {									\
   2095 			EventId, DataInput, ExtraEntryData,		\
   2096 			AddHandler, RemoveHandler, SupportHandler	\
   2097 }
   2098 
   2099 typedef struct {
   2100   ULONG EventId;
   2101   ULONG DataInput;
   2102   ULONG ExtraEntryData;
   2103   PFNKSADDEVENT AddHandler;
   2104   PFNKSREMOVEEVENT RemoveHandler;
   2105   PFNKSHANDLER SupportHandler;
   2106 } KSEVENT_ITEM, *PKSEVENT_ITEM;
   2107 
   2108 #define DEFINE_KSEVENT_SET(Set,EventsCount,EventItem)			\
   2109 {									\
   2110 			Set, EventsCount, EventItem			\
   2111 }
   2112 
   2113 #define DEFINE_KSEVENT_SET_TABLE(tablename)				\
   2114 	const KSEVENT_SET tablename[] =
   2115 
   2116 typedef struct {
   2117   const GUID *Set;
   2118   ULONG EventsCount;
   2119   const KSEVENT_ITEM *EventItem;
   2120 } KSEVENT_SET, *PKSEVENT_SET;
   2121 
   2122 typedef struct {
   2123   KDPC Dpc;
   2124   ULONG ReferenceCount;
   2125   KSPIN_LOCK AccessLock;
   2126 } KSDPC_ITEM, *PKSDPC_ITEM;
   2127 
   2128 typedef struct {
   2129   KSDPC_ITEM DpcItem;
   2130   LIST_ENTRY BufferList;
   2131 } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
   2132 
   2133 
   2134 #define KSEVENT_ENTRY_DELETED		1
   2135 #define KSEVENT_ENTRY_ONESHOT		2
   2136 #define KSEVENT_ENTRY_BUFFERED		4
   2137 
   2138 struct _KSEVENT_ENTRY {
   2139   LIST_ENTRY ListEntry;
   2140   PVOID Object;
   2141   __MINGW_EXTENSION union {
   2142     PKSDPC_ITEM DpcItem;
   2143     PKSBUFFER_ITEM BufferItem;
   2144   };
   2145   PKSEVENTDATA EventData;
   2146   ULONG NotificationType;
   2147   const KSEVENT_SET *EventSet;
   2148   const KSEVENT_ITEM *EventItem;
   2149   PFILE_OBJECT FileObject;
   2150   ULONG SemaphoreAdjustment;
   2151   ULONG Reserved;
   2152   ULONG Flags;
   2153 };
   2154 
   2155 typedef enum {
   2156   KSEVENTS_NONE,
   2157   KSEVENTS_SPINLOCK,
   2158   KSEVENTS_MUTEX,
   2159   KSEVENTS_FMUTEX,
   2160   KSEVENTS_FMUTEXUNSAFE,
   2161   KSEVENTS_INTERRUPT,
   2162   KSEVENTS_ERESOURCE
   2163 } KSEVENTS_LOCKTYPE;
   2164 
   2165 #define KSDISPATCH_FASTIO			0x80000000
   2166 
   2167 typedef struct {
   2168   PDRIVER_DISPATCH Create;
   2169   PVOID Context;
   2170   UNICODE_STRING ObjectClass;
   2171   PSECURITY_DESCRIPTOR SecurityDescriptor;
   2172   ULONG Flags;
   2173 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
   2174 
   2175 typedef VOID (*PFNKSITEMFREECALLBACK)(PKSOBJECT_CREATE_ITEM CreateItem);
   2176 
   2177 #define KSCREATE_ITEM_SECURITYCHANGED		0x00000001
   2178 #define KSCREATE_ITEM_WILDCARD			0x00000002
   2179 #define KSCREATE_ITEM_NOPARAMETERS		0x00000004
   2180 #define KSCREATE_ITEM_FREEONSTOP		0x00000008
   2181 
   2182 #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )			\
   2183 	KSOBJECT_CREATE_ITEM tablename[] =
   2184 
   2185 #define DEFINE_KSCREATE_ITEM(DispatchCreate,TypeName,Context)		\
   2186 {									\
   2187 			(DispatchCreate), (PVOID)(Context),		\
   2188 			{						\
   2189 				sizeof(TypeName) - sizeof(UNICODE_NULL),\
   2190 				sizeof(TypeName),			\
   2191 				(PWCHAR)(TypeName)			\
   2192 			},						\
   2193 			NULL, 0						\
   2194 }
   2195 
   2196 #define DEFINE_KSCREATE_ITEMEX(DispatchCreate,TypeName,Context,Flags)	\
   2197 {									\
   2198 			(DispatchCreate),				\
   2199 			(PVOID)(Context),				\
   2200 			{						\
   2201 				sizeof(TypeName) - sizeof(UNICODE_NULL),\
   2202 				sizeof(TypeName),			\
   2203 				(PWCHAR)(TypeName)			\
   2204 			},						\
   2205 			NULL, (Flags)					\
   2206 }
   2207 
   2208 #define DEFINE_KSCREATE_ITEMNULL(DispatchCreate,Context)		\
   2209 {									\
   2210 			DispatchCreate, Context,			\
   2211 			{						\
   2212 				0, 0, NULL,				\
   2213 			},						\
   2214 			NULL, 0						\
   2215 }
   2216 
   2217 typedef struct {
   2218   ULONG CreateItemsCount;
   2219   PKSOBJECT_CREATE_ITEM CreateItemsList;
   2220 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
   2221 
   2222 typedef struct {
   2223   PDRIVER_DISPATCH DeviceIoControl;
   2224   PDRIVER_DISPATCH Read;
   2225   PDRIVER_DISPATCH Write;
   2226   PDRIVER_DISPATCH Flush;
   2227   PDRIVER_DISPATCH Close;
   2228   PDRIVER_DISPATCH QuerySecurity;
   2229   PDRIVER_DISPATCH SetSecurity;
   2230   PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
   2231   PFAST_IO_READ FastRead;
   2232   PFAST_IO_WRITE FastWrite;
   2233 } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
   2234 
   2235 #define DEFINE_KSDISPATCH_TABLE(tablename,DeviceIoControl,Read,Write,Flush,Close,QuerySecurity,SetSecurity,FastDeviceIoControl,FastRead,FastWrite)\
   2236 	const KSDISPATCH_TABLE tablename =				\
   2237 	{								\
   2238 		DeviceIoControl,					\
   2239 		Read,							\
   2240 		Write,							\
   2241 		Flush,							\
   2242 		Close,							\
   2243 		QuerySecurity,						\
   2244 		SetSecurity,						\
   2245 		FastDeviceIoControl,					\
   2246 		FastRead,						\
   2247 		FastWrite,						\
   2248 	}
   2249 
   2250 #define KSCREATE_ITEM_IRP_STORAGE(Irp)					\
   2251 	(*(PKSOBJECT_CREATE_ITEM *)&(Irp)->Tail.Overlay.DriverContext[0])
   2252 #define KSEVENT_SET_IRP_STORAGE(Irp)					\
   2253 	(*(const KSEVENT_SET **)&(Irp)->Tail.Overlay.DriverContext[0])
   2254 #define KSEVENT_ITEM_IRP_STORAGE(Irp)					\
   2255 	(*(const KSEVENT_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3])
   2256 #define KSEVENT_ENTRY_IRP_STORAGE(Irp)					\
   2257 	(*(PKSEVENT_ENTRY *)&(Irp)->Tail.Overlay.DriverContext[0])
   2258 #define KSMETHOD_SET_IRP_STORAGE(Irp)					\
   2259 	(*(const KSMETHOD_SET **)&(Irp)->Tail.Overlay.DriverContext[0])
   2260 #define KSMETHOD_ITEM_IRP_STORAGE(Irp)					\
   2261 	(*(const KSMETHOD_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3])
   2262 #define KSMETHOD_TYPE_IRP_STORAGE(Irp)					\
   2263 	(*(ULONG_PTR *)(&(Irp)->Tail.Overlay.DriverContext[2]))
   2264 #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp)				\
   2265 	(*(PKSPIN_LOCK *)&(Irp)->Tail.Overlay.DriverContext[1])
   2266 #define KSPROPERTY_SET_IRP_STORAGE(Irp)					\
   2267 	(*(const KSPROPERTY_SET **)&(Irp)->Tail.Overlay.DriverContext[0])
   2268 #define KSPROPERTY_ITEM_IRP_STORAGE(Irp)				\
   2269 	(*(const KSPROPERTY_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3])
   2270 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp)				\
   2271 	(*(PKSATTRIBUTE_LIST *)&(Irp)->Tail.Overlay.DriverContext[2])
   2272 
   2273 typedef PVOID		KSDEVICE_HEADER, KSOBJECT_HEADER;
   2274 
   2275 typedef enum {
   2276   KsInvokeOnSuccess = 1,
   2277   KsInvokeOnError = 2,
   2278   KsInvokeOnCancel = 4
   2279 } KSCOMPLETION_INVOCATION;
   2280 
   2281 typedef enum {
   2282   KsListEntryTail,
   2283   KsListEntryHead
   2284 } KSLIST_ENTRY_LOCATION;
   2285 
   2286 typedef enum {
   2287   KsAcquireOnly,
   2288   KsAcquireAndRemove,
   2289   KsAcquireOnlySingleItem,
   2290   KsAcquireAndRemoveOnlySingleItem
   2291 } KSIRP_REMOVAL_OPERATION;
   2292 
   2293 typedef enum {
   2294   KsStackCopyToNewLocation,
   2295   KsStackReuseCurrentLocation,
   2296   KsStackUseNewLocation
   2297 } KSSTACK_USE;
   2298 
   2299 typedef enum {
   2300   KSTARGET_STATE_DISABLED,
   2301   KSTARGET_STATE_ENABLED
   2302 } KSTARGET_STATE;
   2303 
   2304 typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(PIRP Irp, PVOID Context);
   2305 typedef VOID (*PFNREFERENCEDEVICEOBJECT)(PVOID Context);
   2306 typedef VOID (*PFNDEREFERENCEDEVICEOBJECT)(PVOID Context);
   2307 typedef NTSTATUS (*PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String);
   2308 
   2309 #define BUS_INTERFACE_REFERENCE_VERSION			0x100
   2310 
   2311 typedef struct {
   2312   INTERFACE Interface;
   2313 
   2314   PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject;
   2315   PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject;
   2316   PFNQUERYREFERENCESTRING QueryReferenceString;
   2317 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
   2318 
   2319 #define STATIC_REFERENCE_BUS_INTERFACE		STATIC_KSMEDIUMSETID_Standard
   2320 #define REFERENCE_BUS_INTERFACE			KSMEDIUMSETID_Standard
   2321 
   2322 #endif /* _NTDDK_ */
   2323 
   2324 #ifndef PACK_PRAGMAS_NOT_SUPPORTED
   2325 #include <pshpack1.h>
   2326 #endif
   2327 
   2328 typedef struct {
   2329   GUID PropertySet;
   2330   ULONG Count;
   2331 } KSPROPERTY_SERIALHDR,*PKSPROPERTY_SERIALHDR;
   2332 
   2333 #ifndef PACK_PRAGMAS_NOT_SUPPORTED
   2334 #include <poppack.h>
   2335 #endif
   2336 
   2337 typedef struct {
   2338   KSIDENTIFIER PropTypeSet;
   2339   ULONG Id;
   2340   ULONG PropertyLength;
   2341 } KSPROPERTY_SERIAL,*PKSPROPERTY_SERIAL;
   2342 
   2343 
   2344 #if defined(_NTDDK_)
   2345 
   2346 #define IOCTL_KS_HANDSHAKE						\
   2347 	CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
   2348 
   2349 typedef struct {
   2350   GUID ProtocolId;
   2351   PVOID Argument1;
   2352   PVOID Argument2;
   2353 } KSHANDSHAKE, *PKSHANDSHAKE;
   2354 
   2355 typedef struct _KSGATE		KSGATE, *PKSGATE;
   2356 
   2357 struct _KSGATE {
   2358   LONG Count;
   2359   PKSGATE NextGate;
   2360 };
   2361 
   2362 typedef PVOID KSOBJECT_BAG;
   2363 
   2364 
   2365 typedef BOOLEAN (*PFNKSGENERATEEVENTCALLBACK)(PVOID Context,
   2366 					      PKSEVENT_ENTRY EventEntry);
   2367 
   2368 typedef NTSTATUS (*PFNKSDEVICECREATE)(PKSDEVICE Device);
   2369 
   2370 typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(PKSDEVICE Device,PIRP Irp,
   2371 				PCM_RESOURCE_LIST TranslatedResourceList,
   2372 				PCM_RESOURCE_LIST UntranslatedResourceList);
   2373 
   2374 typedef NTSTATUS (*PFNKSDEVICE)(PKSDEVICE Device);
   2375 
   2376 typedef NTSTATUS (*PFNKSDEVICEIRP)(PKSDEVICE Device,PIRP Irp);
   2377 
   2378 typedef void (*PFNKSDEVICEIRPVOID)(PKSDEVICE Device,PIRP Irp);
   2379 
   2380 typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(PKSDEVICE Device,PIRP Irp,
   2381 					 PDEVICE_CAPABILITIES Capabilities);
   2382 
   2383 typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(PKSDEVICE Device,PIRP Irp,
   2384 					  DEVICE_POWER_STATE DeviceTo,
   2385 					  DEVICE_POWER_STATE DeviceFrom,
   2386 					  SYSTEM_POWER_STATE SystemTo,
   2387 					  SYSTEM_POWER_STATE SystemFrom,
   2388 					  POWER_ACTION Action);
   2389 
   2390 typedef void (*PFNKSDEVICESETPOWER)(PKSDEVICE Device,PIRP Irp,
   2391 				    DEVICE_POWER_STATE To,
   2392 				    DEVICE_POWER_STATE From);
   2393 
   2394 typedef NTSTATUS (*PFNKSFILTERFACTORYVOID)(PKSFILTERFACTORY FilterFactory);
   2395 
   2396 typedef void (*PFNKSFILTERFACTORYPOWER)(PKSFILTERFACTORY FilterFactory,
   2397 					DEVICE_POWER_STATE State);
   2398 
   2399 typedef NTSTATUS (*PFNKSFILTERIRP)(PKSFILTER Filter,PIRP Irp);
   2400 
   2401 typedef NTSTATUS (*PFNKSFILTERPROCESS)(PKSFILTER Filter,
   2402 					PKSPROCESSPIN_INDEXENTRY Index);
   2403 
   2404 typedef NTSTATUS (*PFNKSFILTERVOID)(PKSFILTER Filter);
   2405 
   2406 typedef void (*PFNKSFILTERPOWER)(PKSFILTER Filter,DEVICE_POWER_STATE State);
   2407 
   2408 typedef NTSTATUS (*PFNKSPINIRP)(PKSPIN Pin,PIRP Irp);
   2409 
   2410 typedef NTSTATUS (*PFNKSPINSETDEVICESTATE)(PKSPIN Pin,KSSTATE ToState,
   2411 					   KSSTATE FromState);
   2412 
   2413 typedef NTSTATUS (*PFNKSPINSETDATAFORMAT)(PKSPIN Pin,PKSDATAFORMAT OldFormat,
   2414 					  PKSMULTIPLE_ITEM OldAttributeList,
   2415 					  const KSDATARANGE *DataRange,
   2416 					  const KSATTRIBUTE_LIST *AttributeRange);
   2417 
   2418 typedef NTSTATUS (*PFNKSPINHANDSHAKE)(PKSPIN Pin,PKSHANDSHAKE In,
   2419 				      PKSHANDSHAKE Out);
   2420 
   2421 typedef NTSTATUS (*PFNKSPIN)(PKSPIN Pin);
   2422 
   2423 typedef void (*PFNKSPINVOID)(PKSPIN Pin);
   2424 
   2425 typedef void (*PFNKSPINPOWER)(PKSPIN Pin,DEVICE_POWER_STATE State);
   2426 
   2427 typedef BOOLEAN (*PFNKSPINSETTIMER)(PKSPIN Pin,PKTIMER Timer,
   2428 				    LARGE_INTEGER DueTime,PKDPC Dpc);
   2429 
   2430 typedef BOOLEAN (*PFNKSPINCANCELTIMER)(PKSPIN Pin,PKTIMER Timer);
   2431 
   2432 typedef LONGLONG (FASTCALL *PFNKSPINCORRELATEDTIME)(PKSPIN Pin,
   2433 						    PLONGLONG SystemTime);
   2434 
   2435 typedef void (*PFNKSPINRESOLUTION)(PKSPIN Pin,PKSRESOLUTION Resolution);
   2436 
   2437 typedef NTSTATUS (*PFNKSPININITIALIZEALLOCATOR)(PKSPIN Pin,
   2438 					PKSALLOCATOR_FRAMING AllocatorFraming,
   2439 					PVOID *Context);
   2440 
   2441 typedef void (*PFNKSSTREAMPOINTER)(PKSSTREAM_POINTER StreamPointer);
   2442 
   2443 
   2444 typedef struct KSAUTOMATION_TABLE_ KSAUTOMATION_TABLE,*PKSAUTOMATION_TABLE;
   2445 
   2446 struct KSAUTOMATION_TABLE_ {
   2447   ULONG PropertySetsCount;
   2448   ULONG PropertyItemSize;
   2449   const KSPROPERTY_SET *PropertySets;
   2450   ULONG MethodSetsCount;
   2451   ULONG MethodItemSize;
   2452   const KSMETHOD_SET *MethodSets;
   2453   ULONG EventSetsCount;
   2454   ULONG EventItemSize;
   2455   const KSEVENT_SET *EventSets;
   2456 #ifndef _WIN64
   2457   PVOID Alignment;
   2458 #endif
   2459 };
   2460 
   2461 #define DEFINE_KSAUTOMATION_TABLE(table)				\
   2462 		const KSAUTOMATION_TABLE table =
   2463 
   2464 #define DEFINE_KSAUTOMATION_PROPERTIES(table)				\
   2465 		SIZEOF_ARRAY(table),					\
   2466 		sizeof(KSPROPERTY_ITEM),				\
   2467 		table
   2468 
   2469 #define DEFINE_KSAUTOMATION_METHODS(table)				\
   2470 		SIZEOF_ARRAY(table),					\
   2471 		sizeof(KSMETHOD_ITEM),					\
   2472 		table
   2473 
   2474 #define DEFINE_KSAUTOMATION_EVENTS(table)				\
   2475 		SIZEOF_ARRAY(table),					\
   2476 		sizeof(KSEVENT_ITEM),					\
   2477 		table
   2478 
   2479 #define DEFINE_KSAUTOMATION_PROPERTIES_NULL				\
   2480 		0,							\
   2481 		sizeof(KSPROPERTY_ITEM),				\
   2482 		NULL
   2483 
   2484 #define DEFINE_KSAUTOMATION_METHODS_NULL				\
   2485 		0,							\
   2486 		sizeof(KSMETHOD_ITEM),					\
   2487 		NULL
   2488 
   2489 #define DEFINE_KSAUTOMATION_EVENTS_NULL					\
   2490 		0,							\
   2491 		sizeof(KSEVENT_ITEM),					\
   2492 		NULL
   2493 
   2494 #define MIN_DEV_VER_FOR_QI		(0x100)
   2495 
   2496 struct _KSDEVICE_DISPATCH {
   2497   PFNKSDEVICECREATE Add;
   2498   PFNKSDEVICEPNPSTART Start;
   2499   PFNKSDEVICE PostStart;
   2500   PFNKSDEVICEIRP QueryStop;
   2501   PFNKSDEVICEIRPVOID CancelStop;
   2502   PFNKSDEVICEIRPVOID Stop;
   2503   PFNKSDEVICEIRP QueryRemove;
   2504   PFNKSDEVICEIRPVOID CancelRemove;
   2505   PFNKSDEVICEIRPVOID Remove;
   2506   PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
   2507   PFNKSDEVICEIRPVOID SurpriseRemoval;
   2508   PFNKSDEVICEQUERYPOWER QueryPower;
   2509   PFNKSDEVICESETPOWER SetPower;
   2510   PFNKSDEVICEIRP QueryInterface;
   2511 };
   2512 
   2513 struct _KSFILTER_DISPATCH {
   2514   PFNKSFILTERIRP Create;
   2515   PFNKSFILTERIRP Close;
   2516   PFNKSFILTERPROCESS Process;
   2517   PFNKSFILTERVOID Reset;
   2518 };
   2519 
   2520 struct _KSPIN_DISPATCH {
   2521   PFNKSPINIRP Create;
   2522   PFNKSPINIRP Close;
   2523   PFNKSPIN Process;
   2524   PFNKSPINVOID Reset;
   2525   PFNKSPINSETDATAFORMAT SetDataFormat;
   2526   PFNKSPINSETDEVICESTATE SetDeviceState;
   2527   PFNKSPIN Connect;
   2528   PFNKSPINVOID Disconnect;
   2529   const KSCLOCK_DISPATCH *Clock;
   2530   const KSALLOCATOR_DISPATCH *Allocator;
   2531 };
   2532 
   2533 struct _KSCLOCK_DISPATCH {
   2534   PFNKSPINSETTIMER SetTimer;
   2535   PFNKSPINCANCELTIMER CancelTimer;
   2536   PFNKSPINCORRELATEDTIME CorrelatedTime;
   2537   PFNKSPINRESOLUTION Resolution;
   2538 };
   2539 
   2540 struct _KSALLOCATOR_DISPATCH {
   2541   PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
   2542   PFNKSDELETEALLOCATOR DeleteAllocator;
   2543   PFNKSDEFAULTALLOCATE Allocate;
   2544   PFNKSDEFAULTFREE Free;
   2545 };
   2546 
   2547 #define KSDEVICE_DESCRIPTOR_VERSION	(0x100)
   2548 
   2549 struct _KSDEVICE_DESCRIPTOR {
   2550   const KSDEVICE_DISPATCH *Dispatch;
   2551   ULONG FilterDescriptorsCount;
   2552   const KSFILTER_DESCRIPTOR*const *FilterDescriptors;
   2553   ULONG Version;
   2554 };
   2555 
   2556 struct _KSFILTER_DESCRIPTOR {
   2557   const KSFILTER_DISPATCH *Dispatch;
   2558   const KSAUTOMATION_TABLE *AutomationTable;
   2559   ULONG Version;
   2560 #define KSFILTER_DESCRIPTOR_VERSION	((ULONG)-1)
   2561   ULONG Flags;
   2562 #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING		0x00000001
   2563 #define KSFILTER_FLAG_CRITICAL_PROCESSING		0x00000002
   2564 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING		0x00000004
   2565 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES	0x00000008
   2566 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS		0x80000000
   2567   const GUID *ReferenceGuid;
   2568   ULONG PinDescriptorsCount;
   2569   ULONG PinDescriptorSize;
   2570   const KSPIN_DESCRIPTOR_EX *PinDescriptors;
   2571   ULONG CategoriesCount;
   2572   const GUID *Categories;
   2573   ULONG NodeDescriptorsCount;
   2574   ULONG NodeDescriptorSize;
   2575   const KSNODE_DESCRIPTOR *NodeDescriptors;
   2576   ULONG ConnectionsCount;
   2577   const KSTOPOLOGY_CONNECTION *Connections;
   2578   const KSCOMPONENTID *ComponentId;
   2579 };
   2580 
   2581 #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)				\
   2582 	const KSFILTER_DESCRIPTOR descriptor =
   2583 
   2584 #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)				\
   2585 	SIZEOF_ARRAY(table),						\
   2586 	sizeof(table[0]),						\
   2587 	table
   2588 
   2589 #define DEFINE_KSFILTER_CATEGORIES(table)				\
   2590 	SIZEOF_ARRAY(table),						\
   2591 	table
   2592 
   2593 #define DEFINE_KSFILTER_CATEGORY(category)				\
   2594 	1,								\
   2595 	&(category)
   2596 
   2597 #define DEFINE_KSFILTER_CATEGORIES_NULL					\
   2598 	0,								\
   2599 	NULL
   2600 
   2601 #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)				\
   2602 	SIZEOF_ARRAY(table),						\
   2603 	sizeof(table[0]),						\
   2604 	table
   2605 
   2606 #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL				\
   2607 	0,								\
   2608 	sizeof(KSNODE_DESCRIPTOR),					\
   2609 	NULL
   2610 
   2611 #define DEFINE_KSFILTER_CONNECTIONS(table)				\
   2612 	SIZEOF_ARRAY(table),						\
   2613 	table
   2614 
   2615 #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS				\
   2616 	0,								\
   2617 	NULL
   2618 
   2619 #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)				\
   2620 	const KSFILTER_DESCRIPTOR*const table[] =
   2621 
   2622 struct _KSPIN_DESCRIPTOR_EX {
   2623   const KSPIN_DISPATCH *Dispatch;
   2624   const KSAUTOMATION_TABLE *AutomationTable;
   2625   KSPIN_DESCRIPTOR PinDescriptor;
   2626   ULONG Flags;
   2627 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING	KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
   2628 #define KSPIN_FLAG_CRITICAL_PROCESSING		KSFILTER_FLAG_CRITICAL_PROCESSING
   2629 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING	KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
   2630 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING			0x00000008
   2631 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING			0x00000010
   2632 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL		0x00000020
   2633 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING		0x00000040
   2634 #define KSPIN_FLAG_ENFORCE_FIFO					0x00000080
   2635 #define KSPIN_FLAG_GENERATE_MAPPINGS				0x00000100
   2636 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE			0x00000200
   2637 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY			0x00010000
   2638 #define KSPIN_FLAG_SPLITTER					0x00020000
   2639 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT			0x00040000
   2640 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT		0x00080000
   2641 #define KSPIN_FLAG_FIXED_FORMAT					0x00100000
   2642 #define KSPIN_FLAG_GENERATE_EOS_EVENTS				0x00200000
   2643 #define KSPIN_FLAG_RENDERER			(KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
   2644 #define KSPIN_FLAG_IMPLEMENT_CLOCK				0x00400000
   2645 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING		0x00800000
   2646 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE			0x01000000
   2647 #define KSPIN_FLAG_DENY_USERMODE_ACCESS				0x80000000
   2648   ULONG InstancesPossible;
   2649   ULONG InstancesNecessary;
   2650   const KSALLOCATOR_FRAMING_EX *AllocatorFraming;
   2651   PFNKSINTERSECTHANDLEREX IntersectHandler;
   2652 };
   2653 
   2654 #define DEFINE_KSPIN_DEFAULT_INTERFACES					\
   2655 	0,								\
   2656 	NULL
   2657 
   2658 #define DEFINE_KSPIN_DEFAULT_MEDIUMS					\
   2659 	0,								\
   2660 	NULL
   2661 
   2662 struct _KSNODE_DESCRIPTOR {
   2663   const KSAUTOMATION_TABLE *AutomationTable;
   2664   const GUID *Type;
   2665   const GUID *Name;
   2666 #ifndef _WIN64
   2667   PVOID Alignment;
   2668 #endif
   2669 };
   2670 
   2671 #ifndef _WIN64
   2672 #define DEFINE_NODE_DESCRIPTOR(automation,type,name)			\
   2673 	{ (automation), (type), (name), NULL }
   2674 #else
   2675 #define DEFINE_NODE_DESCRIPTOR(automation,type,name)			\
   2676 	{ (automation), (type), (name) }
   2677 #endif
   2678 
   2679 struct _KSDEVICE {
   2680   const KSDEVICE_DESCRIPTOR *Descriptor;
   2681   KSOBJECT_BAG Bag;
   2682   PVOID Context;
   2683   PDEVICE_OBJECT FunctionalDeviceObject;
   2684   PDEVICE_OBJECT PhysicalDeviceObject;
   2685   PDEVICE_OBJECT NextDeviceObject;
   2686   BOOLEAN Started;
   2687   SYSTEM_POWER_STATE SystemPowerState;
   2688   DEVICE_POWER_STATE DevicePowerState;
   2689 };
   2690 
   2691 struct _KSFILTERFACTORY {
   2692   const KSFILTER_DESCRIPTOR *FilterDescriptor;
   2693   KSOBJECT_BAG Bag;
   2694   PVOID Context;
   2695 };
   2696 
   2697 struct _KSFILTER {
   2698   const KSFILTER_DESCRIPTOR *Descriptor;
   2699   KSOBJECT_BAG Bag;
   2700   PVOID Context;
   2701 };
   2702 
   2703 struct _KSPIN {
   2704   const KSPIN_DESCRIPTOR_EX *Descriptor;
   2705   KSOBJECT_BAG Bag;
   2706   PVOID Context;
   2707   ULONG Id;
   2708   KSPIN_COMMUNICATION Communication;
   2709   BOOLEAN ConnectionIsExternal;
   2710   KSPIN_INTERFACE ConnectionInterface;
   2711   KSPIN_MEDIUM ConnectionMedium;
   2712   KSPRIORITY ConnectionPriority;
   2713   PKSDATAFORMAT ConnectionFormat;
   2714   PKSMULTIPLE_ITEM AttributeList;
   2715   ULONG StreamHeaderSize;
   2716   KSPIN_DATAFLOW DataFlow;
   2717   KSSTATE DeviceState;
   2718   KSRESET ResetState;
   2719   KSSTATE ClientState;
   2720 };
   2721 
   2722 struct _KSMAPPING {
   2723   PHYSICAL_ADDRESS PhysicalAddress;
   2724   ULONG ByteCount;
   2725   ULONG Alignment;
   2726 };
   2727 
   2728 struct _KSSTREAM_POINTER_OFFSET
   2729 {
   2730 #if defined(_NTDDK_)
   2731   __MINGW_EXTENSION union {
   2732     PUCHAR Data;
   2733     PKSMAPPING Mappings;
   2734   };
   2735 #else
   2736   PUCHAR Data;
   2737 #endif /* _NTDDK_ */
   2738 #ifndef _WIN64
   2739   PVOID Alignment;
   2740 #endif
   2741   ULONG Count;
   2742   ULONG Remaining;
   2743 };
   2744 
   2745 struct _KSSTREAM_POINTER
   2746 {
   2747   PVOID Context;
   2748   PKSPIN Pin;
   2749   PKSSTREAM_HEADER StreamHeader;
   2750   PKSSTREAM_POINTER_OFFSET Offset;
   2751   KSSTREAM_POINTER_OFFSET OffsetIn;
   2752   KSSTREAM_POINTER_OFFSET OffsetOut;
   2753 };
   2754 
   2755 struct _KSPROCESSPIN {
   2756   PKSPIN Pin;
   2757   PKSSTREAM_POINTER StreamPointer;
   2758   PKSPROCESSPIN InPlaceCounterpart;
   2759   PKSPROCESSPIN DelegateBranch;
   2760   PKSPROCESSPIN CopySource;
   2761   PVOID Data;
   2762   ULONG BytesAvailable;
   2763   ULONG BytesUsed;
   2764   ULONG Flags;
   2765   BOOLEAN Terminate;
   2766 };
   2767 
   2768 struct _KSPROCESSPIN_INDEXENTRY {
   2769   PKSPROCESSPIN *Pins;
   2770   ULONG Count;
   2771 };
   2772 
   2773 typedef enum {
   2774   KsObjectTypeDevice,
   2775   KsObjectTypeFilterFactory,
   2776   KsObjectTypeFilter,
   2777   KsObjectTypePin
   2778 } KSOBJECTTYPE;
   2779 
   2780 
   2781 typedef void (*PFNKSFREE)(PVOID Data);
   2782 
   2783 typedef void (*PFNKSPINFRAMERETURN)(PKSPIN Pin,PVOID Data,ULONG Size,PMDL Mdl,
   2784 				    PVOID Context,NTSTATUS Status);
   2785 
   2786 typedef void (*PFNKSPINIRPCOMPLETION)(PKSPIN Pin,PIRP Irp);
   2787 
   2788 
   2789 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
   2790 #ifndef _IKsControl_
   2791 #define _IKsControl_
   2792 
   2793 typedef struct IKsControl *PIKSCONTROL;
   2794 
   2795 #ifndef DEFINE_ABSTRACT_UNKNOWN
   2796 #define DEFINE_ABSTRACT_UNKNOWN()					\
   2797 	STDMETHOD_(NTSTATUS,QueryInterface) (THIS_ 			\
   2798 						REFIID InterfaceId,	\
   2799 						PVOID *Interface	\
   2800 					    ) PURE;			\
   2801 	STDMETHOD_(ULONG,AddRef)(THIS) PURE;				\
   2802 	STDMETHOD_(ULONG,Release)(THIS) PURE;
   2803 #endif
   2804 
   2805 #undef INTERFACE
   2806 #define INTERFACE IKsControl
   2807 DECLARE_INTERFACE_(IKsControl,IUnknown)
   2808 {
   2809   DEFINE_ABSTRACT_UNKNOWN()
   2810   STDMETHOD_(NTSTATUS,KsProperty)(THIS_
   2811 					PKSPROPERTY Property,
   2812 					ULONG PropertyLength,
   2813 					PVOID PropertyData,
   2814 					ULONG DataLength,
   2815 					ULONG *BytesReturned
   2816 				 ) PURE;
   2817   STDMETHOD_(NTSTATUS,KsMethod)	(THIS_
   2818 					PKSMETHOD Method,
   2819 					ULONG MethodLength,
   2820 					PVOID MethodData,
   2821 					ULONG DataLength,
   2822 					ULONG *BytesReturned
   2823 				 ) PURE;
   2824   STDMETHOD_(NTSTATUS,KsEvent)	(THIS_
   2825 					PKSEVENT Event,
   2826 					ULONG EventLength,
   2827 					PVOID EventData,
   2828 					ULONG DataLength,
   2829 					ULONG *BytesReturned
   2830 				) PURE;
   2831 };
   2832 typedef struct IKsReferenceClock *PIKSREFERENCECLOCK;
   2833 
   2834 #undef INTERFACE
   2835 #define INTERFACE IKsReferenceClock
   2836 DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
   2837 {
   2838   DEFINE_ABSTRACT_UNKNOWN()
   2839   STDMETHOD_(LONGLONG,GetTime)		(THIS) PURE;
   2840   STDMETHOD_(LONGLONG,GetPhysicalTime)	(THIS) PURE;
   2841   STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
   2842   						PLONGLONG SystemTime
   2843   					) PURE;
   2844   STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
   2845 						PLONGLONG SystemTime
   2846 					) PURE;
   2847   STDMETHOD_(NTSTATUS,GetResolution)	(THIS_
   2848 						PKSRESOLUTION Resolution
   2849 					) PURE;
   2850   STDMETHOD_(NTSTATUS,GetState)		(THIS_
   2851 						PKSSTATE State
   2852 					) PURE;
   2853 };
   2854 #undef INTERFACE
   2855 
   2856 #define INTERFACE IKsDeviceFunctions
   2857 DECLARE_INTERFACE_(IKsDeviceFunctions,IUnknown)
   2858 {
   2859   DEFINE_ABSTRACT_UNKNOWN()
   2860   STDMETHOD_(NTSTATUS,RegisterAdapterObjectEx)	(THIS_
   2861 						  PADAPTER_OBJECT AdapterObject,
   2862 						  PDEVICE_DESCRIPTION DeviceDescription,
   2863 						  ULONG NumberOfMapRegisters,
   2864 						  ULONG MaxMappingsByteCount,
   2865 						  ULONG MappingTableStride
   2866 						) PURE;
   2867 };
   2868 
   2869 #undef INTERFACE
   2870 #define STATIC_IID_IKsControl						\
   2871 	0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
   2872 DEFINE_GUID(IID_IKsControl,
   2873 	0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96);
   2874 #define STATIC_IID_IKsFastClock						\
   2875 	0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e
   2876 DEFINE_GUID(IID_IKsFastClock,
   2877 	0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e);
   2878 #define STATIC_IID_IKsDeviceFunctions					\
   2879 	0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd
   2880 DEFINE_GUID(IID_IKsDeviceFunctions,
   2881 	0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd);
   2882 #endif /* _IKsControl_ */
   2883 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */
   2884 
   2885 #endif /* _NTDDK_ */
   2886 
   2887 
   2888 #ifdef __cplusplus
   2889 extern "C" {
   2890 #endif
   2891 
   2892 #ifdef _KSDDK_
   2893 #define KSDDKAPI
   2894 #else
   2895 #define KSDDKAPI DECLSPEC_IMPORT
   2896 #endif
   2897 
   2898 #if defined(_NTDDK_)
   2899 
   2900 KSDDKAPI NTSTATUS NTAPI KsEnableEvent
   2901 			(PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet,
   2902 			 PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
   2903 			 PVOID EventsLock);
   2904 
   2905 KSDDKAPI NTSTATUS NTAPI KsEnableEventWithAllocator
   2906 			(PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet,
   2907 			 PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
   2908 			 PVOID EventsLock, PFNKSALLOCATOR Allocator, ULONG EventItemSize);
   2909 
   2910 KSDDKAPI NTSTATUS NTAPI KsDisableEvent
   2911 			(PIRP Irp, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
   2912 			 PVOID EventsLock);
   2913 
   2914 KSDDKAPI VOID NTAPI KsDiscardEvent (PKSEVENT_ENTRY EventEntry);
   2915 
   2916 KSDDKAPI VOID NTAPI KsFreeEventList
   2917 			(PFILE_OBJECT FileObject, PLIST_ENTRY EventsList,
   2918 			 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock);
   2919 
   2920 KSDDKAPI NTSTATUS NTAPI KsGenerateEvent (PKSEVENT_ENTRY EventEntry);
   2921 
   2922 KSDDKAPI NTSTATUS NTAPI KsGenerateDataEvent
   2923 			(PKSEVENT_ENTRY EventEntry, ULONG DataSize, PVOID Data);
   2924 
   2925 KSDDKAPI VOID NTAPI KsGenerateEventList
   2926 			(GUID *Set, ULONG EventId, PLIST_ENTRY EventsList,
   2927 			 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock);
   2928 
   2929 KSDDKAPI NTSTATUS NTAPI KsPropertyHandler
   2930 			(PIRP Irp, ULONG PropertySetsCount,
   2931 			 const KSPROPERTY_SET *PropertySet);
   2932 
   2933 KSDDKAPI NTSTATUS NTAPI KsPropertyHandlerWithAllocator
   2934 			(PIRP Irp, ULONG PropertySetsCount,
   2935 			 const KSPROPERTY_SET *PropertySet, PFNKSALLOCATOR Allocator,
   2936 			 ULONG PropertyItemSize);
   2937 
   2938 KSDDKAPI BOOLEAN NTAPI KsFastPropertyHandler
   2939 			(PFILE_OBJECT FileObject, PKSPROPERTY Property,
   2940 			 ULONG PropertyLength, PVOID Data, ULONG DataLength,
   2941 			 PIO_STATUS_BLOCK IoStatus, ULONG PropertySetsCount,
   2942 			 const KSPROPERTY_SET *PropertySet);
   2943 
   2944 KSDDKAPI NTSTATUS NTAPI KsMethodHandler
   2945 			(PIRP Irp, ULONG MethodSetsCount,
   2946 			 const KSMETHOD_SET *MethodSet);
   2947 
   2948 KSDDKAPI NTSTATUS NTAPI KsMethodHandlerWithAllocator
   2949 			(PIRP Irp, ULONG MethodSetsCount,
   2950 			 const KSMETHOD_SET *MethodSet, PFNKSALLOCATOR Allocator,
   2951 			 ULONG MethodItemSize);
   2952 
   2953 KSDDKAPI BOOLEAN NTAPI KsFastMethodHandler
   2954 			(PFILE_OBJECT FileObject, PKSMETHOD Method, ULONG MethodLength,
   2955 			 PVOID Data, ULONG DataLength, PIO_STATUS_BLOCK IoStatus,
   2956 			 ULONG MethodSetsCount, const KSMETHOD_SET *MethodSet);
   2957 
   2958 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocator (PIRP Irp);
   2959 
   2960 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx
   2961 			(PIRP Irp, PVOID InitializeContext,
   2962 			 PFNKSDEFAULTALLOCATE DefaultAllocate,
   2963 			 PFNKSDEFAULTFREE DefaultFree,
   2964 			 PFNKSINITIALIZEALLOCATOR InitializeAllocator,
   2965 			 PFNKSDELETEALLOCATOR DeleteAllocator);
   2966 
   2967 KSDDKAPI NTSTATUS NTAPI KsCreateAllocator
   2968 			(HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming,
   2969 			 PHANDLE AllocatorHandle);
   2970 
   2971 KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorCreateRequest
   2972 			(PIRP Irp, PKSALLOCATOR_FRAMING *AllocatorFraming);
   2973 
   2974 KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorFramingEx
   2975 			(PKSALLOCATOR_FRAMING_EX Framing, ULONG BufferSize,
   2976 			 const KSALLOCATOR_FRAMING_EX *PinFraming);
   2977 
   2978 KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock (PKSDEFAULTCLOCK *DefaultClock);
   2979 
   2980 KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx
   2981 			(PKSDEFAULTCLOCK *DefaultClock, PVOID Context,
   2982 			 PFNKSSETTIMER SetTimer, PFNKSCANCELTIMER CancelTimer,
   2983 			 PFNKSCORRELATEDTIME CorrelatedTime,
   2984 			 const KSRESOLUTION *Resolution, ULONG Flags);
   2985 
   2986 KSDDKAPI VOID NTAPI KsFreeDefaultClock (PKSDEFAULTCLOCK DefaultClock);
   2987 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock (PIRP Irp, PKSDEFAULTCLOCK DefaultClock);
   2988 
   2989 KSDDKAPI NTSTATUS NTAPI KsCreateClock
   2990 			(HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate,
   2991 			 PHANDLE ClockHandle);
   2992 
   2993 KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest
   2994 			(PIRP Irp, PKSCLOCK_CREATE *ClockCreate);
   2995 
   2996 KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState (PKSDEFAULTCLOCK DefaultClock);
   2997 KSDDKAPI VOID NTAPI KsSetDefaultClockState(PKSDEFAULTCLOCK DefaultClock, KSSTATE State);
   2998 KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime (PKSDEFAULTCLOCK DefaultClock);
   2999 KSDDKAPI VOID NTAPI KsSetDefaultClockTime(PKSDEFAULTCLOCK DefaultClock, LONGLONG Time);
   3000 
   3001 KSDDKAPI NTSTATUS NTAPI KsCreatePin
   3002 			(HANDLE FilterHandle, PKSPIN_CONNECT Connect,
   3003 			 ACCESS_MASK DesiredAccess, PHANDLE ConnectionHandle);
   3004 
   3005 KSDDKAPI NTSTATUS NTAPI KsValidateConnectRequest
   3006 			(PIRP Irp, ULONG DescriptorsCount,
   3007 			 const KSPIN_DESCRIPTOR *Descriptor, PKSPIN_CONNECT *Connect);
   3008 
   3009 KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler
   3010 			(PIRP Irp, PKSPROPERTY Property, PVOID Data,
   3011 			 ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor);
   3012 
   3013 KSDDKAPI NTSTATUS NTAPI KsPinDataIntersection
   3014 			(PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount,
   3015 			 const KSPIN_DESCRIPTOR *Descriptor,
   3016 			 PFNKSINTERSECTHANDLER IntersectHandler);
   3017 
   3018 KSDDKAPI NTSTATUS NTAPI KsPinDataIntersectionEx
   3019 			(PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount,
   3020 			 const KSPIN_DESCRIPTOR *Descriptor, ULONG DescriptorSize,
   3021 			 PFNKSINTERSECTHANDLEREX IntersectHandler, PVOID HandlerContext);
   3022 
   3023 KSDDKAPI NTSTATUS NTAPI KsHandleSizedListQuery
   3024 			(PIRP Irp, ULONG DataItemsCount, ULONG DataItemSize,
   3025 			 const VOID *DataItems);
   3026 
   3027 #ifndef MAKEINTRESOURCE
   3028 #define MAKEINTRESOURCE(r)		((ULONG_PTR) (USHORT) r)
   3029 #endif
   3030 #ifndef RT_STRING
   3031 #define RT_STRING			MAKEINTRESOURCE(6)
   3032 #define RT_RCDATA			MAKEINTRESOURCE(10)
   3033 #endif
   3034 
   3035 KSDDKAPI NTSTATUS NTAPI KsLoadResource
   3036 			(PVOID ImageBase, POOL_TYPE PoolType, ULONG_PTR ResourceName,
   3037 			 ULONG ResourceType, PVOID *Resource, PULONG ResourceSize);
   3038 
   3039 KSDDKAPI NTSTATUS NTAPI KsGetImageNameAndResourceId
   3040 			(HANDLE RegKey, PUNICODE_STRING ImageName, PULONG_PTR ResourceId,
   3041 			 PULONG ValueType);
   3042 
   3043 KSDDKAPI NTSTATUS NTAPI KsMapModuleName
   3044 			(PDEVICE_OBJECT PhysicalDeviceObject, PUNICODE_STRING ModuleName,
   3045 			 PUNICODE_STRING ImageName, PULONG_PTR ResourceId,
   3046 			 PULONG ValueType);
   3047 
   3048 KSDDKAPI NTSTATUS NTAPI KsReferenceBusObject (KSDEVICE_HEADER Header);
   3049 KSDDKAPI VOID NTAPI KsDereferenceBusObject (KSDEVICE_HEADER Header);
   3050 KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3051 KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3052 KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificProperty (PIRP Irp, PFNKSHANDLER Handler);
   3053 KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificMethod (PIRP Irp, PFNKSHANDLER Handler);
   3054 
   3055 KSDDKAPI NTSTATUS NTAPI KsReadFile
   3056 			(PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext,
   3057 			 PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length,
   3058 			 ULONG Key, KPROCESSOR_MODE RequestorMode);
   3059 
   3060 KSDDKAPI NTSTATUS NTAPI KsWriteFile
   3061 			(PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext,
   3062 			 PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length,
   3063 			 ULONG Key, KPROCESSOR_MODE RequestorMode);
   3064 
   3065 KSDDKAPI NTSTATUS NTAPI KsQueryInformationFile
   3066 			(PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length,
   3067 			 FILE_INFORMATION_CLASS FileInformationClass);
   3068 
   3069 KSDDKAPI NTSTATUS NTAPI KsSetInformationFile
   3070 			(PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length,
   3071 			 FILE_INFORMATION_CLASS FileInformationClass);
   3072 
   3073 KSDDKAPI NTSTATUS NTAPI KsStreamIo
   3074 			(PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext,
   3075 			 PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext,
   3076 			 KSCOMPLETION_INVOCATION CompletionInvocationFlags,
   3077 			 PIO_STATUS_BLOCK IoStatusBlock, PVOID StreamHeaders, ULONG Length,
   3078 			 ULONG Flags, KPROCESSOR_MODE RequestorMode);
   3079 
   3080 KSDDKAPI NTSTATUS NTAPI KsProbeStreamIrp(PIRP Irp, ULONG ProbeFlags, ULONG HeaderSize);
   3081 KSDDKAPI NTSTATUS NTAPI KsAllocateExtraData(PIRP Irp, ULONG ExtraSize, PVOID *ExtraBuffer);
   3082 KSDDKAPI VOID NTAPI KsNullDriverUnload (PDRIVER_OBJECT DriverObject);
   3083 
   3084 KSDDKAPI NTSTATUS NTAPI KsSetMajorFunctionHandler
   3085 			(PDRIVER_OBJECT DriverObject, ULONG MajorFunction);
   3086 
   3087 KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest
   3088 			(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3089 
   3090 KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion
   3091 			(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3092 
   3093 KSDDKAPI NTSTATUS NTAPI KsDispatchIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3094 
   3095 KSDDKAPI BOOLEAN NTAPI KsDispatchFastIoDeviceControlFailure
   3096 			(PFILE_OBJECT FileObject, BOOLEAN Wait, PVOID InputBuffer,
   3097 			 ULONG InputBufferLength, PVOID OutputBuffer,
   3098 			 ULONG OutputBufferLength, ULONG IoControlCode,
   3099 			 PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject);
   3100 
   3101 KSDDKAPI BOOLEAN NTAPI KsDispatchFastReadFailure
   3102 			(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset,
   3103 			 ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer,
   3104 			 PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject);
   3105 
   3106 #define KsDispatchFastWriteFailure		KsDispatchFastReadFailure
   3107 
   3108 KSDDKAPI VOID NTAPI KsCancelRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3109 KSDDKAPI VOID NTAPI KsCancelIo(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock);
   3110 KSDDKAPI VOID NTAPI KsReleaseIrpOnCancelableQueue(PIRP Irp, PDRIVER_CANCEL DriverCancel);
   3111 
   3112 KSDDKAPI PIRP NTAPI KsRemoveIrpFromCancelableQueue
   3113 			(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock,
   3114 			 KSLIST_ENTRY_LOCATION ListLocation,
   3115 			 KSIRP_REMOVAL_OPERATION RemovalOperation);
   3116 
   3117 KSDDKAPI NTSTATUS NTAPI KsMoveIrpsOnCancelableQueue
   3118 			(PLIST_ENTRY SourceList, PKSPIN_LOCK SourceLock,
   3119 			 PLIST_ENTRY DestinationList, PKSPIN_LOCK DestinationLock,
   3120 			 KSLIST_ENTRY_LOCATION ListLocation,
   3121 			 PFNKSIRPLISTCALLBACK ListCallback, PVOID Context);
   3122 
   3123 KSDDKAPI VOID NTAPI KsRemoveSpecificIrpFromCancelableQueue (PIRP Irp);
   3124 
   3125 KSDDKAPI VOID NTAPI KsAddIrpToCancelableQueue
   3126 			(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, PIRP Irp,
   3127 			 KSLIST_ENTRY_LOCATION ListLocation, PDRIVER_CANCEL DriverCancel);
   3128 
   3129 KSDDKAPI NTSTATUS NTAPI KsAcquireResetValue(PIRP Irp, KSRESET *ResetValue);
   3130 
   3131 KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler
   3132 			(PIRP Irp, PKSPROPERTY Property, PVOID Data,
   3133 			 const KSTOPOLOGY *Topology);
   3134 
   3135 KSDDKAPI VOID NTAPI KsAcquireDeviceSecurityLock(KSDEVICE_HEADER Header, BOOLEAN Exclusive);
   3136 KSDDKAPI VOID NTAPI KsReleaseDeviceSecurityLock (KSDEVICE_HEADER Header);
   3137 KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3138 KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3139 KSDDKAPI NTSTATUS NTAPI KsDefaultForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
   3140 
   3141 KSDDKAPI VOID NTAPI KsSetDevicePnpAndBaseObject
   3142 			(KSDEVICE_HEADER Header, PDEVICE_OBJECT PnpDeviceObject,
   3143 			 PDEVICE_OBJECT BaseObject);
   3144 
   3145 KSDDKAPI PDEVICE_OBJECT NTAPI KsQueryDevicePnpObject (KSDEVICE_HEADER Header);
   3146 KSDDKAPI ACCESS_MASK NTAPI KsQueryObjectAccessMask (KSOBJECT_HEADER Header);
   3147 
   3148 KSDDKAPI VOID NTAPI KsRecalculateStackDepth
   3149 			(KSDEVICE_HEADER Header, BOOLEAN ReuseStackLocation);
   3150 
   3151 KSDDKAPI VOID NTAPI KsSetTargetState
   3152 			(KSOBJECT_HEADER Header, KSTARGET_STATE TargetState);
   3153 
   3154 KSDDKAPI VOID NTAPI KsSetTargetDeviceObject
   3155 			(KSOBJECT_HEADER Header, PDEVICE_OBJECT TargetDevice);
   3156 
   3157 KSDDKAPI VOID NTAPI KsSetPowerDispatch
   3158 			(KSOBJECT_HEADER Header, PFNKSCONTEXT_DISPATCH PowerDispatch,
   3159 			 PVOID PowerContext);
   3160 
   3161 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI KsQueryObjectCreateItem (KSOBJECT_HEADER Header);
   3162 
   3163 KSDDKAPI NTSTATUS NTAPI KsAllocateDeviceHeader
   3164 			(KSDEVICE_HEADER *Header, ULONG ItemsCount,
   3165 			 PKSOBJECT_CREATE_ITEM ItemsList);
   3166 
   3167 KSDDKAPI VOID NTAPI KsFreeDeviceHeader (KSDEVICE_HEADER Header);
   3168 
   3169 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader
   3170 			(KSOBJECT_HEADER *Header, ULONG ItemsCount,
   3171 			 PKSOBJECT_CREATE_ITEM ItemsList, PIRP Irp,
   3172 			 const KSDISPATCH_TABLE *Table);
   3173 
   3174 KSDDKAPI VOID NTAPI KsFreeObjectHeader (KSOBJECT_HEADER Header);
   3175 
   3176 KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToDeviceHeader
   3177 			(KSDEVICE_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context,
   3178 			 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor);
   3179 
   3180 KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToObjectHeader
   3181 			(KSOBJECT_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context,
   3182 			 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor);
   3183 
   3184 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectCreateItem
   3185 			(KSDEVICE_HEADER Header, PKSOBJECT_CREATE_ITEM CreateItem,
   3186 			 BOOLEAN AllocateEntry, PFNKSITEMFREECALLBACK ItemFreeCallback);
   3187 
   3188 KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItem
   3189 			(KSDEVICE_HEADER Header, PUNICODE_STRING CreateItem);
   3190 
   3191 KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItemsByContext
   3192 			(KSDEVICE_HEADER Header, PVOID Context);
   3193 
   3194 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultSecurity
   3195 			(PSECURITY_DESCRIPTOR ParentSecurity,
   3196 			 PSECURITY_DESCRIPTOR *DefaultSecurity);
   3197 
   3198 KSDDKAPI NTSTATUS NTAPI KsForwardIrp
   3199 			(PIRP Irp, PFILE_OBJECT FileObject, BOOLEAN ReuseStackLocation);
   3200 
   3201 KSDDKAPI NTSTATUS NTAPI KsForwardAndCatchIrp
   3202 			(PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject,
   3203 			 KSSTACK_USE StackUse);
   3204 
   3205 KSDDKAPI NTSTATUS NTAPI KsSynchronousIoControlDevice
   3206 			(PFILE_OBJECT FileObject, KPROCESSOR_MODE RequestorMode,
   3207 			 ULONG IoControl, PVOID InBuffer, ULONG InSize, PVOID OutBuffer,
   3208 			 ULONG OutSize, PULONG BytesReturned);
   3209 
   3210 KSDDKAPI NTSTATUS NTAPI KsUnserializeObjectPropertiesFromRegistry
   3211 			(PFILE_OBJECT FileObject, HANDLE ParentKey,
   3212 			 PUNICODE_STRING RegistryPath);
   3213 
   3214 KSDDKAPI NTSTATUS NTAPI KsCacheMedium
   3215 			(PUNICODE_STRING SymbolicLink, PKSPIN_MEDIUM Medium,
   3216 			 ULONG PinDirection);
   3217 
   3218 KSDDKAPI NTSTATUS NTAPI KsRegisterWorker
   3219 			(WORK_QUEUE_TYPE WorkQueueType, PKSWORKER *Worker);
   3220 
   3221 KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker
   3222 			(WORK_QUEUE_TYPE WorkQueueType, PWORK_QUEUE_ITEM CountedWorkItem,
   3223 			 PKSWORKER *Worker);
   3224 
   3225 KSDDKAPI VOID NTAPI KsUnregisterWorker (PKSWORKER Worker);
   3226 KSDDKAPI NTSTATUS NTAPI KsQueueWorkItem(PKSWORKER Worker, PWORK_QUEUE_ITEM WorkItem);
   3227 KSDDKAPI ULONG NTAPI KsIncrementCountedWorker (PKSWORKER Worker);
   3228 KSDDKAPI ULONG NTAPI KsDecrementCountedWorker (PKSWORKER Worker);
   3229 
   3230 KSDDKAPI NTSTATUS NTAPI KsCreateTopologyNode
   3231 			(HANDLE ParentHandle, PKSNODE_CREATE NodeCreate,
   3232 			 ACCESS_MASK DesiredAccess, PHANDLE NodeHandle);
   3233 
   3234 KSDDKAPI NTSTATUS NTAPI KsValidateTopologyNodeCreateRequest
   3235 			(PIRP Irp, PKSTOPOLOGY Topology, PKSNODE_CREATE *NodeCreate);
   3236 
   3237 KSDDKAPI NTSTATUS NTAPI KsMergeAutomationTables
   3238 			(PKSAUTOMATION_TABLE *AutomationTableAB,
   3239 			 PKSAUTOMATION_TABLE AutomationTableA,
   3240 			 PKSAUTOMATION_TABLE AutomationTableB,
   3241 			 KSOBJECT_BAG Bag);
   3242 
   3243 KSDDKAPI NTSTATUS NTAPI KsInitializeDriver
   3244 			(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName,
   3245 			 const KSDEVICE_DESCRIPTOR *Descriptor);
   3246 
   3247 KSDDKAPI NTSTATUS NTAPI KsAddDevice
   3248 			(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject);
   3249 
   3250 KSDDKAPI NTSTATUS NTAPI KsCreateDevice
   3251 			(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject,
   3252 			 const KSDEVICE_DESCRIPTOR *Descriptor, ULONG ExtensionSize,
   3253 			 PKSDEVICE *Device);
   3254 
   3255 KSDDKAPI NTSTATUS NTAPI KsInitializeDevice
   3256 			(PDEVICE_OBJECT FunctionalDeviceObject,
   3257 			 PDEVICE_OBJECT PhysicalDeviceObject,
   3258 			 PDEVICE_OBJECT NextDeviceObject,
   3259 			 const KSDEVICE_DESCRIPTOR *Descriptor);
   3260 
   3261 KSDDKAPI void NTAPI KsTerminateDevice (PDEVICE_OBJECT DeviceObject);
   3262 KSDDKAPI PKSDEVICE NTAPI KsGetDeviceForDeviceObject (PDEVICE_OBJECT FunctionalDeviceObject);
   3263 KSDDKAPI void NTAPI KsAcquireDevice (PKSDEVICE Device);
   3264 KSDDKAPI void NTAPI KsReleaseDevice (PKSDEVICE Device);
   3265 
   3266 KSDDKAPI void NTAPI KsDeviceRegisterAdapterObject
   3267 			(PKSDEVICE Device, PADAPTER_OBJECT AdapterObject,
   3268 			 ULONG MaxMappingsByteCount, ULONG MappingTableStride);
   3269 
   3270 KSDDKAPI ULONG NTAPI KsDeviceGetBusData
   3271 			(PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset,
   3272 			 ULONG Length);
   3273 
   3274 KSDDKAPI ULONG NTAPI KsDeviceSetBusData
   3275 			(PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset,
   3276 			 ULONG Length);
   3277 
   3278 KSDDKAPI NTSTATUS NTAPI KsCreateFilterFactory
   3279 			(PDEVICE_OBJECT DeviceObject, const KSFILTER_DESCRIPTOR *Descriptor,
   3280 			 PWSTR RefString, PSECURITY_DESCRIPTOR SecurityDescriptor,
   3281 			 ULONG CreateItemFlags, PFNKSFILTERFACTORYPOWER SleepCallback,
   3282 			 PFNKSFILTERFACTORYPOWER WakeCallback,
   3283 			 PKSFILTERFACTORY *FilterFactory);
   3284 
   3285 #define KsDeleteFilterFactory(FilterFactory)												\
   3286 	KsFreeObjectCreateItemsByContext( *(KSDEVICE_HEADER *)(										\
   3287 						KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->DeviceExtension),\
   3288 					   FilterFactory)
   3289 
   3290 KSDDKAPI NTSTATUS NTAPI KsFilterFactoryUpdateCacheData
   3291 			(PKSFILTERFACTORY FilterFactory,
   3292 			 const KSFILTER_DESCRIPTOR *FilterDescriptor);
   3293 
   3294 KSDDKAPI NTSTATUS NTAPI KsFilterFactoryAddCreateItem
   3295 			(PKSFILTERFACTORY FilterFactory, PWSTR RefString,
   3296 			 PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags);
   3297 
   3298 KSDDKAPI NTSTATUS NTAPI KsFilterFactorySetDeviceClassesState
   3299 			(PKSFILTERFACTORY FilterFactory, BOOLEAN NewState);
   3300 
   3301 KSDDKAPI PUNICODE_STRING NTAPI KsFilterFactoryGetSymbolicLink
   3302 			(PKSFILTERFACTORY FilterFactory);
   3303 
   3304 KSDDKAPI void NTAPI KsAddEvent(PVOID Object, PKSEVENT_ENTRY EventEntry);
   3305 
   3306 void __forceinline KsFilterAddEvent (PKSFILTER Filter, PKSEVENT_ENTRY EventEntry)
   3307 {
   3308 	KsAddEvent(Filter, EventEntry);
   3309 }
   3310 
   3311 void __forceinline KsPinAddEvent (PKSPIN Pin, PKSEVENT_ENTRY EventEntry)
   3312 {
   3313 	KsAddEvent(Pin, EventEntry);
   3314 }
   3315 
   3316 KSDDKAPI NTSTATUS NTAPI KsDefaultAddEventHandler
   3317 			(PIRP Irp, PKSEVENTDATA EventData, PKSEVENT_ENTRY EventEntry);
   3318 
   3319 KSDDKAPI void NTAPI KsGenerateEvents
   3320 			(PVOID Object, const GUID *EventSet, ULONG EventId,
   3321 			 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack,
   3322 			 PVOID CallBackContext);
   3323 
   3324 void __forceinline KsFilterGenerateEvents
   3325 			(PKSFILTER Filter, const GUID *EventSet, ULONG EventId,
   3326 			 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack,
   3327 			 PVOID CallBackContext)
   3328 {
   3329 	KsGenerateEvents(Filter, EventSet, EventId, DataSize, Data, CallBack,
   3330 			 CallBackContext);
   3331 }
   3332 
   3333 void __forceinline KsPinGenerateEvents
   3334 			(PKSPIN Pin, const GUID *EventSet, ULONG EventId,
   3335 			 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack,
   3336 			 PVOID CallBackContext)
   3337 {
   3338 	KsGenerateEvents(Pin, EventSet, EventId, DataSize, Data, CallBack,
   3339 			 CallBackContext);
   3340 }
   3341 
   3342 typedef enum {
   3343   KSSTREAM_POINTER_STATE_UNLOCKED = 0,
   3344   KSSTREAM_POINTER_STATE_LOCKED
   3345 } KSSTREAM_POINTER_STATE;
   3346 
   3347 KSDDKAPI NTSTATUS NTAPI KsPinGetAvailableByteCount
   3348 			(PKSPIN Pin, PLONG InputDataBytes, PLONG OutputBufferBytes);
   3349 
   3350 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer
   3351 			(PKSPIN Pin, KSSTREAM_POINTER_STATE State);
   3352 
   3353 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetTrailingEdgeStreamPointer
   3354 			(PKSPIN Pin, KSSTREAM_POINTER_STATE State);
   3355 
   3356 KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode
   3357 			(PKSSTREAM_POINTER StreamPointer, NTSTATUS Status);
   3358 
   3359 KSDDKAPI NTSTATUS NTAPI KsStreamPointerLock (PKSSTREAM_POINTER StreamPointer);
   3360 KSDDKAPI void NTAPI KsStreamPointerUnlock(PKSSTREAM_POINTER StreamPointer, BOOLEAN Eject);
   3361 
   3362 KSDDKAPI void NTAPI KsStreamPointerAdvanceOffsetsAndUnlock
   3363 			(PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed,
   3364 			 BOOLEAN Eject);
   3365 
   3366 KSDDKAPI void NTAPI KsStreamPointerDelete (PKSSTREAM_POINTER StreamPointer);
   3367 
   3368 KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone
   3369 			(PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER CancelCallback,
   3370 			 ULONG ContextSize, PKSSTREAM_POINTER *CloneStreamPointer);
   3371 
   3372 KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets
   3373 			(PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed,
   3374 			 BOOLEAN Eject);
   3375 
   3376 KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance (PKSSTREAM_POINTER StreamPointer);
   3377 KSDDKAPI PMDL NTAPI KsStreamPointerGetMdl (PKSSTREAM_POINTER StreamPointer);
   3378 
   3379 KSDDKAPI PIRP NTAPI KsStreamPointerGetIrp
   3380 			(PKSSTREAM_POINTER StreamPointer, PBOOLEAN FirstFrameInIrp,
   3381 			 PBOOLEAN LastFrameInIrp);
   3382 
   3383 KSDDKAPI void NTAPI KsStreamPointerScheduleTimeout
   3384 			(PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER Callback,
   3385 			 ULONGLONG Interval);
   3386 
   3387 KSDDKAPI void NTAPI KsStreamPointerCancelTimeout (PKSSTREAM_POINTER StreamPointer);
   3388 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetFirstCloneStreamPointer (PKSPIN Pin);
   3389 
   3390 KSDDKAPI PKSSTREAM_POINTER NTAPI KsStreamPointerGetNextClone
   3391 			(PKSSTREAM_POINTER StreamPointer);
   3392 
   3393 KSDDKAPI NTSTATUS NTAPI KsPinHandshake(PKSPIN Pin, PKSHANDSHAKE In, PKSHANDSHAKE Out);
   3394 KSDDKAPI void NTAPI KsCompletePendingRequest (PIRP Irp);
   3395 KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp (PIRP Irp);
   3396 KSDDKAPI PVOID NTAPI KsGetObjectFromFileObject (PFILE_OBJECT FileObject);
   3397 KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromFileObject (PFILE_OBJECT FileObject);
   3398 
   3399 PKSFILTER __forceinline KsGetFilterFromFileObject (PFILE_OBJECT FileObject)
   3400 {
   3401 	return (PKSFILTER) KsGetObjectFromFileObject(FileObject);
   3402 }
   3403 
   3404 PKSPIN __forceinline KsGetPinFromFileObject (PFILE_OBJECT FileObject)
   3405 {
   3406 	return (PKSPIN) KsGetObjectFromFileObject(FileObject);
   3407 }
   3408 
   3409 KSDDKAPI PKSGATE NTAPI KsFilterGetAndGate (PKSFILTER Filter);
   3410 KSDDKAPI void NTAPI KsFilterAcquireProcessingMutex (PKSFILTER Filter);
   3411 KSDDKAPI void NTAPI KsFilterReleaseProcessingMutex (PKSFILTER Filter);
   3412 KSDDKAPI void NTAPI KsFilterAttemptProcessing(PKSFILTER Filter, BOOLEAN Asynchronous);
   3413 KSDDKAPI PKSGATE NTAPI KsPinGetAndGate(PKSPIN Pin);
   3414 KSDDKAPI void NTAPI KsPinAttachAndGate(PKSPIN Pin, PKSGATE AndGate);
   3415 KSDDKAPI void NTAPI KsPinAttachOrGate (PKSPIN Pin, PKSGATE OrGate);
   3416 KSDDKAPI void NTAPI KsPinAcquireProcessingMutex (PKSPIN Pin);
   3417 KSDDKAPI void NTAPI KsPinReleaseProcessingMutex (PKSPIN Pin);
   3418 KSDDKAPI BOOLEAN NTAPI KsProcessPinUpdate (PKSPROCESSPIN ProcessPin);
   3419 
   3420 KSDDKAPI void NTAPI KsPinGetCopyRelationships
   3421 			(PKSPIN Pin, PKSPIN *CopySource, PKSPIN *DelegateBranch);
   3422 
   3423 KSDDKAPI void NTAPI KsPinAttemptProcessing(PKSPIN Pin, BOOLEAN Asynchronous);
   3424 KSDDKAPI PVOID NTAPI KsGetParent (PVOID Object);
   3425 
   3426 PKSDEVICE __forceinline KsFilterFactoryGetParentDevice (PKSFILTERFACTORY FilterFactory)
   3427 {
   3428 	return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
   3429 }
   3430 
   3431 PKSFILTERFACTORY __forceinline KsFilterGetParentFilterFactory (PKSFILTER Filter)
   3432 {
   3433 	return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
   3434 }
   3435 
   3436 KSDDKAPI PKSFILTER NTAPI KsPinGetParentFilter (PKSPIN Pin);
   3437 KSDDKAPI PVOID NTAPI KsGetFirstChild (PVOID Object);
   3438 
   3439 PKSFILTERFACTORY __forceinline KsDeviceGetFirstChildFilterFactory (PKSDEVICE Device)
   3440 {
   3441 	return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device);
   3442 }
   3443 
   3444 PKSFILTER __forceinline KsFilterFactoryGetFirstChildFilter (PKSFILTERFACTORY FilterFactory)
   3445 {
   3446 	return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory);
   3447 }
   3448 
   3449 KSDDKAPI ULONG NTAPI KsFilterGetChildPinCount(PKSFILTER Filter, ULONG PinId);
   3450 KSDDKAPI PKSPIN NTAPI KsFilterGetFirstChildPin(PKSFILTER Filter, ULONG PinId);
   3451 KSDDKAPI PVOID NTAPI KsGetNextSibling (PVOID Object);
   3452 KSDDKAPI PKSPIN NTAPI KsPinGetNextSiblingPin (PKSPIN Pin);
   3453 
   3454 PKSFILTERFACTORY __forceinline KsFilterFactoryGetNextSiblingFilterFactory
   3455 			(PKSFILTERFACTORY FilterFactory)
   3456 {
   3457 	return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory);
   3458 }
   3459 
   3460 PKSFILTER __forceinline KsFilterGetNextSiblingFilter (PKSFILTER Filter)
   3461 {
   3462 	return (PKSFILTER) KsGetNextSibling((PVOID) Filter);
   3463 }
   3464 
   3465 KSDDKAPI PKSDEVICE NTAPI KsGetDevice (PVOID Object);
   3466 
   3467 PKSDEVICE __forceinline KsFilterFactoryGetDevice (PKSFILTERFACTORY FilterFactory)
   3468 {
   3469 	return KsGetDevice((PVOID) FilterFactory);
   3470 }
   3471 
   3472 PKSDEVICE __forceinline KsFilterGetDevice (PKSFILTER Filter)
   3473 {
   3474 	return KsGetDevice((PVOID) Filter);
   3475 }
   3476 
   3477 PKSDEVICE __forceinline KsPinGetDevice (PKSPIN Pin)
   3478 {
   3479 	return KsGetDevice((PVOID) Pin);
   3480 }
   3481 
   3482 KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp (PIRP Irp);
   3483 KSDDKAPI PKSPIN NTAPI KsGetPinFromIrp (PIRP Irp);
   3484 KSDDKAPI ULONG NTAPI KsGetNodeIdFromIrp (PIRP Irp);
   3485 KSDDKAPI void NTAPI KsAcquireControl (PVOID Object);
   3486 KSDDKAPI void NTAPI KsReleaseControl (PVOID Object);
   3487 
   3488 void __forceinline KsFilterAcquireControl (PKSFILTER Filter)
   3489 {
   3490 	KsAcquireControl((PVOID) Filter);
   3491 }
   3492 
   3493 void __forceinline KsFilterReleaseControl (PKSFILTER Filter)
   3494 {
   3495 	KsReleaseControl((PVOID) Filter);
   3496 }
   3497 
   3498 void __forceinline KsPinAcquireControl (PKSPIN Pin)
   3499 {
   3500 	KsAcquireControl((PVOID) Pin);
   3501 }
   3502 
   3503 void __forceinline KsPinReleaseControl (PKSPIN Pin)
   3504 {
   3505 	KsReleaseControl((PVOID) Pin);
   3506 }
   3507 
   3508 KSDDKAPI NTSTATUS NTAPI KsAddItemToObjectBag
   3509 			(KSOBJECT_BAG ObjectBag, PVOID Item, PFNKSFREE Free);
   3510 
   3511 KSDDKAPI ULONG NTAPI KsRemoveItemFromObjectBag
   3512 			(KSOBJECT_BAG ObjectBag, PVOID Item, BOOLEAN Free);
   3513 
   3514 #define KsDiscard(Object,Pointer)					\
   3515 	KsRemoveItemFromObjectBag((Object)->Bag, (PVOID)(Pointer), TRUE)
   3516 
   3517 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectBag(PKSDEVICE Device, KSOBJECT_BAG *ObjectBag);
   3518 KSDDKAPI void NTAPI KsFreeObjectBag (KSOBJECT_BAG ObjectBag);
   3519 
   3520 KSDDKAPI NTSTATUS NTAPI KsCopyObjectBagItems
   3521 			(KSOBJECT_BAG ObjectBagDestination, KSOBJECT_BAG ObjectBagSource);
   3522 
   3523 KSDDKAPI NTSTATUS NTAPI _KsEdit
   3524 			(KSOBJECT_BAG ObjectBag, PVOID *PointerToPointerToItem,
   3525 			 ULONG NewSize, ULONG OldSize, ULONG Tag);
   3526 
   3527 #define KsEdit(Object, PointerToPointer, Tag)						\
   3528 	_KsEdit((Object)->Bag, (PVOID*)(PointerToPointer),				\
   3529 		sizeof(**(PointerToPointer)), sizeof(**(PointerToPointer)), (Tag))
   3530 
   3531 #define KsEditSized(Object, PointerToPointer, NewSize, OldSize, Tag)			\
   3532 	_KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), (NewSize), (OldSize), (Tag))
   3533 
   3534 KSDDKAPI NTSTATUS NTAPI KsRegisterFilterWithNoKSPins
   3535 			(PDEVICE_OBJECT DeviceObject, const GUID *InterfaceClassGUID,
   3536 			 ULONG PinCount, WINBOOL *PinDirection, KSPIN_MEDIUM *MediumList,
   3537 			 GUID *CategoryList);
   3538 
   3539 KSDDKAPI NTSTATUS NTAPI KsFilterCreatePinFactory
   3540 			(PKSFILTER Filter, const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
   3541 			 PULONG PinID);
   3542 
   3543 KSDDKAPI NTSTATUS NTAPI KsFilterCreateNode
   3544 			(PKSFILTER Filter, const KSNODE_DESCRIPTOR *const NodeDescriptor,
   3545 			 PULONG NodeID);
   3546 
   3547 KSDDKAPI NTSTATUS NTAPI KsFilterAddTopologyConnections
   3548 			(PKSFILTER Filter, ULONG NewConnectionsCount,
   3549 			 const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
   3550 
   3551 KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedPinInterface
   3552 			(PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface);
   3553 
   3554 KSDDKAPI PFILE_OBJECT NTAPI KsPinGetConnectedPinFileObject (PKSPIN Pin);
   3555 KSDDKAPI PDEVICE_OBJECT NTAPI KsPinGetConnectedPinDeviceObject (PKSPIN Pin);
   3556 
   3557 KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedFilterInterface
   3558 			(PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface);
   3559 
   3560 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
   3561 KSDDKAPI NTSTATUS NTAPI KsPinGetReferenceClockInterface
   3562 			(PKSPIN Pin, PIKSREFERENCECLOCK *Interface);
   3563 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */
   3564 
   3565 KSDDKAPI VOID NTAPI KsPinSetPinClockTime(PKSPIN Pin, LONGLONG Time);
   3566 
   3567 KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrame
   3568 			(PKSPIN Pin, PVOID Data, ULONG Size,
   3569 			 PKSSTREAM_HEADER StreamHeader, PVOID Context);
   3570 
   3571 KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrameMdl
   3572 			(PKSPIN Pin, PMDL Mdl, PKSSTREAM_HEADER StreamHeader,
   3573 			 PVOID Context);
   3574 
   3575 KSDDKAPI void NTAPI KsPinRegisterFrameReturnCallback
   3576 			(PKSPIN Pin, PFNKSPINFRAMERETURN FrameReturn);
   3577 
   3578 KSDDKAPI void NTAPI KsPinRegisterIrpCompletionCallback
   3579 			(PKSPIN Pin, PFNKSPINIRPCOMPLETION IrpCompletion);
   3580 
   3581 KSDDKAPI void NTAPI KsPinRegisterHandshakeCallback
   3582 			(PKSPIN Pin, PFNKSPINHANDSHAKE Handshake);
   3583 
   3584 KSDDKAPI void NTAPI KsFilterRegisterPowerCallbacks
   3585 			(PKSFILTER Filter, PFNKSFILTERPOWER Sleep, PFNKSFILTERPOWER Wake);
   3586 
   3587 KSDDKAPI void NTAPI KsPinRegisterPowerCallbacks
   3588 			(PKSPIN Pin, PFNKSPINPOWER Sleep, PFNKSPINPOWER Wake);
   3589 
   3590 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
   3591 KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown
   3592 			(PVOID Object, PUNKNOWN ClientUnknown);
   3593 
   3594 KSDDKAPI PUNKNOWN NTAPI KsGetOuterUnknown (PVOID Object);
   3595 
   3596 PUNKNOWN __forceinline KsDeviceRegisterAggregatedClientUnknown
   3597 			(PKSDEVICE Device, PUNKNOWN ClientUnknown)
   3598 {
   3599 	return KsRegisterAggregatedClientUnknown((PVOID)Device, ClientUnknown);
   3600 }
   3601 
   3602 PUNKNOWN __forceinline KsDeviceGetOuterUnknown (PKSDEVICE Device)
   3603 {
   3604 	return KsGetOuterUnknown((PVOID) Device);
   3605 }
   3606 
   3607 PUNKNOWN __forceinline KsFilterFactoryRegisterAggregatedClientUnknown
   3608 			(PKSFILTERFACTORY FilterFactory, PUNKNOWN ClientUnknown)
   3609 {
   3610 	return KsRegisterAggregatedClientUnknown((PVOID)FilterFactory, ClientUnknown);
   3611 }
   3612 
   3613 PUNKNOWN __forceinline KsFilterFactoryGetOuterUnknown (PKSFILTERFACTORY FilterFactory)
   3614 {
   3615 	return KsGetOuterUnknown((PVOID)FilterFactory);
   3616 }
   3617 
   3618 PUNKNOWN __forceinline KsFilterRegisterAggregatedClientUnknown
   3619 			(PKSFILTER Filter, PUNKNOWN ClientUnknown)
   3620 {
   3621 	return KsRegisterAggregatedClientUnknown((PVOID)Filter, ClientUnknown);
   3622 }
   3623 
   3624 PUNKNOWN __forceinline KsFilterGetOuterUnknown (PKSFILTER Filter)
   3625 {
   3626 	return KsGetOuterUnknown((PVOID)Filter);
   3627 }
   3628 
   3629 PUNKNOWN __forceinline KsPinRegisterAggregatedClientUnknown
   3630 			(PKSPIN Pin, PUNKNOWN ClientUnknown)
   3631 {
   3632 	return KsRegisterAggregatedClientUnknown((PVOID)Pin, ClientUnknown);
   3633 }
   3634 
   3635 PUNKNOWN __forceinline KsPinGetOuterUnknown (PKSPIN Pin)
   3636 {
   3637 	return KsGetOuterUnknown((PVOID)Pin);
   3638 }
   3639 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */
   3640 
   3641 #else /* _NTDDK_ */
   3642 
   3643 #ifndef KS_NO_CREATE_FUNCTIONS
   3644 KSDDKAPI DWORD WINAPI KsCreateAllocator(HANDLE ConnectionHandle,PKSALLOCATOR_FRAMING AllocatorFraming,PHANDLE AllocatorHandle);
   3645 KSDDKAPI DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle,PKSCLOCK_CREATE ClockCreate,PHANDLE ClockHandle);
   3646 KSDDKAPI DWORD WINAPI KsCreatePin(HANDLE FilterHandle,PKSPIN_CONNECT Connect,ACCESS_MASK DesiredAccess,PHANDLE ConnectionHandle);
   3647 KSDDKAPI DWORD WINAPI KsCreateTopologyNode(HANDLE ParentHandle,PKSNODE_CREATE NodeCreate,ACCESS_MASK DesiredAccess,PHANDLE NodeHandle);
   3648 #endif
   3649 
   3650 #endif /* _NTDDK_ */
   3651 
   3652 #ifdef __cplusplus
   3653 }
   3654 #endif
   3655 
   3656 #define DENY_USERMODE_ACCESS(pIrp,CompleteRequest)			\
   3657 	if(pIrp->RequestorMode!=KernelMode) {				\
   3658 		pIrp->IoStatus.Information = 0;				\
   3659 		pIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;	\
   3660 		if(CompleteRequest)					\
   3661 			IoCompleteRequest (pIrp,IO_NO_INCREMENT);	\
   3662 		return STATUS_INVALID_DEVICE_REQUEST;			\
   3663 	}
   3664 
   3665 #endif /* _KS_ */
   3666