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

Generated for PortAudio by  doxygen1.8.1.1