To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

The primary repository for this project is hosted at https://github.com/sonic-visualiser/sv-dependency-builds .
This repository is a read-only copy which is updated automatically every hour.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / src / portaudio_20161030_catalina_patch / src / hostapi / wasapi / mingw-include / ks.h @ 162:d43aab368df9

History | View | Annotate | Download (115 KB)

1
/**
2
 * This file has no copyright assigned and is placed in the Public Domain.
3
 * This file is part of the w64 mingw-runtime package.
4
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5
 */
6
#ifndef _KS_
7
#define _KS_
8

    
9
#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 {
62
  KSRESET_BEGIN,
63
  KSRESET_END
64
} KSRESET;
65

    
66
typedef enum {
67
  KSSTATE_STOP,
68
  KSSTATE_ACQUIRE,
69
  KSSTATE_PAUSE,
70
  KSSTATE_RUN
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 {
79
  ULONG PriorityClass;
80
  ULONG PrioritySubClass;
81
} KSPRIORITY,*PKSPRIORITY;
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
  };
93
} KSIDENTIFIER,*PKSIDENTIFIER;
94

    
95
typedef KSIDENTIFIER KSPROPERTY,*PKSPROPERTY,KSMETHOD,*PKSMETHOD,KSEVENT,*PKSEVENT;
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 {
124
  KSPROPERTY Property;
125
  ULONG NodeId;
126
  ULONG Reserved;
127
} KSP_NODE,*PKSP_NODE;
128

    
129
typedef struct {
130
  KSMETHOD Method;
131
  ULONG NodeId;
132
  ULONG Reserved;
133
} KSM_NODE,*PKSM_NODE;
134

    
135
typedef struct {
136
  KSEVENT Event;
137
  ULONG NodeId;
138
  ULONG Reserved;
139
} KSE_NODE,*PKSE_NODE;
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;
149
} KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM;
150

    
151
typedef struct {
152
  ULONG AccessFlags;
153
  ULONG DescriptionSize;
154
  KSIDENTIFIER PropTypeSet;
155
  ULONG MembersListCount;
156
  ULONG Reserved;
157
} KSPROPERTY_DESCRIPTION,*PKSPROPERTY_DESCRIPTION;
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 {
168
  ULONG MembersFlags;
169
  ULONG MembersSize;
170
  ULONG MembersCount;
171
  ULONG Flags;
172
} KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER;
173

    
174
typedef union {
175
  _KS_ANON_STRUCT(_SIGNED)
176
  {
177
    LONG SignedMinimum;
178
    LONG SignedMaximum;
179
  };
180
  _KS_ANON_STRUCT(_UNSIGNED)
181
  {
182
    ULONG UnsignedMinimum;
183
    ULONG UnsignedMaximum;
184
  };
185
} KSPROPERTY_BOUNDS_LONG,*PKSPROPERTY_BOUNDS_LONG;
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
  };
