zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

ks.h (121734B) - Raw


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