ReactOS  0.4.14-dev-49-gfb4591c
ks.h
Go to the documentation of this file.
1 /*
2  ReactOS
3  Kernel Streaming API
4 
5  by Andrew Greenwood
6 
7  NOTES:
8  This is a basic stubbing of the Kernel Streaming API header. It is
9  very incomplete - a lot of the #defines are not set to any value at all.
10 
11  Some of the structs/funcs may be incorrectly grouped.
12 
13  GUIDs need to be defined properly.
14 
15  AVStream functionality (XP and above, DirectX 8.0 and above) will NOT
16  implemented for a while.
17 
18  Some example code for interaction from usermode:
19  DeviceIoControl(
20  FilterHandle,
21  IOCTL_KS_PROPERTY,
22  &Property,
23  sizeof(KSPROPERTY),
24  &SeekingCapabilities,
25  sizeof(KS_SEEKING_CAPABILITIES),
26  &BytesReturned,
27  &Overlapped);
28 */
29 
30 #ifndef _KS_
31 #define _KS_
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 #ifdef BUILDING_KS
38  #define KSDDKAPI
39 #else
40  #define KSDDKAPI //DECLSPEC_IMPORT /* TODO */
41 #endif
42 
43 
44 #define KSFILTER_NODE ((ULONG)-1)
45 #define KSALL_NODES ((ULONG)-1)
46 
47 #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
48 #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
49 #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
50 #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
51 #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}"
52 #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
53 
54 #define KSDATAFORMAT_BIT_ATTRIBUTES 1
55 #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES)
56 
57 #if defined(_NTDDK_)
58 typedef PVOID PKSWORKER;
59 #endif
60 
61 #ifndef SIZEOF_ARRAY
62 #define SIZEOF_ARRAY(a) (sizeof(a)/sizeof((a)[0]))
63 #endif
64 
65 /* ===============================================================
66  GUID definition helpers
67 */
68 
69 #ifndef _NTRTL_
70 
71 #ifndef DEFINE_GUIDEX
72 #ifdef _MSC_VER
73 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
74 #else
75 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
76 #endif
77 #endif /* !DEFINE_GUIDEX */
78 
79 #ifndef STATICGUIDOF
80 #define STATICGUIDOF(guid) STATIC_##guid
81 #endif
82 
83 #endif /* !_NTRTL_ */
84 
85 #if defined(__cplusplus)
86 
87 #if _MSC_VER >= 1100
88 #define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name
89 #define DEFINE_GUIDNAMED(name) __uuidof(struct name)
90 #else
91 #define DEFINE_GUIDSTRUCT(guid, name) \
92  extern const DECLSPEC_SELECTANY GUID __uuid__##name={STATIC_##name};
93 #define DEFINE_GUIDNAMED(name) __uuid__##name
94 #endif
95 
96 #else /* __cplusplus */
97 
98 #define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name)
99 #define DEFINE_GUIDNAMED(name) name
100 
101 #endif /* __cplusplus */
102 
103 #define STATIC_GUID_NULL \
104  0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
105 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
106 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
107 
108 #define STATIC_KSNAME_Filter\
109  0x9b365890L, 0x165f, 0x11d0, {0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
110 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
111 #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
112 
113 #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
114  0xd833f8f8L, 0x7894, 0x11d1, {0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}
115 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
116 #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
117 
118 #define STATIC_KSDATAFORMAT_SUBTYPE_NONE \
119  0xe436eb8eL, 0x524f, 0x11ce, {0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}
120 DEFINE_GUIDSTRUCT("e436eb8e-524f-11ce-9f53-0020af0ba770", KSDATAFORMAT_SUBTYPE_NONE);
121 #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE)
122 
123 /* ===============================================================
124  I/O Control Codes
125 */
126 
127 #define IOCTL_KS_PROPERTY \
128  CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS)
129 
130 #define IOCTL_KS_ENABLE_EVENT \
131  CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS)
132 
133 #define IOCTL_KS_DISABLE_EVENT \
134  CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS)
135 
136 #define IOCTL_KS_METHOD \
137  CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS)
138 
139 #define IOCTL_KS_WRITE_STREAM \
140  CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS)
141 
142 #define IOCTL_KS_READ_STREAM \
143  CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS)
144 
145 #define IOCTL_KS_RESET_STATE \
146  CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS)
147 
148 /* ===============================================================
149  Categories
150 */
151 
152 #define STATIC_KSCATEGORY_BRIDGE \
153  0x085AFF00L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
154 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
155 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
156 
157 #define STATIC_KSCATEGORY_CAPTURE \
158  0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
159 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
160 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
161 
162 #define STATIC_KSCATEGORY_RENDER \
163  0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
164 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
165 #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
166 
167 #define STATIC_KSCATEGORY_MIXER \
168  0xAD809C00L, 0x7B88, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
169 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
170 #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
171 
172 #define STATIC_KSCATEGORY_SPLITTER \
173  0x0A4252A0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
174 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
175 #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
176 
177 #define STATIC_KSCATEGORY_DATACOMPRESSOR \
178  0x1E84C900L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
179 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
180 #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
181 
182 #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
183  0x2721AE20L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
184 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
185 #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
186 
187 #define STATIC_KSCATEGORY_DATATRANSFORM \
188  0x2EB07EA0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
189 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
190 #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
191 
192 #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
193  0xCF1DDA2CL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
194 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
195 #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
196 
197 #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
198  0xCF1DDA2DL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
199 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
200 #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
201 
202 #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
203  0xCF1DDA2EL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
204 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
205 #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
206 
207 #define STATIC_KSCATEGORY_FILESYSTEM \
208  0x760FED5EL, 0x9357, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
209 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
210 #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
211 
212 #define STATIC_KSCATEGORY_CLOCK \
213  0x53172480L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
214 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
215 #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
216 
217 #define STATIC_KSCATEGORY_PROXY \
218  0x97EBAACAL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
219 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
220 #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
221 
222 #define STATIC_KSCATEGORY_QUALITY \
223  0x97EBAACBL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
224 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
225 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
226 
227 /* ===============================================================
228  Common
229 */
230 
231 typedef struct {
232  GUID Set;
233  ULONG Id;
234  ULONG Flags;
236 
240 
242 
245 
246 typedef union {
247  struct {
248  ULONG FormatSize;
249  ULONG Flags;
250  ULONG SampleSize;
251  ULONG Reserved;
252  GUID MajorFormat;
253  GUID SubFormat;
254  GUID Specifier;
255  };
258 
259 typedef struct {
264 
265 
266 /* ===============================================================
267  Interface Sets - TODO
268 */
269 
270 #if 0
271 #define KSINTERFACESETID_Media
272 #define KSINTERFACE_STANDARD_STREAMING
273 #define KSINTERFACE_STANDARD_LOOPED_STREAMING
274 #define KSINTERFACE_STANDARD_CONTROL
275 #endif
276 
277 #define STATIC_KSINTERFACESETID_Standard \
278  0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
279 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
280 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
281 
282 typedef enum {
287 
288 #define STATIC_KSINTERFACESETID_FileIo \
289  0x8C6F932CL, 0xE771, 0x11D0, {0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
290 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
291 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
292 
293 /* ===============================================================
294  Mediums
295 */
296 
297 typedef enum {
300 
301 #define KSMEDIUM_TYPE_ANYINSTANCE 0
302 
303 #define STATIC_KSMEDIUMSETID_Standard \
304  0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
305 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
306 #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
307 
308 /* ===============================================================
309  Clock Properties/Methods/Events
310 */
311 
312 #define STATIC_KSPROPSETID_Clock \
313  0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
314 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
315 #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
316 
317 typedef enum {
324 #if defined(_NTDDK_)
325  KSPROPERTY_CLOCK_FUNCTIONTABLE
326 #endif // defined(_NTDDK_)
328 
329 #define STATIC_KSEVENTSETID_Clock \
330  0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
331 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
332 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
333 
334 typedef enum {
338 
339 /* ===============================================================
340  Connection Properties/Methods/Events
341 */
342 
343 #define STATIC_KSPROPSETID_Connection \
344  0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
345 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
346 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
347 
348 typedef enum {
358 
359 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
360  DEFINE_KSPROPERTY_ITEM(\
361  KSPROPERTY_CONNECTION_STATE,\
362  (GetHandler),\
363  sizeof(KSPROPERTY),\
364  sizeof(KSSTATE),\
365  (SetHandler),\
366  NULL, 0, NULL, NULL, 0)
367 
368 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
369  DEFINE_KSPROPERTY_ITEM(\
370  KSPROPERTY_CONNECTION_PRIORITY,\
371  (GetHandler),\
372  sizeof(KSPROPERTY),\
373  sizeof(KSPRIORITY),\
374  (SetHandler),\
375  NULL, 0, NULL, NULL, 0)
376 
377 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
378  DEFINE_KSPROPERTY_ITEM(\
379  KSPROPERTY_CONNECTION_DATAFORMAT,\
380  (GetHandler),\
381  sizeof(KSPROPERTY),\
382  0,\
383  (SetHandler),\
384  NULL, 0, NULL, NULL, 0)
385 
386 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
387  DEFINE_KSPROPERTY_ITEM(\
388  KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
389  (Handler),\
390  sizeof(KSPROPERTY),\
391  sizeof(KSALLOCATOR_FRAMING),\
392  NULL, NULL, 0, NULL, NULL, 0)
393 
394 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
395  DEFINE_KSPROPERTY_ITEM(\
396  KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
397  (Handler),\
398  sizeof(KSPROPERTY),\
399  0,\
400  NULL, NULL, 0, NULL, NULL, 0)
401 
402 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
403  DEFINE_KSPROPERTY_ITEM(\
404  KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
405  NULL,\
406  sizeof(KSPROPERTY),\
407  sizeof(KSDATAFORMAT),\
408  (Handler),\
409  NULL, 0, NULL, NULL, 0)
410 
411 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
412  DEFINE_KSPROPERTY_ITEM(\
413  KSPROPERTY_CONNECTION_ACQUIREORDERING,\
414  (Handler),\
415  sizeof(KSPROPERTY),\
416  sizeof(int),\
417  NULL, NULL, 0, NULL, NULL, 0)
418 
419 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
420  DEFINE_KSPROPERTY_ITEM(\
421  KSPROPERTY_CONNECTION_STARTAT,\
422  NULL,\
423  sizeof(KSPROPERTY),\
424  sizeof(KSRELATIVEEVENT),\
425  (Handler),\
426  NULL, 0, NULL, NULL, 0)
427 
428 typedef enum {
435 
436 /* ===============================================================
437  General
438  Properties/Methods/Events
439 */
440 
441 #define STATIC_KSPROPSETID_General\
442  0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
443 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
444 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
445 
446 typedef enum {
449 
450 /* ===============================================================
451  Graph Manager
452  Properties/Methods/Events
453 */
454 
455 #define KSPROPSETID_GM \
456  0xAF627536L, 0xE719, 0x11D2, {0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D}
457 
458 typedef enum {
463 } KSPROPERTY_GM;
464 
465 /* ===============================================================
466  Media Seeking
467  Properties/Methods/Events
468 */
469 
470 #define STATIC_KSPROPSETID_MediaSeeking\
471  0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
472 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
473 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
474 
475 typedef enum {
487 
488 typedef enum {
497 
498 typedef enum {
507 
508 typedef struct {
514 
515 typedef struct {
519 
520 typedef struct {
526 
527 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
528  DEFINE_KSPROPERTY_ITEM(\
529  KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
530  (Handler),\
531  sizeof(KSPROPERTY),\
532  sizeof(KS_SEEKING_CAPABILITIES),\
533  NULL, NULL, 0, NULL, NULL, 0)
534 
535 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
536  DEFINE_KSPROPERTY_ITEM(\
537  KSPROPERTY_MEDIASEEKING_FORMATS,\
538  (Handler),\
539  sizeof(KSPROPERTY),\
540  0,\
541  NULL, NULL, 0, NULL, NULL, 0)
542 
543 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
544  DEFINE_KSPROPERTY_ITEM(\
545  KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
546  (GetHandler),\
547  sizeof(KSPROPERTY),\
548  sizeof(GUID),\
549  (SetHandler),\
550  NULL, 0, NULL, NULL, 0)
551 
552 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
553  DEFINE_KSPROPERTY_ITEM(\
554  KSPROPERTY_MEDIASEEKING_POSITION,\
555  (Handler),\
556  sizeof(KSPROPERTY),\
557  sizeof(LONGLONG),\
558  NULL, NULL, 0, NULL, NULL, 0)
559 
560 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
561  DEFINE_KSPROPERTY_ITEM(\
562  KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
563  (Handler),\
564  sizeof(KSPROPERTY),\
565  sizeof(LONGLONG),\
566  NULL, NULL, 0, NULL, NULL, 0)
567 
568 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
569  DEFINE_KSPROPERTY_ITEM(\
570  KSPROPERTY_MEDIASEEKING_POSITIONS,\
571  NULL,\
572  sizeof(KSPROPERTY),\
573  sizeof(KSPROPERTY_POSITIONS),\
574  (Handler),\
575  NULL, 0, NULL, NULL, 0)
576 
577 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
578  DEFINE_KSPROPERTY_ITEM(\
579  KSPROPERTY_MEDIASEEKING_DURATION,\
580  (Handler),\
581  sizeof(KSPROPERTY),\
582  sizeof(LONGLONG),\
583  NULL, NULL, 0, NULL, NULL, 0)
584 
585 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
586  DEFINE_KSPROPERTY_ITEM(\
587  KSPROPERTY_MEDIASEEKING_AVAILABLE,\
588  (Handler),\
589  sizeof(KSPROPERTY),\
590  sizeof(KSPROPERTY_MEDIAAVAILABLE),\
591  NULL, NULL, 0, NULL, NULL, 0)
592 
593 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
594  DEFINE_KSPROPERTY_ITEM(\
595  KSPROPERTY_MEDIASEEKING_PREROLL,\
596  (Handler),\
597  sizeof(KSPROPERTY),\
598  sizeof(LONGLONG),\
599  NULL, NULL, 0, NULL, NULL, 0)
600 
601 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
602  DEFINE_KSPROPERTY_ITEM(\
603  KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
604  (Handler),\
605  sizeof(KSP_TIMEFORMAT),\
606  sizeof(LONGLONG),\
607  NULL, NULL, 0, NULL, NULL, 0)
608 
609 /* ===============================================================
610  Pin
611  Properties/Methods/Events
612 */
613 
614 #define STATIC_KSPROPSETID_Pin\
615  0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}
616 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
617 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
618 
619 #define STATIC_KSNAME_Pin\
620  0x146F1A80L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
621 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
622 #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
623 
624 typedef enum {
641 
642 typedef struct {
646 } KSP_PIN, *PKSP_PIN;
647 
648 #define KSINSTANCE_INDETERMINATE ((ULONG)-1)
649 
650 typedef struct {
654 
655 typedef struct {
658  WCHAR SymbolicLinkName[1];
660 
661 /* ===============================================================
662  Quality
663  Properties/Methods/Events
664 */
665 
666 #define KSPROPSETID_Quality \
667  0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
668 
669 typedef enum {
673 
674 /* ===============================================================
675  Stream
676  Properties/Methods/Events
677 */
678 
679 #define STATIC_KSPROPSETID_Stream\
680  0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
681 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
682 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
683 
684 typedef enum {
697 
698 #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
699  DEFINE_KSPROPERTY_ITEM(\
700  KSPROPERTY_STREAM_ALLOCATOR,\
701  (GetHandler),\
702  sizeof(KSPROPERTY),\
703  sizeof(HANDLE),\
704  (SetHandler),\
705  NULL, 0, NULL, NULL, 0)
706 
707 #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
708  DEFINE_KSPROPERTY_ITEM(\
709  KSPROPERTY_STREAM_QUALITY,\
710  (Handler),\
711  sizeof(KSPROPERTY),\
712  sizeof(KSQUALITY_MANAGER),\
713  NULL, NULL, 0, NULL, NULL, 0)
714 
715 #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
716  DEFINE_KSPROPERTY_ITEM(\
717  KSPROPERTY_STREAM_DEGRADATION,\
718  (GetHandler),\
719  sizeof(KSPROPERTY),\
720  0,\
721  (SetHandler),\
722  NULL, 0, NULL, NULL, 0)
723 
724 #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
725  DEFINE_KSPROPERTY_ITEM(\
726  KSPROPERTY_STREAM_MASTERCLOCK,\
727  (GetHandler),\
728  sizeof(KSPROPERTY),\
729  sizeof(HANDLE),\
730  (SetHandler),\
731  NULL, 0, NULL, NULL, 0)
732 
733 #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
734  DEFINE_KSPROPERTY_ITEM(\
735  KSPROPERTY_STREAM_TIMEFORMAT,\
736  (Handler),\
737  sizeof(KSPROPERTY),\
738  sizeof(GUID),\
739  NULL, NULL, 0, NULL, NULL, 0)
740 
741 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
742  DEFINE_KSPROPERTY_ITEM(\
743  KSPROPERTY_STREAM_PRESENTATIONTIME,\
744  (GetHandler),\
745  sizeof(KSPROPERTY),\
746  sizeof(KSTIME),\
747  (SetHandler),\
748  NULL, 0, NULL, NULL, 0)
749 
750 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
751  DEFINE_KSPROPERTY_ITEM(\
752  KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
753  (Handler),\
754  sizeof(KSPROPERTY),\
755  sizeof(LONGLONG),\
756  NULL, NULL, 0, NULL, NULL, 0)
757 
758 #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
759  DEFINE_KSPROPERTY_ITEM(\
760  KSPROPERTY_STREAM_FRAMETIME,\
761  (Handler),\
762  sizeof(KSPROPERTY),\
763  sizeof(KSFRAMETIME),\
764  NULL, NULL, 0, NULL, NULL, 0)
765 
766 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
767  DEFINE_KSPROPERTY_ITEM(\
768  KSPROPERTY_STREAM_RATECAPABILITY,\
769  (Handler),\
770  sizeof(KSRATE_CAPABILITY),\
771  sizeof(KSRATE),\
772  NULL, NULL, 0, NULL, NULL, 0)
773 
774 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
775  DEFINE_KSPROPERTY_ITEM(\
776  KSPROPERTY_STREAM_RATE,\
777  (GetHandler),\
778  sizeof(KSPROPERTY),\
779  sizeof(KSRATE),\
780  (SetHandler),\
781  NULL, 0, NULL, NULL, 0)
782 
783 #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
784  DEFINE_KSPROPERTY_ITEM(\
785  KSPROPERTY_STREAM_PIPE_ID,\
786  (GetHandler),\
787  sizeof(KSPROPERTY),\
788  sizeof(HANDLE),\
789  (SetHandler),\
790  NULL, 0, NULL, NULL, 0)
791 
792 /* ===============================================================
793  StreamAllocator
794  Properties/Methods/Events
795 */
796 
797 #define STATIC_KSPROPSETID_StreamAllocator\
798  0xcf6e4342L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
799 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
800 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
801 
802 typedef enum {
806 
807 #define KSMETHODSETID_StreamAllocator \
808  0xcf6e4341L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
809 
810 typedef enum {
814 
815 #define KSEVENTSETID_StreamAllocator
816 
817 typedef enum {
821 
822 /* ===============================================================
823  StreamInterface
824  Properties/Methods/Events
825 */
826 
827 #define KSPROPSETID_StreamInterface \
828  0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
829 
830 typedef enum {
833 
834 /* ===============================================================
835  Topology
836  Properties/Methods/Events
837 */
838 
839 #define STATIC_KSPROPSETID_Topology\
840  0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
841 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
842 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
843 
844 typedef enum {
850 
851 /* ===============================================================
852  Property Sets for audio drivers - TODO
853 */
854 
855 #define STATIC_KSPROPTYPESETID_General \
856  0x97E99BA0L, 0xBDEA, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
857 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
858 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
859 
860 /*
861  KSPROPERTY_AC3_ALTERNATE_AUDIO
862  KSPROPERTY_AC3_BIT_STREAM_MODE
863  KSPROPERTY_AC3_DIALOGUE_LEVEL
864  KSPROPERTY_AC3_DOWNMIX
865  KSPROPERTY_AC3_ERROR_CONCEALMENT
866  KSPROPERTY_AC3_LANGUAGE_CODE
867  KSPROPERTY_AC3_ROOM_TYPE
868 */
869 
870 #define KSPROPSETID_Acoustic_Echo_Cancel
871 /*
872  KSPROPERTY_AEC_MODE
873  KSPROPERTY_AEC_NOISE_FILL_ENABLE
874  KSPROPERTY_AEC_STATUS
875 */
876 
877 /*
878  KSPROPERTY_AUDIO_3D_INTERFACE
879  KSPROPERTY_AUDIO_AGC
880  KSPROPERTY_AUDIO_ALGORITHM_INSTANCE
881  KSPROPERTY_AUDIO_BASS
882  KSPROPERTY_AUDIO_BASS_BOOST
883  KSPROPERTY_AUDIO_CHANNEL_CONFIG
884  KSPROPERTY_AUDIO_CHORUS_LEVEL
885  KSPROPERTY_AUDIO_COPY_PROTECTION
886  KSPROPERTY_AUDIO_CPU_RESOURCES
887  KSPROPERTY_AUDIO_DELAY
888  KSPROPERTY_AUDIO_DEMUX_DEST
889  KSPROPERTY_AUDIO_DEV_SPECIFIC
890  KSPROPERTY_AUDIO_DYNAMIC_RANGE
891  KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE
892  KSPROPERTY_AUDIO_EQ_BANDS
893  KSPROPERTY_AUDIO_EQ_LEVEL
894  KSPROPERTY_AUDIO_FILTER_STATE
895  KSPROPERTY_AUDIO_LATENCY
896  KSPROPERTY_AUDIO_LOUDNESS
897  KSPROPERTY_AUDIO_MANUFACTURE_GUID
898  KSPROPERTY_AUDIO_MID
899  KSPROPERTY_AUDIO_MIX_LEVEL_CAPS
900  KSPROPERTY_AUDIO_MIX_LEVEL_TABLE
901  KSPROPERTY_AUDIO_MUTE
902  KSPROPERTY_AUDIO_MUX_SOURCE
903  KSPROPERTY_AUDIO_NUM_EQ_BANDS
904  KSPROPERTY_AUDIO_PEAKMETER
905  KSPROPERTY_AUDIO_POSITION
906  KSPROPERTY_AUDIO_PREFERRED_STATUS
907  KSPROPERTY_AUDIO_PRODUCT_GUID
908  KSPROPERTY_AUDIO_QUALITY
909  KSPROPERTY_AUDIO_REVERB_LEVEL
910  KSPROPERTY_AUDIO_SAMPLING_RATE
911  KSPROPERTY_AUDIO_STEREO_ENHANCE
912  KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY
913  KSPROPERTY_AUDIO_SURROUND_ENCODE
914  KSPROPERTY_AUDIO_TREBLE
915  KSPROPERTY_AUDIO_VOLUMELEVEL
916  KSPROPERTY_AUDIO_WIDE_MODE
917  KSPROPERTY_AUDIO_WIDENESS
918 */
919 
920 #define KSPROPSETID_AudioGfx
921 /*
922  KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID
923  KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID
924 */
925 
926 #define KSPROPSETID_DirectSound3DBuffer
927 /*
928  KSPROPERTY_DIRECTSOUND3DBUFFER_ALL
929  KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES
930  KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION
931  KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME
932  KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE
933  KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE
934  KSPROPERTY_DIRECTSOUND3DBUFFER_MODE
935  KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION
936  KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY
937 */
938 
939 #define KSPROPSETID_DirectSound3DListener
940 /*
941  KSPROPERTY_DIRECTSOUND3DLISTENER_ALL
942  KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION
943  KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH
944  KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR
945  KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR
946  KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION
947  KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION
948  KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR
949  KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY
950 */
951 
952 #define KSPROPSETID_Hrtf3d
953 /*
954  KSPROPERTY_HRTF3D_FILTER_FORMAT
955  KSPROPERTY_HRTF3D_INITIALIZE
956  KSPROPERTY_HRTF3D_PARAMS
957 */
958 
959 #define KSPROPSETID_Itd3d
960 /*
961  KSPROPERTY_ITD3D_PARAMS
962 */
963 
964 #define KSPROPSETID_TopologyNode
965 /*
966  KSPROPERTY_TOPOLOGYNODE_ENABLE
967  KSPROPERTY_TOPOLOGYNODE_RESET
968 */
969 
970 
971 /* ===============================================================
972  Node Types
973 */
974 /*
975  KSNODETYPE_3D_EFFECTS
976  KSNODETYPE_ACOUSTIC_ECHO_CANCEL
977  KSNODETYPE_ADC
978  KSNODETYPE_AGC
979  KSNODETYPE_CHORUS
980  KSNODETYPE_DAC
981  KSNODETYPE_DELAY
982  KSNODETYPE_DEMUX
983  KSNODETYPE_DEV_SPECIFIC
984  KSNODETYPE_DMSYNTH
985  KSNODETYPE_DMSYNTH_CAPS
986  KSNODETYPE_DRM_DESCRAMBLE
987  KSNODETYPE_EQUALIZER
988  KSNODETYPE_LOUDNESS
989  KSNODETYPE_MUTE
990  KSNODETYPE_MUX
991  KSNODETYPE_PEAKMETER
992  KSNODETYPE_PROLOGIC_DECODER
993  KSNODETYPE_PROLOGIC_ENCODER
994  KSNODETYPE_REVERB
995  KSNODETYPE_SRC
996  KSNODETYPE_STEREO_ENHANCE
997  KSNODETYPE_STEREO_WIDE
998  KSNODETYPE_SUM
999  KSNODETYPE_SUPERMIX
1000  KSNODETYPE_SWMIDI
1001  KSNODETYPE_SWSYNTH
1002  KSNODETYPE_SYNTHESIZER
1003  KSNODETYPE_TONE
1004  KSNODETYPE_VOLUME
1005 */
1006 
1008 
1009 /* ===============================================================
1010  Method Types
1011 */
1012 
1013 #define KSMETHOD_TYPE_NONE 0x00000000
1014 #define KSMETHOD_TYPE_READ 0x00000001
1015 #define KSMETHOD_TYPE_WRITE 0x00000002
1016 #define KSMETHOD_TYPE_MODIFY 0x00000003
1017 #define KSMETHOD_TYPE_SOURCE 0x00000004
1018 #define KSMETHOD_TYPE_SEND 0x00000001
1019 #define KSMETHOD_TYPE_SETSUPPORT 0x00000100
1020 #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200
1021 
1022 /* ===============================================================
1023  Property Types
1024 */
1025 
1026 #define KSPROPERTY_TYPE_GET 0x00000001
1027 #define KSPROPERTY_TYPE_SET 0x00000002
1028 #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100
1029 #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200
1030 #define KSPROPERTY_TYPE_RELATIONS 0x00000400
1031 #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800
1032 #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000
1033 #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000
1034 #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000
1035 #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000
1036 #define KSPROPERTY_TYPE_DEFAULT_VALUES 0x00010000
1037 
1038 /* ===============================================================
1039  Topology Methods/Properties
1040 */
1041 
1042 #define KSMETHOD_TYPE_TOPOLOGY 0x10000000
1043 #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000
1044 
1045 /*
1046 #define DEFINE_KS_GUID(GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK) \
1047  DEFINE_GUID(??, 0x#GA#L, 0xGB, 0xGC, 0xGD, 0xGE, 0xGF, 0xGG, 0xGH, 0xGI, 0xGJ, 0xGK) \
1048  "GA-GB-GC-GDGE-GFGGGHGIGJGK"
1049 */
1050 
1051 /* ===============================================================
1052  KS Category GUIDs
1053 
1054  BRIDGE - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1055  CAPTURE - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1056  RENDER - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1057  MIXER - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1058  SPLITTER - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1059  DATACOMPRESSOR - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1060  DATADECOMPRESSOR - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1061  DATATRANSFORM - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1062  COMMUNICATIONSTRANSFORM - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1063  INTERFACETRANSFORM - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1064  MEDIUMTRANSFORM - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1065  FILESYSTEM - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1066  CLOCK - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1067  PROXY - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1068  QUALITY - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1069 */
1070 
1071 /* ===============================================================
1072  KSNAME GUIDs (defined also as KSSTRING_Xxx L"{...}"
1073 
1074  Filter - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1075  Pin - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1076  Clock - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1077  Allocator - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1078  TopologyNode - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1079 */
1080 
1081 /* ===============================================================
1082  Interface GUIDs
1083 
1084  Standard - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1085  FileIo - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1086 */
1087 
1088 /* ===============================================================
1089  Medium Type GUIDs
1090 
1091  Standard - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1092 */
1093 
1094 /* ===============================================================
1095  Property Set GUIDs
1096 
1097  General - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1098  StreamIo - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1099  MediaSeeking - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1100  Topology - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1101  GM - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D
1102  Quality - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1103  Connection - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1104 */
1105 
1106 /* ===============================================================
1107  StreamAllocator Sets
1108 
1109  Event set - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1110  Method set - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1111  Property set - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1112 */
1113 
1114 /* ===============================================================
1115  StreamInterface Sets
1116 
1117  Property set - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
1118 */
1119 
1120 /* ===============================================================
1121  Clock Sets
1122 
1123  Property set - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1124  Event sets - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1125 */
1126 
1127 /* ===============================================================
1128  Connection Sets
1129 
1130  Event set - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
1131 */
1132 
1133 /* ===============================================================
1134  Time Format GUIDs
1135 
1136  KSTIME_FORMAT_NONE (null guid)
1137  FRAME - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1138  BYTE - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1139  SAMPLE - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1140  FIELD - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1141  MEDIA_TIME - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1142 */
1143 
1144 /* ===============================================================
1145  Media Type GUIDs
1146 
1147  NULL
1148  Stream -
1149  None -
1150 
1151  TODO ...
1152 */
1153 
1154 #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
1155  0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
1156 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
1157 #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
1158 
1159 /* ===============================================================
1160  KSMEMORY_TYPE_xxx
1161 
1162  WILDCARD, DONT_CARE = NULL
1163  SYSTEM - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1164  USER - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1165  KERNEL_PAGED - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1166  KERNEL_NONPAGED - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1167  DEVICE_UNKNOWN - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1168 */
1169 
1170 /* ===============================================================
1171  Enums
1172  (values have been checked)
1173 */
1174 
1175 #ifndef _MSC_VER
1176 
1177 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
1178  MinProperty,\
1179  MinData,\
1180  SetHandler,\
1181  Values, RelationsCount, Relations, SupportHandler,\
1182  SerializedSize)\
1183 {\
1184  PropertyId, {(PFNKSHANDLER)GetHandler}, MinProperty, MinData,\
1185  {(PFNKSHANDLER)SetHandler},\
1186  (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
1187  (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
1188 }
1189 
1190 #else
1191 
1192 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
1193  MinProperty,\
1194  MinData,\
1195  SetHandler,\
1196  Values, RelationsCount, Relations, SupportHandler,\
1197  SerializedSize)\
1198 {\
1199  PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
1200  (PFNKSHANDLER)SetHandler,\
1201  (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
1202  (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
1203 }
1204 
1205 #endif
1206 
1207 typedef enum {
1212 } KSOBJECTTYPE;
1213 
1214 typedef enum {
1219 } KSSTATE, *PKSSTATE;
1220 
1221 typedef enum {
1224 } KSTARGET_STATE;
1225 
1226 typedef enum {
1229 } KSRESET;
1230 
1231 typedef enum {
1240 
1241 typedef enum {
1247 
1248 typedef enum {
1252 
1253 typedef enum {
1260 
1261 typedef enum {
1265 
1266 typedef enum {
1270 } KSSTACK_USE;
1271 
1272 typedef enum {
1278 
1279 typedef enum {
1284 
1285 #if defined(_NTDDK_) && !defined(__wtypes_h__)
1286 enum VARENUM {
1287  VT_EMPTY = 0,
1288  VT_NULL = 1,
1289  VT_I2 = 2,
1290  VT_I4 = 3,
1291  VT_R4 = 4,
1292  VT_R8 = 5,
1293  VT_CY = 6,
1294  VT_DATE = 7,
1295  VT_BSTR = 8,
1296  VT_DISPATCH = 9,
1297  VT_ERROR = 10,
1298  VT_BOOL = 11,
1299  VT_VARIANT = 12,
1300  VT_UNKNOWN = 13,
1301  VT_DECIMAL = 14,
1302  VT_I1 = 16,
1303  VT_UI1 = 17,
1304  VT_UI2 = 18,
1305  VT_UI4 = 19,
1306  VT_I8 = 20,
1307  VT_UI8 = 21,
1308  VT_INT = 22,
1309  VT_UINT = 23,
1310  VT_VOID = 24,
1311  VT_HRESULT = 25,
1312  VT_PTR = 26,
1313  VT_SAFEARRAY = 27,
1314  VT_CARRAY = 28,
1315  VT_USERDEFINED = 29,
1316  VT_LPSTR = 30,
1317  VT_LPWSTR = 31,
1318  VT_FILETIME = 64,
1319  VT_BLOB = 65,
1320  VT_STREAM = 66,
1321  VT_STORAGE = 67,
1322  VT_STREAMED_OBJECT = 68,
1323  VT_STORED_OBJECT = 69,
1324  VT_BLOB_OBJECT = 70,
1325  VT_CF = 71,
1326  VT_CLSID = 72,
1327  VT_VECTOR = 0x1000,
1328  VT_ARRAY = 0x2000,
1329  VT_BYREF = 0x4000,
1330  VT_RESERVED = 0x8000,
1331  VT_ILLEGAL = 0xffff,
1332  VT_ILLEGALMASKED = 0xfff,
1333  VT_TYPEMASK = 0xfff
1334 };
1335 #endif
1336 
1337 #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL
1338 #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL
1339 
1340 #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL
1341 #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL
1342 
1343 #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL
1344 #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL
1345 
1346 /* ===============================================================
1347  Framing
1348 */
1349 
1350 typedef struct {
1355 
1356 typedef struct {
1361 
1362 typedef struct {
1374 
1375 typedef struct {
1380 
1381 /* ===============================================================
1382  Priorities
1383 */
1384 
1385 #define KSPRIORITY_LOW 0x00000001
1386 #define KSPRIORITY_NORMAL 0x40000000
1387 #define KSPRIORITY_HIGH 0x80000000
1388 #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF
1389 
1390 typedef struct {
1394 
1395 /* ===============================================================
1396  Dispatch Table
1397  http://www.osronline.com/DDKx/stream/ks-struct_494j.htm
1398 */
1399 
1400 #if defined(_NTDDK_)
1401 
1402 typedef struct {
1408  PDRIVER_DISPATCH QuerySecurity;
1409  PDRIVER_DISPATCH SetSecurity;
1410  PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
1411  PFAST_IO_READ FastRead;
1412  PFAST_IO_WRITE FastWrite;
1413 } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
1414 
1415 #define KSCREATE_ITEM_IRP_STORAGE(Irp) (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0])
1416 #define KSEVENT_SET_IRP_STORAGE(Irp) (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
1417 #define KSEVENT_ITEM_IRP_STORAGE(Irp) (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
1418 #define KSEVENT_ENTRY_IRP_STORAGE(Irp) (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0])
1419 #define KSMETHOD_SET_IRP_STORAGE(Irp) (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
1420 #define KSMETHOD_ITEM_IRP_STORAGE(Irp) (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
1421 #define KSMETHOD_TYPE_IRP_STORAGE(Irp) (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2]))
1422 #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1])
1423 #define KSPROPERTY_SET_IRP_STORAGE(Irp) (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
1424 #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
1425 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
1426 
1428 typedef VOID
1429 (NTAPI *PFNREFERENCEDEVICEOBJECT)(
1430  _In_ PVOID Context);
1431 
1433 typedef VOID
1434 (NTAPI *PFNDEREFERENCEDEVICEOBJECT)(
1435  _In_ PVOID Context);
1436 
1438 typedef NTSTATUS
1439 (NTAPI *PFNQUERYREFERENCESTRING)(
1440  _In_ PVOID Context,
1441  _Inout_ PWCHAR *String);
1442 
1443 typedef struct {
1445  PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject;
1446  PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject;
1447  PFNQUERYREFERENCESTRING QueryReferenceString;
1448 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
1449 
1450 typedef struct {
1451  KDPC Dpc;
1452  ULONG ReferenceCount;
1453  KSPIN_LOCK AccessLock;
1454 } KSDPC_ITEM, *PKSDPC_ITEM;
1455 
1456 typedef struct {
1457  KSDPC_ITEM DpcItem;
1458  LIST_ENTRY BufferList;
1459 } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
1460 
1461 #endif /* _NTDDK_ */
1462 
1463 typedef struct {
1471 
1472 #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\
1473  DEFINE_KSPROPERTY_ITEM(\
1474  KSPROPERTY_GENERAL_COMPONENTID,\
1475  (Handler),\
1476  sizeof(KSPROPERTY),\
1477  sizeof(KSCOMPONENTID),\
1478  NULL, NULL, 0, NULL, NULL, 0)
1479 
1480 /* ===============================================================
1481  Properties
1482 */
1483 
1484 typedef struct {
1488 
1489 typedef struct {
1494 
1495 typedef union {
1496  struct {
1499 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1500  } _SIGNED;
1501 #else
1502  };
1503 #endif
1504  struct {
1507 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1508  } _UNSIGNED;
1509 #else
1510  };
1511 #endif
1513 
1514 typedef union {
1515  struct {
1518 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1519  } _SIGNED64;
1520 #else
1521  };
1522 #endif
1523  struct {
1524 #if defined(_NTDDK_)
1525  ULONGLONG UnsignedMinimum;
1526  ULONGLONG UnsignedMaximum;
1527 #else
1530 #endif
1531 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1532  } _UNSIGNED64;
1533 #else
1534  };
1535 #endif
1537 
1538 typedef struct {
1545 
1546 typedef struct {
1552 
1553 typedef struct {
1555  const VOID *Members;
1557 
1558 #define KSPROPERTY_MEMBER_RANGES 0x00000001
1559 #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002
1560 #define KSPROPERTY_MEMBER_VALUES 0x00000003
1561 
1562 #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001
1563 #if (NTDDI_VERSION >= NTDDI_WINXP)
1564 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002
1565 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004
1566 #endif
1567 
1568 typedef struct {
1571  _Field_size_(MembersListCount) const KSPROPERTY_MEMBERSLIST *MembersList;
1573 
1574 #if defined(_NTDDK_)
1575 
1577 typedef NTSTATUS
1578 (NTAPI *PFNKSCONTEXT_DISPATCH)(
1579  _In_ PVOID Context,
1580  _In_ PIRP Irp);
1581 
1583 typedef NTSTATUS
1584 (NTAPI *PFNKSHANDLER)(
1585  _In_ PIRP Irp,
1587  _Inout_ PVOID Data);
1588 
1589 typedef struct {
1590  ULONG PropertyId;
1591  union {
1592  PFNKSHANDLER GetPropertyHandler;
1593  BOOLEAN GetSupported;
1594  };
1595  ULONG MinProperty;
1596  ULONG MinData;
1597  union {
1598  PFNKSHANDLER SetPropertyHandler;
1599  BOOLEAN SetSupported;
1600  };
1601  const KSPROPERTY_VALUES *Values;
1602  ULONG RelationsCount;
1603  _Field_size_(RelationsCount) const KSPROPERTY *Relations;
1604  PFNKSHANDLER SupportHandler;
1605  ULONG SerializedSize;
1606 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
1607 
1609 typedef BOOLEAN
1610 (NTAPI *PFNKSFASTHANDLER)(
1612  _In_reads_bytes_(RequestLength) PKSIDENTIFIER Request,
1613  _In_ ULONG RequestLength,
1617 
1618 typedef struct {
1619  ULONG PropertyId;
1620  union {
1621  PFNKSFASTHANDLER GetPropertyHandler;
1622  BOOLEAN GetSupported;
1623  };
1624  union {
1625  PFNKSFASTHANDLER SetPropertyHandler;
1626  BOOLEAN SetSupported;
1627  };
1628  ULONG Reserved;
1629 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
1630 
1631 typedef struct {
1632  const GUID *Set;
1633  ULONG PropertiesCount;
1634  _Field_size_(PropertiesCount) const KSPROPERTY_ITEM *PropertyItem;
1635  ULONG FastIoCount;
1636  const KSFASTPROPERTY_ITEM *FastIoTable;
1637 } KSPROPERTY_SET, *PKSPROPERTY_SET;
1638 
1639 #endif /* _NTDDK_ */
1640 
1641 typedef struct {
1646 
1647 typedef struct {
1648 #if defined(_NTDDK_)
1649  ULONGLONG SteppingDelta;
1650 #else
1652 #endif
1655 
1656 /* ===============================================================
1657  Allocator Framing
1658 */
1659 
1660 typedef struct {
1661  union {
1664  };
1665 #if defined(_NTDDK_)
1667 #else
1669 #endif
1675 
1676 typedef struct {
1681  KS_FRAMING_ITEM FramingItem[1];
1683 
1684 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001
1685 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002
1686 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004
1687 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008
1688 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000
1689 
1690 #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001
1691 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002
1692 #define KSALLOCATOR_OPTIONF_VALID 0x00000003
1693 
1694 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010
1695 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020
1696 #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040
1697 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080
1698 
1699 /* ===============================================================
1700  Quality
1701 */
1702 
1703 typedef struct {
1707 } KSQUALITY, *PKSQUALITY;
1708 
1709 typedef struct {
1713 
1714 typedef struct {
1720 } KSRATE, *PKSRATE;
1721 
1722 typedef struct {
1726 
1727 typedef struct {
1731 
1732 typedef struct {
1734  union {
1735  struct {
1738  } EventHandle;
1739  struct {
1743  } SemaphoreHandle;
1744 #if defined(_NTDDK_)
1745  struct {
1746  PVOID Event;
1749  } EventObject;
1750  struct {
1751  PVOID Semaphore;
1753  LONG Adjustment;
1754  } SemaphoreObject;
1755  struct {
1756  PKDPC Dpc;
1757  ULONG ReferenceCount;
1759  } Dpc;
1760  struct {
1761  PWORK_QUEUE_ITEM WorkQueueItem;
1762  WORK_QUEUE_TYPE WorkQueueType;
1764  } WorkItem;
1765  struct {
1766  PWORK_QUEUE_ITEM WorkQueueItem;
1767  PKSWORKER KsWorkerObject;
1769  } KsWorkItem;
1770 #endif
1771  struct {
1774  } Alignment;
1775  };
1777 
1778 #define KSEVENTF_EVENT_HANDLE 0x00000001
1779 #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002
1780 #if defined(_NTDDK_)
1781 #define KSEVENTF_EVENT_OBJECT 0x00000004
1782 #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008
1783 #define KSEVENTF_DPC 0x00000010
1784 #define KSEVENTF_WORKITEM 0x00000020
1785 #define KSEVENTF_KSWORKITEM 0x00000080
1786 #endif
1787 
1788 
1789 #define KSEVENT_TYPE_ENABLE 0x00000001
1790 #define KSEVENT_TYPE_ONESHOT 0x00000002
1791 #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
1792 #define KSEVENT_TYPE_SETSUPPORT 0x00000100
1793 #define KSEVENT_TYPE_BASICSUPPORT 0x00000200
1794 #define KSEVENT_TYPE_QUERYBUFFER 0x00000400
1795 
1796 #define KSEVENT_TYPE_TOPOLOGY 0x10000000
1797 
1798 typedef struct {
1801  union {
1804  };
1809 
1810 #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
1811 #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
1812 
1813 /* ===============================================================
1814  Timing
1815 */
1816 
1817 typedef struct {
1821 
1822 typedef struct {
1827 
1828 typedef struct {
1832 
1833 typedef struct {
1837 } KSTIME, *PKSTIME;
1838 
1839 typedef struct {
1843 
1844 typedef struct {
1849 
1850 /* ===============================================================
1851  Clocks
1852 */
1853 
1855 
1856 typedef struct {
1859 
1860 #if defined(_NTDDK_)
1861 
1863 typedef LONGLONG
1864 (FASTCALL *PFNKSCLOCK_GETTIME)(
1866 
1868 typedef LONGLONG
1869 (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
1871  _Out_ PLONGLONG SystemTime);
1872 
1873 typedef struct {
1874  PFNKSCLOCK_GETTIME GetTime;
1875  PFNKSCLOCK_GETTIME GetPhysicalTime;
1876  PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
1877  PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
1878 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
1879 
1880 #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
1881  DEFINE_KSPROPERTY_ITEM(\
1882  KSPROPERTY_CLOCK_TIME,\
1883  (Handler),\
1884  sizeof(KSPROPERTY),\
1885  sizeof(LONGLONG),\
1886  NULL, NULL, 0, NULL, NULL, 0)
1887 
1888 #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
1889  DEFINE_KSPROPERTY_ITEM(\
1890  KSPROPERTY_CLOCK_PHYSICALTIME,\
1891  (Handler),\
1892  sizeof(KSPROPERTY),\
1893  sizeof(LONGLONG),\
1894  NULL, NULL, 0, NULL, NULL, 0)
1895 
1896 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
1897  DEFINE_KSPROPERTY_ITEM(\
1898  KSPROPERTY_CLOCK_CORRELATEDTIME,\
1899  (Handler),\
1900  sizeof(KSPROPERTY),\
1901  sizeof(KSCORRELATED_TIME),\
1902  NULL, NULL, 0, NULL, NULL, 0)
1903 
1904 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
1905  DEFINE_KSPROPERTY_ITEM(\
1906  KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
1907  (Handler),\
1908  sizeof(KSPROPERTY),\
1909  sizeof(KSCORRELATED_TIME),\
1910  NULL, NULL, 0, NULL, NULL, 0)
1911 
1912 #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
1913  DEFINE_KSPROPERTY_ITEM(\
1914  KSPROPERTY_CLOCK_RESOLUTION,\
1915  (Handler),\
1916  sizeof(KSPROPERTY),\
1917  sizeof(KSRESOLUTION),\
1918  NULL, NULL, 0, NULL, NULL, 0)
1919 
1920 #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
1921  DEFINE_KSPROPERTY_ITEM(\
1922  KSPROPERTY_CLOCK_STATE,\
1923  (Handler),\
1924  sizeof(KSPROPERTY),\
1925  sizeof(KSSTATE),\
1926  NULL, NULL, 0, NULL, NULL, 0)
1927 
1928 #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
1929  DEFINE_KSPROPERTY_ITEM(\
1930  KSPROPERTY_CLOCK_FUNCTIONTABLE,\
1931  (Handler),\
1932  sizeof(KSPROPERTY),\
1933  sizeof(KSCLOCK_FUNCTIONTABLE),\
1934  NULL, NULL, 0, NULL, NULL, 0)
1935 
1936 #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
1937  PropTime, PropPhysicalTime,\
1938  PropCorrelatedTime, PropCorrelatedPhysicalTime,\
1939  PropResolution, PropState, PropFunctionTable)\
1940 DEFINE_KSPROPERTY_TABLE(ClockSet) {\
1941  DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
1942  DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
1943  DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
1944  DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
1945  DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
1946  DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
1947  DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable)\
1948 }
1949 
1950 /* ===============================================================
1951  Objects ??? SORT ME!
1952 */
1953 
1954 #define KSCREATE_ITEM_SECURITYCHANGED 0x1
1955 #define KSCREATE_ITEM_WILDCARD 0x2
1956 #define KSCREATE_ITEM_NOPARAMETERS 0x4
1957 #define KSCREATE_ITEM_FREEONSTOP 0x8
1958 
1959 typedef struct {
1961  PVOID Context;
1962  UNICODE_STRING ObjectClass;
1964  ULONG Flags;
1965 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
1966 
1967 typedef struct {
1968  ULONG CreateItemsCount;
1969  _Field_size_(CreateItemsCount) PKSOBJECT_CREATE_ITEM CreateItemsList;
1970 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
1971 
1972 typedef VOID
1973 (NTAPI *PFNKSITEMFREECALLBACK)(
1974  _In_ PKSOBJECT_CREATE_ITEM CreateItem);
1975 
1976 #endif /* _NTDDK_ */
1977 
1978 typedef struct {
1982 
1983 typedef struct {
1988 
1989 typedef struct {
1992 } KSERROR, *PKSERROR;
1993 
1994 /* ===============================================================
1995  Methods
1996 */
1997 
1998 #if defined(_NTDDK_)
1999 
2000 typedef struct {
2001  ULONG MethodId;
2002  union {
2003  PFNKSHANDLER MethodHandler;
2004  BOOLEAN MethodSupported;
2005  };
2006  ULONG MinMethod;
2007  ULONG MinData;
2008  PFNKSHANDLER SupportHandler;
2009  ULONG Flags;
2010 } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
2011 
2012 #ifndef _MSC_VER
2013 
2014 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
2015  MethodHandler,\
2016  MinMethod, MinData, SupportHandler)\
2017 {\
2018  MethodId, {(PFNKSHANDLER)MethodHandler}, MinMethod, MinData,\
2019  SupportHandler, Flags\
2020 }
2021 
2022 #else
2023 
2024 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
2025  MethodHandler,\
2026  MinMethod, MinData, SupportHandler)\
2027 {\
2028  MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
2029  SupportHandler, Flags\
2030 }
2031 
2032 #endif
2033 
2034 typedef struct {
2035  ULONG MethodId;
2036  union {
2037  PFNKSFASTHANDLER MethodHandler;
2038  BOOLEAN MethodSupported;
2039  };
2040 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
2041 
2042 #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
2043 {\
2044  MethodId, (PFNKSFASTHANDLER)MethodHandler\
2045 }
2046 
2047 typedef struct {
2048  const GUID *Set;
2049  ULONG MethodsCount;
2050  _Field_size_(MethodsCount) const KSMETHOD_ITEM *MethodItem;
2051  ULONG FastIoCount;
2052  _Field_size_(FastIoCount) const KSFASTMETHOD_ITEM *FastIoTable;
2053 } KSMETHOD_SET, *PKSMETHOD_SET;
2054 
2055 #define DEFINE_KSMETHOD_SET(Set,\
2056  MethodsCount,\
2057  MethodItem,\
2058  FastIoCount,\
2059  FastIoTable)\
2060 {\
2061  Set,\
2062  MethodsCount,\
2063  MethodItem,\
2064  FastIoCount,\
2065  FastIoTable\
2066 }
2067 
2068 #endif /* _NTDDK_ */
2069 
2070 /* ===============================================================
2071  Nodes
2072 */
2073 
2074 typedef struct {
2078 } KSP_NODE, *PKSP_NODE;
2079 
2080 typedef struct {
2084 } KSM_NODE, *PKSM_NODE;
2085 
2086 typedef struct {
2090 } KSE_NODE, *PKSE_NODE;
2091 
2092 typedef struct {
2096 
2097 /* ===============================================================
2098  Events
2099 */
2100 
2101 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY;
2102 
2103 #if defined(_NTDDK_)
2104 
2105 typedef NTSTATUS
2106 (NTAPI *PFNKSADDEVENT)(
2107  _In_ PIRP Irp,
2108  _In_ PKSEVENTDATA EventData,
2109  _In_ struct _KSEVENT_ENTRY *EventEntry);
2110 
2111 typedef VOID
2112 (NTAPI *PFNKSREMOVEEVENT)(
2114  _In_ struct _KSEVENT_ENTRY *EventEntry);
2115 
2116 typedef struct {
2117  ULONG EventId;
2118  ULONG DataInput;
2119  ULONG ExtraEntryData;
2120  PFNKSADDEVENT AddHandler;
2121  PFNKSREMOVEEVENT RemoveHandler;
2122  PFNKSHANDLER SupportHandler;
2123 } KSEVENT_ITEM, *PKSEVENT_ITEM;
2124 
2125 typedef struct {
2126  const GUID *Set;
2127  ULONG EventsCount;
2128  _Field_size_(EventsCount) const KSEVENT_ITEM *EventItem;
2129 } KSEVENT_SET, *PKSEVENT_SET;
2130 
2131 struct _KSEVENT_ENTRY {
2132  LIST_ENTRY ListEntry;
2133  PVOID Object;
2134  union {
2135  PKSDPC_ITEM DpcItem;
2136  PKSBUFFER_ITEM BufferItem;
2137  };
2138  PKSEVENTDATA EventData;
2139  ULONG NotificationType;
2140  const KSEVENT_SET *EventSet;
2141  const KSEVENT_ITEM *EventItem;
2143  ULONG SemaphoreAdjustment;
2144  ULONG Reserved;
2145  ULONG Flags;
2146 };
2147 
2148 #endif /* _NTDDK_ */
2149 
2150 /* ===============================================================
2151  Pins
2152 */
2153 
2154 #if defined(_NTDDK_)
2155 
2156 typedef struct _KSPIN KSPIN, *PKSPIN;
2157 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
2158 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
2159 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
2160 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
2161 
2162 #define IOCTL_KS_HANDSHAKE \
2163  CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
2164 
2165 typedef struct {
2166  GUID ProtocolId;
2167  PVOID Argument1;
2168  PVOID Argument2;
2169 } KSHANDSHAKE, *PKSHANDSHAKE;
2170 
2172 typedef NTSTATUS
2173 (NTAPI *PFNKSPINHANDSHAKE)(
2174  _In_ PKSPIN Pin,
2175  _In_ PKSHANDSHAKE In,
2176  _In_ PKSHANDSHAKE Out);
2177 
2179 typedef void
2180 (NTAPI *PFNKSPINPOWER)(
2181  _In_ PKSPIN Pin,
2183 
2184 typedef void
2185 (NTAPI *PFNKSPINFRAMERETURN)(
2186  _In_ PKSPIN Pin,
2189  _In_opt_ PMDL Mdl,
2191  _In_ NTSTATUS Status);
2192 
2194 typedef void
2195 (NTAPI *PFNKSPINIRPCOMPLETION)(
2196  _In_ PKSPIN Pin,
2197  _In_ PIRP Irp);
2198 
2200 typedef NTSTATUS
2201 (NTAPI *PFNKSPINIRP)(
2202  _In_ PKSPIN Pin,
2203  _In_ PIRP Irp);
2204 
2205 typedef NTSTATUS
2206 (NTAPI *PFNKSPIN)(
2207  _In_ PKSPIN Pin);
2208 
2210 typedef void
2211 (NTAPI *PFNKSPINVOID)(
2212  _In_ PKSPIN Pin);
2213 
2215 typedef void
2216 (NTAPI *PFNKSSTREAMPOINTER)(
2217  _In_ PKSSTREAM_POINTER StreamPointer);
2218 
2219 typedef struct {
2220  ULONG Count;
2222 } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
2223 
2225 typedef NTSTATUS
2226 (NTAPI *PFNKSPINSETDATAFORMAT)(
2227  _In_ PKSPIN Pin,
2228  _In_opt_ PKSDATAFORMAT OldFormat,
2229  _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
2230  _In_ const KSDATARANGE* DataRange,
2231  _In_opt_ const KSATTRIBUTE_LIST* AttributeRange);
2232 
2234 typedef NTSTATUS
2235 (NTAPI *PFNKSPINSETDEVICESTATE)(
2236  _In_ PKSPIN Pin,
2237  _In_ KSSTATE ToState,
2238  _In_ KSSTATE FromState);
2239 
2240 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
2241 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
2242 
2243 typedef struct {
2244  PFNKSPINIRP Create;
2245  PFNKSPINIRP Close;
2246  PFNKSPIN Process;
2247  PFNKSPINVOID Reset;
2248  PFNKSPINSETDATAFORMAT SetDataFormat;
2249  PFNKSPINSETDEVICESTATE SetDeviceState;
2250  PFNKSPIN Connect;
2251  PFNKSPINVOID Disconnect;
2252  const KSCLOCK_DISPATCH* Clock;
2253  const KSALLOCATOR_DISPATCH* Allocator;
2254 } KSPIN_DISPATCH, *PKSPIN_DISPATCH;
2255 
2257 typedef BOOLEAN
2258 (NTAPI *PFNKSPINSETTIMER)(
2259  _In_ PKSPIN Pin,
2260  _In_ PKTIMER Timer,
2262  _In_ PKDPC Dpc);
2263 
2265 typedef BOOLEAN
2266 (NTAPI *PFNKSPINCANCELTIMER)(
2267  _In_ PKSPIN Pin,
2268  _In_ PKTIMER Timer);
2269 
2271 typedef LONGLONG
2272 (FASTCALL *PFNKSPINCORRELATEDTIME)(
2273  _In_ PKSPIN Pin,
2274  _Out_ PLONGLONG SystemTime);
2275 
2277 typedef void
2278 (NTAPI *PFNKSPINRESOLUTION)(
2279  _In_ PKSPIN Pin,
2281 
2282 struct _KSCLOCK_DISPATCH {
2283  PFNKSPINSETTIMER SetTimer;
2284  PFNKSPINCANCELTIMER CancelTimer;
2285  PFNKSPINCORRELATEDTIME CorrelatedTime;
2286  PFNKSPINRESOLUTION Resolution;
2287 };
2288 
2290 typedef NTSTATUS
2291 (NTAPI *PFNKSPININITIALIZEALLOCATOR)(
2292  _In_ PKSPIN Pin,
2294  _Out_ PVOID *Context);
2295 
2296 typedef PVOID
2297 (NTAPI *PFNKSDELETEALLOCATOR)(
2298  _In_ PVOID Context);
2299 
2300 typedef PVOID
2301 (NTAPI *PFNKSDEFAULTALLOCATE)(
2302  _In_ PVOID Context);
2303 
2304 typedef PVOID
2305 (NTAPI *PFNKSDEFAULTFREE)(
2306  _In_ PVOID Context,
2307  _In_ PVOID Buffer);
2308 
2309 struct _KSALLOCATOR_DISPATCH {
2310  PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
2311  PFNKSDELETEALLOCATOR DeleteAllocator;
2312  PFNKSDEFAULTALLOCATE Allocate;
2313  PFNKSDEFAULTFREE Free;
2314 };
2315 
2316 typedef struct KSAUTOMATION_TABLE_ {
2317  ULONG PropertySetsCount;
2318  ULONG PropertyItemSize;
2319  _Field_size_bytes_(PropertySetsCount * PropertyItemSize) const KSPROPERTY_SET *PropertySets;
2320  ULONG MethodSetsCount;
2321  ULONG MethodItemSize;
2322  _Field_size_bytes_(MethodSetsCount * MethodItemSize) const KSMETHOD_SET *MethodSets;
2323  ULONG EventSetsCount;
2324  ULONG EventItemSize;
2325  _Field_size_bytes_(EventSetsCount * EventItemSize) const KSEVENT_SET *EventSets;
2326 #if !defined(_WIN64)
2327  PVOID Alignment;
2328 #endif
2329 } KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
2330 
2331 typedef struct {
2332  ULONG InterfacesCount;
2333  _Field_size_(InterfacesCount) const KSPIN_INTERFACE *Interfaces;
2334  ULONG MediumsCount;
2335  _Field_size_(MediumsCount) const KSPIN_MEDIUM *Mediums;
2336  ULONG DataRangesCount;
2337  _Field_size_(DataRangesCount) const PKSDATARANGE *DataRanges;
2339  KSPIN_COMMUNICATION Communication;
2340  const GUID *Category;
2341  const GUID *Name;
2342  union {
2344  struct {
2345  ULONG ConstrainedDataRangesCount;
2346  _Field_size_(ConstrainedDataRangesCount) PKSDATARANGE *ConstrainedDataRanges;
2347  };
2348  };
2349 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
2350 
2353 typedef NTSTATUS
2354 (NTAPI *PFNKSINTERSECTHANDLER)(
2355  _In_ PIRP Irp,
2356  _In_ PKSP_PIN Pin,
2357  _In_ PKSDATARANGE DataRange,
2358  _Out_opt_ PVOID Data);
2359 
2362 typedef NTSTATUS
2363 (NTAPI *PFNKSINTERSECTHANDLEREX)(
2364  _In_ PVOID Context,
2365  _In_ PIRP Irp,
2366  _In_ PKSP_PIN Pin,
2367  _In_ PKSDATARANGE DataRange,
2368  _In_ PKSDATARANGE MatchingDataRange,
2369  _In_ ULONG DataBufferSize,
2370  _Out_writes_bytes_to_opt_(DataBufferSize, *DataSize) PVOID Data,
2372 
2373 typedef struct {
2374  const KSPIN_DISPATCH* Dispatch;
2375  const KSAUTOMATION_TABLE* AutomationTable;
2376  KSPIN_DESCRIPTOR PinDescriptor;
2377  ULONG Flags;
2378  ULONG InstancesPossible;
2379  ULONG InstancesNecessary;
2381  PFNKSINTERSECTHANDLEREX IntersectHandler;
2382 } KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
2383 
2384 #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
2385 #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
2386 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
2387 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008
2388 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2389 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000
2390 #endif
2391 
2392 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
2393 #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
2394 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
2395 
2396 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
2397 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
2398 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
2399 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
2400 #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
2401 
2402 #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
2403 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
2404 
2405 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
2406 #define KSPIN_FLAG_SPLITTER 0x00020000
2407 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
2408 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
2409 #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
2410 #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
2411 
2412 #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
2413 
2414 #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
2415 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000
2416 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000
2417 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2418 #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000
2419 #endif
2420 
2421 struct _KSPIN {
2422  const KSPIN_DESCRIPTOR_EX *Descriptor;
2423  KSOBJECT_BAG Bag;
2424  PVOID Context;
2425  ULONG Id;
2426  KSPIN_COMMUNICATION Communication;
2427  BOOLEAN ConnectionIsExternal;
2428  KSPIN_INTERFACE ConnectionInterface;
2429  KSPIN_MEDIUM ConnectionMedium;
2430  KSPRIORITY ConnectionPriority;
2431  PKSDATAFORMAT ConnectionFormat;
2432  PKSMULTIPLE_ITEM AttributeList;
2433  ULONG StreamHeaderSize;
2435  KSSTATE DeviceState;
2437  KSSTATE ClientState;
2438 };
2439 
2440 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
2441  DEFINE_KSPROPERTY_ITEM(\
2442  KSPROPERTY_PIN_CINSTANCES,\
2443  (Handler),\
2444  sizeof(KSP_PIN),\
2445  sizeof(KSPIN_CINSTANCES),\
2446  NULL, NULL, 0, NULL, NULL, 0)
2447 
2448 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
2449  DEFINE_KSPROPERTY_ITEM(\
2450  KSPROPERTY_PIN_CTYPES,\
2451  (Handler),\
2452  sizeof(KSPROPERTY),\
2453  sizeof(ULONG),\
2454  NULL, NULL, 0, NULL, NULL, 0)
2455 
2456 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
2457  DEFINE_KSPROPERTY_ITEM(\
2458  KSPROPERTY_PIN_DATAFLOW,\
2459  (Handler),\
2460  sizeof(KSP_PIN),\
2461  sizeof(KSPIN_DATAFLOW),\
2462  NULL, NULL, 0, NULL, NULL, 0)
2463 
2464 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
2465  DEFINE_KSPROPERTY_ITEM(\
2466  KSPROPERTY_PIN_DATARANGES,\
2467  (Handler),\
2468  sizeof(KSP_PIN),\
2469  0,\
2470  NULL, NULL, 0, NULL, NULL, 0)
2471 
2472 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
2473  DEFINE_KSPROPERTY_ITEM(\
2474  KSPROPERTY_PIN_DATAINTERSECTION,\
2475  (Handler),\
2476  sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
2477  0,\
2478  NULL, NULL, 0, NULL, NULL, 0)
2479 
2480 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
2481  DEFINE_KSPROPERTY_ITEM(\
2482  KSPROPERTY_PIN_INTERFACES,\
2483  (Handler),\
2484  sizeof(KSP_PIN),\
2485  0,\
2486  NULL, NULL, 0, NULL, NULL, 0)
2487 
2488 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
2489  DEFINE_KSPROPERTY_ITEM(\
2490  KSPROPERTY_PIN_MEDIUMS,\
2491  (Handler),\
2492  sizeof(KSP_PIN),\
2493  0,\
2494  NULL, NULL, 0, NULL, NULL, 0)
2495 
2496 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
2497  DEFINE_KSPROPERTY_ITEM(\
2498  KSPROPERTY_PIN_COMMUNICATION,\
2499  (Handler),\
2500  sizeof(KSP_PIN),\
2501  sizeof(KSPIN_COMMUNICATION),\
2502  NULL, NULL, 0, NULL, NULL, 0)
2503 
2504 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
2505  DEFINE_KSPROPERTY_ITEM(\
2506  KSPROPERTY_PIN_GLOBALCINSTANCES,\
2507  (Handler),\
2508  sizeof(KSP_PIN),\
2509  sizeof(KSPIN_CINSTANCES),\
2510  NULL, NULL, 0, NULL, NULL, 0)
2511 
2512 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
2513  DEFINE_KSPROPERTY_ITEM(\
2514  KSPROPERTY_PIN_NECESSARYINSTANCES,\
2515  (Handler),\
2516  sizeof(KSP_PIN),\
2517  sizeof(ULONG),\
2518  NULL, NULL, 0, NULL, NULL, 0)
2519 
2520 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
2521  DEFINE_KSPROPERTY_ITEM(\
2522  KSPROPERTY_PIN_PHYSICALCONNECTION,\
2523  (Handler),\
2524  sizeof(KSP_PIN),\
2525  0,\
2526  NULL, NULL, 0, NULL, NULL, 0)
2527 
2528 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
2529  DEFINE_KSPROPERTY_ITEM(\
2530  KSPROPERTY_PIN_CATEGORY,\
2531  (Handler),\
2532  sizeof(KSP_PIN),\
2533  sizeof(GUID),\
2534  NULL, NULL, 0, NULL, NULL, 0)
2535 
2536 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
2537  DEFINE_KSPROPERTY_ITEM(\
2538  KSPROPERTY_PIN_NAME,\
2539  (Handler),\
2540  sizeof(KSP_PIN),\
2541  0,\
2542  NULL, NULL, 0, NULL, NULL, 0)
2543 
2544 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
2545  DEFINE_KSPROPERTY_ITEM(\
2546  KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
2547  (Handler),\
2548  sizeof(KSP_PIN),\
2549  0,\
2550  NULL, NULL, 0, NULL, NULL, 0)
2551 
2552 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
2553  DEFINE_KSPROPERTY_ITEM(\
2554  KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
2555  NULL,\
2556  sizeof(KSP_PIN),\
2557  sizeof(KSDATAFORMAT),\
2558  (Handler), NULL, 0, NULL, NULL, 0)
2559 
2560 #define DEFINE_KSPROPERTY_PINSET(PinSet,\
2561  PropGeneral, PropInstances, PropIntersection)\
2562 DEFINE_KSPROPERTY_TABLE(PinSet) {\
2563  DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
2564  DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
2565  DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
2566  DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
2567  DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
2568  DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
2569  DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
2570  DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
2571  DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
2572  DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
2573 }
2574 
2575 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
2576  PropGeneral, PropInstances, PropIntersection)\
2577 DEFINE_KSPROPERTY_TABLE(PinSet) {\
2578  DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
2579  DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
2580  DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
2581  DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
2582  DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
2583  DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
2584  DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
2585  DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
2586  DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
2587  DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
2588  DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
2589 }
2590 
2591 typedef void
2592 (NTAPI *PFNKSFREE)(
2593  _In_ PVOID Data);
2594 
2595 #define DEFINE_KSPROPERTY_TABLE(tablename) \
2596  const KSPROPERTY_ITEM tablename[] =
2597 
2598 #endif /* _NTDDK_ */
2599 
2600 typedef struct {
2607 
2608 /* ===============================================================
2609  Topology
2610 */
2611 
2612 typedef struct {
2613  ULONG FromNode;
2614  ULONG FromNodePin;
2615  ULONG ToNode;
2616  ULONG ToNodePin;
2618 
2619 typedef struct {
2621  _Field_size_(CategoriesCount) const GUID *Categories;
2623  _Field_size_(TopologyNodesCount) const GUID *TopologyNodes;
2625  _Field_size_(TopologyConnectionsCount) const KSTOPOLOGY_CONNECTION *TopologyConnections;
2626  _Field_size_(TopologyNodesCount) const GUID *TopologyNodesNames;
2629 
2630 
2631 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
2632  DEFINE_KSPROPERTY_ITEM(\
2633  KSPROPERTY_TOPOLOGY_CATEGORIES,\
2634  (Handler),\
2635  sizeof(KSPROPERTY),\
2636  0,\
2637  NULL, NULL, 0, NULL, NULL, 0)
2638 
2639 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
2640  DEFINE_KSPROPERTY_ITEM(\
2641  KSPROPERTY_TOPOLOGY_NODES,\
2642  (Handler),\
2643  sizeof(KSPROPERTY),\
2644  0,\
2645  NULL, NULL, 0, NULL, NULL, 0)
2646 
2647 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
2648  DEFINE_KSPROPERTY_ITEM(\
2649  KSPROPERTY_TOPOLOGY_CONNECTIONS,\
2650  (Handler),\
2651  sizeof(KSPROPERTY),\
2652  0,\
2653  NULL, NULL, 0, NULL, NULL, 0)
2654 
2655 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
2656  DEFINE_KSPROPERTY_ITEM(\
2657  KSPROPERTY_TOPOLOGY_NAME,\
2658  (Handler),\
2659  sizeof(KSP_NODE),\
2660  0,\
2661  NULL, NULL, 0, NULL, NULL, 0)
2662 
2663 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
2664 DEFINE_KSPROPERTY_TABLE(TopologySet) {\
2665  DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
2666  DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
2667  DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
2668  DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
2669 }
2670 
2671 /* ===============================================================
2672  ??? SORT ME
2673 */
2674 
2675 /* TODO */
2676 typedef void* UNKNOWN;
2677 
2678 typedef PVOID
2680  _In_ PVOID InitialContext,
2683 
2684 #if defined(_NTDDK_)
2685 
2687 typedef NTSTATUS
2688 (NTAPI *PFNKSALLOCATOR)(
2689  _In_ PIRP Irp,
2691  _In_ BOOLEAN InputOperation);
2692 
2695 typedef NTSTATUS
2696 (NTAPI *PFNKINTERSECTHANDLEREX)(
2697  _In_ PVOID Context,
2698  _In_ PIRP Irp,
2699  _In_ PKSP_PIN Pin,
2700  _In_ PKSDATARANGE DataRange,
2701  _In_ PKSDATARANGE MatchingDataRange,
2702  _In_ ULONG DataBufferSize,
2703  _Out_writes_bytes_to_opt_(DataBufferSize, *DataSize) PVOID Data,
2705 
2706 typedef NTSTATUS
2707 (NTAPI *PFNALLOCATOR_ALLOCATEFRAME)(
2709  _Outptr_ PVOID *Frame);
2710 
2711 typedef VOID
2712 (NTAPI *PFNALLOCATOR_FREEFRAME)(
2714  _In_ PVOID Frame);
2715 
2716 typedef struct {
2717  PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
2718  PFNALLOCATOR_FREEFRAME FreeFrame;
2719 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
2720 
2721 #endif /* _NTDDK_ */
2722 
2723 typedef struct {
2728 
2729 typedef struct {
2734 
2735 typedef struct {
2744 #ifdef _WIN64
2745  ULONG Reserved;
2746 #endif
2748 
2749 #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001
2750 #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002
2751 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004
2752 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008
2753 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010
2754 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040
2755 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080
2756 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100
2757 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200
2758 #define KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER 0x00000400
2759 #define KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER 0x00000800
2760 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000
2761 
2762 /* ===============================================================
2763  XP / DX8
2764 */
2765 
2766 #if defined(_NTDDK_)
2767 
2768 typedef struct _KSGATE KSGATE, *PKSGATE;
2769 
2770 struct _KSGATE {
2771  LONG Count;
2772  PKSGATE NextGate;
2773 };
2774 
2775 #ifndef _NTOS_
2776 
2778 KSDDKAPI
2779 PKSGATE
2780 NTAPI
2782  _In_ PKSPIN Pin);
2783 
2785 static
2786 __inline
2787 void
2788 KsGateTurnInputOn(
2789  _In_opt_ PKSGATE Gate)
2790 {
2791  while (Gate && (InterlockedIncrement(&Gate->Count) == 1))
2792  {
2793  Gate = Gate->NextGate;
2794  }
2795 }
2796 
2798 static
2799 __inline
2800 void
2801 KsGateTurnInputOff(
2802  _In_opt_ PKSGATE Gate)
2803 {
2804  while (Gate && (InterlockedDecrement(&Gate->Count) == 0))
2805  {
2806  Gate = Gate->NextGate;
2807  }
2808 }
2809 
2811 static
2812 __inline
2813 BOOLEAN
2814 KsGateGetStateUnsafe(
2815  _In_ PKSGATE Gate)
2816 {
2817  ASSERT(Gate);
2818  return((BOOLEAN)(Gate->Count > 0));
2819 }
2820 
2822 static
2823 __inline
2824 BOOLEAN
2825 KsGateCaptureThreshold(
2826  _In_ PKSGATE Gate)
2827 {
2828  BOOLEAN captured;
2829 
2830  ASSERT(Gate);
2831 
2832  captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1);
2833 
2834  if (captured)
2835  {
2836  KsGateTurnInputOff(Gate->NextGate);
2837  }
2838 
2839  return captured;
2840 }
2841 
2843 static
2844 __inline
2845 void
2846 KsGateInitialize(
2847  _In_ PKSGATE Gate,
2848  _In_ LONG InitialCount,
2849  _In_opt_ PKSGATE NextGate,
2850  _In_ BOOLEAN StateToPropagate)
2851 {
2852  ASSERT(Gate);
2853  Gate->Count = InitialCount;
2854  Gate->NextGate = NextGate;
2855 
2856  if (NextGate)
2857  {
2858  if (InitialCount > 0)
2859  {
2860  if (StateToPropagate)
2861  {
2862  KsGateTurnInputOn(NextGate);
2863  }
2864  }
2865  else
2866  {
2867  if (!StateToPropagate)
2868  {
2869  KsGateTurnInputOff(NextGate);
2870  }
2871  }
2872  }
2873 }
2874 
2876 static
2877 __inline
2878 void
2879 KsGateInitializeAnd(
2880  _In_ PKSGATE AndGate,
2881  _In_opt_ PKSGATE NextOrGate)
2882 {
2883  KsGateInitialize(AndGate,1,NextOrGate,TRUE);
2884 }
2885 
2887 static
2888 __inline
2889 void
2890 KsGateInitializeOr(
2891  _In_ PKSGATE OrGate,
2892  _In_opt_ PKSGATE NextAndGate)
2893 {
2894  KsGateInitialize(OrGate,0,NextAndGate,FALSE);
2895 }
2896 
2898 static
2899 __inline
2900 void
2901 KsGateAddOnInputToAnd(
2902  _In_ PKSGATE AndGate)
2903 {
2904  UNREFERENCED_PARAMETER (AndGate);
2905 }
2906 
2908 static
2909 __inline
2910 void
2911 KsGateAddOffInputToAnd(
2912  _In_ PKSGATE AndGate)
2913 {
2914  KsGateTurnInputOff(AndGate);
2915 }
2916 
2918 static
2919 __inline
2920 void
2921 KsGateRemoveOnInputFromAnd(
2922  _In_ PKSGATE AndGate)
2923 {
2924  UNREFERENCED_PARAMETER (AndGate);
2925 }
2926 
2928 static
2929 __inline
2930 void
2931 KsGateRemoveOffInputFromAnd(
2932  _In_ PKSGATE AndGate)
2933 {
2934  KsGateTurnInputOn(AndGate);
2935 }
2936 
2938 static
2939 __inline
2940 void
2941 KsGateAddOnInputToOr(
2942  _In_ PKSGATE OrGate)
2943 {
2944  KsGateTurnInputOn(OrGate);
2945 }
2946 
2948 static
2949 __inline
2950 void
2951 KsGateAddOffInputToOr(
2952  _In_ PKSGATE OrGate)
2953 {
2954  UNREFERENCED_PARAMETER (OrGate);
2955 }
2956 
2958 static
2959 __inline
2960 void
2961 KsGateRemoveOnInputFromOr(
2962  _In_ PKSGATE OrGate)
2963 {
2964  KsGateTurnInputOff(OrGate);
2965 }
2966 
2968 static
2969 __inline
2970 void
2971 KsGateRemoveOffInputFromOr(
2972  _In_ PKSGATE OrGate)
2973 {
2974  UNREFERENCED_PARAMETER (OrGate);
2975 }
2976 
2978 static
2979 __inline
2980 void
2981 KsGateTerminateAnd(
2982  _In_ PKSGATE AndGate)
2983 {
2984  ASSERT(AndGate);
2985  if (KsGateGetStateUnsafe(AndGate))
2986  {
2987  KsGateRemoveOnInputFromOr(AndGate->NextGate);
2988  }
2989  else
2990  {
2991  KsGateRemoveOffInputFromOr(AndGate->NextGate);
2992  }
2993 }
2994 
2996 static
2997 __inline
2998 void
2999 KsGateTerminateOr(
3000  _In_ PKSGATE OrGate)
3001 {
3002  ASSERT(OrGate);
3003  if (KsGateGetStateUnsafe(OrGate))
3004  {
3005  KsGateRemoveOnInputFromAnd(OrGate->NextGate);
3006  }
3007  else
3008  {
3009  KsGateRemoveOffInputFromAnd(OrGate->NextGate);
3010  }
3011 }
3012 
3013 #endif /* !_NTOS_ */
3014 
3015 struct _KSMAPPING {
3017  ULONG ByteCount;
3018  ULONG Alignment;
3019 };
3020 
3021 #endif /* _NTDDK_ */
3022 
3023 typedef enum {
3027 
3028 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
3029 
3031 #if defined(_NTDDK_)
3032  union {
3033  PUCHAR Data;
3034  PKSMAPPING Mappings;
3035  };
3036 #else
3038 #endif
3039 #if !defined(_WIN64)
3041 #endif
3044 };
3045 
3046 #if defined(_NTDDK_)
3047 
3048 struct _KSSTREAM_POINTER {
3049  PVOID Context;
3050  PKSPIN Pin;
3051  PKSSTREAM_HEADER StreamHeader;
3052  PKSSTREAM_POINTER_OFFSET Offset;
3053  KSSTREAM_POINTER_OFFSET OffsetIn;
3054  KSSTREAM_POINTER_OFFSET OffsetOut;
3055 };
3056 
3057 struct _KSPROCESSPIN {
3058  PKSPIN Pin;
3059  PKSSTREAM_POINTER StreamPointer;
3060  PKSPROCESSPIN InPlaceCounterpart;
3061  PKSPROCESSPIN DelegateBranch;
3062  PKSPROCESSPIN CopySource;
3063  _Field_size_bytes_(BytesAvailable) PVOID Data;
3064  ULONG BytesAvailable;
3065  ULONG BytesUsed;
3066  ULONG Flags;
3067  BOOLEAN Terminate;
3068 };
3069 
3070 struct _KSPROCESSPIN_INDEXENTRY {
3071  _Field_size_(Count) PKSPROCESSPIN *Pins;
3072  ULONG Count;
3073 };
3074 
3075 #endif /* _NTDDK_ */
3076 
3077 /* ===============================================================
3078  Device Dispatch
3079 */
3080 
3081 #if defined(_NTDDK_)
3082 
3083 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
3084 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
3085 typedef struct _KSFILTER KSFILTER, *PKSFILTER;
3086 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
3087 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
3088 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
3089 
3091 typedef NTSTATUS
3092 (NTAPI *PFNKSDEVICECREATE)(
3093  _In_ PKSDEVICE Device);
3094 
3096 typedef NTSTATUS
3097 (NTAPI *PFNKSDEVICEPNPSTART)(
3098  _In_ PKSDEVICE Device,
3099  _In_ PIRP Irp,
3100  _In_opt_ PCM_RESOURCE_LIST TranslatedResourceList,
3101  _In_opt_ PCM_RESOURCE_LIST UntranslatedResourceList);
3102 
3104 typedef NTSTATUS
3105 (NTAPI *PFNKSDEVICE)(
3106  _In_ PKSDEVICE Device);
3107 
3109 typedef NTSTATUS
3110 (NTAPI *PFNKSDEVICEIRP)(
3111  _In_ PKSDEVICE Device,
3112  _In_ PIRP Irp);
3113 
3115 typedef VOID
3116 (NTAPI *PFNKSDEVICEIRPVOID)(
3117  _In_ PKSDEVICE Device,
3118  _In_ PIRP Irp);
3119 
3121 typedef NTSTATUS
3122 (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)(
3123  _In_ PKSDEVICE Device,
3124  _In_ PIRP Irp,
3126 
3128 typedef NTSTATUS
3129 (NTAPI *PFNKSDEVICEQUERYPOWER)(
3130  _In_ PKSDEVICE Device,
3131  _In_ PIRP Irp,
3132  _In_ DEVICE_POWER_STATE DeviceTo,
3133  _In_ DEVICE_POWER_STATE DeviceFrom,
3134  _In_ SYSTEM_POWER_STATE SystemTo,
3135  _In_ SYSTEM_POWER_STATE SystemFrom,
3137 
3139 typedef VOID
3140 (NTAPI *PFNKSDEVICESETPOWER)(
3141  _In_ PKSDEVICE Device,
3142  _In_ PIRP Irp,
3144  _In_ DEVICE_POWER_STATE From);
3145 
3146 typedef struct _KSDEVICE_DISPATCH {
3147  PFNKSDEVICECREATE Add;
3148  PFNKSDEVICEPNPSTART Start;
3149  PFNKSDEVICE PostStart;
3150  PFNKSDEVICEIRP QueryStop;
3151  PFNKSDEVICEIRPVOID CancelStop;
3152  PFNKSDEVICEIRPVOID Stop;
3153  PFNKSDEVICEIRP QueryRemove;
3154  PFNKSDEVICEIRPVOID CancelRemove;
3155  PFNKSDEVICEIRPVOID Remove;
3156  PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
3157  PFNKSDEVICEIRPVOID SurpriseRemoval;
3158  PFNKSDEVICEQUERYPOWER QueryPower;
3159  PFNKSDEVICESETPOWER SetPower;
3160  PFNKSDEVICEIRP QueryInterface;
3161 } KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
3162 
3163 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3164 #define KSDEVICE_DESCRIPTOR_VERSION_2 (0x110)
3165 #define MIN_DEV_VER_FOR_FLAGS (0x110)
3166 #endif
3167 
3168 struct _KSDEVICE {
3169  const KSDEVICE_DESCRIPTOR* Descriptor;
3170  KSOBJECT_BAG Bag;
3171  PVOID Context;
3175  BOOLEAN Started;
3178 };
3179 
3180 #endif /* _NTDDK_ */
3181 
3182 /* ===============================================================
3183  Filter Dispatch
3184 */
3185 
3186 #if defined(_NTDDK_)
3187 
3188 struct _KSFILTER {
3189  const KSFILTER_DESCRIPTOR* Descriptor;
3190  KSOBJECT_BAG Bag;
3191  PVOID Context;
3192 };
3193 
3195 typedef void
3196 (NTAPI *PFNKSFILTERPOWER)(
3197  _In_ PKSFILTER Filter,
3199 
3201 typedef NTSTATUS
3202 (NTAPI *PFNKSFILTERIRP)(
3203  _In_ PKSFILTER Filter,
3204  _In_ PIRP Irp);
3205 
3206 typedef NTSTATUS
3207 (NTAPI *PFNKSFILTERPROCESS)(
3208  _In_ PKSFILTER Filter,
3209  _In_ PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex);
3210 
3212 typedef NTSTATUS
3213 (NTAPI *PFNKSFILTERVOID)(
3214  _In_ PKSFILTER Filter);
3215 
3216 struct _KSFILTER_DISPATCH {
3217  PFNKSFILTERIRP Create;
3218  PFNKSFILTERIRP Close;
3219  PFNKSFILTERPROCESS Process;
3220  PFNKSFILTERVOID Reset;
3221 };
3222 
3223 struct _KSNODE_DESCRIPTOR {
3224  const KSAUTOMATION_TABLE *AutomationTable;
3225  const GUID *Type;
3226  const GUID *Name;
3227 #if !defined(_WIN64)
3228  PVOID Alignment;
3229 #endif
3230 };
3231 
3232 struct _KSFILTER_DESCRIPTOR {
3233  const KSFILTER_DISPATCH *Dispatch;
3234  const KSAUTOMATION_TABLE *AutomationTable;
3235  ULONG Version;
3236  ULONG Flags;
3237  const GUID *ReferenceGuid;
3238  ULONG PinDescriptorsCount;
3239  ULONG PinDescriptorSize;
3240  _Field_size_bytes_(PinDescriptorsCount * PinDescriptorSize) const KSPIN_DESCRIPTOR_EX *PinDescriptors;
3241  ULONG CategoriesCount;
3242  _Field_size_(CategoriesCount) const GUID *Categories;
3243  ULONG NodeDescriptorsCount;
3244  ULONG NodeDescriptorSize;
3245  _Field_size_bytes_(NodeDescriptorsCount * NodeDescriptorSize) const KSNODE_DESCRIPTOR *NodeDescriptors;
3246  ULONG ConnectionsCount;
3247  _Field_size_(ConnectionsCount) const KSTOPOLOGY_CONNECTION *Connections;
3248  const KSCOMPONENTID *ComponentId;
3249 };
3250 
3251 #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
3252 
3253 struct _KSDEVICE_DESCRIPTOR {
3254  const KSDEVICE_DISPATCH *Dispatch;
3255  ULONG FilterDescriptorsCount;
3256  _Field_size_(FilterDescriptorsCount) const KSFILTER_DESCRIPTOR * const *FilterDescriptors;
3257  ULONG Version;
3258  ULONG Flags;
3259 };
3260 
3261 struct _KSFILTERFACTORY {
3262  const KSFILTER_DESCRIPTOR* FilterDescriptor;
3263  KSOBJECT_BAG Bag;
3264  PVOID Context;
3265 };
3266 
3267 #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
3268  const KSFILTER_DESCRIPTOR descriptor =
3269 
3270 #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
3271  SIZEOF_ARRAY(table),\
3272  sizeof(table[0]),\
3273  table
3274 
3275 #define DEFINE_KSFILTER_CATEGORIES(table)\
3276  SIZEOF_ARRAY(table),\
3277  table
3278 
3279 #define DEFINE_KSFILTER_CATEGORY(category)\
3280  1,\
3281  &(category)
3282 
3283 #define DEFINE_KSFILTER_CATEGORIES_NULL\
3284  0,\
3285  NULL
3286 
3287 #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
3288  SIZEOF_ARRAY(table),\
3289  sizeof(table[0]),\
3290  table
3291 
3292 #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
3293  0,\
3294  sizeof(KSNODE_DESCRIPTOR),\
3295  NULL
3296 
3297 #define DEFINE_KSFILTER_CONNECTIONS(table)\
3298  SIZEOF_ARRAY(table),\
3299  table
3300 
3301 #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
3302  0,\
3303  NULL
3304 
3305 #endif /* _NTDDK_ */
3306 
3307 /* ===============================================================
3308  Minidriver Callbacks
3309 */
3310 
3311 #if defined(_NTDDK_)
3312 
3313 typedef NTSTATUS
3314 (NTAPI *KStrMethodHandler)(
3315  IN PIRP Irp,
3317  IN OUT PVOID Data);
3318 
3319 typedef NTSTATUS
3320 (NTAPI *KStrSupportHandler)(
3321  IN PIRP Irp,
3323  IN OUT PVOID Data);
3324 
3325 #endif
3326 
3327 /* ===============================================================
3328  Allocator Functions
3329 */
3330 
3331 #if defined(_NTDDK_)
3332 
3334 KSDDKAPI
3335 NTSTATUS
3336 NTAPI
3341 
3343 KSDDKAPI
3344 NTSTATUS
3345 NTAPI
3347  _In_ PIRP Irp);
3348 
3350 KSDDKAPI
3351 NTSTATUS
3352 NTAPI
3354  _In_ PIRP Irp,
3356 
3358 KSDDKAPI
3359 NTSTATUS
3360 NTAPI
3362  _In_ PIRP Irp,
3364  _In_opt_ PFNKSDEFAULTALLOCATE DefaultAllocate,
3365  _In_opt_ PFNKSDEFAULTFREE DefaultFree,
3366  _In_opt_ PFNKSINITIALIZEALLOCATOR InitializeAllocator,
3367  _In_opt_ PFNKSDELETEALLOCATOR DeleteAllocator);
3368 
3370 KSDDKAPI
3371 NTSTATUS
3372 NTAPI
3374  _In_ PKSALLOCATOR_FRAMING_EX Framing,
3376  _In_ const KSALLOCATOR_FRAMING_EX *PinFraming);
3377 
3378 #endif /* _NTDDK_ */
3379 
3380 /* ===============================================================
3381  Clock Functions
3382 */
3383 
3384 #if defined(_NTDDK_)
3385 
3387 typedef BOOLEAN
3388 (NTAPI *PFNKSSETTIMER)(
3389  _In_ PVOID Context,
3390  _In_ PKTIMER Timer,
3392  _In_ PKDPC Dpc);
3393 
3395 typedef BOOLEAN
3396 (NTAPI *PFNKSCANCELTIMER)(
3397  _In_ PVOID Context,
3398  _In_ PKTIMER Timer);
3399 
3400 typedef LONGLONG
3401 (FASTCALL *PFNKSCORRELATEDTIME)(
3402  _In_ PVOID Context,
3403  _Out_ PLONGLONG SystemTime);
3404 
3406 KSDDKAPI
3407 NTSTATUS
3408 NTAPI
3413 
3415 KSDDKAPI
3416 NTSTATUS
3417 NTAPI
3419  _In_ PIRP Irp,
3420  _In_ PKSDEFAULTCLOCK DefaultClock);
3421 
3423 KSDDKAPI
3424 NTSTATUS
3425 NTAPI
3427  _Out_ PKSDEFAULTCLOCK *DefaultClock);
3428 
3430 KSDDKAPI
3431 NTSTATUS
3432 NTAPI
3434  _Out_ PKSDEFAULTCLOCK *DefaultClock,
3436  _In_opt_ PFNKSSETTIMER SetTimer,
3437  _In_opt_ PFNKSCANCELTIMER CancelTimer,
3438  _In_opt_ PFNKSCORRELATEDTIME CorrelatedTime,
3440  _In_ ULONG Flags);
3441 
3443 KSDDKAPI
3444 VOID
3445 NTAPI
3447  _In_ PKSDEFAULTCLOCK DefaultClock);
3448 
3450 KSDDKAPI
3451 NTSTATUS
3452 NTAPI
3454  _In_ PIRP Irp,
3456 
3458 KSDDKAPI
3459 KSSTATE
3460 NTAPI
3462  _In_ PKSDEFAULTCLOCK DefaultClock);
3463 
3465 KSDDKAPI
3466 VOID
3467 NTAPI
3469  _In_ PKSDEFAULTCLOCK DefaultClock,
3470  _In_ KSSTATE State);
3471 
3473 KSDDKAPI
3474 LONGLONG
3475 NTAPI
3477  _In_ PKSDEFAULTCLOCK DefaultClock);
3478 
3480 KSDDKAPI
3481 VOID
3482 NTAPI
3484  _In_ PKSDEFAULTCLOCK DefaultClock,
3485  _In_ LONGLONG Time);
3486 
3487 #endif /* _NTDDK_ */
3488 
3489 /* ===============================================================
3490  Method Functions
3491 */
3492 
3493 /* Method sets - TODO: Make into macros! */
3494 #if defined(_NTDDK_)
3495 
3496 #if 0
3497 
3498 VOID
3499 KSMETHOD_SET_IRP_STORAGE(
3500  IN IRP Irp);
3501 
3502 VOID
3503 KSMETHOD_ITEM_IRP_STORAGE(
3504  IN IRP Irp);
3505 
3506 VOID
3507 KSMETHOD_TYPE_IRP_STORAGE(
3508  IN IRP Irp);
3509 
3510 #endif
3511 
3513 KSDDKAPI
3514 NTSTATUS
3515 NTAPI
3516 KsMethodHandler(
3517  _In_ PIRP Irp,
3518  _In_ ULONG MethodSetsCount,
3519  _In_reads_(MethodSetsCount) const KSMETHOD_SET* MethodSet);
3520 
3522 KSDDKAPI
3523 NTSTATUS
3524 NTAPI
3525 KsMethodHandlerWithAllocator(
3526  _In_ PIRP Irp,
3527  _In_ ULONG MethodSetsCount,
3528  _In_reads_(MethodSetsCount) const KSMETHOD_SET* MethodSet,
3529  _In_opt_ PFNKSALLOCATOR Allocator,
3530  _In_opt_ ULONG MethodItemSize);
3531 
3533 KSDDKAPI
3534 BOOLEAN
3535 NTAPI
3538  _In_reads_bytes_(MethodLength) PKSMETHOD UNALIGNED Method,
3539  _In_ ULONG MethodLength,
3543  _In_ ULONG MethodSetsCount,
3544  _In_reads_(MethodSetsCount) const KSMETHOD_SET *MethodSet);
3545 
3546 #endif /* _NTDDK_ */
3547 
3548 /* ===============================================================
3549  Property Functions
3550 */
3551 
3552 #if defined(_NTDDK_)
3553 
3555 KSDDKAPI
3556 NTSTATUS
3557 NTAPI
3559  _In_ PIRP Irp,
3560  _In_ ULONG PropertySetsCount,
3561  _In_reads_(PropertySetsCount) const KSPROPERTY_SET *PropertySet);
3562 
3564 KSDDKAPI
3565 NTSTATUS
3566 NTAPI
3567 KsPropertyHandlerWithAllocator(
3568  _In_ PIRP Irp,
3569  _In_ ULONG PropertySetsCount,
3570  _In_reads_(PropertySetsCount) const KSPROPERTY_SET* PropertySet,
3571  _In_opt_ PFNKSALLOCATOR Allocator,
3572  _In_opt_ ULONG PropertyItemSize);
3573 
3575 KSDDKAPI
3576 NTSTATUS
3577 NTAPI
3580  _In_opt_ HANDLE ParentKey,
3582 
3584 KSDDKAPI
3585 BOOLEAN
3586 NTAPI
3590  _In_ ULONG PropertyLength,
3594  _In_ ULONG PropertySetsCount,
3595  _In_reads_(PropertySetsCount) const KSPROPERTY_SET *PropertySet);
3596 
3597 #endif /* _NTDDK_ */
3598 
3599 /* ===============================================================
3600  Event Functions
3601 */
3602 
3603 #if defined(_NTDDK_)
3604 
3605 #define KSPROBE_STREAMREAD 0x00000000
3606 #define KSPROBE_STREAMWRITE 0x00000001
3607 #define KSPROBE_ALLOCATEMDL 0x00000010
3608 #define KSPROBE_PROBEANDLOCK 0x00000020
3609 #define KSPROBE_SYSTEMADDRESS 0x00000040
3610 #define KSPROBE_MODIFY 0x00000200
3611 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
3612 #define KSPROBE_ALLOWFORMATCHANGE 0x00000080
3613 
3614 #define KSSTREAM_READ KSPROBE_STREAMREAD
3615 #define KSSTREAM_WRITE KSPROBE_STREAMWRITE
3616 #define KSSTREAM_PAGED_DATA 0x00000000
3617 #define KSSTREAM_NONPAGED_DATA 0x00000100
3618 #define KSSTREAM_SYNCHRONOUS 0x00001000
3619 #define KSSTREAM_FAILUREEXCEPTION 0x00002000
3620 
3622 typedef BOOLEAN
3623 (NTAPI *PFNKSGENERATEEVENTCALLBACK)(
3624  _In_ PVOID Context,
3625  _In_ PKSEVENT_ENTRY EventEntry);
3626 
3627 KSDDKAPI
3628 NTSTATUS
3629 NTAPI
3631  _In_ PKSEVENT_ENTRY EntryEvent);
3632 
3634 KSDDKAPI
3635 void
3636 NTAPI
3638  _In_ PVOID Object,
3639  _In_opt_ const GUID *EventSet,
3640  _In_ ULONG EventId,
3643  _In_opt_ PFNKSGENERATEEVENTCALLBACK CallBack,
3645 
3647 KSDDKAPI
3648 NTSTATUS
3649 NTAPI
3650 KsEnableEventWithAllocator(
3651  _In_ PIRP Irp,
3652  _In_ ULONG EventSetsCount,
3653  _In_reads_(EventSetsCount) const KSEVENT_SET* EventSet,
3654  _Inout_opt_ PLIST_ENTRY EventsList,
3655  _In_opt_ KSEVENTS_LOCKTYPE EventsFlags,
3656  _In_opt_ PVOID EventsLock,
3657  _In_opt_ PFNKSALLOCATOR Allocator,
3658  _In_opt_ ULONG EventItemSize);
3659 
3660 KSDDKAPI
3661 NTSTATUS
3662 NTAPI
3664  _In_ PKSEVENT_ENTRY EventEntry,
3667 
3669 KSDDKAPI
3670 NTSTATUS
3671 NTAPI
3673  _In_ PIRP Irp,
3674  _In_ ULONG EventSetsCount,
3675  _In_reads_(EventSetsCount) KSEVENT_SET *EventSet,
3676  _Inout_opt_ PLIST_ENTRY EventsList,
3677  _In_opt_ KSEVENTS_LOCKTYPE EventsFlags,
3678  _In_opt_ PVOID EventsLock);
3679 
3681 KSDDKAPI
3682 VOID
3683 NTAPI
3685  _In_ PKSEVENT_ENTRY EventEntry);
3686 
3688 KSDDKAPI
3689 NTSTATUS
3690 NTAPI
3692  _In_ PIRP Irp,
3693  _Inout_ PLIST_ENTRY EventsList,
3694  _In_ KSEVENTS_LOCKTYPE EventsFlags,
3695  _In_ PVOID EventsLock);
3696 
3698 KSDDKAPI
3699 VOID
3700 NTAPI
3703  _Inout_ PLIST_ENTRY EventsList,
3704  _In_ KSEVENTS_LOCKTYPE EventsFlags,
3705  _In_ PVOID EventsLock);
3706 
3707 /* ===============================================================
3708  Topology Functions
3709 */
3710 
3712 KSDDKAPI
3713 NTSTATUS
3714 NTAPI
3716  _In_ PIRP Irp,
3717  _In_ PKSTOPOLOGY Topology,
3719 
3721 KSDDKAPI
3722 NTSTATUS
3723 NTAPI
3725  _In_ HANDLE ParentHandle,
3729 
3731 KSDDKAPI
3732 NTSTATUS
3733 NTAPI
3735  _In_ PIRP Irp,
3737  _Inout_ PVOID Data,
3738  _In_ const KSTOPOLOGY *Topology);
3739 
3740 /* ===============================================================
3741  Connectivity Functions
3742 */
3743 
3745 KSDDKAPI
3746 NTSTATUS
3747 NTAPI
3748 KsCreatePin(
3749  _In_ HANDLE FilterHandle,
3753 
3755 KSDDKAPI
3756 NTSTATUS
3757 NTAPI
3759  _In_ PIRP Irp,
3760  _In_ ULONG DescriptorsCount,
3761  _In_reads_(DescriptorsCount) KSPIN_DESCRIPTOR *Descriptor,
3763 
3765 KSDDKAPI
3766 NTSTATUS
3767 NTAPI
3769  _In_ PIRP Irp,
3771  _Inout_ PVOID Data,
3772  _In_ ULONG DescriptorsCount,
3773  _In_reads_(DescriptorsCount) const KSPIN_DESCRIPTOR *Descriptor);
3774 
3777 KSDDKAPI
3778 NTSTATUS
3779 NTAPI
3781  _In_ PIRP Irp,
3782  _In_ PKSP_PIN Pin,
3784  _In_ ULONG DescriptorsCount,
3785  _In_reads_(DescriptorsCount) const KSPIN_DESCRIPTOR *Descriptor,
3786  _In_ PFNKSINTERSECTHANDLER IntersectHandler);
3787 
3790 KSDDKAPI
3791 NTSTATUS
3792 NTAPI
3794  _In_ PIRP Irp,
3795  _In_ PKSP_PIN Pin,
3796  _Out_ PVOID Data,
3797  _In_ ULONG DescriptorsCount,
3798  _In_reads_bytes_(DescriptorsCount * DescriptorSize) const KSPIN_DESCRIPTOR *Descriptor,
3799  _In_ ULONG DescriptorSize,
3800  _In_opt_ PFNKSINTERSECTHANDLEREX IntersectHandler,
3801  _In_opt_ PVOID HandlerContext);
3802 
3804 KSDDKAPI
3805 PKSFILTER
3806 NTAPI
3808  _In_ PKSPIN Pin);
3809 
3811 KSDDKAPI
3812 PKSPIN
3813 NTAPI
3815  _In_ PKSPIN Pin);
3816 
3818 KSDDKAPI
3819 PKSSTREAM_POINTER
3820 NTAPI
3822  _In_ PKSPIN Pin,
3824 
3826 KSDDKAPI
3827 NTSTATUS
3828 NTAPI
3830  _In_ PKSSTREAM_POINTER StreamPointer,
3832 );
3833 
3835 KSDDKAPI
3836 void
3837 NTAPI
3839  _In_ PKSSTREAM_POINTER StreamPointer
3840 );
3841 
3843 KSDDKAPI
3844 NTSTATUS
3845 NTAPI
3847  _In_ PKSSTREAM_POINTER StreamPointer,
3848  _In_opt_ PFNKSSTREAMPOINTER CancelCallback,
3850  _Out_ PKSSTREAM_POINTER* CloneStreamPointer
3851 );
3852 
3853 
3854 /* Does this belong here? */
3855 
3857 KSDDKAPI
3858 NTSTATUS
3859 NTAPI
3861  _In_ PIRP Irp,
3862  _In_ ULONG DataItemsCount,
3863  _In_ ULONG DataItemSize,
3864  _In_reads_bytes_(DataItemsCount * DataItemSize) const VOID *DataItems);
3865 
3866 /* ===============================================================
3867  IRP Helper Functions
3868 */
3869 
3871 typedef NTSTATUS
3872 (NTAPI *PFNKSIRPLISTCALLBACK)(
3873  _In_ PIRP Irp,
3874  _In_ PVOID Context);
3875 
3877 KSDDKAPI
3878 NTSTATUS
3879 NTAPI
3881  _In_ PIRP Irp,
3882  _Out_ KSRESET *ResetValue);
3883 
3885 KSDDKAPI
3886 VOID
3887 NTAPI
3889  _Inout_ PLIST_ENTRY QueueHead,
3891  _In_ PIRP Irp,
3892  _In_ KSLIST_ENTRY_LOCATION ListLocation,
3893  _In_opt_ PDRIVER_CANCEL DriverCancel);
3894 
3896 KSDDKAPI
3897 NTSTATUS
3898 NTAPI
3902  _In_ PVOID Context,
3903  _In_ PWSTR ObjectClass,
3905 
3907 KSDDKAPI
3908 NTSTATUS
3909 NTAPI
3913  _In_ PVOID Context,
3914  _In_ PWSTR ObjectClass,
3916 
3918 KSDDKAPI
3919 NTSTATUS
3920 NTAPI
3923  _In_ ULONG ItemsCount,
3924  _In_reads_opt_(ItemsCount) PKSOBJECT_CREATE_ITEM ItemsList);
3925 
3927 KSDDKAPI
3928 NTSTATUS
3929 NTAPI
3931  _Inout_ PIRP Irp,
3932  _In_ ULONG ExtraSize,
3933  _Out_ PVOID *ExtraBuffer);
3934 
3936 KSDDKAPI
3937 NTSTATUS
3938 NTAPI
3941  _In_ PKSOBJECT_CREATE_ITEM CreateItem,
3942  _In_ BOOLEAN AllocateEntry,
3943  _In_opt_ PFNKSITEMFREECALLBACK ItemFreeCallback);
3944 
3946 KSDDKAPI
3947 NTSTATUS
3948 NTAPI
3951  _In_ ULONG ItemsCount,
3952  _In_reads_opt_(ItemsCount) PKSOBJECT_CREATE_ITEM ItemsList,
3953  _In_ PIRP Irp,
3954  _In_ KSDISPATCH_TABLE *Table);
3955 
3957 KSDDKAPI
3958 VOID
3959 NTAPI
3960 KsCancelIo(
3961  _Inout_ PLIST_ENTRY QueueHead,
3963 
3965 KSDDKAPI
3966 VOID
3967 NTAPI
3970  _In_ PIRP Irp);
3971 
3973 KSDDKAPI
3974 NTSTATUS
3975 NTAPI
3978  _In_ PIRP Irp);
3979 
3981 KSDDKAPI
3982 BOOLEAN
3983 NTAPI
3986  _In_ BOOLEAN Wait,
3993  _In_ PDEVICE_OBJECT DeviceObject); /* always return false */
3994 
3996 KSDDKAPI
3997 BOOLEAN
3998 NTAPI
4002  _In_ ULONG Length,
4003  _In_ BOOLEAN Wait,
4004  _In_ ULONG LockKey,
4005  _Out_ PVOID Buffer,
4007  _In_ PDEVICE_OBJECT DeviceObject); /* always return false */
4008 
4009 /* This function does the same as the above */
4010 #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
4011 
4013 KSDDKAPI
4014 NTSTATUS
4015 NTAPI
4018  _In_ PIRP Irp);
4019 
4021 KSDDKAPI
4022 NTSTATUS
4023 NTAPI
4026  _In_ PIRP Irp);
4027 
4029 KSDDKAPI
4030 NTSTATUS
4031 NTAPI
4033  _In_ PIRP Irp,
4034  _In_ PFNKSHANDLER Handler);
4035 
4037 KSDDKAPI
4038 NTSTATUS
4039 NTAPI
4041  _In_ PIRP Irp,
4042  _In_ PFNKSHANDLER Handler);
4043 
4045 KSDDKAPI
4046 NTSTATUS
4047 NTAPI
4050  _In_ PIRP Irp,
4052  _In_ KSSTACK_USE StackUse);
4053 
4055 KSDDKAPI
4056 NTSTATUS
4057 NTAPI
4058 KsForwardIrp(
4059  _In_ PIRP Irp,
4061  _In_ BOOLEAN ReuseStackLocation);
4062 
4064 KSDDKAPI
4065 VOID
4066 NTAPI
4069 
4071 KSDDKAPI
4072 VOID
4073 NTAPI
4075  _In_ PVOID Header);
4076 
4077 KSDDKAPI
4078 NTSTATUS
4079 NTAPI
4080 KsGetChildCreateParameter(
4081  _In_ PIRP Irp,
4082  _Out_ PVOID *CreateParameter);
4083 
4085 KSDDKAPI
4086 NTSTATUS
4087 NTAPI
4090  _In_ PKSPIN_LOCK SourceLock,
4091  _Inout_ PLIST_ENTRY DestinationList,
4092  _In_opt_ PKSPIN_LOCK DestinationLock,
4093  _In_ KSLIST_ENTRY_LOCATION ListLocation,
4094  _In_ PFNKSIRPLISTCALLBACK ListCallback,
4095  _In_ PVOID Context);
4096 
4098 KSDDKAPI
4099 NTSTATUS
4100 NTAPI
4102  _Inout_ PIRP Irp,
4103  _In_ ULONG ProbeFlags,
4104  _In_ ULONG HeaderSize);
4105 
4107 KSDDKAPI
4108 NTSTATUS
4109 NTAPI
4113  _In_ ULONG Length,
4115 
4117 KSDDKAPI
4119 NTAPI
4122 
4124 KSDDKAPI
4125 PKSOBJECT_CREATE_ITEM
4126 NTAPI
4129 
4131 KSDDKAPI
4132 NTSTATUS
4133 NTAPI
4134 KsReadFile(
4137  _In_opt_ PVOID PortContext,
4140  _In_ ULONG Length,
4141  _In_opt_ ULONG Key,
4142  _In_ KPROCESSOR_MODE RequestorMode);
4143 
4145 KSDDKAPI
4146 VOID
4147 NTAPI
4149  _In_ PKSDEVICE);
4150 
4152 KSDDKAPI
4153 VOID
4154 NTAPI
4156  _In_ PIRP Irp,
4157  _In_opt_ PDRIVER_CANCEL DriverCancel);
4158 
4160 KSDDKAPI
4161 PIRP
4162 NTAPI
4164  _Inout_ PLIST_ENTRY QueueHead,
4166  _In_ KSLIST_ENTRY_LOCATION ListLocation,
4167  _In_ KSIRP_REMOVAL_OPERATION RemovalOperation);
4168 
4170 KSDDKAPI
4171 VOID
4172 NTAPI
4174  _In_ PIRP Irp);
4175 
4177 KSDDKAPI
4178 NTSTATUS
4179 NTAPI
4183  _In_ ULONG Length,
4185 
4187 KSDDKAPI
4188 NTSTATUS
4189 NTAPI
4192  _In_ ULONG MajorFunction);
4193 
4196 KSDDKAPI
4197 NTSTATUS
4198 NTAPI
4199 KsStreamIo(
4202  _In_opt_ PVOID PortContext,
4205  _In_opt_ KSCOMPLETION_INVOCATION CompletionInvocationFlags,
4207  _Inout_updates_bytes_(Length) PVOID StreamHeaders,
4208  _In_ ULONG Length,
4209  _In_ ULONG Flags,
4210  _In_ KPROCESSOR_MODE RequestorMode);
4211 
4213 KSDDKAPI
4214 VOID
4215 NTAPI
4217  _In_ PKSSTREAM_POINTER StreamPointer,
4218  _In_ BOOLEAN Eject);
4219 
4221 KSDDKAPI
4222 NTSTATUS
4223 NTAPI
4225  _In_ PKSSTREAM_POINTER StreamPointer,
4226  _In_ ULONG InUsed,
4227  _In_ ULONG OutUsed,
4228  _In_ BOOLEAN Eject);
4229 
4232 KSDDKAPI
4233 NTSTATUS
4234 NTAPI
4236  _In_ PKSSTREAM_POINTER StreamPointer);
4237 
4239 KSDDKAPI
4240 VOID
4241 NTAPI
4243  _In_ PKSSTREAM_POINTER StreamPointer,
4244  _In_ ULONG InUsed,
4245  _In_ ULONG OutUsed,
4246  _In_ BOOLEAN Eject
4247  );
4248 
4249 
4251 KSDDKAPI
4252 NTSTATUS
4253 NTAPI
4254 KsWriteFile(
4257  _In_opt_ PVOID PortContext,
4260  _In_ ULONG Length,
4261  _In_opt_ ULONG Key,
4262  _In_ KPROCESSOR_MODE RequestorMode);
4263 
4264 KSDDKAPI
4265 NTSTATUS
4266 NTAPI
4269  _In_ PIRP Irp);
4270 
4271 /* ===============================================================
4272  Worker Management Functions
4273 */
4274 
4276 KSDDKAPI
4277 NTSTATUS
4278 NTAPI
4280  _In_ WORK_QUEUE_TYPE WorkQueueType,
4281  _Out_ PKSWORKER* Worker);
4282 
4284 KSDDKAPI
4285 VOID
4286 NTAPI
4288  _In_ PKSWORKER Worker);
4289 
4291 KSDDKAPI
4292 NTSTATUS
4293 NTAPI
4295  _In_ WORK_QUEUE_TYPE WorkQueueType,
4296  _In_ PWORK_QUEUE_ITEM CountedWorkItem,
4297  _Out_ PKSWORKER *Worker);
4298 
4300 KSDDKAPI
4301 ULONG
4302 NTAPI
4304  _In_ PKSWORKER Worker);
4305 
4307 KSDDKAPI
4308 ULONG
4309 NTAPI
4311  _In_ PKSWORKER Worker);
4312 
4314 KSDDKAPI
4315 NTSTATUS
4316 NTAPI
4318  _In_ PKSWORKER Worker,
4319  _In_ PWORK_QUEUE_ITEM WorkItem);
4320 
4321 /* ===============================================================
4322  Resources / Images
4323 */
4324 
4326 KSDDKAPI
4327 NTSTATUS
4328 NTAPI
4330  _In_ PVOID ImageBase,
4332  _In_ ULONG_PTR ResourceName,
4333  _In_ ULONG ResourceType,
4334  _Outptr_result_bytebuffer_(*ResourceSize) PVOID *Resource,
4335  _Out_opt_ PULONG ResourceSize);
4336 
4338 KSDDKAPI
4339 NTSTATUS
4340 NTAPI
4342  _In_ HANDLE RegKey,
4344  _Out_ PULONG_PTR ResourceId,
4346 
4348 KSDDKAPI
4349 NTSTATUS
4350 NTAPI
4355  _Out_ PULONG_PTR ResourceId,
4357 
4358 /* ===============================================================
4359  Misc. Helper Functions
4360 */
4361 
4363 KSDDKAPI
4364 PVOID
4365 NTAPI
4367  _In_ PVOID Object);
4368 
4370 KSDDKAPI
4371 NTSTATUS
4372 NTAPI
4375  _In_ PKSPIN_MEDIUM Medium,
4376  _In_ ULONG PinDirection);
4377 
4378 KSDDKAPI
4379 NTSTATUS
4380 NTAPI
4383  _In_ PIRP Irp);
4384 
4386 KSDDKAPI
4387 VOID
4388 NTAPI
4391  _In_ PDEVICE_OBJECT PnpDeviceObject,
4392  _In_ PDEVICE_OBJECT BaseDevice);
4393 
4394 KSDDKAPI
4395 NTSTATUS
4396 NTAPI
4399  _In_ PIRP Irp);
4400 
4402 KSDDKAPI
4403 VOID
4404 NTAPI
4407  _In_opt_ PFNKSCONTEXT_DISPATCH PowerDispatch,
4408  _In_opt_ PVOID PowerContext);
4409 
4411 KSDDKAPI
4412 NTSTATUS
4413 NTAPI
4416 
4418 KSDDKAPI
4419 VOID
4420 NTAPI
4423 
4425 KSDDKAPI
4426 NTSTATUS
4427 NTAPI
4430  _In_ PUNICODE_STRING CreateItem);
4431 
4433 KSDDKAPI
4434 NTSTATUS
4435 NTAPI
4438  _In_ PVOID Context);
4439 
4441 KSDDKAPI
4442 VOID
4443 NTAPI
4446 
4448 KSDDKAPI
4450 NTAPI
4453 
4455 KSDDKAPI
4456 VOID
4457 NTAPI
4460  _In_ BOOLEAN ReuseStackLocation);
4461 
4463 KSDDKAPI
4464 VOID
4465 NTAPI
4469 
4471 KSDDKAPI
4472 VOID
4473 NTAPI
4476  _In_ KSTARGET_STATE TargetState);
4477 
4480 KSDDKAPI
4481 NTSTATUS
4482 NTAPI
4485  _In_ KPROCESSOR_MODE RequestorMode,
4486  _In_ ULONG IoControl,
4487  _In_reads_bytes_(InSize) PVOID InBuffer,
4488  _In_ ULONG InSize,
4489  _Out_writes_bytes_to_(OutSize, *BytesReturned) PVOID OutBuffer,
4490  _In_ ULONG OutSize,
4492 
4494 KSDDKAPI
4495 PKSPIN
4496 NTAPI
4498  _In_ PKSFILTER Filter,
4499  _In_ ULONG PinId);
4500 
4502 KSDDKAPI
4504 NTAPI
4506  _In_ PKSPIN Pin);
4507 
4508 #else /* _NTDDK_ */
4509 
4510 #if !defined( KS_NO_CREATE_FUNCTIONS )
4511 
4513 KSDDKAPI
4514 DWORD
4515 WINAPI
4520 
4522 KSDDKAPI
4523 DWORD
4524 NTAPI
4529 
4531 KSDDKAPI
4532 DWORD
4533 WINAPI
4534 KsCreatePin(
4535  _In_ HANDLE FilterHandle,
4539 
4541 KSDDKAPI
4542 DWORD
4543 WINAPI
4545  _In_ HANDLE ParentHandle,
4549 
4550 #endif
4551 
4552 #endif /* _NTDDK_ */
4553 
4554 /* ===============================================================
4555  AVStream Functions (XP / DirectX 8)
4556  NOT IMPLEMENTED YET
4557  http://www.osronline.com/ddkx/stream/avstream_5q9f.htm
4558 */
4559 
4560 #if defined(_NTDDK_)
4561 
4563 KSDDKAPI
4564 NTSTATUS
4565 NTAPI
4567  _Out_ PKSAUTOMATION_TABLE *AutomationTableAB,
4568  _In_opt_ PKSAUTOMATION_TABLE AutomationTableA,
4569  _In_opt_ PKSAUTOMATION_TABLE AutomationTableB,
4570  _In_opt_ KSOBJECT_BAG Bag);
4571 
4574 KSDDKAPI
4575 NTSTATUS
4576 NTAPI
4580  _In_opt_ const KSDEVICE_DESCRIPTOR *Descriptor);
4581 
4582 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME
4583 
4585 KSDDKAPI
4586 NTSTATUS
4587 NTAPI
4592  _In_opt_ const KSDEVICE_DESCRIPTOR *Descriptor);
4593 
4595 typedef void
4596 (NTAPI *PFNKSFILTERFACTORYPOWER)(
4597  _In_ PKSFILTERFACTORY FilterFactory,
4599 
4602 KSDDKAPI
4603 NTSTATUS
4604 NTAPI
4605 _KsEdit(
4606  _In_ KSOBJECT_BAG ObjectBag,
4607  _Inout_ PVOID *PointerToPointerToItem,
4608  _In_ ULONG NewSize,
4609  _In_ ULONG OldSize,
4610  _In_ ULONG Tag);
4611 
4613 KSDDKAPI
4614 VOID
4615 NTAPI
4617  _In_ PVOID Object);
4618 
4620 KSDDKAPI
4621 VOID
4622 NTAPI
4624  _In_ PKSDEVICE Device);
4625 
4627 KSDDKAPI
4628 NTSTATUS
4629 NTAPI
4630 KsAddDevice(
4633 
4635 KSDDKAPI
4636 VOID
4637 NTAPI
4638 KsAddEvent(
4639  _In_ PVOID Object,
4640  _In_ PKSEVENT_ENTRY EventEntry);
4641 
4644 KSDDKAPI
4645 NTSTATUS
4646 NTAPI
4648  _In_ KSOBJECT_BAG ObjectBag,
4650  _In_opt_ PFNKSFREE Free);
4651 
4653 KSDDKAPI
4654 ULONG
4655 NTAPI
4657  _In_ KSOBJECT_BAG ObjectBag,
4658  _In_ PVOID Item,
4659  _In_ BOOLEAN Free);
4660 
4662 KSDDKAPI
4663 NTSTATUS
4664 NTAPI
4666  _In_ PKSDEVICE Device,
4667  _Out_ KSOBJECT_BAG *ObjectBag);
4668 
4670 KSDDKAPI
4671 VOID
4672 NTAPI
4674  _In_ KSOBJECT_BAG ObjectBag);
4675 
4677 KSDDKAPI
4678 VOID
4679 NTAPI
4681  _In_ PIRP Irp);
4682 
4684 KSDDKAPI
4685 NTSTATUS
4686 NTAPI
4688  _In_ KSOBJECT_BAG ObjectBagDestination,
4689  _In_ KSOBJECT_BAG ObjectBagSource);
4690 
4692 KSDDKAPI
4693 NTSTATUS
4694 NTAPI
4698  _In_opt_ const KSDEVICE_DESCRIPTOR *Descriptor,
4699  _In_ ULONG ExtensionSize,
4700  _Out_opt_ PKSDEVICE *Device);
4701 
4704 KSDDKAPI
4705 NTSTATUS
4706 NTAPI
4709  _In_ const KSFILTER_DESCRIPTOR *Descriptor,
4710  _In_opt_ PWSTR RefString,
4712  _In_ ULONG CreateItemFlags,
4713  _In_opt_ PFNKSFILTERFACTORYPOWER SleepCallback,
4714  _In_opt_ PFNKSFILTERFACTORYPOWER WakeCallback,
4715  _Out_opt_ PKSFILTERFACTORY *FilterFactory);
4716 
4718 KSDDKAPI
4719 NTSTATUS
4720 NTAPI
4722  _In_ PKSFILTERFACTORY FilterFactory,
4723  _In_ BOOLEAN NewState);
4724 
4727 KSDDKAPI
4728 NTSTATUS
4729 NTAPI
4731  _In_ PKSFILTERFACTORY FilterFactory,
4732  _In_opt_ const KSFILTER_DESCRIPTOR *FilterDescriptor);
4733 
4735 KSDDKAPI
4736 PKSPIN
4737 NTAPI
4739  _In_ PIRP Irp);
4740 
4742 KSDDKAPI
4743 PKSFILTER
4744 NTAPI
4746  _In_ PIRP Irp);
4747 
4749 KSDDKAPI
4750 NTSTATUS
4751 NTAPI
4753  _In_ PIRP Irp,
4754  _In_ PKSEVENTDATA EventData,
4755  _Inout_ PKSEVENT_ENTRY EventEntry);
4756 
4758 KSDDKAPI
4759 NTSTATUS
4760 NTAPI
4763  _In_ PIRP Irp);
4764 
4766 KSDDKAPI
4767 NTSTATUS
4768 NTAPI
4771  _In_ PIRP Irp);
4772 
4774 KSDDKAPI
4775 VOID
4776 NTAPI
4778  _In_ PKSPIN Pin,
4780 
4782 KSDDKAPI
4783 VOID
4784 NTAPI
4786  _In_ PKSPIN Pin);
4787 
4789 KSDDKAPI
4790 VOID
4791 NTAPI
4793  _In_ PKSPIN Pin);
4794 
4796 KSDDKAPI
4797 PVOID
4798 NTAPI
4799 KsGetParent(
4800  _In_ PVOID Object);
4801 
4803 static
4804 __inline
4805 PKSFILTERFACTORY
4806 KsFilterGetParentFilterFactory(
4807  _In_ PKSFILTER Filter)
4808 {
4809  return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
4810 }
4811 
4813 static
4814 __inline
4815 PKSDEVICE
4816 KsFilterFactoryGetParentDevice(
4817  _In_ PKSFILTERFACTORY FilterFactory)
4818 {
4819  return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
4820 }
4821 
4822 #define KsDeleteFilterFactory(FilterFactory) \
4823  KsFreeObjectCreateItemsByContext( \
4824  *(KSDEVICE_HEADER *)( \
4825  KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject-> \
4826  DeviceExtension), \
4827  FilterFactory)
4828 
4830 KSDDKAPI
4831 ULONG
4832 NTAPI
4834  _In_ PKSDEVICE Device,
4837  _In_ ULONG Offset,
4838  _In_ ULONG Length);
4839 
4841 KSDDKAPI
4842 PVOID
4843 NTAPI
4845  _In_ PVOID Object);
4846 
4848 KSDDKAPI
4849 PKSFILTERFACTORY
4850 NTAPI
4851 KsDeviceGetFirstChildFilterFactory(
4852  _In_ PKSDEVICE Device);
4853 
4854 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
4855 
4857 KSDDKAPI
4858 PUNKNOWN
4859 NTAPI
4861  _In_ PVOID Object);
4862 
4864 static
4865 __inline
4866 PUNKNOWN
4867 KsDeviceGetOuterUnknown(
4868  _In_ PKSDEVICE Device)
4869 {
4870  return KsGetOuterUnknown((PVOID) Device);
4871 }
4872 
4874 KSDDKAPI
4875 PUNKNOWN
4876 NTAPI
4877 KsDeviceRegisterAggregatedClientUnknown(
4878  _In_ PKSDEVICE Device,
4879  _In_ PUNKNOWN ClientUnknown);
4880 
4881 #endif
4882 
4883 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
4884 
4885 typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
4886 
4887 #undef INTERFACE
4888 #define INTERFACE IKsReferenceClock
4889 DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
4890 {
4891  DEFINE_ABSTRACT_UNKNOWN() // For C
4892 
4894  ) PURE;
4895  STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
4896  ) PURE;
4897  STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
4898  _Out_ PLONGLONG SystemTime
4899  ) PURE;
4900  STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
4901  _Out_ PLONGLONG SystemTime
4902  ) PURE;
4903  STDMETHOD_(NTSTATUS, GetResolution)(THIS_
4905  ) PURE;
4906  STDMETHOD_(NTSTATUS, GetState)(THIS_
4908  ) PURE;
4909 };
4910 
4911 #undef INTERFACE
4912 #define INTERFACE IKsControl
4913 
4914 DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
4915 
4917 {
4919  REFIID InterfaceId,
4920  PVOID* Interface)PURE;
4921 
4923 
4925 
4926  STDMETHOD_(NTSTATUS, KsProperty)(THIS_
4927  _In_reads_bytes_(PropertyLength) PKSPROPERTY Property,
4928  _In_ ULONG PropertyLength,
4929  _Inout_updates_bytes_(DataLength) PVOID PropertyData,
4932  ) PURE;
4933  STDMETHOD_(NTSTATUS, KsMethod)(THIS_
4934  _In_reads_bytes_(MethodLength) PKSMETHOD Method,
4935  _In_ ULONG MethodLength,
4939  ) PURE;
4940  STDMETHOD_(NTSTATUS, KsEvent)(THIS_
4941  _In_reads_bytes_opt_(EventLength) PKSEVENT Event,
4942  _In_ ULONG EventLength,
4946  ) PURE;
4947 };
4948 
4949 #undef INTERFACE
4950 typedef IKsControl* PIKSCONTROL;
4951 
4952 #endif
4953 
4955 KSDDKAPI
4956 VOID
4957 NTAPI
4959  _In_ PKSDEVICE Device,
4960  _In_ PADAPTER_OBJECT AdapterObject,
4961  _In_ ULONG MaxMappingByteCount,
4962  _In_ ULONG MappingTableStride);
4963 
4965 KSDDKAPI
4966 ULONG
4967 NTAPI
4969  _In_ PKSDEVICE Device,
4972  _In_ ULONG Offset,
4973  _In_ ULONG Length);
4974 
4976 KSDDKAPI
4977 VOID
4978 NTAPI
4980  _In_ PVOID Object);
4981 
4982 #define KsDiscard(object, pointer) \
4983  KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE)
4984 
4985 #define KsFilterAcquireControl(Filter) \
4986  KsAcquireControl((PVOID) Filter);
4987 
4988 #define KsFilterReleaseControl(Filter) \
4989  KsReleaseControl((PVOID) Filter);
4990 
4991 #define KsFilterAddEvent(Filter, EventEntry) \
4992  KsAddEvent(Filter,EventEntry);
4993 
4995 KSDDKAPI
4996 VOID
4997 NTAPI
4999  _In_ PKSFILTER Filter);
5000 
5002 KSDDKAPI
5003 NTSTATUS
5004 NTAPI
5006  _In_ PKSFILTER Filter,
5007  _In_ ULONG NewConnectionsCount,
5008  _In_reads_(NewConnectionsCount) const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
5009 
5011 KSDDKAPI
5012 VOID
5013 NTAPI
5015  _In_ PKSFILTER Filter,
5017 
5019 KSDDKAPI
5020 NTSTATUS
5021 NTAPI
5023  _In_ PKSFILTER Filter,
5024  _In_ const KSNODE_DESCRIPTOR *const NodeDescriptor,
5025  _Out_ PULONG NodeID);
5026 
5028 KSDDKAPI
5029 NTSTATUS
5030 NTAPI
5032  _In_ PKSFILTER Filter,
5033  _In_ const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
5034  _Out_ PULONG PinID);
5035 
5037 KSDDKAPI
5038 PKSDEVICE
5039 NTAPI
5040 KsGetDevice(
5041  _In_ PVOID Object);
5042 
5044 static
5045 __inline
5046 PKSDEVICE
5047 KsFilterFactoryGetDevice(
5048  _In_ PKSFILTERFACTORY FilterFactory)
5049 {
5050  return KsGetDevice((PVOID)FilterFactory);
5051 }
5052 
5053 /* etc. */
5054 #endif /* avstream */
5055 
5056 #ifdef __cplusplus
5057 }
5058 #endif
5059 
5060 #endif /* _KS_ */
#define KSNAME_Filter
Definition: ks.h:111
ULONG TopologyConnectionsCount
Definition: ks.h:2624
ULONG Count
Definition: ks.h:1980
KSDDKAPI VOID NTAPI KsStreamPointerDelete(IN PKSSTREAM_POINTER StreamPointer)
Definition: pin.c:1497
KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1172
KSEVENTDATA EventData
Definition: ks.h:1807
PKSFILTER NTAPI KsPinGetParentFilter(IN PKSPIN Pin)
Definition: pin.c:1097
#define _Inout_updates_bytes_(size)
Definition: no_sal2.h:287
KSDDKAPI VOID NTAPI KsSetDefaultClockTime(IN PKSDEFAULTCLOCK DefaultClock, IN LONGLONG Time)
Definition: clocks.c:568
KSDDKAPI NTSTATUS NTAPI KsRegisterWorker(IN WORK_QUEUE_TYPE WorkQueueType, OUT PKSWORKER *Worker)
Definition: worker.c:88