198
} KSPROPERTY_BOUNDS_LONGLONG,*PKSPROPERTY_BOUNDS_LONGLONG;
199

    
200
typedef struct {
201
  ULONG SteppingDelta;
202
  ULONG Reserved;
203
  KSPROPERTY_BOUNDS_LONG Bounds;
204
} KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG;
205

    
206
typedef struct {
207
  DWORDLONG SteppingDelta;
208
  KSPROPERTY_BOUNDS_LONGLONG Bounds;
209
} KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG;
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 {
236
  ULONG NotificationType;
237
  __MINGW_EXTENSION union {
238
    struct {
239
      HANDLE Event;
240
      ULONG_PTR Reserved[2];
241
    } EventHandle;
242
    struct {
243
      HANDLE Semaphore;
244
      ULONG Reserved;
245
      LONG Adjustment;
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
  };
279
} KSEVENTDATA,*PKSEVENTDATA;
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 {
301
  KSEVENT Event;
302
  PKSEVENTDATA EventData;
303
  PVOID Reserved;
304
} KSQUERYBUFFER,*PKSQUERYBUFFER;
305

    
306
typedef struct {
307
  ULONG Size;
308
  ULONG Flags;
309
  __MINGW_EXTENSION union {
310
    HANDLE ObjectHandle;
311
    PVOID ObjectPointer;
312
  };
313
  PVOID Reserved;
314
  KSEVENT Event;
315
  KSEVENTDATA EventData;
316
} KSRELATIVEEVENT;
317

    
318
#define KSRELATIVEEVENT_FLAG_HANDLE        0x00000001
319
#define KSRELATIVEEVENT_FLAG_POINTER        0x00000002
320

    
321
typedef struct {
322
  KSEVENTDATA EventData;
323
  LONGLONG MarkTime;
324
} KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK;
325

    
326
typedef struct {
327
  KSEVENTDATA EventData;
328
  LONGLONG TimeBase;
329
  LONGLONG Interval;
330
} KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL;
331

    
332
typedef struct {
333
  LONGLONG TimeBase;
334
  LONGLONG Interval;
335
} KSINTERVAL,*PKSINTERVAL;
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 {
343
  KSPROPERTY_GENERAL_COMPONENTID
344
} KSPROPERTY_GENERAL;
345

    
346
typedef struct {
347
  GUID Manufacturer;
348
  GUID Product;
349
  GUID Component;
350
  GUID Name;
351
  ULONG Version;
352
  ULONG Revision;
353
} KSCOMPONENTID,*PKSCOMPONENTID;
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 {
369
  KSMETHOD_STREAMIO_READ,
370
  KSMETHOD_STREAMIO_WRITE
371
} KSMETHOD_STREAMIO;
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 {
397
  KSPROPERTY_MEDIASEEKING_CAPABILITIES,
398
  KSPROPERTY_MEDIASEEKING_FORMATS,
399
  KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
400
  KSPROPERTY_MEDIASEEKING_POSITION,
401
  KSPROPERTY_MEDIASEEKING_STOPPOSITION,
402
  KSPROPERTY_MEDIASEEKING_POSITIONS,
403
  KSPROPERTY_MEDIASEEKING_DURATION,
404
  KSPROPERTY_MEDIASEEKING_AVAILABLE,
405
  KSPROPERTY_MEDIASEEKING_PREROLL,
406
  KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
407
} KSPROPERTY_MEDIASEEKING;
408

    
409
typedef enum {
410
  KS_SEEKING_NoPositioning,
411
  KS_SEEKING_AbsolutePositioning,
412
  KS_SEEKING_RelativePositioning,
413
  KS_SEEKING_IncrementalPositioning,
414
  KS_SEEKING_PositioningBitsMask = 0x3,
415
  KS_SEEKING_SeekToKeyFrame,
416
  KS_SEEKING_ReturnTime = 0x8
417
} KS_SEEKING_FLAGS;
418

    
419
typedef enum {
420
  KS_SEEKING_CanSeekAbsolute = 0x1,
421
  KS_SEEKING_CanSeekForwards = 0x2,
422
  KS_SEEKING_CanSeekBackwards = 0x4,
423
  KS_SEEKING_CanGetCurrentPos = 0x8,
424
  KS_SEEKING_CanGetStopPos = 0x10,
425
  KS_SEEKING_CanGetDuration = 0x20,
426
  KS_SEEKING_CanPlayBackwards = 0x40
427
} KS_SEEKING_CAPABILITIES;
428

    
429
typedef struct {
430
  LONGLONG Current;
431
  LONGLONG Stop;
432
  KS_SEEKING_FLAGS CurrentFlags;
433
  KS_SEEKING_FLAGS StopFlags;
434
} KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS;
435

    
436
typedef struct {
437
  LONGLONG Earliest;
438
  LONGLONG Latest;
439
} KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE;
440

    
441
typedef struct {
442
  KSPROPERTY Property;
443
  GUID SourceFormat;
444
  GUID TargetFormat;
445
  LONGLONG Time;
446
} KSP_TIMEFORMAT,*PKSP_TIMEFORMAT;
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 {
536
  KSPROPERTY_TOPOLOGY_CATEGORIES,
537
  KSPROPERTY_TOPOLOGY_NODES,
538
  KSPROPERTY_TOPOLOGY_CONNECTIONS,
539
  KSPROPERTY_TOPOLOGY_NAME
540
} KSPROPERTY_TOPOLOGY;
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;
662
} KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION;
663

    
664
typedef struct {
665
  ULONG CategoriesCount;
666
  const GUID *Categories;
667
  ULONG TopologyNodesCount;
668
  const GUID *TopologyNodes;
669
  ULONG TopologyConnectionsCount;
670
  const KSTOPOLOGY_CONNECTION *TopologyConnections;
671
  const GUID *TopologyNodesNames;
672
  ULONG Reserved;
673
} KSTOPOLOGY,*PKSTOPOLOGY;
674

    
675
#define KSFILTER_NODE        ((ULONG)-1)
676
#define KSALL_NODES        ((ULONG)-1)
677

    
678
typedef struct {
679
  ULONG CreateFlags;
680
  ULONG Node;
681
} KSNODE_CREATE,*PKSNODE_CREATE;
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

    
711
typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE;
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 {
719
  KSINTERFACE_STANDARD_STREAMING,
720
  KSINTERFACE_STANDARD_LOOPED_STREAMING,
721
  KSINTERFACE_STANDARD_CONTROL
722
} KSINTERFACE_STANDARD;
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 {
730
  KSINTERFACE_FILEIO_STREAMING
731
} KSINTERFACE_FILEIO;
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 {
748
  KSPROPERTY_PIN_CINSTANCES,
749
  KSPROPERTY_PIN_CTYPES,
750
  KSPROPERTY_PIN_DATAFLOW,
751
  KSPROPERTY_PIN_DATARANGES,
752
  KSPROPERTY_PIN_DATAINTERSECTION,
753
  KSPROPERTY_PIN_INTERFACES,
754
  KSPROPERTY_PIN_MEDIUMS,
755
  KSPROPERTY_PIN_COMMUNICATION,
756
  KSPROPERTY_PIN_GLOBALCINSTANCES,
757
  KSPROPERTY_PIN_NECESSARYINSTANCES,
758
  KSPROPERTY_PIN_PHYSICALCONNECTION,
759
  KSPROPERTY_PIN_CATEGORY,
760
  KSPROPERTY_PIN_NAME,
761
  KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
762
  KSPROPERTY_PIN_PROPOSEDATAFORMAT
763
} KSPROPERTY_PIN;
764

    
765
typedef struct {
766
  KSPROPERTY Property;
767
  ULONG PinId;
768
  ULONG Reserved;
769
} KSP_PIN,*PKSP_PIN;
770

    
771
#define KSINSTANCE_INDETERMINATE        ((ULONG)-1)
772

    
773
typedef struct {
774
  ULONG PossibleCount;
775
  ULONG CurrentCount;
776
} KSPIN_CINSTANCES,*PKSPIN_CINSTANCES;
777

    
778
typedef enum {
779
  KSPIN_DATAFLOW_IN = 1,
780
  KSPIN_DATAFLOW_OUT
781
} KSPIN_DATAFLOW,*PKSPIN_DATAFLOW;
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;
799
    GUID MajorFormat;
