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
  38DEFINE_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
  49typedef enum {
  50  KSRESET_BEGIN,
  51  KSRESET_END
  52} KSRESET;
  53
  54typedef 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
  66typedef struct {
  67  ULONG PriorityClass;
  68  ULONG PrioritySubClass;
  69} KSPRIORITY,*PKSPRIORITY;
  70
  71typedef 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
  83typedef 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
 111typedef struct {
 112  KSPROPERTY Property;
 113  ULONG NodeId;
 114  ULONG Reserved;
 115} KSP_NODE,*PKSP_NODE;
 116
 117typedef struct {
 118  KSMETHOD Method;
 119  ULONG NodeId;
 120  ULONG Reserved;
 121} KSM_NODE,*PKSM_NODE;
 122
 123typedef 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
 131DEFINE_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
 138typedef struct {
 139  ULONG Size;
 140  ULONG Count;
 141} KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM;
 142
 143typedef 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
 159typedef struct {
 160  ULONG MembersFlags;
 161  ULONG MembersSize;
 162  ULONG MembersCount;
 163  ULONG Flags;
 164} KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER;
 165
 166typedef 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
 179typedef 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
 192typedef struct {
 193  ULONG SteppingDelta;
 194  ULONG Reserved;
 195  KSPROPERTY_BOUNDS_LONG Bounds;
 196} KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG;
 197
 198typedef struct {
 199  DWORDLONG SteppingDelta;
 200  KSPROPERTY_BOUNDS_LONGLONG Bounds;
 201} KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG;
 202
 203#if defined(_NTDDK_)
 204typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
 205typedef struct _KSDEVICE_DISPATCH KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
 206typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
 207typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY;
 208typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
 209typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
 210typedef struct _KSFILTER KSFILTER, *PKSFILTER;
 211typedef struct _KSPIN_DESCRIPTOR_EX KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
 212typedef struct _KSPIN_DISPATCH KSPIN_DISPATCH, *PKSPIN_DISPATCH;
 213typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
 214typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
 215typedef struct _KSPIN KSPIN, *PKSPIN;
 216typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
 217typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
 218typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
 219typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
 220typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
 221typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
 222#endif /* _NTDDK_ */
 223
 224typedef PVOID PKSWORKER;
 225
 226
 227typedef 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
 292typedef struct {
 293  KSEVENT Event;
 294  PKSEVENTDATA EventData;
 295  PVOID Reserved;
 296} KSQUERYBUFFER,*PKSQUERYBUFFER;
 297
 298typedef 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
 313typedef struct {
 314  KSEVENTDATA EventData;
 315  LONGLONG MarkTime;
 316} KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK;
 317
 318typedef struct {
 319  KSEVENTDATA EventData;
 320  LONGLONG TimeBase;
 321  LONGLONG Interval;
 322} KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL;
 323
 324typedef 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
 331DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196",KSPROPSETID_General);
 332#define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
 333
 334typedef enum {
 335  KSPROPERTY_GENERAL_COMPONENTID
 336} KSPROPERTY_GENERAL;
 337
 338typedef 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
 357DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196",KSMETHODSETID_StreamIo);
 358#define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
 359
 360typedef 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
 385DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196",KSPROPSETID_MediaSeeking);
 386#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
 387
 388typedef 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
 401typedef 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
 411typedef 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
 421typedef struct {
 422  LONGLONG Current;
 423  LONGLONG Stop;
 424  KS_SEEKING_FLAGS CurrentFlags;
 425  KS_SEEKING_FLAGS StopFlags;
 426} KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS;
 427
 428typedef struct {
 429  LONGLONG Earliest;
 430  LONGLONG Latest;
 431} KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE;
 432
 433typedef 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
 524DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000",KSPROPSETID_Topology);
 525#define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
 526
 527typedef 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)		\
 567DEFINE_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
 576DEFINE_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
 581DEFINE_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
 586DEFINE_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
 591DEFINE_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
 596DEFINE_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
 601DEFINE_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
 606DEFINE_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
 611DEFINE_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
 616DEFINE_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
 621DEFINE_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
 626DEFINE_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
 631DEFINE_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
 636DEFINE_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
 641DEFINE_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
 646DEFINE_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
 651DEFINE_GUIDSTRUCT("E5323777-F976-4F5B-9B55-B94699C46E44",KSCATEGORY_VIDEO_CAMERA);
 652#define KSCATEGORY_VIDEO_CAMERA DEFINE_GUIDNAMED(KSCATEGORY_VIDEO_CAMERA)
 653
 654typedef struct {
 655  ULONG FromNode;
 656  ULONG FromNodePin;
 657  ULONG ToNode;
 658  ULONG ToNodePin;
 659} KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION;
 660
 661typedef 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
 675typedef 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
 685DEFINE_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
 690DEFINE_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
 695DEFINE_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
 700DEFINE_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
 705DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_MEDIA_TIME);
 706#define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
 707
 708typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE;
 709
 710#define STATIC_KSINTERFACESETID_Standard				\
 711	0x1A8766A0,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
 712DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000",KSINTERFACESETID_Standard);
 713#define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
 714
 715typedef 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
 723DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196",KSINTERFACESETID_FileIo);
 724#define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
 725
 726typedef 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
 734DEFINE_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
 741DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000",KSPROPSETID_Pin);
 742#define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
 743
 744typedef 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
 762typedef struct {
 763  KSPROPERTY Property;
 764  ULONG PinId;
 765  ULONG Reserved;
 766} KSP_PIN,*PKSP_PIN;
 767
 768#define KSINSTANCE_INDETERMINATE	((ULONG)-1)
 769
 770typedef struct {
 771  ULONG PossibleCount;
 772  ULONG CurrentCount;
 773} KSPIN_CINSTANCES,*PKSPIN_CINSTANCES;
 774
 775typedef 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
 790typedef 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
 805typedef struct {
 806  ULONG Size;
 807  ULONG Flags;
 808  GUID Attribute;
 809} KSATTRIBUTE,*PKSATTRIBUTE;
 810
 811#if defined(_NTDDK_)
 812typedef struct {
 813  ULONG Count;
 814  PKSATTRIBUTE *Attributes;
 815} KSATTRIBUTE_LIST,*PKSATTRIBUTE_LIST;
 816#endif /* _NTDDK_ */
 817
 818typedef 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
 826typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM;
 827
 828typedef struct {
 829  KSPIN_INTERFACE Interface;
 830  KSPIN_MEDIUM Medium;
 831  ULONG PinId;
 832  HANDLE PinToHandle;
 833  KSPRIORITY Priority;
 834} KSPIN_CONNECT,*PKSPIN_CONNECT;
 835
 836typedef struct {
 837  ULONG Size;
 838  ULONG Pin;
 839  WCHAR SymbolicLinkName[1];
 840} KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION;
 841
 842#if defined(_NTDDK_)
 843typedef NTSTATUS (*PFNKSINTERSECTHANDLER) ( PIRP Irp, PKSP_PIN Pin,
 844					    PKSDATARANGE DataRange,
 845					    PVOID Data);
 846typedef 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) \
 992DEFINE_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) \
