1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef _KS_
7 #define _KS_
8 
9 #ifdef __TCS__
10 #define _KS_NO_ANONYMOUS_STRUCTURES_ 1
11 #endif
12 
13 #ifdef  _KS_NO_ANONYMOUS_STRUCTURES_
14 #define _KS_ANON_STRUCT(X)			struct X
15 #else
16 #define _KS_ANON_STRUCT(X)	__C89_NAMELESS struct
17 #endif
18 
19 #ifndef _NTRTL_
20 #ifndef DEFINE_GUIDEX
21 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
22 #endif
23 #ifndef STATICGUIDOF
24 #define STATICGUIDOF(guid) STATIC_##guid
25 #endif
26 #endif /* _NTRTL_ */
27 
28 #ifndef SIZEOF_ARRAY
29 #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0]))
30 #endif
31 
32 #define DEFINE_GUIDSTRUCT(g,n) DEFINE_GUIDEX(n)
33 #define DEFINE_GUIDNAMED(n) n
34 
35 #define STATIC_GUID_NULL						\
36 	0x00000000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
37 
38 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000",GUID_NULL);
39 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
40 
41 #define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS,0x000,METHOD_NEITHER,FILE_ANY_ACCESS)
42 #define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x001,METHOD_NEITHER,FILE_ANY_ACCESS)
43 #define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x002,METHOD_NEITHER,FILE_ANY_ACCESS)
44 #define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS,0x003,METHOD_NEITHER,FILE_ANY_ACCESS)
45 #define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS,0x004,METHOD_NEITHER,FILE_WRITE_ACCESS)
46 #define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS,0x005,METHOD_NEITHER,FILE_READ_ACCESS)
47 #define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS,0x006,METHOD_NEITHER,FILE_ANY_ACCESS)
48 
49 typedef enum {
50   KSRESET_BEGIN,
51   KSRESET_END
52 } KSRESET;
53 
54 typedef enum {
55   KSSTATE_STOP,
56   KSSTATE_ACQUIRE,
57   KSSTATE_PAUSE,
58   KSSTATE_RUN
59 } KSSTATE,*PKSSTATE;
60 
61 #define KSPRIORITY_LOW		0x00000001
62 #define KSPRIORITY_NORMAL	0x40000000
63 #define KSPRIORITY_HIGH		0x80000000
64 #define KSPRIORITY_EXCLUSIVE	0xFFFFFFFF
65 
66 typedef struct {
67   ULONG PriorityClass;
68   ULONG PrioritySubClass;
69 } KSPRIORITY,*PKSPRIORITY;
70 
71 typedef struct {
72   __C89_NAMELESS union {
_KS_ANON_STRUCT(_IDENTIFIER)73     _KS_ANON_STRUCT(_IDENTIFIER)
74     {
75       GUID Set;
76       ULONG Id;
77       ULONG Flags;
78     };
79     LONGLONG Alignment;
80   };
81 } KSIDENTIFIER,*PKSIDENTIFIER;
82 
83 typedef KSIDENTIFIER KSPROPERTY,*PKSPROPERTY,KSMETHOD,*PKSMETHOD,KSEVENT,*PKSEVENT;
84 
85 #define KSMETHOD_TYPE_NONE		0x00000000
86 #define KSMETHOD_TYPE_READ		0x00000001
87 #define KSMETHOD_TYPE_WRITE		0x00000002
88 #define KSMETHOD_TYPE_MODIFY		0x00000003
89 #define KSMETHOD_TYPE_SOURCE		0x00000004
90 
91 #define KSMETHOD_TYPE_SEND		0x00000001
92 #define KSMETHOD_TYPE_SETSUPPORT	0x00000100
93 #define KSMETHOD_TYPE_BASICSUPPORT	0x00000200
94 
95 #define KSMETHOD_TYPE_TOPOLOGY		0x10000000
96 
97 #define KSPROPERTY_TYPE_GET		0x00000001
98 #define KSPROPERTY_TYPE_SET		0x00000002
99 #define KSPROPERTY_TYPE_SETSUPPORT	0x00000100
100 #define KSPROPERTY_TYPE_BASICSUPPORT	0x00000200
101 #define KSPROPERTY_TYPE_RELATIONS	0x00000400
102 #define KSPROPERTY_TYPE_SERIALIZESET	0x00000800
103 #define KSPROPERTY_TYPE_UNSERIALIZESET	0x00001000
104 #define KSPROPERTY_TYPE_SERIALIZERAW	0x00002000
105 #define KSPROPERTY_TYPE_UNSERIALIZERAW	0x00004000
106 #define KSPROPERTY_TYPE_SERIALIZESIZE	0x00008000
107 #define KSPROPERTY_TYPE_DEFAULTVALUES	0x00010000
108 
109 #define KSPROPERTY_TYPE_TOPOLOGY	0x10000000
110 
111 typedef struct {
112   KSPROPERTY Property;
113   ULONG NodeId;
114   ULONG Reserved;
115 } KSP_NODE,*PKSP_NODE;
116 
117 typedef struct {
118   KSMETHOD Method;
119   ULONG NodeId;
120   ULONG Reserved;
121 } KSM_NODE,*PKSM_NODE;
122 
123 typedef struct {
124   KSEVENT Event;
125   ULONG NodeId;
126   ULONG Reserved;
127 } KSE_NODE,*PKSE_NODE;
128 
129 #define STATIC_KSPROPTYPESETID_General					\
130 	0x97E99BA0,0xBDEA,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
131 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000",KSPROPTYPESETID_General);
132 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
133 
134 #if defined(_NTDDK_)
135 #include <psdk_inc/_varenum.h>
136 #endif
137 
138 typedef struct {
139   ULONG Size;
140   ULONG Count;
141 } KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM;
142 
143 typedef struct {
144   ULONG AccessFlags;
145   ULONG DescriptionSize;
146   KSIDENTIFIER PropTypeSet;
147   ULONG MembersListCount;
148   ULONG Reserved;
149 } KSPROPERTY_DESCRIPTION,*PKSPROPERTY_DESCRIPTION;
150 
151 #define KSPROPERTY_MEMBER_RANGES		0x00000001
152 #define KSPROPERTY_MEMBER_STEPPEDRANGES		0x00000002
153 #define KSPROPERTY_MEMBER_VALUES		0x00000003
154 
155 #define KSPROPERTY_MEMBER_FLAG_DEFAULT		0x00000001
156 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002
157 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM	0x00000004
158 
159 typedef struct {
160   ULONG MembersFlags;
161   ULONG MembersSize;
162   ULONG MembersCount;
163   ULONG Flags;
164 } KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER;
165 
166 typedef union {
_KS_ANON_STRUCT(_SIGNED)167   _KS_ANON_STRUCT(_SIGNED)
168   {
169     LONG SignedMinimum;
170     LONG SignedMaximum;
171   };
_KS_ANON_STRUCT(_UNSIGNED)172   _KS_ANON_STRUCT(_UNSIGNED)
173   {
174     ULONG UnsignedMinimum;
175     ULONG UnsignedMaximum;
176   };
177 } KSPROPERTY_BOUNDS_LONG,*PKSPROPERTY_BOUNDS_LONG;
178 
179 typedef union {
_KS_ANON_STRUCT(_SIGNED64)180   _KS_ANON_STRUCT(_SIGNED64)
181   {
182     LONGLONG SignedMinimum;
183     LONGLONG SignedMaximum;
184   };
_KS_ANON_STRUCT(_UNSIGNED64)185   _KS_ANON_STRUCT(_UNSIGNED64)
186   {
187     DWORDLONG UnsignedMinimum;
188     DWORDLONG UnsignedMaximum;
189   };
190 } KSPROPERTY_BOUNDS_LONGLONG,*PKSPROPERTY_BOUNDS_LONGLONG;
191 
192 typedef struct {
193   ULONG SteppingDelta;
194   ULONG Reserved;
195   KSPROPERTY_BOUNDS_LONG Bounds;
196 } KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG;
197 
198 typedef struct {
199   DWORDLONG SteppingDelta;
200   KSPROPERTY_BOUNDS_LONGLONG Bounds;
201 } KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG;
202 
203 #if defined(_NTDDK_)
204 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
205 typedef struct _KSDEVICE_DISPATCH KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
206 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
207 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY;
208 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
209 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
210 typedef struct _KSFILTER KSFILTER, *PKSFILTER;
211 typedef struct _KSPIN_DESCRIPTOR_EX KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
212 typedef struct _KSPIN_DISPATCH KSPIN_DISPATCH, *PKSPIN_DISPATCH;
213 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
214 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
215 typedef struct _KSPIN KSPIN, *PKSPIN;
216 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
217 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
218 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
219 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
220 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
221 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
222 #endif /* _NTDDK_ */
223 
224 typedef PVOID PKSWORKER;
225 
226 
227 typedef struct {
228   ULONG NotificationType;
229   __C89_NAMELESS union {
230     struct {
231       HANDLE Event;
232       ULONG_PTR Reserved[2];
233     } EventHandle;
234     struct {
235       HANDLE Semaphore;
236       ULONG Reserved;
237       LONG Adjustment;
238     } SemaphoreHandle;
239 #if defined(_NTDDK_)
240     struct {
241       PVOID Event;
242       KPRIORITY Increment;
243       ULONG_PTR Reserved;
244     } EventObject;
245     struct {
246       PVOID Semaphore;
247       KPRIORITY Increment;
248       LONG Adjustment;
249     } SemaphoreObject;
250     struct {
251       PKDPC Dpc;
252       ULONG ReferenceCount;
253       ULONG_PTR Reserved;
254     } Dpc;
255     struct {
256       PWORK_QUEUE_ITEM WorkQueueItem;
257       WORK_QUEUE_TYPE WorkQueueType;
258       ULONG_PTR Reserved;
259     } WorkItem;
260     struct {
261       PWORK_QUEUE_ITEM WorkQueueItem;
262       PKSWORKER KsWorkerObject;
263       ULONG_PTR Reserved;
264     } KsWorkItem;
265 #endif /* _NTDDK_ */
266     struct {
267       PVOID Unused;
268       LONG_PTR Alignment[2];
269     } Alignment;
270   };
271 } KSEVENTDATA,*PKSEVENTDATA;
272 
273 #define KSEVENTF_EVENT_HANDLE		0x00000001
274 #define KSEVENTF_SEMAPHORE_HANDLE	0x00000002
275 #if defined(_NTDDK_)
276 #define KSEVENTF_EVENT_OBJECT		0x00000004
277 #define KSEVENTF_SEMAPHORE_OBJECT	0x00000008
278 #define KSEVENTF_DPC			0x00000010
279 #define KSEVENTF_WORKITEM		0x00000020
280 #define KSEVENTF_KSWORKITEM		0x00000080
281 #endif /* _NTDDK_ */
282 
283 #define KSEVENT_TYPE_ENABLE		0x00000001
284 #define KSEVENT_TYPE_ONESHOT		0x00000002
285 #define KSEVENT_TYPE_ENABLEBUFFERED	0x00000004
286 #define KSEVENT_TYPE_SETSUPPORT		0x00000100
287 #define KSEVENT_TYPE_BASICSUPPORT	0x00000200
288 #define KSEVENT_TYPE_QUERYBUFFER	0x00000400
289 
290 #define KSEVENT_TYPE_TOPOLOGY		0x10000000
291 
292 typedef struct {
293   KSEVENT Event;
294   PKSEVENTDATA EventData;
295   PVOID Reserved;
296 } KSQUERYBUFFER,*PKSQUERYBUFFER;
297 
298 typedef struct {
299   ULONG Size;
300   ULONG Flags;
301   __C89_NAMELESS union {
302     HANDLE ObjectHandle;
303     PVOID ObjectPointer;
304   };
305   PVOID Reserved;
306   KSEVENT Event;
307   KSEVENTDATA EventData;
308 } KSRELATIVEEVENT;
309 
310 #define KSRELATIVEEVENT_FLAG_HANDLE	0x00000001
311 #define KSRELATIVEEVENT_FLAG_POINTER	0x00000002
312 
313 typedef struct {
314   KSEVENTDATA EventData;
315   LONGLONG MarkTime;
316 } KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK;
317 
318 typedef struct {
319   KSEVENTDATA EventData;
320   LONGLONG TimeBase;
321   LONGLONG Interval;
322 } KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL;
323 
324 typedef struct {
325   LONGLONG TimeBase;
326   LONGLONG Interval;
327 } KSINTERVAL,*PKSINTERVAL;
328 
329 #define STATIC_KSPROPSETID_General					\
330 	0x1464EDA5,0x6A8F,0x11D1,0x9A,0xA7,0x00,0xA0,0xC9,0x22,0x31,0x96
331 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196",KSPROPSETID_General);
332 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
333 
334 typedef enum {
335   KSPROPERTY_GENERAL_COMPONENTID
336 } KSPROPERTY_GENERAL;
337 
338 typedef struct {
339   GUID Manufacturer;
340   GUID Product;
341   GUID Component;
342   GUID Name;
343   ULONG Version;
344   ULONG Revision;
345 } KSCOMPONENTID,*PKSCOMPONENTID;
346 
347 #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)		\
348 	DEFINE_KSPROPERTY_ITEM(						\
349 				KSPROPERTY_GENERAL_COMPONENTID,		\
350 				(Handler),				\
351 				sizeof(KSPROPERTY),			\
352 				sizeof(KSCOMPONENTID),			\
353 				NULL, NULL, 0, NULL, NULL, 0)
354 
355 #define STATIC_KSMETHODSETID_StreamIo	\
356 	0x65D003CA,0x1523,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
357 DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196",KSMETHODSETID_StreamIo);
358 #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
359 
360 typedef enum {
361   KSMETHOD_STREAMIO_READ,
362   KSMETHOD_STREAMIO_WRITE
363 } KSMETHOD_STREAMIO;
364 
365 #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)			\
366 	DEFINE_KSMETHOD_ITEM(						\
367 				KSMETHOD_STREAMIO_READ,			\
368 				KSMETHOD_TYPE_WRITE,			\
369 				(Handler),				\
370 				sizeof(KSMETHOD),			\
371 				0,					\
372 				NULL)
373 
374 #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)			\
375 	DEFINE_KSMETHOD_ITEM(						\
376 				KSMETHOD_STREAMIO_WRITE,		\
377 				KSMETHOD_TYPE_READ,			\
378 				(Handler),				\
379 				sizeof(KSMETHOD),			\
380 				0,					\
381 				NULL)
382 
383 #define STATIC_KSPROPSETID_MediaSeeking					\
384 	0xEE904F0C,0xD09B,0x11D0,0xAB,0xE9,0x00,0xA0,0xC9,0x22,0x31,0x96
385 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196",KSPROPSETID_MediaSeeking);
386 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
387 
388 typedef enum {
389   KSPROPERTY_MEDIASEEKING_CAPABILITIES,
390   KSPROPERTY_MEDIASEEKING_FORMATS,
391   KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
392   KSPROPERTY_MEDIASEEKING_POSITION,
393   KSPROPERTY_MEDIASEEKING_STOPPOSITION,
394   KSPROPERTY_MEDIASEEKING_POSITIONS,
395   KSPROPERTY_MEDIASEEKING_DURATION,
396   KSPROPERTY_MEDIASEEKING_AVAILABLE,
397   KSPROPERTY_MEDIASEEKING_PREROLL,
398   KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
399 } KSPROPERTY_MEDIASEEKING;
400 
401 typedef enum {
402   KS_SEEKING_NoPositioning,
403   KS_SEEKING_AbsolutePositioning,
404   KS_SEEKING_RelativePositioning,
405   KS_SEEKING_IncrementalPositioning,
406   KS_SEEKING_PositioningBitsMask = 0x3,
407   KS_SEEKING_SeekToKeyFrame,
408   KS_SEEKING_ReturnTime = 0x8
409 } KS_SEEKING_FLAGS;
410 
411 typedef enum {
412   KS_SEEKING_CanSeekAbsolute = 0x1,
413   KS_SEEKING_CanSeekForwards = 0x2,
414   KS_SEEKING_CanSeekBackwards = 0x4,
415   KS_SEEKING_CanGetCurrentPos = 0x8,
416   KS_SEEKING_CanGetStopPos = 0x10,
417   KS_SEEKING_CanGetDuration = 0x20,
418   KS_SEEKING_CanPlayBackwards = 0x40
419 } KS_SEEKING_CAPABILITIES;
420 
421 typedef struct {
422   LONGLONG Current;
423   LONGLONG Stop;
424   KS_SEEKING_FLAGS CurrentFlags;
425   KS_SEEKING_FLAGS StopFlags;
426 } KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS;
427 
428 typedef struct {
429   LONGLONG Earliest;
430   LONGLONG Latest;
431 } KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE;
432 
433 typedef struct {
434   KSPROPERTY Property;
435   GUID SourceFormat;
436   GUID TargetFormat;
437   LONGLONG Time;
438 } KSP_TIMEFORMAT,*PKSP_TIMEFORMAT;
439 
440 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)	\
441 	DEFINE_KSPROPERTY_ITEM(						\
442 				KSPROPERTY_MEDIASEEKING_CAPABILITIES,	\
443 				(Handler),				\
444 				sizeof(KSPROPERTY),			\
445 				sizeof(KS_SEEKING_CAPABILITIES),	\
446 				NULL, NULL, 0, NULL, NULL, 0)
447 
448 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)		\
449 	DEFINE_KSPROPERTY_ITEM(						\
450 				KSPROPERTY_MEDIASEEKING_FORMATS,	\
451 				(Handler),				\
452 				sizeof(KSPROPERTY),			\
453 				0,					\
454 				NULL, NULL, 0, NULL, NULL, 0)
455 
456 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler,SetHandler) \
457 	DEFINE_KSPROPERTY_ITEM(						\
458 				KSPROPERTY_MEDIASEEKING_TIMEFORMAT,	\
459 				(GetHandler),				\
460 				sizeof(KSPROPERTY),			\
461 				sizeof(GUID),				\
462 				(SetHandler),				\
463 				NULL, 0, NULL, NULL, 0)
464 
465 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)		\
466 	DEFINE_KSPROPERTY_ITEM(						\
467 				KSPROPERTY_MEDIASEEKING_POSITION,	\
468 				(Handler),				\
469 				sizeof(KSPROPERTY),			\
470 				sizeof(LONGLONG),			\
471 				NULL, NULL, 0, NULL, NULL, 0)
472 
473 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)	\
474 	DEFINE_KSPROPERTY_ITEM(						\
475 				KSPROPERTY_MEDIASEEKING_STOPPOSITION,	\
476 				(Handler),				\
477 				sizeof(KSPROPERTY),			\
478 				sizeof(LONGLONG),			\
479 				NULL, NULL, 0, NULL, NULL, 0)
480 
481 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)		\
482 	DEFINE_KSPROPERTY_ITEM(						\
483 				KSPROPERTY_MEDIASEEKING_POSITIONS,	\
484 				NULL,					\
485 				sizeof(KSPROPERTY),			\
486 				sizeof(KSPROPERTY_POSITIONS),		\
487 				(Handler),				\
488 				NULL, 0, NULL, NULL, 0)
489 
490 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)		\
491 	DEFINE_KSPROPERTY_ITEM(						\
492 				KSPROPERTY_MEDIASEEKING_DURATION,	\
493 				(Handler),				\
494 				sizeof(KSPROPERTY),			\
495 				sizeof(LONGLONG),			\
496 				NULL, NULL, 0, NULL, NULL, 0)
497 
498 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)		\
499 	DEFINE_KSPROPERTY_ITEM(						\
500 				KSPROPERTY_MEDIASEEKING_AVAILABLE,	\
501 				(Handler),				\
502 				sizeof(KSPROPERTY),			\
503 				sizeof(KSPROPERTY_MEDIAAVAILABLE),	\
504 				NULL, NULL, 0, NULL, NULL, 0)
505 
506 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)		\
507 	DEFINE_KSPROPERTY_ITEM(						\
508 				KSPROPERTY_MEDIASEEKING_PREROLL,	\
509 				(Handler),				\
510 				sizeof(KSPROPERTY),			\
511 				sizeof(LONGLONG),			\
512 				NULL, NULL, 0, NULL, NULL, 0)
513 
514 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)	\
515 	DEFINE_KSPROPERTY_ITEM(						\
516 				KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT, \
517 				(Handler),				\
518 				sizeof(KSP_TIMEFORMAT),			\
519 				sizeof(LONGLONG),			\
520 				NULL, NULL, 0, NULL, NULL, 0)
521 
522 #define STATIC_KSPROPSETID_Topology					\
523 	0x720D4AC0,0x7533,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
524 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000",KSPROPSETID_Topology);
525 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
526 
527 typedef enum {
528   KSPROPERTY_TOPOLOGY_CATEGORIES,
529   KSPROPERTY_TOPOLOGY_NODES,
530   KSPROPERTY_TOPOLOGY_CONNECTIONS,
531   KSPROPERTY_TOPOLOGY_NAME
532 } KSPROPERTY_TOPOLOGY;
533 
534 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)		\
535 	DEFINE_KSPROPERTY_ITEM(						\
536 				KSPROPERTY_TOPOLOGY_CATEGORIES,		\
537 				(Handler),				\
538 				sizeof(KSPROPERTY),			\
539 				0,					\
540 				NULL, NULL, 0,NULL, NULL, 0)
541 
542 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)			\
543 	DEFINE_KSPROPERTY_ITEM(						\
544 				KSPROPERTY_TOPOLOGY_NODES,		\
545 				(Handler),				\
546 				sizeof(KSPROPERTY),			\
547 				0,					\
548 				NULL, NULL, 0, NULL, NULL, 0)
549 
550 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)		\
551 	DEFINE_KSPROPERTY_ITEM(						\
552 				KSPROPERTY_TOPOLOGY_CONNECTIONS,	\
553 				(Handler),				\
554 				sizeof(KSPROPERTY),			\
555 				0,					\
556 				NULL, NULL, 0, NULL, NULL, 0)
557 
558 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)			\
559 	DEFINE_KSPROPERTY_ITEM(						\
560 				KSPROPERTY_TOPOLOGY_NAME,		\
561 				(Handler),				\
562 				sizeof(KSP_NODE),			\
563 				0,					\
564 				NULL, NULL, 0, NULL, NULL, 0)
565 
566 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet,Handler)		\
567 DEFINE_KSPROPERTY_TABLE(TopologySet) {					\
568 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),		\
569 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),			\
570 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),		\
571 	DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)			\
572 }
573 
574 #define STATIC_KSCATEGORY_BRIDGE					\
575 	0x085AFF00,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
576 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000",KSCATEGORY_BRIDGE);
577 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
578 
579 #define STATIC_KSCATEGORY_CAPTURE					\
580 	0x65E8773D,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96
581 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_CAPTURE);
582 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
583 
584 #define STATIC_KSCATEGORY_RENDER					\
585 	0x65E8773E,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96
586 DEFINE_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
591 DEFINE_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
596 DEFINE_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
601 DEFINE_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
606 DEFINE_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
611 DEFINE_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
616 DEFINE_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
621 DEFINE_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
626 DEFINE_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
631 DEFINE_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
636 DEFINE_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
641 DEFINE_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
646 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_QUALITY);
647 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
648 
649 typedef struct {
650   ULONG FromNode;
651   ULONG FromNodePin;
652   ULONG ToNode;
653   ULONG ToNodePin;
654 } KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION;
655 
656 typedef 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 
670 typedef 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
680 DEFINE_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
685 DEFINE_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
690 DEFINE_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
695 DEFINE_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
700 DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_MEDIA_TIME);
701 #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
702 
703 typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE;
704 
705 #define STATIC_KSINTERFACESETID_Standard				\
706 	0x1A8766A0,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
707 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000",KSINTERFACESETID_Standard);
708 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
709 
710 typedef 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
718 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196",KSINTERFACESETID_FileIo);
719 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
720 
721 typedef 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
729 DEFINE_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
736 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000",KSPROPSETID_Pin);
737 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
738 
739 typedef 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 
757 typedef struct {
758   KSPROPERTY Property;
759   ULONG PinId;
760   ULONG Reserved;
761 } KSP_PIN,*PKSP_PIN;
762 
763 #define KSINSTANCE_INDETERMINATE	((ULONG)-1)
764 
765 typedef struct {
766   ULONG PossibleCount;
767   ULONG CurrentCount;
768 } KSPIN_CINSTANCES,*PKSPIN_CINSTANCES;
769 
770 typedef 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 
785 typedef 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 
800 typedef struct {
801   ULONG Size;
802   ULONG Flags;
803   GUID Attribute;
804 } KSATTRIBUTE,*PKSATTRIBUTE;
805 
806 #if defined(_NTDDK_)
807 typedef struct {
808   ULONG Count;
809   PKSATTRIBUTE *Attributes;
810 } KSATTRIBUTE_LIST,*PKSATTRIBUTE_LIST;
811 #endif /* _NTDDK_ */
812 
813 typedef 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 
821 typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM;
822 
823 typedef struct {
824   KSPIN_INTERFACE Interface;
825   KSPIN_MEDIUM Medium;
826   ULONG PinId;
827   HANDLE PinToHandle;
828   KSPRIORITY Priority;
829 } KSPIN_CONNECT,*PKSPIN_CONNECT;
830 
831 typedef struct {
832   ULONG Size;
833   ULONG Pin;
834   WCHAR SymbolicLinkName[1];
835 } KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION;
836 
837 #if defined(_NTDDK_)
838 typedef NTSTATUS (*PFNKSINTERSECTHANDLER) ( PIRP Irp, PKSP_PIN Pin,
839 					    PKSDATARANGE DataRange,
840 					    PVOID Data);
841 typedef 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) \
987 DEFINE_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) \
1001 DEFINE_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
1017 DEFINE_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
1024 DEFINE_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
1031 DEFINE_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
1038 DEFINE_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
1047 DEFINE_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_)
1053 typedef 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;
1072 typedef 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
1100 DEFINE_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
1105 DEFINE_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
1113 DEFINE_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
1118 DEFINE_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
1123 DEFINE_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
1128 DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000",KSPROPSETID_Quality);
1129 #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
1130 
1131 typedef 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
1156 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000",KSPROPSETID_Connection);
1157 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
1158 
1159 typedef 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
1241 DEFINE_GUIDSTRUCT("0A3D1C5D-5243-4819-9ED0-AEE8044CEE2B", KSPROPSETID_MemoryTransport);
1242 #define KSPROPSETID_MemoryTransport DEFINE_GUIDNAMED(KSPROPSETID_MemoryTransport)
1243 
1244 enum {
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 
1277 typedef 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_)
1294 typedef PVOID (*PFNKSDEFAULTALLOCATE)(PVOID Context);
1295 typedef VOID (*PFNKSDEFAULTFREE)(PVOID Context, PVOID Buffer);
1296 typedef NTSTATUS (*PFNKSINITIALIZEALLOCATOR)(PVOID InitialContext,
1297 					PKSALLOCATOR_FRAMING AllocatorFraming,
1298 					PVOID* Context);
1299 typedef VOID (*PFNKSDELETEALLOCATOR) (PVOID Context);
1300 #endif /* _NTDDK_ */
1301 
1302 typedef struct {
1303   ULONG MinFrameSize;
1304   ULONG MaxFrameSize;
1305   ULONG Stepping;
1306 } KS_FRAMING_RANGE,*PKS_FRAMING_RANGE;
1307 
1308 typedef struct {
1309   KS_FRAMING_RANGE Range;
1310   ULONG InPlaceWeight;
1311   ULONG NotInPlaceWeight;
1312 } KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED;
1313 
1314 typedef struct {
1315   ULONG RatioNumerator;
1316   ULONG RatioDenominator;
1317   ULONG RatioConstantMargin;
1318 } KS_COMPRESSION,*PKS_COMPRESSION;
1319 
1320 typedef 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 
1333 typedef 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
1352 DEFINE_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
1357 DEFINE_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
1362 DEFINE_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
1367 DEFINE_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
1372 DEFINE_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) \
1376 const 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
1471 DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4",KSEVENTSETID_StreamAllocator);
1472 #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
1473 
1474 typedef 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
1481 DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4",KSMETHODSETID_StreamAllocator);
1482 #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
1483 
1484 typedef 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)\
1508 DEFINE_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
1515 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4",KSPROPSETID_StreamAllocator);
1516 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
1517 
1518 #if defined(_NTDDK_)
1519 typedef 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)\
1541 DEFINE_KSPROPERTY_TABLE(AllocatorSet) {					\
1542 	DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),	\
1543 	DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
1544 }
1545 
1546 typedef NTSTATUS (*PFNALLOCATOR_ALLOCATEFRAME) (PFILE_OBJECT FileObject,
1547 						PVOID *Frame);
1548 typedef VOID (*PFNALLOCATOR_FREEFRAME) (PFILE_OBJECT FileObject, PVOID Frame);
1549 
1550 typedef struct {
1551   PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
1552   PFNALLOCATOR_FREEFRAME FreeFrame;
1553 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
1554 #endif /* _NTDDK_ */
1555 
1556 typedef struct {
1557   KSALLOCATOR_FRAMING Framing;
1558   ULONG AllocatedFrames;
1559   ULONG Reserved;
1560 } KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS;
1561 
1562 typedef 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 
1581 typedef struct {
1582   LONGLONG Time;
1583   ULONG Numerator;
1584   ULONG Denominator;
1585 } KSTIME,*PKSTIME;
1586 
1587 typedef 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
1603 DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a",KSPROPSETID_StreamInterface);
1604 #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
1605 
1606 typedef 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) \
1619 DEFINE_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
1625 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4",KSPROPSETID_Stream);
1626 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
1627 
1628 typedef 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 
1736 typedef struct {
1737   HANDLE QualityManager;
1738   PVOID Context;
1739 } KSQUALITY_MANAGER,*PKSQUALITY_MANAGER;
1740 
1741 typedef struct {
1742   LONGLONG Duration;
1743   ULONG FrameFlags;
1744   ULONG Reserved;
1745 } KSFRAMETIME,*PKSFRAMETIME;
1746 
1747 #define KSFRAMETIME_VARIABLESIZE	0x00000001
1748 
1749 typedef 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 
1760 typedef 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
1767 DEFINE_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 
1776 typedef struct {
1777   ULONG CreateFlags;
1778 } KSCLOCK_CREATE,*PKSCLOCK_CREATE;
1779 
1780 typedef struct {
1781   LONGLONG Time;
1782   LONGLONG SystemTime;
1783 } KSCORRELATED_TIME,*PKSCORRELATED_TIME;
1784 
1785 typedef struct {
1786   LONGLONG Granularity;
1787   LONGLONG Error;
1788 } KSRESOLUTION,*PKSRESOLUTION;
1789 
1790 typedef 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_)
1803 typedef LONGLONG (FASTCALL *PFNKSCLOCK_GETTIME)(PFILE_OBJECT FileObject);
1804 typedef LONGLONG (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(PFILE_OBJECT FileObject,
1805 							PLONGLONG SystemTime);
1806 
1807 typedef struct {
1808    PFNKSCLOCK_GETTIME GetTime;
1809    PFNKSCLOCK_GETTIME GetPhysicalTime;
1810    PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
1811    PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
1812 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
1813 
1814 typedef BOOLEAN (*PFNKSSETTIMER)(PVOID Context, PKTIMER Timer,
1815 				 LARGE_INTEGER DueTime, PKDPC Dpc);
1816 typedef BOOLEAN (*PFNKSCANCELTIMER) (PVOID Context, PKTIMER Timer);
1817 typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(PVOID Context,
1818 						 PLONGLONG SystemTime);
1819 
1820 typedef 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)\
1875 DEFINE_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
1888 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000",KSEVENTSETID_Clock);
1889 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
1890 
1891 typedef 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
1898 DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000",KSEVENTSETID_Connection);
1899 #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
1900 
1901 typedef 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 
1909 typedef struct {
1910   PVOID Context;
1911   ULONG Proportion;
1912   LONGLONG DeltaTime;
1913 } KSQUALITY,*PKSQUALITY;
1914 
1915 typedef struct {
1916   PVOID Context;
1917   ULONG Status;
1918 } KSERROR,*PKSERROR;
1919 
1920 typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE;
1921 
1922 #define STATIC_KSDEGRADESETID_Standard					\
1923 	0x9F564180,0x704C,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00
1924 DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000",KSDEGRADESETID_Standard);
1925 #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
1926 
1927 typedef 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 
1951 typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(PVOID Context, PIRP Irp);
1952 typedef NTSTATUS (*PFNKSHANDLER)(PIRP Irp, PKSIDENTIFIER Request, PVOID Data);
1953 typedef BOOLEAN (*PFNKSFASTHANDLER)(PFILE_OBJECT FileObject,
1954 				    PKSIDENTIFIER Request,
1955 				    ULONG RequestLength, PVOID Data,
1956 				    ULONG DataLength,
1957 				    PIO_STATUS_BLOCK IoStatus);
1958 typedef NTSTATUS (*PFNKSALLOCATOR) (PIRP Irp, ULONG BufferSize,
1959 				    BOOLEAN InputOperation);
1960 
1961 typedef struct {
1962   KSPROPERTY_MEMBERSHEADER MembersHeader;
1963   const VOID *Members;
1964 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
1965 
1966 typedef 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 
1986 typedef 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 
2011 typedef 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 
2034 typedef 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 
2052 typedef 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 
2069 typedef 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 
2087 typedef 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 
2095 typedef struct _KSEVENT_ENTRY	KSEVENT_ENTRY, *PKSEVENT_ENTRY;
2096 typedef NTSTATUS (*PFNKSADDEVENT)(PIRP Irp, PKSEVENTDATA EventData,
2097 				  struct _KSEVENT_ENTRY* EventEntry);
2098 typedef 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 
2110 typedef 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 
2127 typedef struct {
2128   const GUID *Set;
2129   ULONG EventsCount;
2130   const KSEVENT_ITEM *EventItem;
2131 } KSEVENT_SET, *PKSEVENT_SET;
2132 
2133 typedef struct {
2134   KDPC Dpc;
2135   ULONG ReferenceCount;
2136   KSPIN_LOCK AccessLock;
2137 } KSDPC_ITEM, *PKSDPC_ITEM;
2138 
2139 typedef 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 
2149 struct _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 
2166 typedef 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 
2178 typedef 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 
2186 typedef 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 
2228 typedef struct {
2229   ULONG CreateItemsCount;
2230   PKSOBJECT_CREATE_ITEM CreateItemsList;
2231 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
2232 
2233 typedef 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 
2284 typedef PVOID		KSDEVICE_HEADER, KSOBJECT_HEADER;
2285 
2286 typedef enum {
2287   KsInvokeOnSuccess = 1,
2288   KsInvokeOnError = 2,
2289   KsInvokeOnCancel = 4
2290 } KSCOMPLETION_INVOCATION;
2291 
2292 typedef enum {
2293   KsListEntryTail,
2294   KsListEntryHead
2295 } KSLIST_ENTRY_LOCATION;
2296 
2297 typedef enum {
2298   KsAcquireOnly,
2299   KsAcquireAndRemove,
2300   KsAcquireOnlySingleItem,
2301   KsAcquireAndRemoveOnlySingleItem
2302 } KSIRP_REMOVAL_OPERATION;
2303 
2304 typedef enum {
2305   KsStackCopyToNewLocation,
2306   KsStackReuseCurrentLocation,
2307   KsStackUseNewLocation
2308 } KSSTACK_USE;
2309 
2310 typedef enum {
2311   KSTARGET_STATE_DISABLED,
2312   KSTARGET_STATE_ENABLED
2313 } KSTARGET_STATE;
2314 
2315 typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(PIRP Irp, PVOID Context);
2316 typedef VOID (*PFNREFERENCEDEVICEOBJECT)(PVOID Context);
2317 typedef VOID (*PFNDEREFERENCEDEVICEOBJECT)(PVOID Context);
2318 typedef NTSTATUS (*PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String);
2319 
2320 #define BUS_INTERFACE_REFERENCE_VERSION			0x100
2321 
2322 typedef 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 
2333 typedef NTSTATUS (*PFNQUERYMEDIUMSLIST) (PVOID Context, ULONG *MediumsCount,
2334 					 PKSPIN_MEDIUM *MediumList);
2335 
2336 typedef 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
2344 DEFINE_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 
2353 typedef 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 
2362 typedef 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 
2374 typedef struct {
2375   GUID ProtocolId;
2376   PVOID Argument1;
2377   PVOID Argument2;
2378 } KSHANDSHAKE, *PKSHANDSHAKE;
2379 
2380 typedef struct _KSGATE		KSGATE, *PKSGATE;
2381 
2382 struct _KSGATE {
2383   LONG Count;
2384   PKSGATE NextGate;
2385 };
2386 
2387 #ifndef _NTOS_
KsGateTurnInputOn(PKSGATE Gate)2388 __forceinline void KsGateTurnInputOn (PKSGATE Gate)
2389 {
2390 	while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) {
2391 		Gate = Gate->NextGate;
2392 	}
2393 }
2394 
KsGateTurnInputOff(PKSGATE Gate)2395 __forceinline void KsGateTurnInputOff (PKSGATE Gate)
2396 {
2397 	while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) {
2398 		Gate = Gate->NextGate;
2399 	}
2400 }
2401 
KsGateGetStateUnsafe(PKSGATE Gate)2402 __forceinline BOOLEAN KsGateGetStateUnsafe (PKSGATE Gate)
2403 {
2404 	return (BOOLEAN) (Gate->Count > 0);
2405 }
2406 
KsGateCaptureThreshold(PKSGATE Gate)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 
KsGateInitialize(PKSGATE Gate,LONG InitialCount,PKSGATE NextGate,BOOLEAN StateToPropagate)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 
KsGateInitializeAnd(PKSGATE AndGate,PKSGATE NextOrGate)2433 __forceinline void KsGateInitializeAnd (PKSGATE AndGate, PKSGATE NextOrGate)
2434 {
2435 	KsGateInitialize(AndGate, 1, NextOrGate, TRUE);
2436 }
2437 
KsGateInitializeOr(PKSGATE OrGate,PKSGATE NextAndGate)2438 __forceinline void KsGateInitializeOr (PKSGATE OrGate, PKSGATE NextAndGate)
2439 {
2440 	KsGateInitialize(OrGate, 0, NextAndGate, FALSE);
2441 }
2442 
KsGateAddOnInputToAnd(PKSGATE AndGate)2443 __forceinline void KsGateAddOnInputToAnd (PKSGATE AndGate)
2444 {
2445 	(VOID)AndGate;
2446 }
2447 
KsGateAddOffInputToAnd(PKSGATE AndGate)2448 __forceinline void KsGateAddOffInputToAnd (PKSGATE AndGate)
2449 {
2450 	KsGateTurnInputOff(AndGate);
2451 }
2452 
KsGateRemoveOnInputFromAnd(PKSGATE AndGate)2453 __forceinline void KsGateRemoveOnInputFromAnd (PKSGATE AndGate)
2454 {
2455 	(VOID)AndGate;
2456 }
2457 
KsGateRemoveOffInputFromAnd(PKSGATE AndGate)2458 __forceinline void KsGateRemoveOffInputFromAnd (PKSGATE AndGate)
2459 {
2460 	KsGateTurnInputOn(AndGate);
2461 }
2462 
KsGateAddOnInputToOr(PKSGATE OrGate)2463 __forceinline void KsGateAddOnInputToOr (PKSGATE OrGate)
2464 {
2465 	KsGateTurnInputOn(OrGate);
2466 }
2467 
KsGateAddOffInputToOr(PKSGATE OrGate)2468 __forceinline void KsGateAddOffInputToOr (PKSGATE OrGate)
2469 {
2470 	(VOID)OrGate;
2471 }
2472 
KsGateRemoveOnInputFromOr(PKSGATE OrGate)2473 __forceinline void KsGateRemoveOnInputFromOr (PKSGATE OrGate)
2474 {
2475 	KsGateTurnInputOff(OrGate);
2476 }
2477 
KsGateRemoveOffInputFromOr(PKSGATE OrGate)2478 __forceinline void KsGateRemoveOffInputFromOr (PKSGATE OrGate)
2479 {
2480 	(VOID)OrGate;
2481 }
2482 
KsGateTerminateAnd(PKSGATE AndGate)2483 __forceinline void KsGateTerminateAnd (PKSGATE AndGate)
2484 {
2485 	if (KsGateGetStateUnsafe(AndGate)) {
2486 		KsGateRemoveOnInputFromOr(AndGate->NextGate);
2487 	} else {
2488 		KsGateRemoveOffInputFromOr(AndGate->NextGate);
2489 	}
2490 }
2491 
KsGateTerminateOr(PKSGATE OrGate)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 
2503 typedef PVOID KSOBJECT_BAG;
2504 
2505 
2506 typedef BOOLEAN (*PFNKSGENERATEEVENTCALLBACK)(PVOID Context,
2507 					      PKSEVENT_ENTRY EventEntry);
2508 
2509 typedef NTSTATUS (*PFNKSDEVICECREATE)(PKSDEVICE Device);
2510 
2511 typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(PKSDEVICE Device,PIRP Irp,
2512 				PCM_RESOURCE_LIST TranslatedResourceList,
2513 				PCM_RESOURCE_LIST UntranslatedResourceList);
2514 
2515 typedef NTSTATUS (*PFNKSDEVICE)(PKSDEVICE Device);
2516 
2517 typedef NTSTATUS (*PFNKSDEVICEIRP)(PKSDEVICE Device,PIRP Irp);
2518 
2519 typedef void (*PFNKSDEVICEIRPVOID)(PKSDEVICE Device,PIRP Irp);
2520 
2521 typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(PKSDEVICE Device,PIRP Irp,
2522 					 PDEVICE_CAPABILITIES Capabilities);
2523 
2524 typedef 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 
2531 typedef void (*PFNKSDEVICESETPOWER)(PKSDEVICE Device,PIRP Irp,
2532 				    DEVICE_POWER_STATE To,
2533 				    DEVICE_POWER_STATE From);
2534 
2535 typedef NTSTATUS (*PFNKSFILTERFACTORYVOID)(PKSFILTERFACTORY FilterFactory);
2536 
2537 typedef void (*PFNKSFILTERFACTORYPOWER)(PKSFILTERFACTORY FilterFactory,
2538 					DEVICE_POWER_STATE State);
2539 
2540 typedef NTSTATUS (*PFNKSFILTERIRP)(PKSFILTER Filter,PIRP Irp);
2541 
2542 typedef NTSTATUS (*PFNKSFILTERPROCESS)(PKSFILTER Filter,
2543 					PKSPROCESSPIN_INDEXENTRY Index);
2544 
2545 typedef NTSTATUS (*PFNKSFILTERVOID)(PKSFILTER Filter);
2546 
2547 typedef void (*PFNKSFILTERPOWER)(PKSFILTER Filter,DEVICE_POWER_STATE State);
2548 
2549 typedef NTSTATUS (*PFNKSPINIRP)(PKSPIN Pin,PIRP Irp);
2550 
2551 typedef NTSTATUS (*PFNKSPINSETDEVICESTATE)(PKSPIN Pin,KSSTATE ToState,
2552 					   KSSTATE FromState);
2553 
2554 typedef NTSTATUS (*PFNKSPINSETDATAFORMAT)(PKSPIN Pin,PKSDATAFORMAT OldFormat,
2555 					  PKSMULTIPLE_ITEM OldAttributeList,
2556 					  const KSDATARANGE *DataRange,
2557 					  const KSATTRIBUTE_LIST *AttributeRange);
2558 
2559 typedef NTSTATUS (*PFNKSPINHANDSHAKE)(PKSPIN Pin,PKSHANDSHAKE In,
2560 				      PKSHANDSHAKE Out);
2561 
2562 typedef NTSTATUS (*PFNKSPIN)(PKSPIN Pin);
2563 
2564 typedef void (*PFNKSPINVOID)(PKSPIN Pin);
2565 
2566 typedef void (*PFNKSPINPOWER)(PKSPIN Pin,DEVICE_POWER_STATE State);
2567 
2568 typedef BOOLEAN (*PFNKSPINSETTIMER)(PKSPIN Pin,PKTIMER Timer,
2569 				    LARGE_INTEGER DueTime,PKDPC Dpc);
2570 
2571 typedef BOOLEAN (*PFNKSPINCANCELTIMER)(PKSPIN Pin,PKTIMER Timer);
2572 
2573 typedef LONGLONG (FASTCALL *PFNKSPINCORRELATEDTIME)(PKSPIN Pin,
2574 						    PLONGLONG SystemTime);
2575 
2576 typedef void (*PFNKSPINRESOLUTION)(PKSPIN Pin,PKSRESOLUTION Resolution);
2577 
2578 typedef NTSTATUS (*PFNKSPININITIALIZEALLOCATOR)(PKSPIN Pin,
2579 					PKSALLOCATOR_FRAMING AllocatorFraming,
2580 					PVOID *Context);
2581 
2582 typedef void (*PFNKSSTREAMPOINTER)(PKSSTREAM_POINTER StreamPointer);
2583 
2584 
2585 typedef struct KSAUTOMATION_TABLE_ KSAUTOMATION_TABLE,*PKSAUTOMATION_TABLE;
2586 
2587 struct 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 
2637 struct _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 
2654 struct _KSFILTER_DISPATCH {
2655   PFNKSFILTERIRP Create;
2656   PFNKSFILTERIRP Close;
2657   PFNKSFILTERPROCESS Process;
2658   PFNKSFILTERVOID Reset;
2659 };
2660 
2661 struct _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 
2674 struct _KSCLOCK_DISPATCH {
2675   PFNKSPINSETTIMER SetTimer;
2676   PFNKSPINCANCELTIMER CancelTimer;
2677   PFNKSPINCORRELATEDTIME CorrelatedTime;
2678   PFNKSPINRESOLUTION Resolution;
2679 };
2680 
2681 struct _KSALLOCATOR_DISPATCH {
2682   PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
2683   PFNKSDELETEALLOCATOR DeleteAllocator;
2684   PFNKSDEFAULTALLOCATE Allocate;
2685   PFNKSDEFAULTFREE Free;
2686 };
2687 
2688 #define KSDEVICE_DESCRIPTOR_VERSION	(0x100)
2689 
2690 struct _KSDEVICE_DESCRIPTOR {
2691   const KSDEVICE_DISPATCH *Dispatch;
2692   ULONG FilterDescriptorsCount;
2693   const KSFILTER_DESCRIPTOR*const *FilterDescriptors;
2694   ULONG Version;
2695 };
2696 
2697 struct _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 
2763 struct _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 
2803 struct _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 
2820 struct _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 
2832 struct _KSFILTERFACTORY {
2833   const KSFILTER_DESCRIPTOR *FilterDescriptor;
2834   KSOBJECT_BAG Bag;
2835   PVOID Context;
2836 };
2837 
2838 struct _KSFILTER {
2839   const KSFILTER_DESCRIPTOR *Descriptor;
2840   KSOBJECT_BAG Bag;
2841   PVOID Context;
2842 };
2843 
2844 struct _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 
2863 struct _KSMAPPING {
2864   PHYSICAL_ADDRESS PhysicalAddress;
2865   ULONG ByteCount;
2866   ULONG Alignment;
2867 };
2868 
2869 struct _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 
2886 struct _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 
2896 struct _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 
2909 struct _KSPROCESSPIN_INDEXENTRY {
2910   PKSPROCESSPIN *Pins;
2911   ULONG Count;
2912 };
2913 
2914 typedef enum {
2915   KsObjectTypeDevice,
2916   KsObjectTypeFilterFactory,
2917   KsObjectTypeFilter,
2918   KsObjectTypePin
2919 } KSOBJECTTYPE;
2920 
2921 
2922 typedef void (*PFNKSFREE)(PVOID Data);
2923 
2924 typedef void (*PFNKSPINFRAMERETURN)(PKSPIN Pin,PVOID Data,ULONG Size,PMDL Mdl,
2925 				    PVOID Context,NTSTATUS Status);
2926 
2927 typedef void (*PFNKSPINIRPCOMPLETION)(PKSPIN Pin,PIRP Irp);
2928 
2929 
2930 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
2931 #ifndef _IKsControl_
2932 #define _IKsControl_
2933 
2934 typedef 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
DECLARE_INTERFACE_(IKsControl,IUnknown)2948 DECLARE_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 };
2973 typedef struct IKsReferenceClock *PIKSREFERENCECLOCK;
2974 
2975 #undef INTERFACE
2976 #define INTERFACE IKsReferenceClock
DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)2977 DECLARE_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
DECLARE_INTERFACE_(IKsDeviceFunctions,IUnknown)2998 DECLARE_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
3013 DEFINE_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
3017 DEFINE_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
3021 DEFINE_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
3030 extern "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 
3041 KSDDKAPI NTSTATUS NTAPI KsEnableEvent
3042 			(PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet,
3043 			 PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
3044 			 PVOID EventsLock);
3045 
3046 KSDDKAPI 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 
3051 KSDDKAPI NTSTATUS NTAPI KsDisableEvent
3052 			(PIRP Irp, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags,
3053 			 PVOID EventsLock);
3054 
3055 KSDDKAPI VOID NTAPI KsDiscardEvent (PKSEVENT_ENTRY EventEntry);
3056 
3057 KSDDKAPI VOID NTAPI KsFreeEventList
3058 			(PFILE_OBJECT FileObject, PLIST_ENTRY EventsList,
3059 			 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock);
3060 
3061 KSDDKAPI NTSTATUS NTAPI KsGenerateEvent (PKSEVENT_ENTRY EventEntry);
3062 
3063 KSDDKAPI NTSTATUS NTAPI KsGenerateDataEvent
3064 			(PKSEVENT_ENTRY EventEntry, ULONG DataSize, PVOID Data);
3065 
3066 KSDDKAPI VOID NTAPI KsGenerateEventList
3067 			(GUID *Set, ULONG EventId, PLIST_ENTRY EventsList,
3068 			 KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock);
3069 
3070 KSDDKAPI NTSTATUS NTAPI KsPropertyHandler
3071 			(PIRP Irp, ULONG PropertySetsCount,
3072 			 const KSPROPERTY_SET *PropertySet);
3073 
3074 KSDDKAPI NTSTATUS NTAPI KsPropertyHandlerWithAllocator
3075 			(PIRP Irp, ULONG PropertySetsCount,
3076 			 const KSPROPERTY_SET *PropertySet, PFNKSALLOCATOR Allocator,
3077 			 ULONG PropertyItemSize);
3078 
3079 KSDDKAPI 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 
3085 KSDDKAPI NTSTATUS NTAPI KsMethodHandler
3086 			(PIRP Irp, ULONG MethodSetsCount,
3087 			 const KSMETHOD_SET *MethodSet);
3088 
3089 KSDDKAPI NTSTATUS NTAPI KsMethodHandlerWithAllocator
3090 			(PIRP Irp, ULONG MethodSetsCount,
3091 			 const KSMETHOD_SET *MethodSet, PFNKSALLOCATOR Allocator,
3092 			 ULONG MethodItemSize);
3093 
3094 KSDDKAPI 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 
3099 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocator (PIRP Irp);
3100 
3101 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx
3102 			(PIRP Irp, PVOID InitializeContext,
3103 			 PFNKSDEFAULTALLOCATE DefaultAllocate,
3104 			 PFNKSDEFAULTFREE DefaultFree,
3105 			 PFNKSINITIALIZEALLOCATOR InitializeAllocator,
3106 			 PFNKSDELETEALLOCATOR DeleteAllocator);
3107 
3108 KSDDKAPI NTSTATUS NTAPI KsCreateAllocator
3109 			(HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming,
3110 			 PHANDLE AllocatorHandle);
3111 
3112 KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorCreateRequest
3113 			(PIRP Irp, PKSALLOCATOR_FRAMING *AllocatorFraming);
3114 
3115 KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorFramingEx
3116 			(PKSALLOCATOR_FRAMING_EX Framing, ULONG BufferSize,
3117 			 const KSALLOCATOR_FRAMING_EX *PinFraming);
3118 
3119 KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock (PKSDEFAULTCLOCK *DefaultClock);
3120 
3121 KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx
3122 			(PKSDEFAULTCLOCK *DefaultClock, PVOID Context,
3123 			 PFNKSSETTIMER SetTimer, PFNKSCANCELTIMER CancelTimer,
3124 			 PFNKSCORRELATEDTIME CorrelatedTime,
3125 			 const KSRESOLUTION *Resolution, ULONG Flags);
3126 
3127 KSDDKAPI VOID NTAPI KsFreeDefaultClock (PKSDEFAULTCLOCK DefaultClock);
3128 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock (PIRP Irp, PKSDEFAULTCLOCK DefaultClock);
3129 
3130 KSDDKAPI NTSTATUS NTAPI KsCreateClock
3131 			(HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate,
3132 			 PHANDLE ClockHandle);
3133 
3134 KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest
3135 			(PIRP Irp, PKSCLOCK_CREATE *ClockCreate);
3136 
3137 KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState (PKSDEFAULTCLOCK DefaultClock);
3138 KSDDKAPI VOID NTAPI KsSetDefaultClockState(PKSDEFAULTCLOCK DefaultClock, KSSTATE State);
3139 KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime (PKSDEFAULTCLOCK DefaultClock);
3140 KSDDKAPI VOID NTAPI KsSetDefaultClockTime(PKSDEFAULTCLOCK DefaultClock, LONGLONG Time);
3141 
3142 KSDDKAPI NTSTATUS NTAPI KsCreatePin
3143 			(HANDLE FilterHandle, PKSPIN_CONNECT Connect,
3144 			 ACCESS_MASK DesiredAccess, PHANDLE ConnectionHandle);
3145 
3146 KSDDKAPI NTSTATUS NTAPI KsValidateConnectRequest
3147 			(PIRP Irp, ULONG DescriptorsCount,
3148 			 const KSPIN_DESCRIPTOR *Descriptor, PKSPIN_CONNECT *Connect);
3149 
3150 KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler
3151 			(PIRP Irp, PKSPROPERTY Property, PVOID Data,
3152 			 ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor);
3153 
3154 KSDDKAPI NTSTATUS NTAPI KsPinDataIntersection
3155 			(PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount,
3156 			 const KSPIN_DESCRIPTOR *Descriptor,
3157 			 PFNKSINTERSECTHANDLER IntersectHandler);
3158 
3159 KSDDKAPI 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 
3164 KSDDKAPI 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 
3176 KSDDKAPI NTSTATUS NTAPI KsLoadResource
3177 			(PVOID ImageBase, POOL_TYPE PoolType, ULONG_PTR ResourceName,
3178 			 ULONG ResourceType, PVOID *Resource, PULONG ResourceSize);
3179 
3180 KSDDKAPI NTSTATUS NTAPI KsGetImageNameAndResourceId
3181 			(HANDLE RegKey, PUNICODE_STRING ImageName, PULONG_PTR ResourceId,
3182 			 PULONG ValueType);
3183 
3184 KSDDKAPI NTSTATUS NTAPI KsMapModuleName
3185 			(PDEVICE_OBJECT PhysicalDeviceObject, PUNICODE_STRING ModuleName,
3186 			 PUNICODE_STRING ImageName, PULONG_PTR ResourceId,
3187 			 PULONG ValueType);
3188 
3189 KSDDKAPI NTSTATUS NTAPI KsReferenceBusObject (KSDEVICE_HEADER Header);
3190 KSDDKAPI VOID NTAPI KsDereferenceBusObject (KSDEVICE_HEADER Header);
3191 KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp);
3192 KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp);
3193 KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificProperty (PIRP Irp, PFNKSHANDLER Handler);
3194 KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificMethod (PIRP Irp, PFNKSHANDLER Handler);
3195 
3196 KSDDKAPI 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 
3201 KSDDKAPI 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 
3206 KSDDKAPI NTSTATUS NTAPI KsQueryInformationFile
3207 			(PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length,
3208 			 FILE_INFORMATION_CLASS FileInformationClass);
3209 
3210 KSDDKAPI NTSTATUS NTAPI KsSetInformationFile
3211 			(PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length,
3212 			 FILE_INFORMATION_CLASS FileInformationClass);
3213 
3214 KSDDKAPI 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 
3221 KSDDKAPI NTSTATUS NTAPI KsProbeStreamIrp(PIRP Irp, ULONG ProbeFlags, ULONG HeaderSize);
3222 KSDDKAPI NTSTATUS NTAPI KsAllocateExtraData(PIRP Irp, ULONG ExtraSize, PVOID *ExtraBuffer);
3223 KSDDKAPI VOID NTAPI KsNullDriverUnload (PDRIVER_OBJECT DriverObject);
3224 
3225 KSDDKAPI NTSTATUS NTAPI KsSetMajorFunctionHandler
3226 			(PDRIVER_OBJECT DriverObject, ULONG MajorFunction);
3227 
3228 KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest
3229 			(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3230 
3231 KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion
3232 			(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3233 
3234 KSDDKAPI NTSTATUS NTAPI KsDispatchIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3235 
3236 KSDDKAPI 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 
3242 KSDDKAPI 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 
3249 KSDDKAPI VOID NTAPI KsCancelRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3250 KSDDKAPI VOID NTAPI KsCancelIo(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock);
3251 KSDDKAPI VOID NTAPI KsReleaseIrpOnCancelableQueue(PIRP Irp, PDRIVER_CANCEL DriverCancel);
3252 
3253 KSDDKAPI PIRP NTAPI KsRemoveIrpFromCancelableQueue
3254 			(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock,
3255 			 KSLIST_ENTRY_LOCATION ListLocation,
3256 			 KSIRP_REMOVAL_OPERATION RemovalOperation);
3257 
3258 KSDDKAPI 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 
3264 KSDDKAPI VOID NTAPI KsRemoveSpecificIrpFromCancelableQueue (PIRP Irp);
3265 
3266 KSDDKAPI VOID NTAPI KsAddIrpToCancelableQueue
3267 			(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, PIRP Irp,
3268 			 KSLIST_ENTRY_LOCATION ListLocation, PDRIVER_CANCEL DriverCancel);
3269 
3270 KSDDKAPI NTSTATUS NTAPI KsAcquireResetValue(PIRP Irp, KSRESET *ResetValue);
3271 
3272 KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler
3273 			(PIRP Irp, PKSPROPERTY Property, PVOID Data,
3274 			 const KSTOPOLOGY *Topology);
3275 
3276 KSDDKAPI VOID NTAPI KsAcquireDeviceSecurityLock(KSDEVICE_HEADER Header, BOOLEAN Exclusive);
3277 KSDDKAPI VOID NTAPI KsReleaseDeviceSecurityLock (KSDEVICE_HEADER Header);
3278 KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3279 KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3280 KSDDKAPI NTSTATUS NTAPI KsDefaultForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
3281 
3282 KSDDKAPI VOID NTAPI KsSetDevicePnpAndBaseObject
3283 			(KSDEVICE_HEADER Header, PDEVICE_OBJECT PnpDeviceObject,
3284 			 PDEVICE_OBJECT BaseObject);
3285 
3286 KSDDKAPI PDEVICE_OBJECT NTAPI KsQueryDevicePnpObject (KSDEVICE_HEADER Header);
3287 KSDDKAPI ACCESS_MASK NTAPI KsQueryObjectAccessMask (KSOBJECT_HEADER Header);
3288 
3289 KSDDKAPI VOID NTAPI KsRecalculateStackDepth
3290 			(KSDEVICE_HEADER Header, BOOLEAN ReuseStackLocation);
3291 
3292 KSDDKAPI VOID NTAPI KsSetTargetState
3293 			(KSOBJECT_HEADER Header, KSTARGET_STATE TargetState);
3294 
3295 KSDDKAPI VOID NTAPI KsSetTargetDeviceObject
3296 			(KSOBJECT_HEADER Header, PDEVICE_OBJECT TargetDevice);
3297 
3298 KSDDKAPI VOID NTAPI KsSetPowerDispatch
3299 			(KSOBJECT_HEADER Header, PFNKSCONTEXT_DISPATCH PowerDispatch,
3300 			 PVOID PowerContext);
3301 
3302 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI KsQueryObjectCreateItem (KSOBJECT_HEADER Header);
3303 
3304 KSDDKAPI NTSTATUS NTAPI KsAllocateDeviceHeader
3305 			(KSDEVICE_HEADER *Header, ULONG ItemsCount,
3306 			 PKSOBJECT_CREATE_ITEM ItemsList);
3307 
3308 KSDDKAPI VOID NTAPI KsFreeDeviceHeader (KSDEVICE_HEADER Header);
3309 
3310 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader
3311 			(KSOBJECT_HEADER *Header, ULONG ItemsCount,
3312 			 PKSOBJECT_CREATE_ITEM ItemsList, PIRP Irp,
3313 			 const KSDISPATCH_TABLE *Table);
3314 
3315 KSDDKAPI VOID NTAPI KsFreeObjectHeader (KSOBJECT_HEADER Header);
3316 
3317 KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToDeviceHeader
3318 			(KSDEVICE_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context,
3319 			 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor);
3320 
3321 KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToObjectHeader
3322 			(KSOBJECT_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context,
3323 			 PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor);
3324 
3325 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectCreateItem
3326 			(KSDEVICE_HEADER Header, PKSOBJECT_CREATE_ITEM CreateItem,
3327 			 BOOLEAN AllocateEntry, PFNKSITEMFREECALLBACK ItemFreeCallback);
3328 
3329 KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItem
3330 			(KSDEVICE_HEADER Header, PUNICODE_STRING CreateItem);
3331 
3332 KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItemsByContext
3333 			(KSDEVICE_HEADER Header, PVOID Context);
3334 
3335 KSDDKAPI NTSTATUS NTAPI KsCreateDefaultSecurity
3336 			(PSECURITY_DESCRIPTOR ParentSecurity,
3337 			 PSECURITY_DESCRIPTOR *DefaultSecurity);
3338 
3339 KSDDKAPI NTSTATUS NTAPI KsForwardIrp
3340 			(PIRP Irp, PFILE_OBJECT FileObject, BOOLEAN ReuseStackLocation);
3341 
3342 KSDDKAPI NTSTATUS NTAPI KsForwardAndCatchIrp
3343 			(PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject,
3344 			 KSSTACK_USE StackUse);
3345 
3346 KSDDKAPI 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 
3351 KSDDKAPI NTSTATUS NTAPI KsUnserializeObjectPropertiesFromRegistry
3352 			(PFILE_OBJECT FileObject, HANDLE ParentKey,
3353 			 PUNICODE_STRING RegistryPath);
3354 
3355 KSDDKAPI NTSTATUS NTAPI KsCacheMedium
3356 			(PUNICODE_STRING SymbolicLink, PKSPIN_MEDIUM Medium,
3357 			 ULONG PinDirection);
3358 
3359 KSDDKAPI NTSTATUS NTAPI KsRegisterWorker
3360 			(WORK_QUEUE_TYPE WorkQueueType, PKSWORKER *Worker);
3361 
3362 KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker
3363 			(WORK_QUEUE_TYPE WorkQueueType, PWORK_QUEUE_ITEM CountedWorkItem,
3364 			 PKSWORKER *Worker);
3365 
3366 KSDDKAPI VOID NTAPI KsUnregisterWorker (PKSWORKER Worker);
3367 KSDDKAPI NTSTATUS NTAPI KsQueueWorkItem(PKSWORKER Worker, PWORK_QUEUE_ITEM WorkItem);
3368 KSDDKAPI ULONG NTAPI KsIncrementCountedWorker (PKSWORKER Worker);
3369 KSDDKAPI ULONG NTAPI KsDecrementCountedWorker (PKSWORKER Worker);
3370 
3371 KSDDKAPI NTSTATUS NTAPI KsCreateTopologyNode
3372 			(HANDLE ParentHandle, PKSNODE_CREATE NodeCreate,
3373 			 ACCESS_MASK DesiredAccess, PHANDLE NodeHandle);
3374 
3375 KSDDKAPI NTSTATUS NTAPI KsValidateTopologyNodeCreateRequest
3376 			(PIRP Irp, PKSTOPOLOGY Topology, PKSNODE_CREATE *NodeCreate);
3377 
3378 KSDDKAPI NTSTATUS NTAPI KsMergeAutomationTables
3379 			(PKSAUTOMATION_TABLE *AutomationTableAB,
3380 			 PKSAUTOMATION_TABLE AutomationTableA,
3381 			 PKSAUTOMATION_TABLE AutomationTableB,
3382 			 KSOBJECT_BAG Bag);
3383 
3384 KSDDKAPI NTSTATUS NTAPI KsInitializeDriver
3385 			(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName,
3386 			 const KSDEVICE_DESCRIPTOR *Descriptor);
3387 
3388 KSDDKAPI NTSTATUS NTAPI KsAddDevice
3389 			(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject);
3390 
3391 KSDDKAPI NTSTATUS NTAPI KsCreateDevice
3392 			(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject,
3393 			 const KSDEVICE_DESCRIPTOR *Descriptor, ULONG ExtensionSize,
3394 			 PKSDEVICE *Device);
3395 
3396 KSDDKAPI NTSTATUS NTAPI KsInitializeDevice
3397 			(PDEVICE_OBJECT FunctionalDeviceObject,
3398 			 PDEVICE_OBJECT PhysicalDeviceObject,
3399 			 PDEVICE_OBJECT NextDeviceObject,
3400 			 const KSDEVICE_DESCRIPTOR *Descriptor);
3401 
3402 KSDDKAPI void NTAPI KsTerminateDevice (PDEVICE_OBJECT DeviceObject);
3403 KSDDKAPI PKSDEVICE NTAPI KsGetDeviceForDeviceObject (PDEVICE_OBJECT FunctionalDeviceObject);
3404 KSDDKAPI void NTAPI KsAcquireDevice (PKSDEVICE Device);
3405 KSDDKAPI void NTAPI KsReleaseDevice (PKSDEVICE Device);
3406 
3407 KSDDKAPI void NTAPI KsDeviceRegisterAdapterObject
3408 			(PKSDEVICE Device, PADAPTER_OBJECT AdapterObject,
3409 			 ULONG MaxMappingsByteCount, ULONG MappingTableStride);
3410 
3411 KSDDKAPI ULONG NTAPI KsDeviceGetBusData
3412 			(PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset,
3413 			 ULONG Length);
3414 
3415 KSDDKAPI ULONG NTAPI KsDeviceSetBusData
3416 			(PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset,
3417 			 ULONG Length);
3418 
3419 KSDDKAPI 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 
3431 KSDDKAPI NTSTATUS NTAPI KsFilterFactoryUpdateCacheData
3432 			(PKSFILTERFACTORY FilterFactory,
3433 			 const KSFILTER_DESCRIPTOR *FilterDescriptor);
3434 
3435 KSDDKAPI NTSTATUS NTAPI KsFilterFactoryAddCreateItem
3436 			(PKSFILTERFACTORY FilterFactory, PWSTR RefString,
3437 			 PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags);
3438 
3439 KSDDKAPI NTSTATUS NTAPI KsFilterFactorySetDeviceClassesState
3440 			(PKSFILTERFACTORY FilterFactory, BOOLEAN NewState);
3441 
3442 KSDDKAPI PUNICODE_STRING NTAPI KsFilterFactoryGetSymbolicLink
3443 			(PKSFILTERFACTORY FilterFactory);
3444 
3445 KSDDKAPI void NTAPI KsAddEvent(PVOID Object, PKSEVENT_ENTRY EventEntry);
3446 
KsFilterAddEvent(PKSFILTER Filter,PKSEVENT_ENTRY EventEntry)3447 __forceinline void KsFilterAddEvent (PKSFILTER Filter, PKSEVENT_ENTRY EventEntry)
3448 {
3449 	KsAddEvent(Filter, EventEntry);
3450 }
3451 
KsPinAddEvent(PKSPIN Pin,PKSEVENT_ENTRY EventEntry)3452 __forceinline void KsPinAddEvent (PKSPIN Pin, PKSEVENT_ENTRY EventEntry)
3453 {
3454 	KsAddEvent(Pin, EventEntry);
3455 }
3456 
3457 KSDDKAPI NTSTATUS NTAPI KsDefaultAddEventHandler
3458 			(PIRP Irp, PKSEVENTDATA EventData, PKSEVENT_ENTRY EventEntry);
3459 
3460 KSDDKAPI void NTAPI KsGenerateEvents
3461 			(PVOID Object, const GUID *EventSet, ULONG EventId,
3462 			 ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack,
3463 			 PVOID CallBackContext);
3464 
KsFilterGenerateEvents(PKSFILTER Filter,const GUID * EventSet,ULONG EventId,ULONG DataSize,PVOID Data,PFNKSGENERATEEVENTCALLBACK CallBack,PVOID CallBackContext)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 
KsPinGenerateEvents(PKSPIN Pin,const GUID * EventSet,ULONG EventId,ULONG DataSize,PVOID Data,PFNKSGENERATEEVENTCALLBACK CallBack,PVOID CallBackContext)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 
3483 typedef enum {
3484   KSSTREAM_POINTER_STATE_UNLOCKED = 0,
3485   KSSTREAM_POINTER_STATE_LOCKED
3486 } KSSTREAM_POINTER_STATE;
3487 
3488 KSDDKAPI NTSTATUS NTAPI KsPinGetAvailableByteCount
3489 			(PKSPIN Pin, PLONG InputDataBytes, PLONG OutputBufferBytes);
3490 
3491 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer
3492 			(PKSPIN Pin, KSSTREAM_POINTER_STATE State);
3493 
3494 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetTrailingEdgeStreamPointer
3495 			(PKSPIN Pin, KSSTREAM_POINTER_STATE State);
3496 
3497 KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode
3498 			(PKSSTREAM_POINTER StreamPointer, NTSTATUS Status);
3499 
3500 KSDDKAPI NTSTATUS NTAPI KsStreamPointerLock (PKSSTREAM_POINTER StreamPointer);
3501 KSDDKAPI void NTAPI KsStreamPointerUnlock(PKSSTREAM_POINTER StreamPointer, BOOLEAN Eject);
3502 
3503 KSDDKAPI void NTAPI KsStreamPointerAdvanceOffsetsAndUnlock
3504 			(PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed,
3505 			 BOOLEAN Eject);
3506 
3507 KSDDKAPI void NTAPI KsStreamPointerDelete (PKSSTREAM_POINTER StreamPointer);
3508 
3509 KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone
3510 			(PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER CancelCallback,
3511 			 ULONG ContextSize, PKSSTREAM_POINTER *CloneStreamPointer);
3512 
3513 KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets
3514 			(PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed,
3515 			 BOOLEAN Eject);
3516 
3517 KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance (PKSSTREAM_POINTER StreamPointer);
3518 KSDDKAPI PMDL NTAPI KsStreamPointerGetMdl (PKSSTREAM_POINTER StreamPointer);
3519 
3520 KSDDKAPI PIRP NTAPI KsStreamPointerGetIrp
3521 			(PKSSTREAM_POINTER StreamPointer, PBOOLEAN FirstFrameInIrp,
3522 			 PBOOLEAN LastFrameInIrp);
3523 
3524 KSDDKAPI void NTAPI KsStreamPointerScheduleTimeout
3525 			(PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER Callback,
3526 			 ULONGLONG Interval);
3527 
3528 KSDDKAPI void NTAPI KsStreamPointerCancelTimeout (PKSSTREAM_POINTER StreamPointer);
3529 KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetFirstCloneStreamPointer (PKSPIN Pin);
3530 
3531 KSDDKAPI PKSSTREAM_POINTER NTAPI KsStreamPointerGetNextClone
3532 			(PKSSTREAM_POINTER StreamPointer);
3533 
3534 KSDDKAPI NTSTATUS NTAPI KsPinHandshake(PKSPIN Pin, PKSHANDSHAKE In, PKSHANDSHAKE Out);
3535 KSDDKAPI void NTAPI KsCompletePendingRequest (PIRP Irp);
3536 KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp (PIRP Irp);
3537 KSDDKAPI PVOID NTAPI KsGetObjectFromFileObject (PFILE_OBJECT FileObject);
3538 KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromFileObject (PFILE_OBJECT FileObject);
3539 
KsGetFilterFromFileObject(PFILE_OBJECT FileObject)3540 __forceinline PKSFILTER KsGetFilterFromFileObject (PFILE_OBJECT FileObject)
3541 {
3542 	return (PKSFILTER) KsGetObjectFromFileObject(FileObject);
3543 }
3544 
KsGetPinFromFileObject(PFILE_OBJECT FileObject)3545 __forceinline PKSPIN KsGetPinFromFileObject (PFILE_OBJECT FileObject)
3546 {
3547 	return (PKSPIN) KsGetObjectFromFileObject(FileObject);
3548 }
3549 
3550 KSDDKAPI PKSGATE NTAPI KsFilterGetAndGate (PKSFILTER Filter);
3551 KSDDKAPI void NTAPI KsFilterAcquireProcessingMutex (PKSFILTER Filter);
3552 KSDDKAPI void NTAPI KsFilterReleaseProcessingMutex (PKSFILTER Filter);
3553 KSDDKAPI void NTAPI KsFilterAttemptProcessing(PKSFILTER Filter, BOOLEAN Asynchronous);
3554 KSDDKAPI PKSGATE NTAPI KsPinGetAndGate(PKSPIN Pin);
3555 KSDDKAPI void NTAPI KsPinAttachAndGate(PKSPIN Pin, PKSGATE AndGate);
3556 KSDDKAPI void NTAPI KsPinAttachOrGate (PKSPIN Pin, PKSGATE OrGate);
3557 KSDDKAPI void NTAPI KsPinAcquireProcessingMutex (PKSPIN Pin);
3558 KSDDKAPI void NTAPI KsPinReleaseProcessingMutex (PKSPIN Pin);
3559 KSDDKAPI BOOLEAN NTAPI KsProcessPinUpdate (PKSPROCESSPIN ProcessPin);
3560 
3561 KSDDKAPI void NTAPI KsPinGetCopyRelationships
3562 			(PKSPIN Pin, PKSPIN *CopySource, PKSPIN *DelegateBranch);
3563 
3564 KSDDKAPI void NTAPI KsPinAttemptProcessing(PKSPIN Pin, BOOLEAN Asynchronous);
3565 KSDDKAPI PVOID NTAPI KsGetParent (PVOID Object);
3566 
KsFilterFactoryGetParentDevice(PKSFILTERFACTORY FilterFactory)3567 __forceinline PKSDEVICE KsFilterFactoryGetParentDevice (PKSFILTERFACTORY FilterFactory)
3568 {
3569 	return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
3570 }
3571 
KsFilterGetParentFilterFactory(PKSFILTER Filter)3572 __forceinline PKSFILTERFACTORY KsFilterGetParentFilterFactory (PKSFILTER Filter)
3573 {
3574 	return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
3575 }
3576 
3577 KSDDKAPI PKSFILTER NTAPI KsPinGetParentFilter (PKSPIN Pin);
3578 KSDDKAPI PVOID NTAPI KsGetFirstChild (PVOID Object);
3579 
KsDeviceGetFirstChildFilterFactory(PKSDEVICE Device)3580 __forceinline PKSFILTERFACTORY KsDeviceGetFirstChildFilterFactory (PKSDEVICE Device)
3581 {
3582 	return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device);
3583 }
3584 
KsFilterFactoryGetFirstChildFilter(PKSFILTERFACTORY FilterFactory)3585 __forceinline PKSFILTER KsFilterFactoryGetFirstChildFilter (PKSFILTERFACTORY FilterFactory)
3586 {
3587 	return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory);
3588 }
3589 
3590 KSDDKAPI ULONG NTAPI KsFilterGetChildPinCount(PKSFILTER Filter, ULONG PinId);
3591 KSDDKAPI PKSPIN NTAPI KsFilterGetFirstChildPin(PKSFILTER Filter, ULONG PinId);
3592 KSDDKAPI PVOID NTAPI KsGetNextSibling (PVOID Object);
3593 KSDDKAPI PKSPIN NTAPI KsPinGetNextSiblingPin (PKSPIN Pin);
3594 
KsFilterFactoryGetNextSiblingFilterFactory(PKSFILTERFACTORY FilterFactory)3595 __forceinline PKSFILTERFACTORY KsFilterFactoryGetNextSiblingFilterFactory
3596 			(PKSFILTERFACTORY FilterFactory)
3597 {
3598 	return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory);
3599 }
3600 
KsFilterGetNextSiblingFilter(PKSFILTER Filter)3601 __forceinline PKSFILTER KsFilterGetNextSiblingFilter (PKSFILTER Filter)
3602 {
3603 	return (PKSFILTER) KsGetNextSibling((PVOID) Filter);
3604 }
3605 
3606 KSDDKAPI PKSDEVICE NTAPI KsGetDevice (PVOID Object);
3607 
KsFilterFactoryGetDevice(PKSFILTERFACTORY FilterFactory)3608 __forceinline PKSDEVICE KsFilterFactoryGetDevice (PKSFILTERFACTORY FilterFactory)
3609 {
3610 	return KsGetDevice((PVOID) FilterFactory);
3611 }
3612 
KsFilterGetDevice(PKSFILTER Filter)3613 __forceinline PKSDEVICE KsFilterGetDevice (PKSFILTER Filter)
3614 {
3615 	return KsGetDevice((PVOID) Filter);
3616 }
3617 
KsPinGetDevice(PKSPIN Pin)3618 __forceinline PKSDEVICE KsPinGetDevice (PKSPIN Pin)
3619 {
3620 	return KsGetDevice((PVOID) Pin);
3621 }
3622 
3623 KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp (PIRP Irp);
3624 KSDDKAPI PKSPIN NTAPI KsGetPinFromIrp (PIRP Irp);
3625 KSDDKAPI ULONG NTAPI KsGetNodeIdFromIrp (PIRP Irp);
3626 KSDDKAPI void NTAPI KsAcquireControl (PVOID Object);
3627 KSDDKAPI void NTAPI KsReleaseControl (PVOID Object);
3628 
KsFilterAcquireControl(PKSFILTER Filter)3629 __forceinline void KsFilterAcquireControl (PKSFILTER Filter)
3630 {
3631 	KsAcquireControl((PVOID) Filter);
3632 }
3633 
KsFilterReleaseControl(PKSFILTER Filter)3634 __forceinline void KsFilterReleaseControl (PKSFILTER Filter)
3635 {
3636 	KsReleaseControl((PVOID) Filter);
3637 }
3638 
KsPinAcquireControl(PKSPIN Pin)3639 __forceinline void KsPinAcquireControl (PKSPIN Pin)
3640 {
3641 	KsAcquireControl((PVOID) Pin);
3642 }
3643 
KsPinReleaseControl(PKSPIN Pin)3644 __forceinline void KsPinReleaseControl (PKSPIN Pin)
3645 {
3646 	KsReleaseControl((PVOID) Pin);
3647 }
3648 
3649 KSDDKAPI NTSTATUS NTAPI KsAddItemToObjectBag
3650 			(KSOBJECT_BAG ObjectBag, PVOID Item, PFNKSFREE Free);
3651 
3652 KSDDKAPI 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 
3658 KSDDKAPI NTSTATUS NTAPI KsAllocateObjectBag(PKSDEVICE Device, KSOBJECT_BAG *ObjectBag);
3659 KSDDKAPI void NTAPI KsFreeObjectBag (KSOBJECT_BAG ObjectBag);
3660 
3661 KSDDKAPI NTSTATUS NTAPI KsCopyObjectBagItems
3662 			(KSOBJECT_BAG ObjectBagDestination, KSOBJECT_BAG ObjectBagSource);
3663 
3664 KSDDKAPI 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 
3675 KSDDKAPI NTSTATUS NTAPI KsRegisterFilterWithNoKSPins
3676 			(PDEVICE_OBJECT DeviceObject, const GUID *InterfaceClassGUID,
3677 			 ULONG PinCount, WINBOOL *PinDirection, KSPIN_MEDIUM *MediumList,
3678 			 GUID *CategoryList);
3679 
3680 KSDDKAPI NTSTATUS NTAPI KsFilterCreatePinFactory
3681 			(PKSFILTER Filter, const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
3682 			 PULONG PinID);
3683 
3684 KSDDKAPI NTSTATUS NTAPI KsFilterCreateNode
3685 			(PKSFILTER Filter, const KSNODE_DESCRIPTOR *const NodeDescriptor,
3686 			 PULONG NodeID);
3687 
3688 KSDDKAPI NTSTATUS NTAPI KsFilterAddTopologyConnections
3689 			(PKSFILTER Filter, ULONG NewConnectionsCount,
3690 			 const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
3691 
3692 KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedPinInterface
3693 			(PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface);
3694 
3695 KSDDKAPI PFILE_OBJECT NTAPI KsPinGetConnectedPinFileObject (PKSPIN Pin);
3696 KSDDKAPI PDEVICE_OBJECT NTAPI KsPinGetConnectedPinDeviceObject (PKSPIN Pin);
3697 
3698 KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedFilterInterface
3699 			(PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface);
3700 
3701 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3702 KSDDKAPI NTSTATUS NTAPI KsPinGetReferenceClockInterface
3703 			(PKSPIN Pin, PIKSREFERENCECLOCK *Interface);
3704 #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */
3705 
3706 KSDDKAPI VOID NTAPI KsPinSetPinClockTime(PKSPIN Pin, LONGLONG Time);
3707 
3708 KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrame
3709 			(PKSPIN Pin, PVOID Data, ULONG Size,
3710 			 PKSSTREAM_HEADER StreamHeader, PVOID Context);
3711 
3712 KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrameMdl
3713 			(PKSPIN Pin, PMDL Mdl, PKSSTREAM_HEADER StreamHeader,
3714 			 PVOID Context);
3715 
3716 KSDDKAPI void NTAPI KsPinRegisterFrameReturnCallback
3717 			(PKSPIN Pin, PFNKSPINFRAMERETURN FrameReturn);
3718 
3719 KSDDKAPI void NTAPI KsPinRegisterIrpCompletionCallback
3720 			(PKSPIN Pin, PFNKSPINIRPCOMPLETION IrpCompletion);
3721 
3722 KSDDKAPI void NTAPI KsPinRegisterHandshakeCallback
3723 			(PKSPIN Pin, PFNKSPINHANDSHAKE Handshake);
3724 
3725 KSDDKAPI void NTAPI KsFilterRegisterPowerCallbacks
3726 			(PKSFILTER Filter, PFNKSFILTERPOWER Sleep, PFNKSFILTERPOWER Wake);
3727 
3728 KSDDKAPI void NTAPI KsPinRegisterPowerCallbacks
3729 			(PKSPIN Pin, PFNKSPINPOWER Sleep, PFNKSPINPOWER Wake);
3730 
3731 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3732 KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown
3733 			(PVOID Object, PUNKNOWN ClientUnknown);
3734 
3735 KSDDKAPI PUNKNOWN NTAPI KsGetOuterUnknown (PVOID Object);
3736 
KsDeviceRegisterAggregatedClientUnknown(PKSDEVICE Device,PUNKNOWN ClientUnknown)3737 __forceinline PUNKNOWN KsDeviceRegisterAggregatedClientUnknown
3738 			(PKSDEVICE Device, PUNKNOWN ClientUnknown)
3739 {
3740 	return KsRegisterAggregatedClientUnknown((PVOID)Device, ClientUnknown);
3741 }
3742 
KsDeviceGetOuterUnknown(PKSDEVICE Device)3743 __forceinline PUNKNOWN KsDeviceGetOuterUnknown (PKSDEVICE Device)
3744 {
3745 	return KsGetOuterUnknown((PVOID) Device);
3746 }
3747 
KsFilterFactoryRegisterAggregatedClientUnknown(PKSFILTERFACTORY FilterFactory,PUNKNOWN ClientUnknown)3748 __forceinline PUNKNOWN KsFilterFactoryRegisterAggregatedClientUnknown
3749 			(PKSFILTERFACTORY FilterFactory, PUNKNOWN ClientUnknown)
3750 {
3751 	return KsRegisterAggregatedClientUnknown((PVOID)FilterFactory, ClientUnknown);
3752 }
3753 
KsFilterFactoryGetOuterUnknown(PKSFILTERFACTORY FilterFactory)3754 __forceinline PUNKNOWN KsFilterFactoryGetOuterUnknown (PKSFILTERFACTORY FilterFactory)
3755 {
3756 	return KsGetOuterUnknown((PVOID)FilterFactory);
3757 }
3758 
KsFilterRegisterAggregatedClientUnknown(PKSFILTER Filter,PUNKNOWN ClientUnknown)3759 __forceinline PUNKNOWN KsFilterRegisterAggregatedClientUnknown
3760 			(PKSFILTER Filter, PUNKNOWN ClientUnknown)
3761 {
3762 	return KsRegisterAggregatedClientUnknown((PVOID)Filter, ClientUnknown);
3763 }
3764 
KsFilterGetOuterUnknown(PKSFILTER Filter)3765 __forceinline PUNKNOWN KsFilterGetOuterUnknown (PKSFILTER Filter)
3766 {
3767 	return KsGetOuterUnknown((PVOID)Filter);
3768 }
3769 
KsPinRegisterAggregatedClientUnknown(PKSPIN Pin,PUNKNOWN ClientUnknown)3770 __forceinline PUNKNOWN KsPinRegisterAggregatedClientUnknown
3771 			(PKSPIN Pin, PUNKNOWN ClientUnknown)
3772 {
3773 	return KsRegisterAggregatedClientUnknown((PVOID)Pin, ClientUnknown);
3774 }
3775 
KsPinGetOuterUnknown(PKSPIN Pin)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
3785 KSDDKAPI DWORD WINAPI KsCreateAllocator(HANDLE ConnectionHandle,PKSALLOCATOR_FRAMING AllocatorFraming,PHANDLE AllocatorHandle);
3786 KSDDKAPI DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle,PKSCLOCK_CREATE ClockCreate,PHANDLE ClockHandle);
3787 KSDDKAPI DWORD WINAPI KsCreatePin(HANDLE FilterHandle,PKSPIN_CONNECT Connect,ACCESS_MASK DesiredAccess,PHANDLE ConnectionHandle);
3788 KSDDKAPI 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