800
    GUID SubFormat;
801
    GUID Specifier;
802
  };
803
  LONGLONG Alignment;
804
} KSDATAFORMAT,*PKSDATAFORMAT,KSDATARANGE,*PKSDATARANGE;
805

    
806
#define KSATTRIBUTE_REQUIRED                0x00000001
807

    
808
typedef struct {
809
  ULONG Size;
810
  ULONG Flags;
811
  GUID Attribute;
812
} KSATTRIBUTE,*PKSATTRIBUTE;
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 {
822
  KSPIN_COMMUNICATION_NONE,
823
  KSPIN_COMMUNICATION_SINK,
824
  KSPIN_COMMUNICATION_SOURCE,
825
  KSPIN_COMMUNICATION_BOTH,
826
  KSPIN_COMMUNICATION_BRIDGE
827
} KSPIN_COMMUNICATION,*PKSPIN_COMMUNICATION;
828

    
829
typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM;
830

    
831
typedef struct {
832
  KSPIN_INTERFACE Interface;
833
  KSPIN_MEDIUM Medium;
834
  ULONG PinId;
835
  HANDLE PinToHandle;
836
  KSPRIORITY Priority;
837
} KSPIN_CONNECT,*PKSPIN_CONNECT;
838

    
839
typedef struct {
840
  ULONG Size;
841
  ULONG Pin;
842
  WCHAR SymbolicLinkName[1];
843
} KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION;
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;
1068
  KSPIN_DATAFLOW DataFlow;
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 {
1140
  KSPROPERTY_QUALITY_REPORT,
1141
  KSPROPERTY_QUALITY_ERROR
1142
} KSPROPERTY_QUALITY;
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 {
1168
  KSPROPERTY_CONNECTION_STATE,
1169
  KSPROPERTY_CONNECTION_PRIORITY,
1170
  KSPROPERTY_CONNECTION_DATAFORMAT,
1171
  KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
1172
  KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
1173
  KSPROPERTY_CONNECTION_ACQUIREORDERING,
1174
  KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
1175
  KSPROPERTY_CONNECTION_STARTAT
1176
} KSPROPERTY_CONNECTION;
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 {
1270
    ULONG OptionsFlags;
1271
    ULONG RequirementsFlags;
1272
  };