1006DEFINE_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
1022DEFINE_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
1029DEFINE_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
1036DEFINE_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
1043DEFINE_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
1052DEFINE_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_)
1058typedef 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;
1077typedef 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
1105DEFINE_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
1110DEFINE_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
1118DEFINE_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
1123DEFINE_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
1128DEFINE_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
1133DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000",KSPROPSETID_Quality);
1134#define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
1135
1136typedef 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
1161DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000",KSPROPSETID_Connection);
1162#define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
1163
1164typedef 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
1246DEFINE_GUIDSTRUCT("0A3D1C5D-5243-4819-9ED0-AEE8044CEE2B", KSPROPSETID_MemoryTransport);
1247#define KSPROPSETID_MemoryTransport DEFINE_GUIDNAMED(KSPROPSETID_MemoryTransport)
1248
1249enum {
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
1282typedef 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_)
1299typedef PVOID (*PFNKSDEFAULTALLOCATE)(PVOID Context);
1300typedef VOID (*PFNKSDEFAULTFREE)(PVOID Context, PVOID Buffer);
1301typedef NTSTATUS (*PFNKSINITIALIZEALLOCATOR)(PVOID InitialContext,
1302					PKSALLOCATOR_FRAMING AllocatorFraming,
1303					PVOID* Context);
1304typedef VOID (*PFNKSDELETEALLOCATOR) (PVOID Context);
1305#endif /* _NTDDK_ */
1306
1307typedef struct {
1308  ULONG MinFrameSize;
1309  ULONG MaxFrameSize;
1310  ULONG Stepping;
1311} KS_FRAMING_RANGE,*PKS_FRAMING_RANGE;
1312
1313typedef struct {
1314  KS_FRAMING_RANGE Range;
1315  ULONG InPlaceWeight;
1316  ULONG NotInPlaceWeight;
1317} KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED;
1318
1319typedef struct {
1320  ULONG RatioNumerator;
1321  ULONG RatioDenominator;
1322  ULONG RatioConstantMargin;
1323} KS_COMPRESSION,*PKS_COMPRESSION;
1324
1325typedef 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
1338typedef 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
1357DEFINE_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
1362DEFINE_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
1367DEFINE_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
1372DEFINE_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
1377DEFINE_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) \
1381const 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
1476DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4",KSEVENTSETID_StreamAllocator);
1477#define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
1478
1479typedef 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
1486DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4",KSMETHODSETID_StreamAllocator);
1487#define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
1488
1489typedef 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)\
1513DEFINE_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
1520DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4",KSPROPSETID_StreamAllocator);
1521#define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
1522
1523#if defined(_NTDDK_)
1524typedef 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)\
1546DEFINE_KSPROPERTY_TABLE(AllocatorSet) {					\
1547	DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),	\
1548	DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
1549}
1550
1551typedef NTSTATUS (*PFNALLOCATOR_ALLOCATEFRAME) (PFILE_OBJECT FileObject,
1552						PVOID *Frame);
1553typedef VOID (*PFNALLOCATOR_FREEFRAME) (PFILE_OBJECT FileObject, PVOID Frame);
1554
1555typedef struct {
1556  PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
1557  PFNALLOCATOR_FREEFRAME FreeFrame;
1558} KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
1559#endif /* _NTDDK_ */
1560
1561typedef struct {
1562  KSALLOCATOR_FRAMING Framing;
1563  ULONG AllocatedFrames;
1564  ULONG Reserved;
1565} KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS;
1566
1567typedef 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
1586typedef struct {
1587  LONGLONG Time;
1588  ULONG Numerator;
1589  ULONG Denominator;
1590} KSTIME,*PKSTIME;
1591
1592typedef 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
1608DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a",KSPROPSETID_StreamInterface);
1609#define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
1610
1611typedef 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) \
1624DEFINE_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
1630DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4",KSPROPSETID_Stream);
1631#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
1632
1633typedef 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
1741typedef struct {
1742  HANDLE QualityManager;
1743  PVOID Context;
1744} KSQUALITY_MANAGER,*PKSQUALITY_MANAGER;
1745
1746typedef struct {
1747  LONGLONG Duration;
1748  ULONG FrameFlags;
1749  ULONG Reserved;
1750} KSFRAMETIME,*PKSFRAMETIME;
1751
1752#define KSFRAMETIME_VARIABLESIZE	0x00000001
1753
1754typedef 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
1765typedef 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
1772DEFINE_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
1781typedef struct {
1782  ULONG CreateFlags;
1783} KSCLOCK_CREATE,*PKSCLOCK_CREATE;
1784
1785typedef struct {
1786  LONGLONG Time;
1787  LONGLONG SystemTime;
1788} KSCORRELATED_TIME,*PKSCORRELATED_TIME;
1789
1790typedef struct {
1791  LONGLONG Granularity;
1792  LONGLONG Error;
1793} KSRESOLUTION,*PKSRESOLUTION;
1794
1795typedef 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_)
1808typedef LONGLONG (FASTCALL *PFNKSCLOCK_GETTIME)(PFILE_OBJECT FileObject);
1809typedef LONGLONG (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(PFILE_OBJECT FileObject,
1810							PLONGLONG SystemTime);
1811
1812typedef struct {
1813   PFNKSCLOCK_GETTIME GetTime;
1814   PFNKSCLOCK_GETTIME GetPhysicalTime;
1815   PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
1816   PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
1817} KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
1818
1819typedef BOOLEAN (*PFNKSSETTIMER)(PVOID Context, PKTIMER Timer,
1820				 LARGE_INTEGER DueTime, PKDPC Dpc);
1821typedef BOOLEAN (*PFNKSCANCELTIMER) (PVOID Context, PKTIMER Timer);
1822typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(PVOID Context,
1823						 PLONGLONG SystemTime);
1824
1825typedef 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)\
1880DEFINE_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
1893DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000",KSEVENTSETID_Clock);
1894#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
1895
1896typedef 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
1903DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000",KSEVENTSETID_Connection);
1904#define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
1905
1906typedef 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
1914typedef struct {
1915  PVOID Context;
1916  ULONG Proportion;
1917  LONGLONG DeltaTime;
1918} KSQUALITY,*PKSQUALITY;
1919
1920typedef struct {
1921  PVOID Context;
1922  ULONG Status;
1923} KSERROR,*PKSERROR;
1924
1925typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE;
1926
1927#define STATIC_KSDEGRADESETID_Standard					\
1928	0x9F564180,0x704C,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
1929DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000",KSDEGRADESETID_Standard);
1930#define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
1931
1932typedef 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
1956typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(PVOID Context, PIRP Irp);
1957typedef NTSTATUS (*PFNKSHANDLER)(PIRP Irp, PKSIDENTIFIER Request, PVOID Data);
1958typedef BOOLEAN (*PFNKSFASTHANDLER)(PFILE_OBJECT FileObject,
1959				    PKSIDENTIFIER Request,
1960				    ULONG RequestLength, PVOID Data,
1961				    ULONG DataLength,
1962				    PIO_STATUS_BLOCK IoStatus);
1963typedef NTSTATUS (*PFNKSALLOCATOR) (PIRP Irp, ULONG BufferSize,
1964				    BOOLEAN InputOperation);
1965
1966typedef struct {
1967  KSPROPERTY_MEMBERSHEADER MembersHeader;
1968  const VOID *Members;
1969} KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
1970
1971typedef 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
1991typedef 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
2016typedef 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
2039typedef 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
2057typedef 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
2074typedef 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
2092typedef 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
2100typedef struct _KSEVENT_ENTRY	KSEVENT_ENTRY, *PKSEVENT_ENTRY;
2101typedef NTSTATUS (*PFNKSADDEVENT)(PIRP Irp, PKSEVENTDATA EventData,
2102				  struct _KSEVENT_ENTRY* EventEntry);
2103typedef 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
2115typedef 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
2132typedef struct {
2133  const GUID *Set;
2134  ULONG EventsCount;
2135  const KSEVENT_ITEM *EventItem;
2136} KSEVENT_SET, *PKSEVENT_SET;
2137
2138typedef struct {
2139  KDPC Dpc;
2140  ULONG ReferenceCount;
2141  KSPIN_LOCK AccessLock;
2142} KSDPC_ITEM, *PKSDPC_ITEM;
2143
2144typedef 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
2154struct _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
2171typedef 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
2183typedef 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
2191typedef 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
2233typedef struct {
2234  ULONG CreateItemsCount;
2235  PKSOBJECT_CREATE_ITEM CreateItemsList;
2236} KSOBJECT_CREATE, *PKSOBJECT_CREATE;
2237
2238typedef 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
2289typedef PVOID		KSDEVICE_HEADER, KSOBJECT_HEADER;
2290
2291typedef enum {
2292  KsInvokeOnSuccess = 1,
2293  KsInvokeOnError = 2,
2294  KsInvokeOnCancel = 4
2295} KSCOMPLETION_INVOCATION;
2296
2297typedef enum {
2298  KsListEntryTail,
2299  KsListEntryHead
2300} KSLIST_ENTRY_LOCATION;
2301
2302typedef enum {
2303  KsAcquireOnly,
2304  KsAcquireAndRemove,
2305  KsAcquireOnlySingleItem,
2306  KsAcquireAndRemoveOnlySingleItem
2307} KSIRP_REMOVAL_OPERATION;
2308
2309typedef enum {
2310  KsStackCopyToNewLocation,
2311  KsStackReuseCurrentLocation,
2312  KsStackUseNewLocation
2313} KSSTACK_USE;
2314
2315typedef enum {
2316  KSTARGET_STATE_DISABLED,
2317  KSTARGET_STATE_ENABLED
2318} KSTARGET_STATE;
2319
2320typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(PIRP Irp, PVOID Context);
2321typedef VOID (*PFNREFERENCEDEVICEOBJECT)(PVOID Context);
2322typedef VOID (*PFNDEREFERENCEDEVICEOBJECT)(PVOID Context);
2323typedef NTSTATUS (*PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String);
2324
2325#define BUS_INTERFACE_REFERENCE_VERSION			0x100
2326
2327typedef 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
2338typedef NTSTATUS (*PFNQUERYMEDIUMSLIST) (PVOID Context, ULONG *MediumsCount,
2339					 PKSPIN_MEDIUM *MediumList);
2340
2341typedef 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
2349DEFINE_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
2358typedef 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
2367typedef 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
2379typedef struct {
2380  GUID ProtocolId;
2381  PVOID Argument1;
2382  PVOID Argument2;
2383} KSHANDSHAKE, *PKSHANDSHAKE;
2384
2385typedef struct _KSGATE		KSGATE, *PKSGATE;
2386
2387struct _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
2508typedef PVOID KSOBJECT_BAG;
2509
2510
2511typedef BOOLEAN (*PFNKSGENERATEEVENTCALLBACK)(PVOID Context,
2512					      PKSEVENT_ENTRY EventEntry);
2513
2514typedef NTSTATUS (*PFNKSDEVICECREATE)(PKSDEVICE Device);
2515
2516typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(PKSDEVICE Device,PIRP Irp,
2517				PCM_RESOURCE_LIST TranslatedResourceList,
2518				PCM_RESOURCE_LIST UntranslatedResourceList);
2519
2520typedef NTSTATUS (*PFNKSDEVICE)(PKSDEVICE Device);
2521
2522typedef NTSTATUS (*PFNKSDEVICEIRP)(PKSDEVICE Device,PIRP Irp);
2523
2524typedef void (*PFNKSDEVICEIRPVOID)(PKSDEVICE Device,PIRP Irp);
2525
2526typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(PKSDEVICE Device,PIRP Irp,
2527					 PDEVICE_CAPABILITIES Capabilities);
2528
2529typedef 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
2536typedef void (*PFNKSDEVICESETPOWER)(PKSDEVICE Device,PIRP Irp,
2537				    DEVICE_POWER_STATE To,
2538				    DEVICE_POWER_STATE From);
2539
2540typedef NTSTATUS (*PFNKSFILTERFACTORYVOID)(PKSFILTERFACTORY FilterFactory);
2541
2542typedef void (*PFNKSFILTERFACTORYPOWER)(PKSFILTERFACTORY FilterFactory,
2543					DEVICE_POWER_STATE State);
2544
2545typedef NTSTATUS (*PFNKSFILTERIRP)(PKSFILTER Filter,PIRP Irp);
2546
2547typedef NTSTATUS (*PFNKSFILTERPROCESS)(PKSFILTER Filter,
2548					PKSPROCESSPIN_INDEXENTRY Index);
2549
2550typedef NTSTATUS (*PFNKSFILTERVOID)(PKSFILTER Filter);
2551
2552typedef void (*PFNKSFILTERPOWER)(PKSFILTER Filter,DEVICE_POWER_STATE State);
2553
2554typedef NTSTATUS (*PFNKSPINIRP)(PKSPIN Pin,PIRP Irp);
2555
2556typedef NTSTATUS (*PFNKSPINSETDEVICESTATE)(PKSPIN Pin,KSSTATE ToState,
2557					   KSSTATE FromState);
2558
2559typedef NTSTATUS (*PFNKSPINSETDATAFORMAT)(PKSPIN Pin,PKSDATAFORMAT OldFormat,
2560					  PKSMULTIPLE_ITEM OldAttributeList,
2561					  const KSDATARANGE *DataRange,
2562					  const KSATTRIBUTE_LIST *AttributeRange);
2563
2564typedef NTSTATUS (*PFNKSPINHANDSHAKE)(PKSPIN Pin,PKSHANDSHAKE In,
2565				      PKSHANDSHAKE Out);
2566
2567typedef NTSTATUS (*PFNKSPIN)(PKSPIN Pin);
2568
2569typedef void (*PFNKSPINVOID)(PKSPIN Pin);
2570
2571typedef void (*PFNKSPINPOWER)(PKSPIN Pin,DEVICE_POWER_STATE State);
2572
2573typedef BOOLEAN (*PFNKSPINSETTIMER)(PKSPIN Pin,PKTIMER Timer,
2574				    LARGE_INTEGER DueTime,PKDPC Dpc);
2575
2576typedef BOOLEAN (*PFNKSPINCANCELTIMER)(PKSPIN Pin,PKTIMER Timer);
2577
2578typedef LONGLONG (FASTCALL *PFNKSPINCORRELATEDTIME)(PKSPIN Pin,
2579						    PLONGLONG SystemTime);
2580
2581typedef void (*PFNKSPINRESOLUTION)(PKSPIN Pin,PKSRESOLUTION Resolution);
2582
2583typedef NTSTATUS (*PFNKSPININITIALIZEALLOCATOR)(PKSPIN Pin,
2584					PKSALLOCATOR_FRAMING AllocatorFraming,
2585					PVOID *Context);
2586
2587typedef void (*PFNKSSTREAMPOINTER)(PKSSTREAM_POINTER StreamPointer);
2588
2589
2590typedef struct KSAUTOMATION_TABLE_ KSAUTOMATION_TABLE,*PKSAUTOMATION_TABLE;
2591
2592struct 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
2642struct _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
2659struct _KSFILTER_DISPATCH {
2660  PFNKSFILTERIRP Create;
2661  PFNKSFILTERIRP Close;
2662  PFNKSFILTERPROCESS Process;
2663  PFNKSFILTERVOID Reset;
2664};
2665
2666struct _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
2679struct _KSCLOCK_DISPATCH {
2680  PFNKSPINSETTIMER SetTimer;
2681  PFNKSPINCANCELTIMER CancelTimer;
2682  PFNKSPINCORRELATEDTIME CorrelatedTime;
2683  PFNKSPINRESOLUTION Resolution;
2684};
2685
2686struct _KSALLOCATOR_DISPATCH {
2687  PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
2688  PFNKSDELETEALLOCATOR DeleteAllocator;
2689  PFNKSDEFAULTALLOCATE Allocate;
2690  PFNKSDEFAULTFREE Free;
2691};
2692
2693#define KSDEVICE_DESCRIPTOR_VERSION	(0x100)
2694
2695struct _KSDEVICE_DESCRIPTOR {
2696  const KSDEVICE_DISPATCH *Dispatch;
2697  ULONG FilterDescriptorsCount;
2698  const KSFILTER_DESCRIPTOR*const *FilterDescriptors;
2699  ULONG Version;
2700};
2701
2702struct _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
2768struct _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
2808struct _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
2825struct _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
2837struct _KSFILTERFACTORY {
2838  const KSFILTER_DESCRIPTOR *FilterDescriptor;
2839  KSOBJECT_BAG Bag;
2840  PVOID Context;
2841};
2842
2843struct _KSFILTER {
2844  const KSFILTER_DESCRIPTOR *Descriptor;
2845  KSOBJECT_BAG Bag;
2846  PVOID Context;
2847};
2848
2849struct _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
2868struct _KSMAPPING {
2869  PHYSICAL_ADDRESS PhysicalAddress;
2870  ULONG ByteCount;
2871  ULONG Alignment;
2872};
2873
2874struct _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
2891struct _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
2901struct _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
2914struct _KSPROCESSPIN_INDEXENTRY {
2915  PKSPROCESSPIN *Pins;
2916  ULONG Count;
2917};
2918
2919typedef enum {
2920  KsObjectTypeDevice,
2921  KsObjectTypeFilterFactory,
2922  KsObjectTypeFilter,
2923  KsObjectTypePin
2924} KSOBJECTTYPE;
2925
2926
2927typedef void (*PFNKSFREE)(PVOID Data);
2928
2929typedef void (*PFNKSPINFRAMERETURN)(PKSPIN Pin,PVOID Data,ULONG Size,PMDL Mdl,
2930				    PVOID Context,NTSTATUS Status);
2931
2932typedef void (*PFNKSPINIRPCOMPLETION)(PKSPIN Pin,PIRP Irp);
2933
2934
2935#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
2936#ifndef _IKsControl_
2937#define _IKsControl_
2938
2939typedef 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
2953DECLARE_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};
2978typedef struct IKsReferenceClock *PIKSREFERENCECLOCK;
2979
2980#undef INTERFACE
2981#define INTERFACE IKsReferenceClock
2982DECLARE_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
3003DECLARE_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
3018DEFINE_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
3022DEFINE_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
3026DEFINE_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
3035extern "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
3046KSDDKAPI NTSTATUS NTAPI KsEnableEvent
3047			(PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet,
3048			 PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
3049			 PVOID EventsLock);
3050
3051KSDDKAPI 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
3056KSDDKAPI NTSTATUS NTAPI KsDisableEvent
3057			(PIRP Irp, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
3058			 PVOID EventsLock);
3059
3060KSDDKAPI VOID NTAPI KsDiscardEvent (PKSEVENT_ENTRY EventEntry);
3061
3062KSDDKAPI VOID NTAPI KsFreeEventList
3063			(PFILE_OBJECT FileObject, PLIST_ENTRY EventsList,
3064			 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock);
3065
3066KSDDKAPI NTSTATUS NTAPI KsGenerateEvent (PKSEVENT_ENTRY EventEntry);
3067
3068KSDDKAPI NTSTATUS NTAPI KsGenerateDataEvent
3069			(PKSEVENT_ENTRY EventEntry, ULONG DataSize, PVOID Data);
3070
3071KSDDKAPI VOID NTAPI KsGenerateEventList
3072			(GUID *Set, ULONG EventId, PLIST_ENTRY EventsList,
3073			 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock);
3074
3075KSDDKAPI NTSTATUS NTAPI KsPropertyHandler
3076			(PIRP Irp, ULONG PropertySetsCount,
3077			 const KSPROPERTY_SET *PropertySet);
3078
3079KSDDKAPI NTSTATUS NTAPI KsPropertyHandlerWithAllocator
3080			(PIRP Irp, ULONG PropertySetsCount,
3081			 const KSPROPERTY_SET *PropertySet, PFNKSALLOCATOR Allocator,
3082			 ULONG PropertyItemSize);
3083
3084KSDDKAPI 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
3090KSDDKAPI NTSTATUS NTAPI KsMethodHandler
3091			(PIRP Irp, ULONG MethodSetsCount,
3092			 const KSMETHOD_SET *MethodSet);
3093
3094KSDDKAPI NTSTATUS NTAPI KsMethodHandlerWithAllocator
3095			(PIRP Irp, ULONG MethodSetsCount,
3096			 const KSMETHOD_SET *MethodSet, PFNKSALLOCATOR Allocator,
3097			 ULONG MethodItemSize);
3098
3099KSDDKAPI 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
3104KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocator (PIRP Irp);
3105
3106KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx
3107			(PIRP Irp, PVOID InitializeContext,
3108			 PFNKSDEFAULTALLOCATE DefaultAllocate,
3109			 PFNKSDEFAULTFREE DefaultFree,
3110			 PFNKSINITIALIZEALLOCATOR InitializeAllocator,
3111			 PFNKSDELETEALLOCATOR DeleteAllocator);
3112
3113KSDDKAPI NTSTATUS NTAPI KsCreateAllocator
3114			(HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming,
3115			 PHANDLE AllocatorHandle);
3116
3117KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorCreateRequest
3118			(PIRP Irp, PKSALLOCATOR_FRAMING *AllocatorFraming);
3119
3120KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorFramingEx
3121			(PKSALLOCATOR_FRAMING_EX Framing, ULONG BufferSize,
3122			 const KSALLOCATOR_FRAMING_EX *PinFraming);
3123
3124KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock (PKSDEFAULTCLOCK *DefaultClock);
3125
3126KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx
3127			(PKSDEFAULTCLOCK *DefaultClock, PVOID Context,
3128			 PFNKSSETTIMER SetTimer, PFNKSCANCELTIMER CancelTimer,
3129			 PFNKSCORRELATEDTIME CorrelatedTime,
3130			 const KSRESOLUTION *Resolution, ULONG Flags);
3131
3132KSDDKAPI VOID NTAPI KsFreeDefaultClock (PKSDEFAULTCLOCK DefaultClock);
3133KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock (PIRP Irp, PKSDEFAULTCLOCK DefaultClock);
3134
3135KSDDKAPI NTSTATUS NTAPI KsCreateClock
3136			(HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate,
3137			 PHANDLE ClockHandle);
3138
3139KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest
3140			(PIRP Irp, PKSCLOCK_CREATE *ClockCreate);
3141
3142KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState (PKSDEFAULTCLOCK DefaultClock);
3143KSDDKAPI VOID NTAPI KsSetDefaultClockState(PKSDEFAULTCLOCK DefaultClock, KSSTATE State);
3144KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime (PKSDEFAULTCLOCK DefaultClock);
3145KSDDKAPI VOID NTAPI KsSetDefaultClockTime(PKSDEFAULTCLOCK DefaultClock, LONGLONG Time);
3146
3147KSDDKAPI NTSTATUS NTAPI KsCreatePin
3148			(HANDLE FilterHandle, PKSPIN_CONNECT Connect,
3149			 ACCESS_MASK DesiredAccess, PHANDLE ConnectionHandle);
3150
3151KSDDKAPI NTSTATUS NTAPI KsValidateConnectRequest
3152			(PIRP Irp, ULONG DescriptorsCount,
3153			 const KSPIN_DESCRIPTOR *Descriptor, PKSPIN_CONNECT *Connect);
3154
3155KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler
3156			(PIRP Irp, PKSPROPERTY Property, PVOID Data,
3157			 ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor);
3158
3159KSDDKAPI NTSTATUS NTAPI KsPinDataIntersection
3160			(PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount,
3161			 const KSPIN_DESCRIPTOR *Descriptor,
3162			 PFNKSINTERSECTHANDLER IntersectHandler);
3163
3164KSDDKAPI 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
3169KSDDKAPI 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
3181KSDDKAPI NTSTATUS NTAPI KsLoadResource
3182			(PVOID ImageBase, POOL_TYPE PoolType, ULONG_PTR ResourceName,
3183			 ULONG ResourceType, PVOID *Resource, PULONG ResourceSize);
3184
3185KSDDKAPI NTSTATUS NTAPI KsGetImageNameAndResourceId
3186			(HANDLE RegKey, PUNICODE_STRING ImageName, PULONG_PTR ResourceId,
3187			 PULONG ValueType);
3188
3189KSDDKAPI NTSTATUS NTAPI KsMapModuleName
3190			(PDEVICE_OBJECT PhysicalDeviceObject, PUNICODE_STRING ModuleName,
3191			 PUNICODE_STRING ImageName, PULONG_PTR ResourceId,
3192			 PULONG ValueType);
3193
3194KSDDKAPI NTSTATUS NTAPI KsReferenceBusObject (KSDEVICE_HEADER Header);
3195KSDDKAPI VOID NTAPI KsDereferenceBusObject (KSDEVICE_HEADER Header);
3196KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp);
3197KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp);
3198KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificProperty (PIRP Irp, PFNKSHANDLER Handler);
3199KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificMethod (PIRP Irp, PFNKSHANDLER Handler);
3200
3201KSDDKAPI 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
3206KSDDKAPI 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
3211KSDDKAPI NTSTATUS NTAPI KsQueryInformationFile
3212			(PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length,
3213			 FILE_INFORMATION_CLASS FileInformationClass);
3214
3215KSDDKAPI NTSTATUS NTAPI KsSetInformationFile
3216			(PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length,
3217			 FILE_INFORMATION_CLASS FileInformationClass);
3218
3219KSDDKAPI 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
3226KSDDKAPI NTSTATUS NTAPI KsProbeStreamIrp(PIRP Irp, ULONG ProbeFlags, ULONG HeaderSize);
3227KSDDKAPI NTSTATUS NTAPI KsAllocateExtraData(PIRP Irp, ULONG ExtraSize, PVOID *ExtraBuffer);
3228KSDDKAPI VOID NTAPI KsNullDriverUnload (PDRIVER_OBJECT DriverObject);
3229
3230KSDDKAPI NTSTATUS NTAPI KsSetMajorFunctionHandler
3231			(PDRIVER_OBJECT DriverObject, ULONG MajorFunction);
3232
3233KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest
3234			(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3235
3236KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion
3237			(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3238
3239KSDDKAPI NTSTATUS NTAPI KsDispatchIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3240
3241KSDDKAPI 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
3247KSDDKAPI 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
3254KSDDKAPI VOID NTAPI KsCancelRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3255KSDDKAPI VOID NTAPI KsCancelIo(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock);
3256KSDDKAPI VOID NTAPI KsReleaseIrpOnCancelableQueue(PIRP Irp, PDRIVER_CANCEL DriverCancel);
3257
3258KSDDKAPI PIRP NTAPI KsRemoveIrpFromCancelableQueue
3259			(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock,
3260			 KSLIST_ENTRY_LOCATION ListLocation,
3261			 KSIRP_REMOVAL_OPERATION RemovalOperation);
3262
3263KSDDKAPI 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
3269KSDDKAPI VOID NTAPI KsRemoveSpecificIrpFromCancelableQueue (PIRP Irp);
3270
3271KSDDKAPI VOID NTAPI KsAddIrpToCancelableQueue
3272			(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, PIRP Irp,
3273			 KSLIST_ENTRY_LOCATION ListLocation, PDRIVER_CANCEL DriverCancel);
3274
3275KSDDKAPI NTSTATUS NTAPI KsAcquireResetValue(PIRP Irp, KSRESET *ResetValue);
3276
3277KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler
3278			(PIRP Irp, PKSPROPERTY Property, PVOID Data,
3279			 const KSTOPOLOGY *Topology);
3280
3281KSDDKAPI VOID NTAPI KsAcquireDeviceSecurityLock(KSDEVICE_HEADER Header, BOOLEAN Exclusive);
3282KSDDKAPI VOID NTAPI KsReleaseDeviceSecurityLock (KSDEVICE_HEADER Header);
3283KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3284KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3285KSDDKAPI NTSTATUS NTAPI KsDefaultForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3286
3287KSDDKAPI VOID NTAPI KsSetDevicePnpAndBaseObject
3288			(KSDEVICE_HEADER Header, PDEVICE_OBJECT PnpDeviceObject,
3289			 PDEVICE_OBJECT BaseObject);
3290
3291KSDDKAPI PDEVICE_OBJECT NTAPI KsQueryDevicePnpObject (KSDEVICE_HEADER Header);
3292KSDDKAPI ACCESS_MASK NTAPI KsQueryObjectAccessMask (KSOBJECT_HEADER Header);
3293
3294KSDDKAPI VOID NTAPI KsRecalculateStackDepth
3295			(KSDEVICE_HEADER Header, BOOLEAN ReuseStackLocation);
3296
3297KSDDKAPI VOID NTAPI KsSetTargetState
3298			(KSOBJECT_HEADER Header, KSTARGET_STATE TargetState);
3299
3300KSDDKAPI VOID NTAPI KsSetTargetDeviceObject
3301			(KSOBJECT_HEADER Header, PDEVICE_OBJECT TargetDevice);
3302
3303KSDDKAPI VOID NTAPI KsSetPowerDispatch
3304			(KSOBJECT_HEADER Header, PFNKSCONTEXT_DISPATCH PowerDispatch,
3305			 PVOID PowerContext);
3306
3307KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI KsQueryObjectCreateItem (KSOBJECT_HEADER Header);
3308
3309KSDDKAPI NTSTATUS NTAPI KsAllocateDeviceHeader
3310			(KSDEVICE_HEADER *Header, ULONG ItemsCount,
3311			 PKSOBJECT_CREATE_ITEM ItemsList);
3312
3313KSDDKAPI VOID NTAPI KsFreeDeviceHeader (KSDEVICE_HEADER Header);
3314
3315KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader
3316			(KSOBJECT_HEADER *Header, ULONG ItemsCount,
3317			 PKSOBJECT_CREATE_ITEM ItemsList, PIRP Irp,
3318			 const KSDISPATCH_TABLE *Table);
3319
3320KSDDKAPI VOID NTAPI KsFreeObjectHeader (KSOBJECT_HEADER Header);
3321
3322KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToDeviceHeader
3323			(KSDEVICE_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context,
3324			 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor);
3325
3326KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToObjectHeader
3327			(KSOBJECT_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context,
3328			 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor);
3329
3330KSDDKAPI NTSTATUS NTAPI KsAllocateObjectCreateItem
3331			(KSDEVICE_HEADER Header, PKSOBJECT_CREATE_ITEM CreateItem,
3332			 BOOLEAN AllocateEntry, PFNKSITEMFREECALLBACK ItemFreeCallback);
3333
3334KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItem
3335			(KSDEVICE_HEADER Header, PUNICODE_STRING CreateItem);
3336
3337KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItemsByContext
3338			(KSDEVICE_HEADER Header, PVOID Context);
3339
3340KSDDKAPI NTSTATUS NTAPI KsCreateDefaultSecurity
3341			(PSECURITY_DESCRIPTOR ParentSecurity,
3342			 PSECURITY_DESCRIPTOR *DefaultSecurity);
3343
3344KSDDKAPI NTSTATUS NTAPI KsForwardIrp
3345			(PIRP Irp, PFILE_OBJECT FileObject, BOOLEAN ReuseStackLocation);
3346
3347KSDDKAPI NTSTATUS NTAPI KsForwardAndCatchIrp
3348			(PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject,
3349			 KSSTACK_USE StackUse);
3350
3351KSDDKAPI 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
3356KSDDKAPI NTSTATUS NTAPI KsUnserializeObjectPropertiesFromRegistry
3357			(PFILE_OBJECT FileObject, HANDLE ParentKey,
3358			 PUNICODE_STRING RegistryPath);
3359
3360KSDDKAPI NTSTATUS NTAPI KsCacheMedium
3361			(PUNICODE_STRING SymbolicLink, PKSPIN_MEDIUM Medium,
3362			 ULONG PinDirection);
3363
3364KSDDKAPI NTSTATUS NTAPI KsRegisterWorker
3365			(WORK_QUEUE_TYPE WorkQueueType, PKSWORKER *Worker);
3366
3367KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker
3368			(WORK_QUEUE_TYPE WorkQueueType, PWORK_QUEUE_ITEM CountedWorkItem,
3369			 PKSWORKER *Worker);
3370
3371KSDDKAPI VOID NTAPI KsUnregisterWorker (PKSWORKER Worker);
3372KSDDKAPI NTSTATUS NTAPI KsQueueWorkItem(PKSWORKER Worker, PWORK_QUEUE_ITEM WorkItem);
3373KSDDKAPI ULONG NTAPI KsIncrementCountedWorker (PKSWORKER Worker);
3374KSDDKAPI ULONG NTAPI KsDecrementCountedWorker (PKSWORKER Worker);
3375
3376KSDDKAPI NTSTATUS NTAPI KsCreateTopologyNode
3377			(HANDLE ParentHandle, PKSNODE_CREATE NodeCreate,
3378			 ACCESS_MASK DesiredAccess, PHANDLE NodeHandle);
3379
3380KSDDKAPI NTSTATUS NTAPI KsValidateTopologyNodeCreateRequest
3381			(PIRP Irp, PKSTOPOLOGY Topology, PKSNODE_CREATE *NodeCreate);
3382
3383KSDDKAPI NTSTATUS NTAPI KsMergeAutomationTables
3384			(PKSAUTOMATION_TABLE *AutomationTableAB,
3385			 PKSAUTOMATION_TABLE AutomationTableA,
3386			 PKSAUTOMATION_TABLE AutomationTableB,
3387			 KSOBJECT_BAG Bag);
3388
3389KSDDKAPI NTSTATUS NTAPI KsInitializeDriver
3390			(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName,
3391			 const KSDEVICE_DESCRIPTOR *Descriptor);
3392
3393KSDDKAPI NTSTATUS NTAPI KsAddDevice
3394			(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject);
3395
3396KSDDKAPI NTSTATUS NTAPI KsCreateDevice
3397			(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject,
3398			 const KSDEVICE_DESCRIPTOR *Descriptor, ULONG ExtensionSize,
3399			 PKSDEVICE *Device);
3400
3401KSDDKAPI NTSTATUS NTAPI KsInitializeDevice
3402			(PDEVICE_OBJECT FunctionalDeviceObject,
3403			 PDEVICE_OBJECT PhysicalDeviceObject,
3404			 PDEVICE_OBJECT NextDeviceObject,
3405			 const KSDEVICE_DESCRIPTOR *Descriptor);
3406
3407KSDDKAPI void NTAPI KsTerminateDevice (PDEVICE_OBJECT DeviceObject);
3408KSDDKAPI PKSDEVICE NTAPI KsGetDeviceForDeviceObject (PDEVICE_OBJECT FunctionalDeviceObject);
3409KSDDKAPI void NTAPI KsAcquireDevice (PKSDEVICE Device);
3410KSDDKAPI void NTAPI KsReleaseDevice (PKSDEVICE Device);
3411
3412KSDDKAPI void NTAPI KsDeviceRegisterAdapterObject
3413			(PKSDEVICE Device, PADAPTER_OBJECT AdapterObject,
3414			 ULONG MaxMappingsByteCount, ULONG MappingTableStride);
3415
3416KSDDKAPI ULONG NTAPI KsDeviceGetBusData
3417			(PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset,
3418			 ULONG Length);
3419
3420KSDDKAPI ULONG NTAPI KsDeviceSetBusData
3421			(PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset,
3422			 ULONG Length);
3423
3424KSDDKAPI 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
3436KSDDKAPI NTSTATUS NTAPI KsFilterFactoryUpdateCacheData
3437			(PKSFILTERFACTORY FilterFactory,
3438			 const KSFILTER_DESCRIPTOR *FilterDescriptor);
3439
3440KSDDKAPI NTSTATUS NTAPI KsFilterFactoryAddCreateItem
3441			(PKSFILTERFACTORY FilterFactory, PWSTR RefString,
3442			 PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags);
3443
3444KSDDKAPI NTSTATUS NTAPI KsFilterFactorySetDeviceClassesState
3445			(PKSFILTERFACTORY FilterFactory, BOOLEAN NewState);
3446
3447KSDDKAPI PUNICODE_STRING NTAPI KsFilterFactoryGetSymbolicLink
3448			(PKSFILTERFACTORY FilterFactory);
3449
3450KSDDKAPI 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
3462KSDDKAPI NTSTATUS NTAPI KsDefaultAddEventHandler
3463			(PIRP Irp, PKSEVENTDATA EventData, PKSEVENT_ENTRY EventEntry);
3464
3465KSDDKAPI 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
3488typedef enum {
3489  KSSTREAM_POINTER_STATE_UNLOCKED = 0,
3490  KSSTREAM_POINTER_STATE_LOCKED
3491} KSSTREAM_POINTER_STATE;
3492
3493KSDDKAPI NTSTATUS NTAPI KsPinGetAvailableByteCount
3494			(PKSPIN Pin, PLONG InputDataBytes, PLONG OutputBufferBytes);
3495
3496KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer
3497			(PKSPIN Pin, KSSTREAM_POINTER_STATE State);
3498
3499KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetTrailingEdgeStreamPointer
3500			(PKSPIN Pin, KSSTREAM_POINTER_STATE State);
3501
3502KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode
3503			(PKSSTREAM_POINTER StreamPointer, NTSTATUS Status);
3504
3505KSDDKAPI NTSTATUS NTAPI KsStreamPointerLock (PKSSTREAM_POINTER StreamPointer);
3506KSDDKAPI void NTAPI KsStreamPointerUnlock(PKSSTREAM_POINTER StreamPointer, BOOLEAN Eject);
3507
3508KSDDKAPI void NTAPI KsStreamPointerAdvanceOffsetsAndUnlock
3509			(PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed,
3510			 BOOLEAN Eject);
3511
3512KSDDKAPI void NTAPI KsStreamPointerDelete (PKSSTREAM_POINTER StreamPointer);
3513
3514KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone
3515			(PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER CancelCallback,
3516			 ULONG ContextSize, PKSSTREAM_POINTER *CloneStreamPointer);
3517
3518KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets
3519			(PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed,
3520			 BOOLEAN Eject);
3521
3522KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance (PKSSTREAM_POINTER StreamPointer);
3523KSDDKAPI PMDL NTAPI KsStreamPointerGetMdl (PKSSTREAM_POINTER StreamPointer);
3524
3525KSDDKAPI PIRP NTAPI KsStreamPointerGetIrp
3526			(PKSSTREAM_POINTER StreamPointer, PBOOLEAN FirstFrameInIrp,
3527			 PBOOLEAN LastFrameInIrp);
3528
3529KSDDKAPI void NTAPI KsStreamPointerScheduleTimeout
3530			(PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER Callback,
3531			 ULONGLONG Interval);
3532
3533KSDDKAPI void NTAPI KsStreamPointerCancelTimeout (PKSSTREAM_POINTER StreamPointer);
3534KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetFirstCloneStreamPointer (PKSPIN Pin);
3535
3536KSDDKAPI PKSSTREAM_POINTER NTAPI KsStreamPointerGetNextClone
3537			(PKSSTREAM_POINTER StreamPointer);
3538
3539KSDDKAPI NTSTATUS NTAPI KsPinHandshake(PKSPIN Pin, PKSHANDSHAKE In, PKSHANDSHAKE Out);
3540KSDDKAPI void NTAPI KsCompletePendingRequest (PIRP Irp);
3541KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp (PIRP Irp);
3542KSDDKAPI PVOID NTAPI KsGetObjectFromFileObject (PFILE_OBJECT FileObject);
3543KSDDKAPI 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
3555KSDDKAPI PKSGATE NTAPI KsFilterGetAndGate (PKSFILTER Filter);
3556KSDDKAPI void NTAPI KsFilterAcquireProcessingMutex (PKSFILTER Filter);
3557KSDDKAPI void NTAPI KsFilterReleaseProcessingMutex (PKSFILTER Filter);
3558KSDDKAPI void NTAPI KsFilterAttemptProcessing(PKSFILTER Filter, BOOLEAN Asynchronous);
3559KSDDKAPI PKSGATE NTAPI KsPinGetAndGate(PKSPIN Pin);
3560KSDDKAPI void NTAPI KsPinAttachAndGate(PKSPIN Pin, PKSGATE AndGate);
3561KSDDKAPI void NTAPI KsPinAttachOrGate (PKSPIN Pin, PKSGATE OrGate);
3562KSDDKAPI void NTAPI KsPinAcquireProcessingMutex (PKSPIN Pin);
3563KSDDKAPI void NTAPI KsPinReleaseProcessingMutex (PKSPIN Pin);
3564KSDDKAPI BOOLEAN NTAPI KsProcessPinUpdate (PKSPROCESSPIN ProcessPin);
3565
3566KSDDKAPI void NTAPI KsPinGetCopyRelationships
3567			(PKSPIN Pin, PKSPIN *CopySource, PKSPIN *DelegateBranch);
3568
3569KSDDKAPI void NTAPI KsPinAttemptProcessing(PKSPIN Pin, BOOLEAN Asynchronous);
3570KSDDKAPI 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
3582KSDDKAPI PKSFILTER NTAPI KsPinGetParentFilter (PKSPIN Pin);
3583KSDDKAPI 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
3595KSDDKAPI ULONG NTAPI KsFilterGetChildPinCount(PKSFILTER Filter, ULONG PinId);
3596KSDDKAPI PKSPIN NTAPI KsFilterGetFirstChildPin(PKSFILTER Filter, ULONG PinId);
3597KSDDKAPI PVOID NTAPI KsGetNextSibling (PVOID Object);
3598KSDDKAPI 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
3611KSDDKAPI 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
3628KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp (PIRP Irp);
3629KSDDKAPI PKSPIN NTAPI KsGetPinFromIrp (PIRP Irp);
3630KSDDKAPI ULONG NTAPI KsGetNodeIdFromIrp (PIRP Irp);
3631KSDDKAPI void NTAPI KsAcquireControl (PVOID Object);
3632KSDDKAPI 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
3654KSDDKAPI NTSTATUS NTAPI KsAddItemToObjectBag
3655			(KSOBJECT_BAG ObjectBag, PVOID Item, PFNKSFREE Free);
3656
3657KSDDKAPI 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
3663KSDDKAPI NTSTATUS NTAPI KsAllocateObjectBag(PKSDEVICE Device, KSOBJECT_BAG *ObjectBag);
3664KSDDKAPI void NTAPI KsFreeObjectBag (KSOBJECT_BAG ObjectBag);
3665
3666KSDDKAPI NTSTATUS NTAPI KsCopyObjectBagItems
3667			(KSOBJECT_BAG ObjectBagDestination, KSOBJECT_BAG ObjectBagSource);
3668
3669KSDDKAPI 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
3680KSDDKAPI NTSTATUS NTAPI KsRegisterFilterWithNoKSPins
3681			(PDEVICE_OBJECT DeviceObject, const GUID *InterfaceClassGUID,
3682			 ULONG PinCount, WINBOOL *PinDirection, KSPIN_MEDIUM *MediumList,
3683			 GUID *CategoryList);
3684
3685KSDDKAPI NTSTATUS NTAPI KsFilterCreatePinFactory
3686			(PKSFILTER Filter, const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
3687			 PULONG PinID);
3688
3689KSDDKAPI NTSTATUS NTAPI KsFilterCreateNode
3690			(PKSFILTER Filter, const KSNODE_DESCRIPTOR *const NodeDescriptor,
3691			 PULONG NodeID);
3692
3693KSDDKAPI NTSTATUS NTAPI KsFilterAddTopologyConnections
3694			(PKSFILTER Filter, ULONG NewConnectionsCount,
3695			 const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
3696
3697KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedPinInterface
3698			(PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface);
3699
3700KSDDKAPI PFILE_OBJECT NTAPI KsPinGetConnectedPinFileObject (PKSPIN Pin);
3701KSDDKAPI PDEVICE_OBJECT NTAPI KsPinGetConnectedPinDeviceObject (PKSPIN Pin);
3702
3703KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedFilterInterface
3704			(PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface);
3705
3706#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3707KSDDKAPI NTSTATUS NTAPI KsPinGetReferenceClockInterface
3708			(PKSPIN Pin, PIKSREFERENCECLOCK *Interface);
3709#endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */
3710
3711KSDDKAPI VOID NTAPI KsPinSetPinClockTime(PKSPIN Pin, LONGLONG Time);
3712
3713KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrame
3714			(PKSPIN Pin, PVOID Data, ULONG Size,
3715			 PKSSTREAM_HEADER StreamHeader, PVOID Context);
3716
3717KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrameMdl
3718			(PKSPIN Pin, PMDL Mdl, PKSSTREAM_HEADER StreamHeader,
3719			 PVOID Context);
3720
3721KSDDKAPI void NTAPI KsPinRegisterFrameReturnCallback
3722			(PKSPIN Pin, PFNKSPINFRAMERETURN FrameReturn);
3723
3724KSDDKAPI void NTAPI KsPinRegisterIrpCompletionCallback
3725			(PKSPIN Pin, PFNKSPINIRPCOMPLETION IrpCompletion);
3726
3727KSDDKAPI void NTAPI KsPinRegisterHandshakeCallback
3728			(PKSPIN Pin, PFNKSPINHANDSHAKE Handshake);
3729
3730KSDDKAPI void NTAPI KsFilterRegisterPowerCallbacks
3731			(PKSFILTER Filter, PFNKSFILTERPOWER Sleep, PFNKSFILTERPOWER Wake);
3732
3733KSDDKAPI void NTAPI KsPinRegisterPowerCallbacks
3734			(PKSPIN Pin, PFNKSPINPOWER Sleep, PFNKSPINPOWER Wake);
3735
3736#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3737KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown
3738			(PVOID Object, PUNKNOWN ClientUnknown);
3739
3740KSDDKAPI 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
3790KSDDKAPI DWORD WINAPI KsCreateAllocator(HANDLE ConnectionHandle,PKSALLOCATOR_FRAMING AllocatorFraming,PHANDLE AllocatorHandle);
3791KSDDKAPI DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle,PKSCLOCK_CREATE ClockCreate,PHANDLE ClockHandle);
3792KSDDKAPI DWORD WINAPI KsCreatePin(HANDLE FilterHandle,PKSPIN_CONNECT Connect,ACCESS_MASK DesiredAccess,PHANDLE ConnectionHandle);
3793KSDDKAPI 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