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