1273
#if defined(_NTDDK_)
1274
  POOL_TYPE PoolType;
1275
#else
1276
  ULONG PoolType;
1277
#endif /* _NTDDK_ */
1278
  ULONG Frames;
1279
  ULONG FrameSize;
1280
  ULONG FileAlignment;
1281
  ULONG Reserved;
1282
} KSALLOCATOR_FRAMING,*PKSALLOCATOR_FRAMING;
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 {
1294
  ULONG MinFrameSize;
1295
  ULONG MaxFrameSize;
1296
  ULONG Stepping;
1297
} KS_FRAMING_RANGE,*PKS_FRAMING_RANGE;
1298

    
1299
typedef struct {
1300
  KS_FRAMING_RANGE Range;
1301
  ULONG InPlaceWeight;
1302
  ULONG NotInPlaceWeight;
1303
} KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED;
1304

    
1305
typedef struct {
1306
  ULONG RatioNumerator;
1307
  ULONG RatioDenominator;
1308
  ULONG RatioConstantMargin;
1309
} KS_COMPRESSION,*PKS_COMPRESSION;
1310

    
1311
typedef struct {
1312
  GUID MemoryType;
1313
  GUID BusType;
1314
  ULONG MemoryFlags;
1315
  ULONG BusFlags;
1316
  ULONG Flags;
1317
  ULONG Frames;
1318
  ULONG FileAlignment;
1319
  ULONG MemoryTypeWeight;
1320
  KS_FRAMING_RANGE PhysicalRange;
1321
  KS_FRAMING_RANGE_WEIGHTED FramingRange;
1322
} KS_FRAMING_ITEM,*PKS_FRAMING_ITEM;
1323

    
1324
typedef struct {
1325
  ULONG CountItems;
1326
  ULONG PinFlags;
1327
  KS_COMPRESSION OutputCompression;
1328
  ULONG PinWeight;
1329
  KS_FRAMING_ITEM FramingItem[1];
1330
} KSALLOCATOR_FRAMING_EX,*PKSALLOCATOR_FRAMING_EX;
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 {
1466
  KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
1467
  KSEVENT_STREAMALLOCATOR_FREEFRAME
1468
} KSEVENT_STREAMALLOCATOR;
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 {
1476
  KSMETHOD_STREAMALLOCATOR_ALLOC,
1477
  KSMETHOD_STREAMALLOCATOR_FREE
1478
} KSMETHOD_STREAMALLOCATOR;
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 {
1548
  KSALLOCATOR_FRAMING Framing;
1549
  ULONG AllocatedFrames;
1550
  ULONG Reserved;
1551
} KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS;
1552

    
1553
typedef struct {
1554
  KSALLOCATOR_FRAMING_EX Framing;
1555
  ULONG AllocatedFrames;
1556
  ULONG Reserved;
1557
} KSSTREAMALLOCATOR_STATUS_EX,*PKSSTREAMALLOCATOR_STATUS_EX;
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;
1573
  ULONG Denominator;
1574
} KSTIME,*PKSTIME;
1575

    
1576
typedef struct {
1577
  ULONG Size;
1578
  ULONG TypeSpecificFlags;
1579
  KSTIME PresentationTime;
1580
  LONGLONG Duration;
1581
  ULONG FrameExtent;
1582
  ULONG DataUsed;
1583
  PVOID Data;
1584
  ULONG OptionsFlags;
1585
#ifdef _WIN64
1586
  ULONG Reserved;
1587
#endif
1588
} KSSTREAM_HEADER,*PKSSTREAM_HEADER;
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 {
1596
  KSPROPERTY_STREAMINTERFACE_HEADERSIZE
1597
} KSPROPERTY_STREAMINTERFACE;
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 {
1618
  KSPROPERTY_STREAM_ALLOCATOR,
1619
  KSPROPERTY_STREAM_QUALITY,
1620
  KSPROPERTY_STREAM_DEGRADATION,
1621
  KSPROPERTY_STREAM_MASTERCLOCK,
1622
  KSPROPERTY_STREAM_TIMEFORMAT,
1623
  KSPROPERTY_STREAM_PRESENTATIONTIME,
1624
  KSPROPERTY_STREAM_PRESENTATIONEXTENT,
1625
  KSPROPERTY_STREAM_FRAMETIME,
1626
  KSPROPERTY_STREAM_RATECAPABILITY,
1627
  KSPROPERTY_STREAM_RATE,
1628
  KSPROPERTY_STREAM_PIPE_ID
1629
} KSPROPERTY_STREAM;
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 {
1726
  HANDLE QualityManager;
1727
  PVOID Context;
1728
} KSQUALITY_MANAGER,*PKSQUALITY_MANAGER;
1729

    
1730
typedef struct {
1731
  LONGLONG Duration;
1732
  ULONG FrameFlags;
1733
  ULONG Reserved;
1734
} KSFRAMETIME,*PKSFRAMETIME;
1735

    
1736
#define KSFRAMETIME_VARIABLESIZE        0x00000001
1737

    
1738
typedef struct {
1739
  LONGLONG PresentationStart;
1740
  LONGLONG Duration;
1741
  KSPIN_INTERFACE Interface;
1742
  LONG Rate;
1743
  ULONG Flags;
1744
} KSRATE,*PKSRATE;
1745

    
1746
#define KSRATE_NOPRESENTATIONSTART        0x00000001
1747
#define KSRATE_NOPRESENTATIONDURATION        0x00000002
1748

    
1749
typedef struct {
1750
  KSPROPERTY Property;
1751
  KSRATE Rate;
1752
} KSRATE_CAPABILITY,*PKSRATE_CAPABILITY;
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 {
1766
  ULONG CreateFlags;
1767
} KSCLOCK_CREATE,*PKSCLOCK_CREATE;
1768

    
1769
typedef struct {
1770
  LONGLONG Time;
1771
  LONGLONG SystemTime;
1772
} KSCORRELATED_TIME,*PKSCORRELATED_TIME;
1773

    
1774
typedef struct {
1775
  LONGLONG Granularity;
1776
  LONGLONG Error;
1777
} KSRESOLUTION,*PKSRESOLUTION;
1778

    
1779
typedef enum {
1780
  KSPROPERTY_CLOCK_TIME,
1781
  KSPROPERTY_CLOCK_PHYSICALTIME,
1782
  KSPROPERTY_CLOCK_CORRELATEDTIME,
1783
  KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
1784
  KSPROPERTY_CLOCK_RESOLUTION,
1785
  KSPROPERTY_CLOCK_STATE,
1786
#if defined(_NTDDK_)
1787
  KSPROPERTY_CLOCK_FUNCTIONTABLE
1788
#endif /* _NTDDK_ */
1789
} KSPROPERTY_CLOCK;
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 {
1881
  KSEVENT_CLOCK_INTERVAL_MARK,
1882
  KSEVENT_CLOCK_POSITION_MARK
1883
} KSEVENT_CLOCK_POSITION;
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 {
1891
  KSEVENT_CONNECTION_POSITIONUPDATE,
1892
  KSEVENT_CONNECTION_DATADISCONTINUITY,
1893
  KSEVENT_CONNECTION_TIMEDISCONTINUITY,
1894
  KSEVENT_CONNECTION_PRIORITY,
1895
  KSEVENT_CONNECTION_ENDOFSTREAM
1896
} KSEVENT_CONNECTION;
1897

    
1898
typedef struct {
1899
  PVOID Context;
1900
  ULONG Proportion;
1901
  LONGLONG DeltaTime;
1902
} KSQUALITY,*PKSQUALITY;
1903

    
1904
typedef struct {
1905
  PVOID Context;
1906
  ULONG Status;
1907
} KSERROR,*PKSERROR;
1908

    
1909
typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE;
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 {
1917
  KSDEGRADE_STANDARD_SAMPLE,
1918
  KSDEGRADE_STANDARD_QUALITY,
1919
  KSDEGRADE_STANDARD_COMPUTATION,
1920
  KSDEGRADE_STANDARD_SKIP
1921
} KSDEGRADE_STANDARD;
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 {
2329
  GUID PropertySet;
2330
  ULONG Count;
2331
} KSPROPERTY_SERIALHDR,*PKSPROPERTY_SERIALHDR;
2332

    
2333
#ifndef PACK_PRAGMAS_NOT_SUPPORTED
2334
#include <poppack.h>
2335
#endif
2336

    
2337
typedef struct {
2338
  KSIDENTIFIER PropTypeSet;
2339
  ULONG Id;
2340
  ULONG PropertyLength;
2341
} KSPROPERTY_SERIAL,*PKSPROPERTY_SERIAL;
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;
2716
  KSPIN_DATAFLOW DataFlow;
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
2872
DEFINE_GUID(IID_IKsControl,
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