[BASESRV-CONSRV-WINSRV]
[reactos.git] / include / psdk / ks.h
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 #ifndef DEFINE_GUIDEX
71 #ifdef _MSC_VER
72 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
73 #else
74 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
75 #endif
76 #endif
77
78 #ifndef STATICGUIDOF
79 #define STATICGUIDOF(guid) STATIC_##guid
80 #endif
81 #endif
82
83 #if defined(__cplusplus)
84 #if _MSC_VER >= 1100
85 #define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name
86 #define DEFINE_GUIDNAMED(name) __uuidof(struct name)
87 #else
88 extern "C++" {
89 template<typename T> const GUID &__mingw_uuidof();
90 }
91 #define DEFINE_GUIDSTRUCT(guid, name) \
92 struct __guid ## name; \
93 extern "C++" { \
94 template<> inline const GUID &__mingw_uuidof<__guid ## name>() { \
95 static const IID iid = {STATICGUIDOF(name)}; \
96 return iid; \
97 } \
98 template<> inline const GUID &__mingw_uuidof<__guid ## name *>() { \
99 return __mingw_uuidof<__guid ## name>(); \
100 } \
101 }
102 #define DEFINE_GUIDNAMED(name) __mingw_uuidof<__guid ## name>()
103 #endif
104 #else
105 #define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name)
106 #define DEFINE_GUIDNAMED(name) name
107 #endif
108
109
110 #define STATIC_GUID_NULL \
111 0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
112 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
113 #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
114
115 #define STATIC_KSNAME_Filter\
116 0x9b365890L, 0x165f, 0x11d0, {0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
117 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
118 #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
119
120 #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
121 0xd833f8f8L, 0x7894, 0x11d1, {0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}
122 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
123 #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
124
125 /* ===============================================================
126 I/O Control Codes
127 */
128
129 #define IOCTL_KS_DISABLE_EVENT \
130 CTL_CODE( \
131 FILE_DEVICE_KS, \
132 0x000, \
133 METHOD_NEITHER, \
134 FILE_ANY_ACCESS)
135
136 #define IOCTL_KS_ENABLE_EVENT \
137 CTL_CODE( \
138 FILE_DEVICE_KS, \
139 0x001, \
140 METHOD_NEITHER, \
141 FILE_ANY_ACCESS)
142
143 // WAS 2
144 #define IOCTL_KS_METHOD \
145 CTL_CODE( \
146 FILE_DEVICE_KS, \
147 0x003, \
148 METHOD_NEITHER, \
149 FILE_ANY_ACCESS)
150
151 // WAS 3
152 #define IOCTL_KS_PROPERTY \
153 CTL_CODE( \
154 FILE_DEVICE_KS, \
155 0x000, \
156 METHOD_NEITHER, \
157 FILE_ANY_ACCESS)
158
159 #define IOCTL_KS_WRITE_STREAM \
160 CTL_CODE( \
161 FILE_DEVICE_KS, \
162 0x004, \
163 METHOD_NEITHER, \
164 FILE_WRITE_ACCESS)
165
166 #define IOCTL_KS_READ_STREAM \
167 CTL_CODE( \
168 FILE_DEVICE_KS, \
169 0x005, \
170 METHOD_NEITHER, \
171 FILE_READ_ACCESS)
172
173 #define IOCTL_KS_RESET_STATE \
174 CTL_CODE( \
175 FILE_DEVICE_KS, \
176 0x006, \
177 METHOD_NEITHER, \
178 FILE_ANY_ACCESS)
179
180
181 /* ===============================================================
182 Categories
183 */
184
185 #define STATIC_KSCATEGORY_BRIDGE \
186 0x085AFF00L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
187 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
188 #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
189
190 #define STATIC_KSCATEGORY_CAPTURE \
191 0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
192 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
193 #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
194
195 #define STATIC_KSCATEGORY_RENDER \
196 0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
197 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
198 #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
199
200 #define STATIC_KSCATEGORY_MIXER \
201 0xAD809C00L, 0x7B88, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
202 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
203 #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
204
205 #define STATIC_KSCATEGORY_SPLITTER \
206 0x0A4252A0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
207 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
208 #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
209
210 #define STATIC_KSCATEGORY_DATACOMPRESSOR \
211 0x1E84C900L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
212 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
213 #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
214
215 #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
216 0x2721AE20L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
217 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
218 #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
219
220 #define STATIC_KSCATEGORY_DATATRANSFORM \
221 0x2EB07EA0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
222 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
223 #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
224
225 #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
226 0xCF1DDA2CL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
227 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
228 #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
229
230 #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
231 0xCF1DDA2DL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
232 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
233 #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
234
235 #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
236 0xCF1DDA2EL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
237 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
238 #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
239
240 #define STATIC_KSCATEGORY_FILESYSTEM \
241 0x760FED5EL, 0x9357, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
242 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
243 #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
244
245 #define STATIC_KSCATEGORY_CLOCK \
246 0x53172480L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
247 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
248 #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
249
250 #define STATIC_KSCATEGORY_PROXY \
251 0x97EBAACAL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
252 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
253 #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
254
255 #define STATIC_KSCATEGORY_QUALITY \
256 0x97EBAACBL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
257 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
258 #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
259
260 /* ===============================================================
261 Common
262 */
263
264 typedef struct
265 {
266 GUID Set;
267 ULONG Id;
268 ULONG Flags;
269 } KSIDENTIFIER, *PKSIDENTIFIER;
270
271 typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY;
272 typedef KSIDENTIFIER KSMETHOD, *PKSMETHOD;
273 typedef KSIDENTIFIER KSEVENT, *PKSEVENT;
274
275 typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
276
277 typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
278 typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
279
280 typedef union {
281 struct {
282 ULONG FormatSize;
283 ULONG Flags;
284 ULONG SampleSize;
285 ULONG Reserved;
286 GUID MajorFormat;
287 GUID SubFormat;
288 GUID Specifier;
289 };
290 LONGLONG Alignment;
291 } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
292
293
294 typedef struct
295 {
296 ULONG Size;
297 ULONG Flags;
298 GUID Attribute;
299 } KSATTRIBUTE, *PKSATTRIBUTE;
300
301
302
303 /* ===============================================================
304 Interface Sets - TODO
305 */
306
307 #if 0
308 #define KSINTERFACESETID_Media
309
310 #define KSINTERFACE_STANDARD_STREAMING
311 #define KSINTERFACE_STANDARD_LOOPED_STREAMING
312 #define KSINTERFACE_STANDARD_CONTROL
313 #endif
314
315 #define STATIC_KSINTERFACESETID_Standard \
316 0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
317 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
318 #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
319
320 typedef enum
321 {
322 KSINTERFACE_STANDARD_STREAMING,
323 KSINTERFACE_STANDARD_LOOPED_STREAMING,
324 KSINTERFACE_STANDARD_CONTROL
325 } KSINTERFACE_STANDARD;
326
327 #define STATIC_KSINTERFACESETID_FileIo \
328 0x8C6F932CL, 0xE771, 0x11D0, {0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
329 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
330 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
331
332
333
334
335 /* ===============================================================
336 Mediums
337 */
338
339 typedef enum
340 {
341 KSINTERFACE_FILEIO_STREAMING
342 } KSINTERFACE_FILEIO;
343
344 #define KSMEDIUM_TYPE_ANYINSTANCE 0
345
346 #define STATIC_KSMEDIUMSETID_Standard \
347 0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
348 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
349 #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
350
351
352 /* ===============================================================
353 Clock Properties/Methods/Events
354 */
355
356 #define STATIC_KSPROPSETID_Clock \
357 0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
358 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
359 #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
360
361 typedef enum
362 {
363 KSPROPERTY_CLOCK_TIME,
364 KSPROPERTY_CLOCK_PHYSICALTIME,
365 KSPROPERTY_CLOCK_CORRELATEDTIME,
366 KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
367 KSPROPERTY_CLOCK_RESOLUTION,
368 KSPROPERTY_CLOCK_STATE,
369 #if defined(_NTDDK_)
370 KSPROPERTY_CLOCK_FUNCTIONTABLE
371 #endif // defined(_NTDDK_)
372 } KSPROPERTY_CLOCK;
373
374 #define STATIC_KSEVENTSETID_Clock \
375 0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
376 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
377 #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
378
379 typedef enum
380 {
381 KSEVENT_CLOCK_INTERVAL_MARK,
382 KSEVENT_CLOCK_POSITION_MARK
383 } KSEVENT_CLOCK_POSITION;
384
385
386 /* ===============================================================
387 Connection Properties/Methods/Events
388 */
389
390 #define STATIC_KSPROPSETID_Connection \
391 0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
392 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
393 #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
394
395
396 typedef enum
397 {
398 KSPROPERTY_CONNECTION_STATE,
399 KSPROPERTY_CONNECTION_PRIORITY,
400 KSPROPERTY_CONNECTION_DATAFORMAT,
401 KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
402 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
403 KSPROPERTY_CONNECTION_ACQUIREORDERING,
404 KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
405 KSPROPERTY_CONNECTION_STARTAT
406 } KSPROPERTY_CONNECTION;
407
408 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
409 DEFINE_KSPROPERTY_ITEM(\
410 KSPROPERTY_CONNECTION_STATE,\
411 (GetHandler),\
412 sizeof(KSPROPERTY),\
413 sizeof(KSSTATE),\
414 (SetHandler),\
415 NULL, 0, NULL, NULL, 0)
416
417 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
418 DEFINE_KSPROPERTY_ITEM(\
419 KSPROPERTY_CONNECTION_PRIORITY,\
420 (GetHandler),\
421 sizeof(KSPROPERTY),\
422 sizeof(KSPRIORITY),\
423 (SetHandler),\
424 NULL, 0, NULL, NULL, 0)
425
426 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
427 DEFINE_KSPROPERTY_ITEM(\
428 KSPROPERTY_CONNECTION_DATAFORMAT,\
429 (GetHandler),\
430 sizeof(KSPROPERTY),\
431 0,\
432 (SetHandler),\
433 NULL, 0, NULL, NULL, 0)
434
435 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
436 DEFINE_KSPROPERTY_ITEM(\
437 KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
438 (Handler),\
439 sizeof(KSPROPERTY),\
440 sizeof(KSALLOCATOR_FRAMING),\
441 NULL, NULL, 0, NULL, NULL, 0)
442
443 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
444 DEFINE_KSPROPERTY_ITEM(\
445 KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
446 (Handler),\
447 sizeof(KSPROPERTY),\
448 0,\
449 NULL, NULL, 0, NULL, NULL, 0)
450
451 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
452 DEFINE_KSPROPERTY_ITEM(\
453 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
454 NULL,\
455 sizeof(KSPROPERTY),\
456 sizeof(KSDATAFORMAT),\
457 (Handler),\
458 NULL, 0, NULL, NULL, 0)
459
460 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
461 DEFINE_KSPROPERTY_ITEM(\
462 KSPROPERTY_CONNECTION_ACQUIREORDERING,\
463 (Handler),\
464 sizeof(KSPROPERTY),\
465 sizeof(int),\
466 NULL, NULL, 0, NULL, NULL, 0)
467
468 #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
469 DEFINE_KSPROPERTY_ITEM(\
470 KSPROPERTY_CONNECTION_STARTAT,\
471 NULL,\
472 sizeof(KSPROPERTY),\
473 sizeof(KSRELATIVEEVENT),\
474 (Handler),\
475 NULL, 0, NULL, NULL, 0)
476
477
478 typedef enum
479 {
480 KSEVENT_CONNECTION_POSITIONUPDATE,
481 KSEVENT_CONNECTION_DATADISCONTINUITY,
482 KSEVENT_CONNECTION_TIMEDISCONTINUITY,
483 KSEVENT_CONNECTION_PRIORITY,
484 KSEVENT_CONNECTION_ENDOFSTREAM
485 } KSEVENT_CONNECTION;
486
487
488 /* ===============================================================
489 General
490 Properties/Methods/Events
491 */
492
493 #define STATIC_KSPROPSETID_General\
494 0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
495 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
496 #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
497
498
499 typedef enum
500 {
501 KSPROPERTY_GENERAL_COMPONENTID
502 } KSPROPERTY_GENERAL;
503
504
505 /* ===============================================================
506 Graph Manager
507 Properties/Methods/Events
508 */
509
510 #define KSPROPSETID_GM \
511 0xAF627536L, 0xE719, 0x11D2, {0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D}
512
513 typedef enum
514 {
515 KSPROPERTY_GM_GRAPHMANAGER,
516 KSPROPERTY_GM_TIMESTAMP_CLOCK,
517 KSPROPERTY_GM_RATEMATCH,
518 KSPROPERTY_GM_RENDERCLOCK
519 } KSPROPERTY_GM;
520
521
522 /* ===============================================================
523 Media Seeking
524 Properties/Methods/Events
525 */
526
527 #define STATIC_KSPROPSETID_MediaSeeking\
528 0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
529 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
530 #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
531
532 typedef enum {
533 KSPROPERTY_MEDIASEEKING_CAPABILITIES,
534 KSPROPERTY_MEDIASEEKING_FORMATS,
535 KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
536 KSPROPERTY_MEDIASEEKING_POSITION,
537 KSPROPERTY_MEDIASEEKING_STOPPOSITION,
538 KSPROPERTY_MEDIASEEKING_POSITIONS,
539 KSPROPERTY_MEDIASEEKING_DURATION,
540 KSPROPERTY_MEDIASEEKING_AVAILABLE,
541 KSPROPERTY_MEDIASEEKING_PREROLL,
542 KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
543 } KSPROPERTY_MEDIASEEKING;
544
545 typedef enum {
546 KS_SEEKING_NoPositioning,
547 KS_SEEKING_AbsolutePositioning,
548 KS_SEEKING_RelativePositioning,
549 KS_SEEKING_IncrementalPositioning,
550 KS_SEEKING_PositioningBitsMask = 0x3,
551 KS_SEEKING_SeekToKeyFrame,
552 KS_SEEKING_ReturnTime = 0x8
553 } KS_SEEKING_FLAGS;
554
555 typedef enum {
556 KS_SEEKING_CanSeekAbsolute = 0x1,
557 KS_SEEKING_CanSeekForwards = 0x2,
558 KS_SEEKING_CanSeekBackwards = 0x4,
559 KS_SEEKING_CanGetCurrentPos = 0x8,
560 KS_SEEKING_CanGetStopPos = 0x10,
561 KS_SEEKING_CanGetDuration = 0x20,
562 KS_SEEKING_CanPlayBackwards = 0x40
563 } KS_SEEKING_CAPABILITIES;
564
565 typedef struct {
566 LONGLONG Current;
567 LONGLONG Stop;
568 KS_SEEKING_FLAGS CurrentFlags;
569 KS_SEEKING_FLAGS StopFlags;
570 } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
571
572 typedef struct {
573 LONGLONG Earliest;
574 LONGLONG Latest;
575 } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
576
577 typedef struct {
578 KSPROPERTY Property;
579 GUID SourceFormat;
580 GUID TargetFormat;
581 LONGLONG Time;
582 } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
583
584 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
585 DEFINE_KSPROPERTY_ITEM(\
586 KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
587 (Handler),\
588 sizeof(KSPROPERTY),\
589 sizeof(KS_SEEKING_CAPABILITIES),\
590 NULL, NULL, 0, NULL, NULL, 0)
591
592 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
593 DEFINE_KSPROPERTY_ITEM(\
594 KSPROPERTY_MEDIASEEKING_FORMATS,\
595 (Handler),\
596 sizeof(KSPROPERTY),\
597 0,\
598 NULL, NULL, 0, NULL, NULL, 0)
599
600 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
601 DEFINE_KSPROPERTY_ITEM(\
602 KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
603 (GetHandler),\
604 sizeof(KSPROPERTY),\
605 sizeof(GUID),\
606 (SetHandler),\
607 NULL, 0, NULL, NULL, 0)
608
609 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
610 DEFINE_KSPROPERTY_ITEM(\
611 KSPROPERTY_MEDIASEEKING_POSITION,\
612 (Handler),\
613 sizeof(KSPROPERTY),\
614 sizeof(LONGLONG),\
615 NULL, NULL, 0, NULL, NULL, 0)
616
617 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
618 DEFINE_KSPROPERTY_ITEM(\
619 KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
620 (Handler),\
621 sizeof(KSPROPERTY),\
622 sizeof(LONGLONG),\
623 NULL, NULL, 0, NULL, NULL, 0)
624
625 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
626 DEFINE_KSPROPERTY_ITEM(\
627 KSPROPERTY_MEDIASEEKING_POSITIONS,\
628 NULL,\
629 sizeof(KSPROPERTY),\
630 sizeof(KSPROPERTY_POSITIONS),\
631 (Handler),\
632 NULL, 0, NULL, NULL, 0)
633
634 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
635 DEFINE_KSPROPERTY_ITEM(\
636 KSPROPERTY_MEDIASEEKING_DURATION,\
637 (Handler),\
638 sizeof(KSPROPERTY),\
639 sizeof(LONGLONG),\
640 NULL, NULL, 0, NULL, NULL, 0)
641
642 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
643 DEFINE_KSPROPERTY_ITEM(\
644 KSPROPERTY_MEDIASEEKING_AVAILABLE,\
645 (Handler),\
646 sizeof(KSPROPERTY),\
647 sizeof(KSPROPERTY_MEDIAAVAILABLE),\
648 NULL, NULL, 0, NULL, NULL, 0)
649
650 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
651 DEFINE_KSPROPERTY_ITEM(\
652 KSPROPERTY_MEDIASEEKING_PREROLL,\
653 (Handler),\
654 sizeof(KSPROPERTY),\
655 sizeof(LONGLONG),\
656 NULL, NULL, 0, NULL, NULL, 0)
657
658 #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
659 DEFINE_KSPROPERTY_ITEM(\
660 KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
661 (Handler),\
662 sizeof(KSP_TIMEFORMAT),\
663 sizeof(LONGLONG),\
664 NULL, NULL, 0, NULL, NULL, 0)
665
666 /* ===============================================================
667 Pin
668 Properties/Methods/Events
669 */
670
671 #define STATIC_KSPROPSETID_Pin\
672 0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}
673 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
674 #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
675
676 #define STATIC_KSNAME_Pin\
677 0x146F1A80L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
678 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
679 #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
680
681
682 typedef enum
683 {
684 KSPROPERTY_PIN_CINSTANCES,
685 KSPROPERTY_PIN_CTYPES,
686 KSPROPERTY_PIN_DATAFLOW,
687 KSPROPERTY_PIN_DATARANGES,
688 KSPROPERTY_PIN_DATAINTERSECTION,
689 KSPROPERTY_PIN_INTERFACES,
690 KSPROPERTY_PIN_MEDIUMS,
691 KSPROPERTY_PIN_COMMUNICATION,
692 KSPROPERTY_PIN_GLOBALCINSTANCES,
693 KSPROPERTY_PIN_NECESSARYINSTANCES,
694 KSPROPERTY_PIN_PHYSICALCONNECTION,
695 KSPROPERTY_PIN_CATEGORY,
696 KSPROPERTY_PIN_NAME,
697 KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
698 KSPROPERTY_PIN_PROPOSEDATAFORMAT
699 } KSPROPERTY_PIN;
700
701 typedef struct
702 {
703 KSPROPERTY Property;
704 ULONG PinId;
705 ULONG Reserved;
706 } KSP_PIN, *PKSP_PIN;
707
708 #define KSINSTANCE_INDETERMINATE ((ULONG)-1)
709
710 typedef struct
711 {
712 ULONG PossibleCount;
713 ULONG CurrentCount;
714 } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
715
716 typedef struct
717 {
718 ULONG Size;
719 ULONG Pin;
720 WCHAR SymbolicLinkName[1];
721 } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
722
723
724 /* ===============================================================
725 Quality
726 Properties/Methods/Events
727 */
728
729 #define KSPROPSETID_Quality \
730 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
731
732 typedef enum
733 {
734 KSPROPERTY_QUALITY_REPORT,
735 KSPROPERTY_QUALITY_ERROR
736 } KSPROPERTY_QUALITY;
737
738
739 /* ===============================================================
740 Stream
741 Properties/Methods/Events
742 */
743
744 #define STATIC_KSPROPSETID_Stream\
745 0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
746 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
747 #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
748
749 typedef enum
750 {
751 KSPROPERTY_STREAM_ALLOCATOR,
752 KSPROPERTY_STREAM_QUALITY,
753 KSPROPERTY_STREAM_DEGRADATION,
754 KSPROPERTY_STREAM_MASTERCLOCK,
755 KSPROPERTY_STREAM_TIMEFORMAT,
756 KSPROPERTY_STREAM_PRESENTATIONTIME,
757 KSPROPERTY_STREAM_PRESENTATIONEXTENT,
758 KSPROPERTY_STREAM_FRAMETIME,
759 KSPROPERTY_STREAM_RATECAPABILITY,
760 KSPROPERTY_STREAM_RATE,
761 KSPROPERTY_STREAM_PIPE_ID
762 } KSPROPERTY_STREAM;
763
764 #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
765 DEFINE_KSPROPERTY_ITEM(\
766 KSPROPERTY_STREAM_ALLOCATOR,\
767 (GetHandler),\
768 sizeof(KSPROPERTY),\
769 sizeof(HANDLE),\
770 (SetHandler),\
771 NULL, 0, NULL, NULL, 0)
772
773 #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
774 DEFINE_KSPROPERTY_ITEM(\
775 KSPROPERTY_STREAM_QUALITY,\
776 (Handler),\
777 sizeof(KSPROPERTY),\
778 sizeof(KSQUALITY_MANAGER),\
779 NULL, NULL, 0, NULL, NULL, 0)
780
781 #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
782 DEFINE_KSPROPERTY_ITEM(\
783 KSPROPERTY_STREAM_DEGRADATION,\
784 (GetHandler),\
785 sizeof(KSPROPERTY),\
786 0,\
787 (SetHandler),\
788 NULL, 0, NULL, NULL, 0)
789
790 #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
791 DEFINE_KSPROPERTY_ITEM(\
792 KSPROPERTY_STREAM_MASTERCLOCK,\
793 (GetHandler),\
794 sizeof(KSPROPERTY),\
795 sizeof(HANDLE),\
796 (SetHandler),\
797 NULL, 0, NULL, NULL, 0)
798
799 #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
800 DEFINE_KSPROPERTY_ITEM(\
801 KSPROPERTY_STREAM_TIMEFORMAT,\
802 (Handler),\
803 sizeof(KSPROPERTY),\
804 sizeof(GUID),\
805 NULL, NULL, 0, NULL, NULL, 0)
806
807 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
808 DEFINE_KSPROPERTY_ITEM(\
809 KSPROPERTY_STREAM_PRESENTATIONTIME,\
810 (GetHandler),\
811 sizeof(KSPROPERTY),\
812 sizeof(KSTIME),\
813 (SetHandler),\
814 NULL, 0, NULL, NULL, 0)
815
816 #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
817 DEFINE_KSPROPERTY_ITEM(\
818 KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
819 (Handler),\
820 sizeof(KSPROPERTY),\
821 sizeof(LONGLONG),\
822 NULL, NULL, 0, NULL, NULL, 0)
823
824 #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
825 DEFINE_KSPROPERTY_ITEM(\
826 KSPROPERTY_STREAM_FRAMETIME,\
827 (Handler),\
828 sizeof(KSPROPERTY),\
829 sizeof(KSFRAMETIME),\
830 NULL, NULL, 0, NULL, NULL, 0)
831
832 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
833 DEFINE_KSPROPERTY_ITEM(\
834 KSPROPERTY_STREAM_RATECAPABILITY,\
835 (Handler),\
836 sizeof(KSRATE_CAPABILITY),\
837 sizeof(KSRATE),\
838 NULL, NULL, 0, NULL, NULL, 0)
839
840 #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
841 DEFINE_KSPROPERTY_ITEM(\
842 KSPROPERTY_STREAM_RATE,\
843 (GetHandler),\
844 sizeof(KSPROPERTY),\
845 sizeof(KSRATE),\
846 (SetHandler),\
847 NULL, 0, NULL, NULL, 0)
848
849 #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
850 DEFINE_KSPROPERTY_ITEM(\
851 KSPROPERTY_STREAM_PIPE_ID,\
852 (GetHandler),\
853 sizeof(KSPROPERTY),\
854 sizeof(HANDLE),\
855 (SetHandler),\
856 NULL, 0, NULL, NULL, 0)
857
858 /* ===============================================================
859 StreamAllocator
860 Properties/Methods/Events
861 */
862
863 #define STATIC_KSPROPSETID_StreamAllocator\
864 0xcf6e4342L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
865 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
866 #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
867
868 typedef enum
869 {
870 KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
871 KSPROPERTY_STREAMALLOCATOR_STATUS
872 } KSPROPERTY_STREAMALLOCATOR;
873
874 #define KSMETHODSETID_StreamAllocator \
875 0xcf6e4341L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
876
877 typedef enum
878 {
879 KSMETHOD_STREAMALLOCATOR_ALLOC,
880 KSMETHOD_STREAMALLOCATOR_FREE
881 } KSMETHOD_STREAMALLOCATOR;
882
883
884 #define KSEVENTSETID_StreamAllocator
885
886 typedef enum
887 {
888 KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
889 KSEVENT_STREAMALLOCATOR_FREEFRAME
890 } KSEVENT_STREAMALLOCATOR;
891
892
893 /* ===============================================================
894 StreamInterface
895 Properties/Methods/Events
896 */
897
898 #define KSPROPSETID_StreamInterface \
899 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
900
901 typedef enum
902 {
903 KSPROPERTY_STREAMINTERFACE_HEADERSIZE
904 } KSPROPERTY_STREAMINTERFACE;
905
906
907 /* ===============================================================
908 Topology
909 Properties/Methods/Events
910 */
911
912 #define STATIC_KSPROPSETID_Topology\
913 0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
914 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
915 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
916
917 typedef enum {
918 KSPROPERTY_TOPOLOGY_CATEGORIES,
919 KSPROPERTY_TOPOLOGY_NODES,
920 KSPROPERTY_TOPOLOGY_CONNECTIONS,
921 KSPROPERTY_TOPOLOGY_NAME
922 } KSPROPERTY_TOPOLOGY;
923
924 /* ===============================================================
925 Property Sets for audio drivers - TODO
926 */
927
928 #define STATIC_KSPROPTYPESETID_General \
929 0x97E99BA0L, 0xBDEA, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
930 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
931 #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
932
933 /*
934 KSPROPERTY_AC3_ALTERNATE_AUDIO
935 KSPROPERTY_AC3_BIT_STREAM_MODE
936 KSPROPERTY_AC3_DIALOGUE_LEVEL
937 KSPROPERTY_AC3_DOWNMIX
938 KSPROPERTY_AC3_ERROR_CONCEALMENT
939 KSPROPERTY_AC3_LANGUAGE_CODE
940 KSPROPERTY_AC3_ROOM_TYPE
941 */
942
943 #define KSPROPSETID_Acoustic_Echo_Cancel
944 /*
945 KSPROPERTY_AEC_MODE
946 KSPROPERTY_AEC_NOISE_FILL_ENABLE
947 KSPROPERTY_AEC_STATUS
948 */
949
950 /*
951 KSPROPERTY_AUDIO_3D_INTERFACE
952 KSPROPERTY_AUDIO_AGC
953 KSPROPERTY_AUDIO_ALGORITHM_INSTANCE
954 KSPROPERTY_AUDIO_BASS
955 KSPROPERTY_AUDIO_BASS_BOOST
956 KSPROPERTY_AUDIO_CHANNEL_CONFIG
957 KSPROPERTY_AUDIO_CHORUS_LEVEL
958 KSPROPERTY_AUDIO_COPY_PROTECTION
959 KSPROPERTY_AUDIO_CPU_RESOURCES
960 KSPROPERTY_AUDIO_DELAY
961 KSPROPERTY_AUDIO_DEMUX_DEST
962 KSPROPERTY_AUDIO_DEV_SPECIFIC
963 KSPROPERTY_AUDIO_DYNAMIC_RANGE
964 KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE
965 KSPROPERTY_AUDIO_EQ_BANDS
966 KSPROPERTY_AUDIO_EQ_LEVEL
967 KSPROPERTY_AUDIO_FILTER_STATE
968 KSPROPERTY_AUDIO_LATENCY
969 KSPROPERTY_AUDIO_LOUDNESS
970 KSPROPERTY_AUDIO_MANUFACTURE_GUID
971 KSPROPERTY_AUDIO_MID
972 KSPROPERTY_AUDIO_MIX_LEVEL_CAPS
973 KSPROPERTY_AUDIO_MIX_LEVEL_TABLE
974 KSPROPERTY_AUDIO_MUTE
975 KSPROPERTY_AUDIO_MUX_SOURCE
976 KSPROPERTY_AUDIO_NUM_EQ_BANDS
977 KSPROPERTY_AUDIO_PEAKMETER
978 KSPROPERTY_AUDIO_POSITION
979 KSPROPERTY_AUDIO_PREFERRED_STATUS
980 KSPROPERTY_AUDIO_PRODUCT_GUID
981 KSPROPERTY_AUDIO_QUALITY
982 KSPROPERTY_AUDIO_REVERB_LEVEL
983 KSPROPERTY_AUDIO_SAMPLING_RATE
984 KSPROPERTY_AUDIO_STEREO_ENHANCE
985 KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY
986 KSPROPERTY_AUDIO_SURROUND_ENCODE
987 KSPROPERTY_AUDIO_TREBLE
988 KSPROPERTY_AUDIO_VOLUMELEVEL
989 KSPROPERTY_AUDIO_WIDE_MODE
990 KSPROPERTY_AUDIO_WIDENESS
991 */
992
993 #define KSPROPSETID_AudioGfx
994 /*
995 KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID
996 KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID
997 */
998
999 #define KSPROPSETID_DirectSound3DBuffer
1000 /*
1001 KSPROPERTY_DIRECTSOUND3DBUFFER_ALL
1002 KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES
1003 KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION
1004 KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME
1005 KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE
1006 KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE
1007 KSPROPERTY_DIRECTSOUND3DBUFFER_MODE
1008 KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION
1009 KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY
1010 */
1011
1012 #define KSPROPSETID_DirectSound3DListener
1013 /*
1014 KSPROPERTY_DIRECTSOUND3DLISTENER_ALL
1015 KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION
1016 KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH
1017 KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR
1018 KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR
1019 KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION
1020 KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION
1021 KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR
1022 KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY
1023 */
1024
1025 #define KSPROPSETID_Hrtf3d
1026 /*
1027 KSPROPERTY_HRTF3D_FILTER_FORMAT
1028 KSPROPERTY_HRTF3D_INITIALIZE
1029 KSPROPERTY_HRTF3D_PARAMS
1030 */
1031
1032 #define KSPROPSETID_Itd3d
1033 /*
1034 KSPROPERTY_ITD3D_PARAMS
1035 */
1036
1037 #define KSPROPSETID_TopologyNode
1038 /*
1039 KSPROPERTY_TOPOLOGYNODE_ENABLE
1040 KSPROPERTY_TOPOLOGYNODE_RESET
1041 */
1042
1043
1044 /* ===============================================================
1045 Node Types
1046 */
1047 /*
1048 KSNODETYPE_3D_EFFECTS
1049 KSNODETYPE_ACOUSTIC_ECHO_CANCEL
1050 KSNODETYPE_ADC
1051 KSNODETYPE_AGC
1052 KSNODETYPE_CHORUS
1053 KSNODETYPE_DAC
1054 KSNODETYPE_DELAY
1055 KSNODETYPE_DEMUX
1056 KSNODETYPE_DEV_SPECIFIC
1057 KSNODETYPE_DMSYNTH
1058 KSNODETYPE_DMSYNTH_CAPS
1059 KSNODETYPE_DRM_DESCRAMBLE
1060 KSNODETYPE_EQUALIZER
1061 KSNODETYPE_LOUDNESS
1062 KSNODETYPE_MUTE
1063 KSNODETYPE_MUX
1064 KSNODETYPE_PEAKMETER
1065 KSNODETYPE_PROLOGIC_DECODER
1066 KSNODETYPE_PROLOGIC_ENCODER
1067 KSNODETYPE_REVERB
1068 KSNODETYPE_SRC
1069 KSNODETYPE_STEREO_ENHANCE
1070 KSNODETYPE_STEREO_WIDE
1071 KSNODETYPE_SUM
1072 KSNODETYPE_SUPERMIX
1073 KSNODETYPE_SWMIDI
1074 KSNODETYPE_SWSYNTH
1075 KSNODETYPE_SYNTHESIZER
1076 KSNODETYPE_TONE
1077 KSNODETYPE_VOLUME
1078 */
1079
1080
1081 typedef PVOID KSDEVICE_HEADER,
1082 KSOBJECT_HEADER,
1083 KSOBJECT_BAG;
1084
1085
1086
1087
1088 /* ===============================================================
1089 Method Types
1090 */
1091
1092 #define KSMETHOD_TYPE_NONE 0x00000000
1093 #define KSMETHOD_TYPE_READ 0x00000001
1094 #define KSMETHOD_TYPE_WRITE 0x00000002
1095 #define KSMETHOD_TYPE_MODIFY 0x00000003
1096 #define KSMETHOD_TYPE_SOURCE 0x00000004
1097 #define KSMETHOD_TYPE_SEND 0x00000001
1098 #define KSMETHOD_TYPE_SETSUPPORT 0x00000100
1099 #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200
1100
1101
1102 /* ===============================================================
1103 Property Types
1104 */
1105
1106 #define KSPROPERTY_TYPE_GET 0x00000001
1107 #define KSPROPERTY_TYPE_SET 0x00000002
1108 #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100
1109 #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200
1110 #define KSPROPERTY_TYPE_RELATIONS 0x00000400
1111 #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800
1112 #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000
1113 #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000
1114 #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000
1115 #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000
1116 #define KSPROPERTY_TYPE_DEFAULT_VALUES 0x00010000
1117
1118
1119 /* ===============================================================
1120 Topology Methods/Properties
1121 */
1122
1123 #define KSMETHOD_TYPE_TOPOLOGY 0x10000000
1124 #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000
1125
1126 /*
1127 #define DEFINE_KS_GUID(GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK) \
1128 DEFINE_GUID(??, 0x#GA#L, 0xGB, 0xGC, 0xGD, 0xGE, 0xGF, 0xGG, 0xGH, 0xGI, 0xGJ, 0xGK) \
1129 "GA-GB-GC-GDGE-GFGGGHGIGJGK"
1130 */
1131
1132 /* ===============================================================
1133 KS Category GUIDs
1134
1135 BRIDGE - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1136 CAPTURE - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1137 RENDER - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1138 MIXER - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1139 SPLITTER - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1140 DATACOMPRESSOR - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1141 DATADECOMPRESSOR - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1142 DATATRANSFORM - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1143 COMMUNICATIONSTRANSFORM - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1144 INTERFACETRANSFORM - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1145 MEDIUMTRANSFORM - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1146 FILESYSTEM - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1147 CLOCK - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1148 PROXY - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1149 QUALITY - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1150 */
1151
1152 /* ===============================================================
1153 KSNAME GUIDs (defined also as KSSTRING_Xxx L"{...}"
1154
1155 Filter - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1156 Pin - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1157 Clock - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1158 Allocator - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1159 TopologyNode - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1160 */
1161
1162 /* ===============================================================
1163 Interface GUIDs
1164
1165 Standard - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1166 FileIo - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1167 */
1168
1169 /* ===============================================================
1170 Medium Type GUIDs
1171
1172 Standard - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1173 */
1174
1175 /* ===============================================================
1176 Property Set GUIDs
1177
1178 General - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1179 StreamIo - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1180 MediaSeeking - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1181 Topology - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1182 GM - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D
1183 Quality - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1184 Connection - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1185 */
1186
1187 /* ===============================================================
1188 StreamAllocator Sets
1189
1190 Event set - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1191 Method set - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1192 Property set - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1193 */
1194
1195 /* ===============================================================
1196 StreamInterface Sets
1197
1198 Property set - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
1199 */
1200
1201 /* ===============================================================
1202 Clock Sets
1203
1204 Property set - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1205 Event sets - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1206 */
1207
1208 /* ===============================================================
1209 Connection Sets
1210
1211 Event set - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
1212 */
1213
1214 /* ===============================================================
1215 Time Format GUIDs
1216
1217 KSTIME_FORMAT_NONE (null guid)
1218 FRAME - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1219 BYTE - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1220 SAMPLE - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1221 FIELD - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1222 MEDIA_TIME - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
1223 */
1224
1225 /* ===============================================================
1226 Media Type GUIDs
1227
1228 NULL
1229 Stream -
1230 None -
1231
1232 TODO ...
1233 */
1234
1235 #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
1236 0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
1237 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
1238 #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
1239
1240
1241 /* ===============================================================
1242 KSMEMORY_TYPE_xxx
1243
1244 WILDCARD, DONT_CARE = NULL
1245 SYSTEM - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1246 USER - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1247 KERNEL_PAGED - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1248 KERNEL_NONPAGED - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1249 DEVICE_UNKNOWN - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1250 */
1251
1252 /* ===============================================================
1253 Enums
1254 (values have been checked)
1255 */
1256
1257 #ifndef _MSC_VER
1258
1259 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
1260 MinProperty,\
1261 MinData,\
1262 SetHandler,\
1263 Values, RelationsCount, Relations, SupportHandler,\
1264 SerializedSize)\
1265 {\
1266 PropertyId, {(PFNKSHANDLER)GetHandler}, MinProperty, MinData,\
1267 {(PFNKSHANDLER)SetHandler},\
1268 (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
1269 (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
1270 }
1271
1272 #else
1273
1274 #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
1275 MinProperty,\
1276 MinData,\
1277 SetHandler,\
1278 Values, RelationsCount, Relations, SupportHandler,\
1279 SerializedSize)\
1280 {\
1281 PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
1282 (PFNKSHANDLER)SetHandler,\
1283 (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
1284 (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
1285 }
1286
1287 #endif
1288
1289
1290 typedef enum
1291 {
1292 KsObjectTypeDevice,
1293 KsObjectTypeFilterFactory,
1294 KsObjectTypeFilter,
1295 KsObjectTypePin
1296 } KSOBJECTTYPE;
1297
1298 typedef enum
1299 {
1300 KSSTATE_STOP,
1301 KSSTATE_ACQUIRE,
1302 KSSTATE_PAUSE,
1303 KSSTATE_RUN
1304 } KSSTATE, *PKSSTATE;
1305
1306 typedef enum
1307 {
1308 KSTARGET_STATE_DISABLED,
1309 KSTARGET_STATE_ENABLED
1310 } KSTARGET_STATE;
1311
1312 typedef enum
1313 {
1314 KSRESET_BEGIN,
1315 KSRESET_END
1316 } KSRESET;
1317
1318 typedef enum
1319 {
1320 KSEVENTS_NONE,
1321 KSEVENTS_SPINLOCK,
1322 KSEVENTS_MUTEX,
1323 KSEVENTS_FMUTEX,
1324 KSEVENTS_FMUTEXUNSAFE,
1325 KSEVENTS_INTERRUPT,
1326 KSEVENTS_ERESOURCE
1327 } KSEVENTS_LOCKTYPE;
1328
1329 typedef enum
1330 {
1331 KSDEGRADE_STANDARD_SIMPLE,
1332 KSDEGRADE_STANDARD_QUALITY,
1333 KSDEGRADE_STANDARD_COMPUTATION,
1334 KSDEGRADE_STANDARD_SKIP
1335 } KSDEGRADE_STANDARD;
1336
1337 typedef enum
1338 {
1339 KSPIN_DATAFLOW_IN = 1,
1340 KSPIN_DATAFLOW_OUT
1341 } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
1342
1343 typedef enum
1344 {
1345 KSPIN_COMMUNICATION_NONE,
1346 KSPIN_COMMUNICATION_SINK,
1347 KSPIN_COMMUNICATION_SOURCE,
1348 KSPIN_COMMUNICATION_BOTH,
1349 KSPIN_COMMUNICATION_BRIDGE
1350 } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
1351
1352 typedef enum
1353 {
1354 KsListEntryTail,
1355 KsListEntryHead
1356 } KSLIST_ENTRY_LOCATION;
1357
1358 typedef enum
1359 {
1360 KsStackCopyToNewLocation,
1361 KsStackReuseCurrentLocation,
1362 KsStackUseNewLocation
1363 } KSSTACK_USE;
1364
1365 typedef enum
1366 {
1367 KsAcquireOnly,
1368 KsAcquireAndRemove,
1369 KsAcquireOnlySingleItem,
1370 KsAcquireAndRemoveOnlySingleItem
1371 } KSIRP_REMOVAL_OPERATION;
1372
1373 typedef enum
1374 {
1375 KsInvokeOnSuccess = 1,
1376 KsInvokeOnError = 2,
1377 KsInvokeOnCancel = 4
1378 } KSCOMPLETION_INVOCATION;
1379
1380
1381 #if defined(_NTDDK_)
1382 /* MOVE ME */
1383 typedef NTSTATUS (NTAPI *PFNKSCONTEXT_DISPATCH)(
1384 IN PVOID Context,
1385 IN PIRP Irp);
1386 #endif
1387
1388 #if defined(_NTDDK_) && !defined(__wtypes_h__)
1389 enum VARENUM {
1390 VT_EMPTY = 0,
1391 VT_NULL = 1,
1392 VT_I2 = 2,
1393 VT_I4 = 3,
1394 VT_R4 = 4,
1395 VT_R8 = 5,
1396 VT_CY = 6,
1397 VT_DATE = 7,
1398 VT_BSTR = 8,
1399 VT_DISPATCH = 9,
1400 VT_ERROR = 10,
1401 VT_BOOL = 11,
1402 VT_VARIANT = 12,
1403 VT_UNKNOWN = 13,
1404 VT_DECIMAL = 14,
1405 VT_I1 = 16,
1406 VT_UI1 = 17,
1407 VT_UI2 = 18,
1408 VT_UI4 = 19,
1409 VT_I8 = 20,
1410 VT_UI8 = 21,
1411 VT_INT = 22,
1412 VT_UINT = 23,
1413 VT_VOID = 24,
1414 VT_HRESULT = 25,
1415 VT_PTR = 26,
1416 VT_SAFEARRAY = 27,
1417 VT_CARRAY = 28,
1418 VT_USERDEFINED = 29,
1419 VT_LPSTR = 30,
1420 VT_LPWSTR = 31,
1421 VT_FILETIME = 64,
1422 VT_BLOB = 65,
1423 VT_STREAM = 66,
1424 VT_STORAGE = 67,
1425 VT_STREAMED_OBJECT = 68,
1426 VT_STORED_OBJECT = 69,
1427 VT_BLOB_OBJECT = 70,
1428 VT_CF = 71,
1429 VT_CLSID = 72,
1430 VT_VECTOR = 0x1000,
1431 VT_ARRAY = 0x2000,
1432 VT_BYREF = 0x4000,
1433 VT_RESERVED = 0x8000,
1434 VT_ILLEGAL = 0xffff,
1435 VT_ILLEGALMASKED = 0xfff,
1436 VT_TYPEMASK = 0xfff
1437 };
1438 #endif
1439
1440 #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL
1441 #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL
1442
1443 #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL
1444 #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL
1445
1446 #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL
1447 #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL
1448
1449 /* ===============================================================
1450 Framing
1451 */
1452
1453 typedef struct
1454 {
1455 ULONG MinFrameSize;
1456 ULONG MaxFrameSize;
1457 ULONG Stepping;
1458 } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
1459
1460 typedef struct
1461 {
1462 KS_FRAMING_RANGE Range;
1463 ULONG InPlaceWeight;
1464 ULONG NotInPlaceWeight;
1465 } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
1466
1467 typedef struct
1468 {
1469 GUID MemoryType;
1470 GUID BusType;
1471 ULONG MemoryFlags;
1472 ULONG BusFlags;
1473 ULONG Flags;
1474 ULONG Frames;
1475 ULONG FileAlignment;
1476 ULONG MemoryTypeWeight;
1477 KS_FRAMING_RANGE PhysicalRange;
1478 KS_FRAMING_RANGE_WEIGHTED FramingRange;
1479 } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
1480
1481 typedef struct
1482 {
1483 ULONG RatioNumerator;
1484 ULONG RatioDenominator;
1485 ULONG RatioConstantMargin;
1486 } KS_COMPRESSION, *PKS_COMPRESSION;
1487
1488
1489 /* ===============================================================
1490 Priorities
1491 */
1492
1493 #define KSPRIORITY_LOW 0x00000001
1494 #define KSPRIORITY_NORMAL 0x40000000
1495 #define KSPRIORITY_HIGH 0x80000000
1496 #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF
1497
1498 typedef struct
1499 {
1500 ULONG PriorityClass;
1501 ULONG PrioritySubClass;
1502 } KSPRIORITY, *PKSPRIORITY;
1503
1504
1505 /* ===============================================================
1506 Dispatch Table
1507 http://www.osronline.com/DDKx/stream/ks-struct_494j.htm
1508 */
1509 #if defined(_NTDDK_)
1510 typedef struct
1511 {
1512 PDRIVER_DISPATCH DeviceIoControl;
1513 PDRIVER_DISPATCH Read;
1514 PDRIVER_DISPATCH Write;
1515 PDRIVER_DISPATCH Flush;
1516 PDRIVER_DISPATCH Close;
1517 PDRIVER_DISPATCH QuerySecurity;
1518 PDRIVER_DISPATCH SetSecurity;
1519 PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
1520 PFAST_IO_READ FastRead;
1521 PFAST_IO_WRITE FastWrite;
1522 } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
1523
1524
1525 #define KSCREATE_ITEM_IRP_STORAGE(Irp) (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0])
1526 #define KSEVENT_SET_IRP_STORAGE(Irp) (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
1527 #define KSEVENT_ITEM_IRP_STORAGE(Irp) (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
1528 #define KSEVENT_ENTRY_IRP_STORAGE(Irp) (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0])
1529 #define KSMETHOD_SET_IRP_STORAGE(Irp) (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
1530 #define KSMETHOD_ITEM_IRP_STORAGE(Irp) (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
1531 #define KSMETHOD_TYPE_IRP_STORAGE(Irp) (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2]))
1532 #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1])
1533 #define KSPROPERTY_SET_IRP_STORAGE(Irp) (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
1534 #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
1535 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
1536
1537 typedef
1538 VOID
1539 (NTAPI *PFNREFERENCEDEVICEOBJECT)(
1540 IN PVOID Context
1541 );
1542
1543 typedef
1544 VOID
1545 (NTAPI *PFNDEREFERENCEDEVICEOBJECT)(
1546 IN PVOID Context
1547 );
1548
1549 typedef
1550 NTSTATUS
1551 (NTAPI *PFNQUERYREFERENCESTRING)(
1552 IN PVOID Context,
1553 IN OUT PWCHAR *String
1554 );
1555
1556 typedef struct
1557 {
1558 INTERFACE Interface;
1559 PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject;
1560 PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject;
1561 PFNQUERYREFERENCESTRING QueryReferenceString;
1562 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
1563
1564 typedef struct
1565 {
1566 KDPC Dpc;
1567 ULONG ReferenceCount;
1568 KSPIN_LOCK AccessLock;
1569 } KSDPC_ITEM, *PKSDPC_ITEM;
1570
1571 typedef struct
1572 {
1573 KSDPC_ITEM DpcItem;
1574 LIST_ENTRY BufferList;
1575 } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
1576
1577 #endif
1578
1579 typedef struct
1580 {
1581 GUID Manufacturer;
1582 GUID Product;
1583 GUID Component;
1584 GUID Name;
1585 ULONG Version;
1586 ULONG Revision;
1587 } KSCOMPONENTID, *PKSCOMPONENTID;
1588
1589 /* ===============================================================
1590 Properties
1591 */
1592
1593 typedef struct
1594 {
1595 GUID PropertySet;
1596 ULONG Count;
1597 } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
1598
1599 typedef struct
1600 {
1601 KSIDENTIFIER PropTypeSet;
1602 ULONG Id;
1603 ULONG PropertyLength;
1604 } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
1605
1606
1607 typedef union
1608 {
1609 struct {
1610 LONG SignedMinimum;
1611 LONG SignedMaximum;
1612
1613 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1614 }_SIGNED;
1615 #else
1616 };
1617 #endif
1618
1619 struct {
1620 ULONG UnsignedMinimum;
1621 ULONG UnsignedMaximum;
1622 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1623 }_UNSIGNED;
1624 #else
1625 };
1626 #endif
1627
1628 } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
1629
1630 typedef union
1631 {
1632 struct {
1633 LONGLONG SignedMinimum;
1634 LONGLONG SignedMaximum;
1635 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1636 }_SIGNED64;
1637 #else
1638 };
1639 #endif
1640
1641 struct {
1642 #if defined(_NTDDK_)
1643 ULONGLONG UnsignedMinimum;
1644 ULONGLONG UnsignedMaximum;
1645 #else
1646 DWORDLONG UnsignedMinimum;
1647 DWORDLONG UnsignedMaximum;
1648 #endif
1649 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1650 }_UNSIGNED64;
1651 #else
1652 };
1653 #endif
1654 } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
1655
1656 typedef struct
1657 {
1658 ULONG AccessFlags;
1659 ULONG DescriptionSize;
1660 KSIDENTIFIER PropTypeSet;
1661 ULONG MembersListCount;
1662 ULONG Reserved;
1663 } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
1664
1665 typedef struct
1666 {
1667 ULONG MembersFlags;
1668 ULONG MembersSize;
1669 ULONG MembersCount;
1670 ULONG Flags;
1671 } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
1672
1673 typedef struct {
1674 KSPROPERTY_MEMBERSHEADER MembersHeader;
1675 const VOID* Members;
1676 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
1677
1678 #define KSPROPERTY_MEMBER_RANGES 0x00000001
1679 #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002
1680 #define KSPROPERTY_MEMBER_VALUES 0x00000003
1681
1682 #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001
1683 #if (NTDDI_VERSION >= NTDDI_WINXP)
1684 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002
1685 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004
1686 #endif
1687
1688
1689 typedef struct {
1690 KSIDENTIFIER PropTypeSet;
1691 ULONG MembersListCount;
1692 const KSPROPERTY_MEMBERSLIST* MembersList;
1693 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
1694
1695 #if defined(_NTDDK_)
1696 typedef NTSTATUS (NTAPI *PFNKSHANDLER)(
1697 IN PIRP Irp,
1698 IN PKSIDENTIFIER Request,
1699 IN OUT PVOID Data);
1700
1701 typedef struct
1702 {
1703 ULONG PropertyId;
1704 union
1705 {
1706 PFNKSHANDLER GetPropertyHandler;
1707 BOOLEAN GetSupported;
1708 };
1709 ULONG MinProperty;
1710 ULONG MinData;
1711 union {
1712 PFNKSHANDLER SetPropertyHandler;
1713 BOOLEAN SetSupported;
1714 };
1715 const KSPROPERTY_VALUES * Values;
1716 ULONG RelationsCount;
1717 const KSPROPERTY * Relations;
1718 PFNKSHANDLER SupportHandler;
1719 ULONG SerializedSize;
1720 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
1721
1722
1723 typedef
1724 BOOLEAN
1725 (NTAPI *PFNKSFASTHANDLER)(
1726 IN PFILE_OBJECT FileObject,
1727 IN PKSIDENTIFIER Request,
1728 IN ULONG RequestLength,
1729 IN OUT PVOID Data,
1730 IN ULONG DataLength,
1731 OUT PIO_STATUS_BLOCK IoStatus
1732 );
1733
1734 typedef struct {
1735 ULONG PropertyId;
1736 union {
1737 PFNKSFASTHANDLER GetPropertyHandler;
1738 BOOLEAN GetSupported;
1739 };
1740 union {
1741 PFNKSFASTHANDLER SetPropertyHandler;
1742 BOOLEAN SetSupported;
1743 };
1744 ULONG Reserved;
1745 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
1746
1747 typedef struct
1748 {
1749 const GUID* Set;
1750 ULONG PropertiesCount;
1751 const KSPROPERTY_ITEM * PropertyItem;
1752 ULONG FastIoCount;
1753 const KSFASTPROPERTY_ITEM* FastIoTable;
1754 } KSPROPERTY_SET, *PKSPROPERTY_SET;
1755
1756 #endif
1757
1758 typedef struct
1759 {
1760 ULONG SteppingDelta;
1761 ULONG Reserved;
1762 KSPROPERTY_BOUNDS_LONG Bounds;
1763 } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
1764
1765 typedef struct
1766 {
1767 #if defined(_NTDDK_)
1768 ULONGLONG SteppingDelta;
1769 #else
1770 DWORDLONG SteppingDelta;
1771 #endif
1772 KSPROPERTY_BOUNDS_LONGLONG Bounds;
1773 } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
1774
1775 /* ===============================================================
1776 Allocator Framing
1777 */
1778
1779 typedef struct
1780 {
1781 union {
1782 ULONG OptionsFlags;
1783 ULONG RequirementsFlags;
1784 };
1785 #if defined(_NTDDK_)
1786 POOL_TYPE PoolType;
1787 #else
1788 ULONG PoolType;
1789 #endif
1790 ULONG Frames;
1791 ULONG FrameSize;
1792 ULONG FileAlignment;
1793 ULONG Reserved;
1794 } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
1795
1796 typedef struct
1797 {
1798 ULONG CountItems;
1799 ULONG PinFlags;
1800 KS_COMPRESSION OutputCompression;
1801 ULONG PinWeight;
1802 KS_FRAMING_ITEM FramingItem[1];
1803 } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
1804
1805 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001
1806 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002
1807 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004
1808 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008
1809 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000
1810
1811 #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001
1812 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002
1813 #define KSALLOCATOR_OPTIONF_VALID 0x00000003
1814
1815 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010
1816 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020
1817 #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040
1818 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080
1819
1820 /* ===============================================================
1821 Quality
1822 */
1823
1824 typedef struct
1825 {
1826 PVOID Context;
1827 ULONG Proportion;
1828 LONGLONG DeltaTime;
1829 } KSQUALITY, *PKSQUALITY;
1830
1831 typedef struct
1832 {
1833 HANDLE QualityManager;
1834 PVOID Context;
1835 } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
1836
1837 typedef struct
1838 {
1839 LONGLONG PresentationStart;
1840 LONGLONG Duration;
1841 KSPIN_INTERFACE Interface;
1842 LONG Rate;
1843 ULONG Flags;
1844 } KSRATE, *PKSRATE;
1845
1846 typedef struct
1847 {
1848 KSPROPERTY Property;
1849 KSRATE Rate;
1850 } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
1851
1852 typedef struct
1853 {
1854 LONGLONG Granularity;
1855 LONGLONG Error;
1856 } KSRESOLUTION, *PKSRESOLUTION;
1857
1858 typedef struct
1859 {
1860 ULONG NotificationType;
1861 union {
1862 struct {
1863 HANDLE Event;
1864 ULONG_PTR Reserved[2];
1865 } EventHandle;
1866 struct {
1867 HANDLE Semaphore;
1868 ULONG Reserved;
1869 LONG Adjustment;
1870 } SemaphoreHandle;
1871 #if defined(_NTDDK_)
1872 struct {
1873 PVOID Event;
1874 KPRIORITY Increment;
1875 ULONG_PTR Reserved;
1876 } EventObject;
1877 struct {
1878 PVOID Semaphore;
1879 KPRIORITY Increment;
1880 LONG Adjustment;
1881 } SemaphoreObject;
1882 struct {
1883 PKDPC Dpc;
1884 ULONG ReferenceCount;
1885 ULONG_PTR Reserved;
1886 } Dpc;
1887 struct {
1888 PWORK_QUEUE_ITEM WorkQueueItem;
1889 WORK_QUEUE_TYPE WorkQueueType;
1890 ULONG_PTR Reserved;
1891 } WorkItem;
1892 struct {
1893 PWORK_QUEUE_ITEM WorkQueueItem;
1894 PKSWORKER KsWorkerObject;
1895 ULONG_PTR Reserved;
1896 } KsWorkItem;
1897 #endif
1898 struct {
1899 PVOID Unused;
1900 LONG_PTR Alignment[2];
1901 } Alignment;
1902 };
1903 } KSEVENTDATA, *PKSEVENTDATA;
1904
1905 #define KSEVENTF_EVENT_HANDLE 0x00000001
1906 #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002
1907 #if defined(_NTDDK_)
1908 #define KSEVENTF_EVENT_OBJECT 0x00000004
1909 #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008
1910 #define KSEVENTF_DPC 0x00000010
1911 #define KSEVENTF_WORKITEM 0x00000020
1912 #define KSEVENTF_KSWORKITEM 0x00000080
1913 #endif
1914
1915
1916 #define KSEVENT_TYPE_ENABLE 0x00000001
1917 #define KSEVENT_TYPE_ONESHOT 0x00000002
1918 #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
1919 #define KSEVENT_TYPE_SETSUPPORT 0x00000100
1920 #define KSEVENT_TYPE_BASICSUPPORT 0x00000200
1921 #define KSEVENT_TYPE_QUERYBUFFER 0x00000400
1922
1923 #define KSEVENT_TYPE_TOPOLOGY 0x10000000
1924
1925 typedef struct
1926 {
1927 ULONG Size;
1928 ULONG Flags;
1929 union {
1930 HANDLE ObjectHandle;
1931 PVOID ObjectPointer;
1932 };
1933 PVOID Reserved;
1934 KSEVENT Event;
1935 KSEVENTDATA EventData;
1936 } KSRELATIVEEVENT, *PKSRELATIVEEVENT;
1937
1938 #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
1939 #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
1940
1941 /* ===============================================================
1942 Timing
1943 */
1944
1945
1946 typedef struct {
1947 KSEVENTDATA EventData;
1948 LONGLONG MarkTime;
1949 } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
1950
1951 typedef struct {
1952 KSEVENTDATA EventData;
1953 LONGLONG TimeBase;
1954 LONGLONG Interval;
1955 } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
1956
1957 typedef struct {
1958 LONGLONG TimeBase;
1959 LONGLONG Interval;
1960 } KSINTERVAL, *PKSINTERVAL;
1961
1962
1963
1964 typedef struct
1965 {
1966 LONGLONG Time;
1967 ULONG Numerator;
1968 ULONG Denominator;
1969 } KSTIME, *PKSTIME;
1970
1971 typedef struct
1972 {
1973 LONGLONG Time;
1974 LONGLONG SystemTime;
1975 } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
1976
1977 typedef struct
1978 {
1979 LONGLONG Duration;
1980 ULONG FrameFlags;
1981 ULONG Reserved;
1982 } KSFRAMETIME, *PKSFRAMETIME;
1983
1984
1985 /* ===============================================================
1986 Clocks
1987 */
1988
1989 typedef PVOID PKSDEFAULTCLOCK;
1990
1991 typedef struct
1992 {
1993 ULONG CreateFlags;
1994 } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
1995
1996 #if defined(_NTDDK_)
1997
1998 typedef
1999 LONGLONG
2000 (FASTCALL *PFNKSCLOCK_GETTIME)(
2001 IN PFILE_OBJECT FileObject
2002 );
2003 typedef
2004 LONGLONG
2005 (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
2006 IN PFILE_OBJECT FileObject,
2007 OUT PLONGLONG SystemTime);
2008
2009 typedef struct
2010 {
2011 PFNKSCLOCK_GETTIME GetTime;
2012 PFNKSCLOCK_GETTIME GetPhysicalTime;
2013 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
2014 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
2015 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
2016
2017
2018 #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
2019 DEFINE_KSPROPERTY_ITEM(\
2020 KSPROPERTY_CLOCK_TIME,\
2021 (Handler),\
2022 sizeof(KSPROPERTY),\
2023 sizeof(LONGLONG),\
2024 NULL, NULL, 0, NULL, NULL, 0)
2025
2026 #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
2027 DEFINE_KSPROPERTY_ITEM(\
2028 KSPROPERTY_CLOCK_PHYSICALTIME,\
2029 (Handler),\
2030 sizeof(KSPROPERTY),\
2031 sizeof(LONGLONG),\
2032 NULL, NULL, 0, NULL, NULL, 0)
2033
2034 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
2035 DEFINE_KSPROPERTY_ITEM(\
2036 KSPROPERTY_CLOCK_CORRELATEDTIME,\
2037 (Handler),\
2038 sizeof(KSPROPERTY),\
2039 sizeof(KSCORRELATED_TIME),\
2040 NULL, NULL, 0, NULL, NULL, 0)
2041
2042 #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
2043 DEFINE_KSPROPERTY_ITEM(\
2044 KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
2045 (Handler),\
2046 sizeof(KSPROPERTY),\
2047 sizeof(KSCORRELATED_TIME),\
2048 NULL, NULL, 0, NULL, NULL, 0)
2049
2050 #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
2051 DEFINE_KSPROPERTY_ITEM(\
2052 KSPROPERTY_CLOCK_RESOLUTION,\
2053 (Handler),\
2054 sizeof(KSPROPERTY),\
2055 sizeof(KSRESOLUTION),\
2056 NULL, NULL, 0, NULL, NULL, 0)
2057
2058 #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
2059 DEFINE_KSPROPERTY_ITEM(\
2060 KSPROPERTY_CLOCK_STATE,\
2061 (Handler),\
2062 sizeof(KSPROPERTY),\
2063 sizeof(KSSTATE),\
2064 NULL, NULL, 0, NULL, NULL, 0)
2065
2066 #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
2067 DEFINE_KSPROPERTY_ITEM(\
2068 KSPROPERTY_CLOCK_FUNCTIONTABLE,\
2069 (Handler),\
2070 sizeof(KSPROPERTY),\
2071 sizeof(KSCLOCK_FUNCTIONTABLE),\
2072 NULL, NULL, 0, NULL, NULL, 0)
2073
2074 #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
2075 PropTime, PropPhysicalTime,\
2076 PropCorrelatedTime, PropCorrelatedPhysicalTime,\
2077 PropResolution, PropState, PropFunctionTable)\
2078 DEFINE_KSPROPERTY_TABLE(ClockSet) {\
2079 DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
2080 DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
2081 DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
2082 DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
2083 DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
2084 DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
2085 DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable)\
2086 }
2087
2088 /* ===============================================================
2089 Objects ??? SORT ME!
2090 */
2091
2092 #define KSCREATE_ITEM_SECURITYCHANGED 0x1
2093 #define KSCREATE_ITEM_WILDCARD 0x2
2094 #define KSCREATE_ITEM_NOPARAMETERS 0x4
2095 #define KSCREATE_ITEM_FREEONSTOP 0x8
2096
2097 typedef struct
2098 {
2099 PDRIVER_DISPATCH Create;
2100 PVOID Context;
2101 UNICODE_STRING ObjectClass;
2102 PSECURITY_DESCRIPTOR SecurityDescriptor;
2103 ULONG Flags;
2104 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
2105
2106 typedef struct
2107 {
2108 ULONG CreateItemsCount;
2109 PKSOBJECT_CREATE_ITEM CreateItemsList;
2110 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
2111
2112 typedef VOID (NTAPI *PFNKSITEMFREECALLBACK)(
2113 IN PKSOBJECT_CREATE_ITEM CreateItem);
2114
2115 #endif
2116
2117 typedef struct
2118 {
2119 ULONG Size;
2120 ULONG Count;
2121 } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
2122
2123 typedef struct
2124 {
2125 KSEVENT Event;
2126 PKSEVENTDATA EventData;
2127 PVOID Reserved;
2128 } KSQUERYBUFFER, *PKSQUERYBUFFER;
2129
2130 typedef struct
2131 {
2132 PVOID Context;
2133 ULONG Status;
2134 } KSERROR, *PKSERROR;
2135
2136 /* ===============================================================
2137 Methods
2138 */
2139 #if defined(_NTDDK_)
2140
2141 typedef struct
2142 {
2143 ULONG MethodId;
2144 union {
2145 PFNKSHANDLER MethodHandler;
2146 BOOLEAN MethodSupported;
2147 };
2148 ULONG MinMethod;
2149 ULONG MinData;
2150 PFNKSHANDLER SupportHandler;
2151 ULONG Flags;
2152 } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
2153
2154 #ifndef _MSC_VER
2155
2156 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
2157 MethodHandler,\
2158 MinMethod, MinData, SupportHandler)\
2159 {\
2160 MethodId, {(PFNKSHANDLER)MethodHandler}, MinMethod, MinData,\
2161 SupportHandler, Flags\
2162 }
2163
2164 #else
2165
2166 #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
2167 MethodHandler,\
2168 MinMethod, MinData, SupportHandler)\
2169 {\
2170 MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
2171 SupportHandler, Flags\
2172 }
2173
2174
2175
2176 #endif
2177
2178
2179 typedef struct
2180 {
2181 ULONG MethodId;
2182 union {
2183 PFNKSFASTHANDLER MethodHandler;
2184 BOOLEAN MethodSupported;
2185 };
2186 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
2187
2188 #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
2189 {\
2190 MethodId, (PFNKSFASTHANDLER)MethodHandler\
2191 }
2192
2193
2194 typedef struct
2195 {
2196 const GUID* Set;
2197 ULONG MethodsCount;
2198 const KSMETHOD_ITEM* MethodItem;
2199 ULONG FastIoCount;
2200 const KSFASTMETHOD_ITEM*FastIoTable;
2201 } KSMETHOD_SET, *PKSMETHOD_SET;
2202
2203
2204 #define DEFINE_KSMETHOD_SET(Set,\
2205 MethodsCount,\
2206 MethodItem,\
2207 FastIoCount,\
2208 FastIoTable)\
2209 {\
2210 Set,\
2211 MethodsCount,\
2212 MethodItem,\
2213 FastIoCount,\
2214 FastIoTable\
2215 }
2216
2217 #endif
2218 /* ===============================================================
2219 Nodes
2220 */
2221
2222 typedef struct
2223 {
2224 KSPROPERTY Property;
2225 ULONG NodeId;
2226 ULONG Reserved;
2227 } KSP_NODE, *PKSP_NODE;
2228
2229 typedef struct
2230 {
2231 KSMETHOD Method;
2232 ULONG NodeID;
2233 ULONG Reserved;
2234 } KSM_NODE, *PKSM_NODE;
2235
2236 typedef struct
2237 {
2238 KSEVENT Event;
2239 ULONG NodeId;
2240 ULONG Reserved;
2241 } KSE_NODE, *PKSE_NODE;
2242
2243 typedef struct {
2244 ULONG CreateFlags;
2245 ULONG Node;
2246 } KSNODE_CREATE, *PKSNODE_CREATE;
2247
2248
2249 /* ===============================================================
2250 Events
2251 */
2252 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY;
2253
2254 #if defined(_NTDDK_)
2255
2256 typedef NTSTATUS (NTAPI *PFNKSADDEVENT)(
2257 IN PIRP Irp,
2258 IN PKSEVENTDATA EventData,
2259 IN struct _KSEVENT_ENTRY* EventEntry);
2260
2261 typedef
2262 VOID
2263 (NTAPI *PFNKSREMOVEEVENT)(
2264 IN PFILE_OBJECT FileObject,
2265 IN struct _KSEVENT_ENTRY* EventEntry
2266 );
2267
2268 typedef struct
2269 {
2270 ULONG EventId;
2271 ULONG DataInput;
2272 ULONG ExtraEntryData;
2273 PFNKSADDEVENT AddHandler;
2274 PFNKSREMOVEEVENT RemoveHandler;
2275 PFNKSHANDLER SupportHandler;
2276 } KSEVENT_ITEM, *PKSEVENT_ITEM;
2277
2278 typedef struct
2279 {
2280 const GUID* Set;
2281 ULONG EventsCount;
2282 const KSEVENT_ITEM* EventItem;
2283 } KSEVENT_SET, *PKSEVENT_SET;
2284
2285 struct _KSEVENT_ENTRY
2286 {
2287 LIST_ENTRY ListEntry;
2288 PVOID Object;
2289 union {
2290 PKSDPC_ITEM DpcItem;
2291 PKSBUFFER_ITEM BufferItem;
2292 };
2293 PKSEVENTDATA EventData;
2294 ULONG NotificationType;
2295 const KSEVENT_SET* EventSet;
2296 const KSEVENT_ITEM* EventItem;
2297 PFILE_OBJECT FileObject;
2298 ULONG SemaphoreAdjustment;
2299 ULONG Reserved;
2300 ULONG Flags;
2301 };
2302
2303 #endif
2304 /* ===============================================================
2305 Pins
2306 */
2307
2308 #if defined(_NTDDK_)
2309
2310 typedef struct _KSPIN KSPIN, *PKSPIN;
2311 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
2312 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
2313 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
2314 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
2315
2316 #define IOCTL_KS_HANDSHAKE CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
2317
2318 typedef struct {
2319 GUID ProtocolId;
2320 PVOID Argument1;
2321 PVOID Argument2;
2322 } KSHANDSHAKE, *PKSHANDSHAKE;
2323
2324 typedef
2325 NTSTATUS
2326 (NTAPI *PFNKSPINHANDSHAKE)(
2327 IN PKSPIN Pin,
2328 IN PKSHANDSHAKE In,
2329 IN PKSHANDSHAKE Out
2330 );
2331
2332 typedef
2333 void
2334 (NTAPI *PFNKSPINPOWER)(
2335 IN PKSPIN Pin,
2336 IN DEVICE_POWER_STATE State
2337 );
2338
2339 typedef
2340 void
2341 (NTAPI *PFNKSPINFRAMERETURN)(
2342 IN PKSPIN Pin,
2343 IN PVOID Data OPTIONAL,
2344 IN ULONG Size OPTIONAL,
2345 IN PMDL Mdl OPTIONAL,
2346 IN PVOID Context OPTIONAL,
2347 IN NTSTATUS Status
2348 );
2349
2350 typedef
2351 void
2352 (NTAPI *PFNKSPINIRPCOMPLETION)(
2353 IN PKSPIN Pin,
2354 IN PIRP Irp
2355 );
2356
2357 typedef
2358 NTSTATUS
2359 (NTAPI *PFNKSPINIRP)(
2360 IN PKSPIN Pin,
2361 IN PIRP Irp
2362 );
2363
2364 typedef
2365 NTSTATUS
2366 (NTAPI *PFNKSPIN)(
2367 IN PKSPIN Pin
2368 );
2369
2370 typedef
2371 void
2372 (NTAPI *PFNKSPINVOID)(
2373 IN PKSPIN Pin
2374 );
2375
2376 typedef
2377 void
2378 (NTAPI *PFNKSSTREAMPOINTER)(
2379 IN PKSSTREAM_POINTER StreamPointer
2380 );
2381
2382 typedef struct {
2383 ULONG Count;
2384 PKSATTRIBUTE* Attributes;
2385 } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
2386
2387 typedef
2388 NTSTATUS
2389 (NTAPI *PFNKSPINSETDATAFORMAT)(
2390 IN PKSPIN Pin,
2391 IN PKSDATAFORMAT OldFormat OPTIONAL,
2392 IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
2393 IN const KSDATARANGE* DataRange,
2394 IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
2395 );
2396
2397 typedef
2398 NTSTATUS
2399 (NTAPI *PFNKSPINSETDEVICESTATE)(
2400 IN PKSPIN Pin,
2401 IN KSSTATE ToState,
2402 IN KSSTATE FromState
2403 );
2404
2405 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
2406 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
2407
2408 typedef struct
2409 {
2410 PFNKSPINIRP Create;
2411 PFNKSPINIRP Close;
2412 PFNKSPIN Process;
2413 PFNKSPINVOID Reset;
2414 PFNKSPINSETDATAFORMAT SetDataFormat;
2415 PFNKSPINSETDEVICESTATE SetDeviceState;
2416 PFNKSPIN Connect;
2417 PFNKSPINVOID Disconnect;
2418 const KSCLOCK_DISPATCH* Clock;
2419 const KSALLOCATOR_DISPATCH* Allocator;
2420 } KSPIN_DISPATCH, *PKSPIN_DISPATCH;
2421
2422 typedef
2423 BOOLEAN
2424 (NTAPI *PFNKSPINSETTIMER)(
2425 IN PKSPIN Pin,
2426 IN PKTIMER Timer,
2427 IN LARGE_INTEGER DueTime,
2428 IN PKDPC Dpc
2429 );
2430
2431 typedef
2432 BOOLEAN
2433 (NTAPI *PFNKSPINCANCELTIMER)(
2434 IN PKSPIN Pin,
2435 IN PKTIMER Timer
2436 );
2437
2438 typedef
2439 LONGLONG
2440 (FASTCALL *PFNKSPINCORRELATEDTIME)(
2441 IN PKSPIN Pin,
2442 OUT PLONGLONG SystemTime
2443 );
2444
2445 typedef
2446 void
2447 (NTAPI *PFNKSPINRESOLUTION)(
2448 IN PKSPIN Pin,
2449 OUT PKSRESOLUTION Resolution
2450 );
2451
2452 struct _KSCLOCK_DISPATCH {
2453 PFNKSPINSETTIMER SetTimer;
2454 PFNKSPINCANCELTIMER CancelTimer;
2455 PFNKSPINCORRELATEDTIME CorrelatedTime;
2456 PFNKSPINRESOLUTION Resolution;
2457 };
2458
2459 typedef
2460 NTSTATUS
2461 (NTAPI *PFNKSPININITIALIZEALLOCATOR)(
2462 IN PKSPIN Pin,
2463 IN PKSALLOCATOR_FRAMING AllocatorFraming,
2464 OUT PVOID* Context
2465 );
2466
2467 typedef PVOID (NTAPI *PFNKSDELETEALLOCATOR)(
2468 IN PVOID Context);
2469
2470 typedef PVOID (NTAPI *PFNKSDEFAULTALLOCATE)(
2471 IN PVOID Context);
2472
2473 typedef PVOID (NTAPI *PFNKSDEFAULTFREE)(
2474 IN PVOID Context,
2475 IN PVOID Buffer);
2476
2477 struct _KSALLOCATOR_DISPATCH {
2478 PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
2479 PFNKSDELETEALLOCATOR DeleteAllocator;
2480 PFNKSDEFAULTALLOCATE Allocate;
2481 PFNKSDEFAULTFREE Free;
2482 };
2483
2484 typedef struct
2485 {
2486 ULONG PropertySetsCount;
2487 ULONG PropertyItemSize;
2488 const KSPROPERTY_SET* PropertySets;
2489 ULONG MethodSetsCount;
2490 ULONG MethodItemSize;
2491 const KSMETHOD_SET* MethodSets;
2492 ULONG EventSetsCount;
2493 ULONG EventItemSize;
2494 const KSEVENT_SET* EventSets;
2495 #if !defined(_WIN64)
2496 PVOID Alignment;
2497 #endif
2498 } KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
2499
2500
2501
2502 typedef struct
2503 {
2504 ULONG InterfacesCount;
2505 const KSPIN_INTERFACE* Interfaces;
2506 ULONG MediumsCount;
2507 const KSPIN_MEDIUM* Mediums;
2508 ULONG DataRangesCount;
2509 const PKSDATARANGE* DataRanges;
2510 KSPIN_DATAFLOW DataFlow;
2511 KSPIN_COMMUNICATION Communication;
2512 const GUID* Category;
2513 const GUID* Name;
2514 union {
2515 LONGLONG Reserved;
2516 struct {
2517 ULONG ConstrainedDataRangesCount;
2518 PKSDATARANGE* ConstrainedDataRanges;
2519 };
2520 };
2521 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
2522
2523 typedef
2524 NTSTATUS
2525 (NTAPI *PFNKSINTERSECTHANDLER)(
2526 IN PIRP Irp,
2527 IN PKSP_PIN Pin,
2528 IN PKSDATARANGE DataRange,
2529 OUT PVOID Data OPTIONAL
2530 );
2531
2532 typedef
2533 NTSTATUS
2534 (NTAPI *PFNKSINTERSECTHANDLEREX)(
2535 IN PVOID Context,
2536 IN PIRP Irp,
2537 IN PKSP_PIN Pin,
2538 IN PKSDATARANGE DataRange,
2539 IN PKSDATARANGE MatchingDataRange,
2540 IN ULONG DataBufferSize,
2541 OUT PVOID Data OPTIONAL,
2542 OUT PULONG DataSize
2543 );
2544
2545 typedef struct
2546 {
2547 const KSPIN_DISPATCH* Dispatch;
2548 const KSAUTOMATION_TABLE* AutomationTable;
2549 KSPIN_DESCRIPTOR PinDescriptor;
2550 ULONG Flags;
2551 ULONG InstancesPossible;
2552 ULONG InstancesNecessary;
2553 const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
2554 PFNKSINTERSECTHANDLEREX IntersectHandler;
2555 } KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
2556
2557 #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
2558 #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
2559 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
2560 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008
2561 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2562 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000
2563 #endif
2564
2565
2566 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
2567 #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
2568 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
2569 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
2570 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
2571 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
2572 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
2573 #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
2574
2575 #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
2576 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
2577
2578 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
2579 #define KSPIN_FLAG_SPLITTER 0x00020000
2580 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
2581 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
2582 #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
2583 #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
2584 #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
2585 #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
2586 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000
2587 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000
2588 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2589 #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000
2590 #endif
2591
2592 struct _KSPIN
2593 {
2594 const KSPIN_DESCRIPTOR_EX* Descriptor;
2595 KSOBJECT_BAG Bag;
2596 PVOID Context;
2597 ULONG Id;
2598 KSPIN_COMMUNICATION Communication;
2599 BOOLEAN ConnectionIsExternal;
2600 KSPIN_INTERFACE ConnectionInterface;
2601 KSPIN_MEDIUM ConnectionMedium;
2602 KSPRIORITY ConnectionPriority;
2603 PKSDATAFORMAT ConnectionFormat;
2604 PKSMULTIPLE_ITEM AttributeList;
2605 ULONG StreamHeaderSize;
2606 KSPIN_DATAFLOW DataFlow;
2607 KSSTATE DeviceState;
2608 KSRESET ResetState;
2609 KSSTATE ClientState;
2610 };
2611
2612 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
2613 DEFINE_KSPROPERTY_ITEM(\
2614 KSPROPERTY_PIN_CINSTANCES,\
2615 (Handler),\
2616 sizeof(KSP_PIN),\
2617 sizeof(KSPIN_CINSTANCES),\
2618 NULL, NULL, 0, NULL, NULL, 0)
2619
2620 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
2621 DEFINE_KSPROPERTY_ITEM(\
2622 KSPROPERTY_PIN_CTYPES,\
2623 (Handler),\
2624 sizeof(KSPROPERTY),\
2625 sizeof(ULONG),\
2626 NULL, NULL, 0, NULL, NULL, 0)
2627
2628 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
2629 DEFINE_KSPROPERTY_ITEM(\
2630 KSPROPERTY_PIN_DATAFLOW,\
2631 (Handler),\
2632 sizeof(KSP_PIN),\
2633 sizeof(KSPIN_DATAFLOW),\
2634 NULL, NULL, 0, NULL, NULL, 0)
2635
2636 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
2637 DEFINE_KSPROPERTY_ITEM(\
2638 KSPROPERTY_PIN_DATARANGES,\
2639 (Handler),\
2640 sizeof(KSP_PIN),\
2641 0,\
2642 NULL, NULL, 0, NULL, NULL, 0)
2643
2644 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
2645 DEFINE_KSPROPERTY_ITEM(\
2646 KSPROPERTY_PIN_DATAINTERSECTION,\
2647 (Handler),\
2648 sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
2649 0,\
2650 NULL, NULL, 0, NULL, NULL, 0)
2651
2652 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
2653 DEFINE_KSPROPERTY_ITEM(\
2654 KSPROPERTY_PIN_INTERFACES,\
2655 (Handler),\
2656 sizeof(KSP_PIN),\
2657 0,\
2658 NULL, NULL, 0, NULL, NULL, 0)
2659
2660 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
2661 DEFINE_KSPROPERTY_ITEM(\
2662 KSPROPERTY_PIN_MEDIUMS,\
2663 (Handler),\
2664 sizeof(KSP_PIN),\
2665 0,\
2666 NULL, NULL, 0, NULL, NULL, 0)
2667
2668 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
2669 DEFINE_KSPROPERTY_ITEM(\
2670 KSPROPERTY_PIN_COMMUNICATION,\
2671 (Handler),\
2672 sizeof(KSP_PIN),\
2673 sizeof(KSPIN_COMMUNICATION),\
2674 NULL, NULL, 0, NULL, NULL, 0)
2675
2676 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
2677 DEFINE_KSPROPERTY_ITEM(\
2678 KSPROPERTY_PIN_GLOBALCINSTANCES,\
2679 (Handler),\
2680 sizeof(KSP_PIN),\
2681 sizeof(KSPIN_CINSTANCES),\
2682 NULL, NULL, 0, NULL, NULL, 0)
2683
2684 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
2685 DEFINE_KSPROPERTY_ITEM(\
2686 KSPROPERTY_PIN_NECESSARYINSTANCES,\
2687 (Handler),\
2688 sizeof(KSP_PIN),\
2689 sizeof(ULONG),\
2690 NULL, NULL, 0, NULL, NULL, 0)
2691
2692 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
2693 DEFINE_KSPROPERTY_ITEM(\
2694 KSPROPERTY_PIN_PHYSICALCONNECTION,\
2695 (Handler),\
2696 sizeof(KSP_PIN),\
2697 0,\
2698 NULL, NULL, 0, NULL, NULL, 0)
2699
2700 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
2701 DEFINE_KSPROPERTY_ITEM(\
2702 KSPROPERTY_PIN_CATEGORY,\
2703 (Handler),\
2704 sizeof(KSP_PIN),\
2705 sizeof(GUID),\
2706 NULL, NULL, 0, NULL, NULL, 0)
2707
2708 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
2709 DEFINE_KSPROPERTY_ITEM(\
2710 KSPROPERTY_PIN_NAME,\
2711 (Handler),\
2712 sizeof(KSP_PIN),\
2713 0,\
2714 NULL, NULL, 0, NULL, NULL, 0)
2715
2716 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
2717 DEFINE_KSPROPERTY_ITEM(\
2718 KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
2719 (Handler),\
2720 sizeof(KSP_PIN),\
2721 0,\
2722 NULL, NULL, 0, NULL, NULL, 0)
2723
2724 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
2725 DEFINE_KSPROPERTY_ITEM(\
2726 KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
2727 NULL,\
2728 sizeof(KSP_PIN),\
2729 sizeof(KSDATAFORMAT),\
2730 (Handler), NULL, 0, NULL, NULL, 0)
2731
2732 #define DEFINE_KSPROPERTY_PINSET(PinSet,\
2733 PropGeneral, PropInstances, PropIntersection)\
2734 DEFINE_KSPROPERTY_TABLE(PinSet) {\
2735 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
2736 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
2737 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
2738 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
2739 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
2740 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
2741 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
2742 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
2743 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
2744 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
2745 }
2746
2747 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
2748 PropGeneral, PropInstances, PropIntersection)\
2749 DEFINE_KSPROPERTY_TABLE(PinSet) {\
2750 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
2751 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
2752 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
2753 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
2754 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
2755 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
2756 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
2757 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
2758 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
2759 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
2760 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
2761 }
2762
2763
2764
2765 typedef
2766 void
2767 (NTAPI *PFNKSFREE)(
2768 IN PVOID Data
2769 );
2770
2771
2772
2773 #define DEFINE_KSPROPERTY_TABLE(tablename)\
2774 const KSPROPERTY_ITEM tablename[] =
2775
2776 #endif
2777
2778 typedef struct
2779 {
2780 KSPIN_INTERFACE Interface;
2781 KSPIN_MEDIUM Medium;
2782 ULONG PinId;
2783 HANDLE PinToHandle;
2784 KSPRIORITY Priority;
2785 } KSPIN_CONNECT, *PKSPIN_CONNECT;
2786
2787 /* ===============================================================
2788 Topology
2789 */
2790
2791 typedef struct
2792 {
2793 ULONG FromNode;
2794 ULONG FromNodePin;
2795 ULONG ToNode;
2796 ULONG ToNodePin;
2797 } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
2798
2799 typedef struct
2800 {
2801 ULONG CategoriesCount;
2802 const GUID* Categories;
2803 ULONG TopologyNodesCount;
2804 const GUID* TopologyNodes;
2805 ULONG TopologyConnectionsCount;
2806 const KSTOPOLOGY_CONNECTION* TopologyConnections;
2807 const GUID* TopologyNodesNames;
2808 ULONG Reserved;
2809 } KSTOPOLOGY, *PKSTOPOLOGY;
2810
2811
2812 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
2813 DEFINE_KSPROPERTY_ITEM(\
2814 KSPROPERTY_TOPOLOGY_CATEGORIES,\
2815 (Handler),\
2816 sizeof(KSPROPERTY),\
2817 0,\
2818 NULL, NULL, 0, NULL, NULL, 0)
2819
2820 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
2821 DEFINE_KSPROPERTY_ITEM(\
2822 KSPROPERTY_TOPOLOGY_NODES,\
2823 (Handler),\
2824 sizeof(KSPROPERTY),\
2825 0,\
2826 NULL, NULL, 0, NULL, NULL, 0)
2827
2828 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
2829 DEFINE_KSPROPERTY_ITEM(\
2830 KSPROPERTY_TOPOLOGY_CONNECTIONS,\
2831 (Handler),\
2832 sizeof(KSPROPERTY),\
2833 0,\
2834 NULL, NULL, 0, NULL, NULL, 0)
2835
2836 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
2837 DEFINE_KSPROPERTY_ITEM(\
2838 KSPROPERTY_TOPOLOGY_NAME,\
2839 (Handler),\
2840 sizeof(KSP_NODE),\
2841 0,\
2842 NULL, NULL, 0, NULL, NULL, 0)
2843
2844 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
2845 DEFINE_KSPROPERTY_TABLE(TopologySet) {\
2846 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
2847 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
2848 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
2849 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
2850 }
2851
2852 /* ===============================================================
2853 ??? SORT ME
2854 */
2855
2856 /* TODO */
2857 typedef void* UNKNOWN;
2858
2859 typedef PVOID (NTAPI *PFNKSINITIALIZEALLOCATOR)(
2860 IN PVOID InitialContext,
2861 IN PKSALLOCATOR_FRAMING AllocatorFraming,
2862 OUT PVOID* Context);
2863
2864 #if defined(_NTDDK_)
2865 typedef NTSTATUS (NTAPI *PFNKSALLOCATOR)(
2866 IN PIRP Irp,
2867 IN ULONG BufferSize,
2868 IN BOOLEAN InputOperation);
2869
2870 typedef NTSTATUS (NTAPI *PFNKINTERSECTHANDLEREX)(
2871 IN PVOID Context,
2872 IN PIRP Irp,
2873 IN PKSP_PIN Pin,
2874 IN PKSDATARANGE DataRange,
2875 IN PKSDATARANGE MatchingDataRange,
2876 IN ULONG DataBufferSize,
2877 OUT PVOID Data OPTIONAL,
2878 OUT PULONG DataSize);
2879
2880
2881 typedef
2882 NTSTATUS
2883 (NTAPI *PFNALLOCATOR_ALLOCATEFRAME)(
2884 IN PFILE_OBJECT FileObject,
2885 PVOID *Frame
2886 );
2887
2888 typedef
2889 VOID
2890 (NTAPI *PFNALLOCATOR_FREEFRAME)(
2891 IN PFILE_OBJECT FileObject,
2892 IN PVOID Frame
2893 );
2894
2895 typedef struct {
2896 PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
2897 PFNALLOCATOR_FREEFRAME FreeFrame;
2898 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
2899
2900 #endif
2901
2902 typedef struct
2903 {
2904 KSALLOCATOR_FRAMING Framing;
2905 ULONG AllocatedFrames;
2906 ULONG Reserved;
2907 } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
2908
2909 typedef struct
2910 {
2911 KSALLOCATOR_FRAMING_EX Framing;
2912 ULONG AllocatedFrames;
2913 ULONG Reserved;
2914 } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
2915
2916 typedef struct
2917 {
2918 ULONG Size;
2919 ULONG TypeSpecificFlags;
2920 KSTIME PresentationTime;
2921 LONGLONG Duration;
2922 ULONG FrameExtent;
2923 ULONG DataUsed;
2924 PVOID Data;
2925 ULONG OptionsFlags;
2926 #ifdef _WIN64
2927 ULONG Reserved;
2928 #endif
2929 } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
2930
2931 #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001
2932 #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002
2933 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004
2934 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008
2935 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010
2936 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040
2937 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080
2938 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100
2939 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200
2940 #define KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER 0x00000400
2941 #define KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER 0x00000800
2942 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000
2943
2944 /* ===============================================================
2945 XP / DX8
2946 */
2947 #if defined(_NTDDK_)
2948
2949 typedef struct _KSGATE KSGATE, *PKSGATE;
2950
2951 struct _KSGATE {
2952 LONG Count;
2953 PKSGATE NextGate;
2954 };
2955
2956 #ifndef _NTOS_
2957
2958 static
2959 void
2960 __inline
2961 KsGateTurnInputOn(
2962 IN PKSGATE Gate OPTIONAL)
2963 {
2964 while (Gate && (InterlockedIncrement(&Gate->Count) == 1))
2965 {
2966 Gate = Gate->NextGate;
2967 }
2968 }
2969
2970 static
2971 void
2972 __inline
2973 KsGateTurnInputOff(
2974 IN PKSGATE Gate OPTIONAL)
2975 {
2976 while (Gate && (InterlockedDecrement(&Gate->Count) == 0))
2977 {
2978 Gate = Gate->NextGate;
2979 }
2980 }
2981
2982 static
2983 BOOLEAN
2984 __inline
2985 KsGateGetStateUnsafe(
2986 IN PKSGATE Gate)
2987 {
2988 ASSERT(Gate);
2989 return((BOOLEAN)(Gate->Count > 0));
2990 }
2991
2992 static
2993 BOOLEAN
2994 __inline
2995 KsGateCaptureThreshold(
2996 IN PKSGATE Gate)
2997 {
2998 BOOLEAN captured;
2999
3000 ASSERT(Gate);
3001
3002 captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1);
3003
3004 if (captured)
3005 {
3006 KsGateTurnInputOff(Gate->NextGate);
3007 }
3008
3009 return captured;
3010 }
3011
3012 static
3013 void
3014 __inline
3015 KsGateInitialize(
3016 IN PKSGATE Gate,
3017 IN LONG InitialCount,
3018 IN PKSGATE NextGate OPTIONAL,
3019 IN BOOLEAN StateToPropagate
3020 )
3021 {
3022 ASSERT(Gate);
3023 Gate->Count = InitialCount;
3024 Gate->NextGate = NextGate;
3025
3026 if (NextGate)
3027 {
3028 if (InitialCount > 0)
3029 {
3030 if (StateToPropagate)
3031 {
3032 KsGateTurnInputOn(NextGate);
3033 }
3034 }
3035 else
3036 {
3037 if (!StateToPropagate)
3038 {
3039 KsGateTurnInputOff(NextGate);
3040 }
3041 }
3042 }
3043 }
3044
3045 static
3046 void
3047 __inline
3048 KsGateInitializeAnd(
3049 IN PKSGATE AndGate,
3050 IN PKSGATE NextOrGate OPTIONAL)
3051 {
3052 KsGateInitialize(AndGate,1,NextOrGate,TRUE);
3053 }
3054
3055 static
3056 void
3057 __inline
3058 KsGateInitializeOr(
3059 IN PKSGATE OrGate,
3060 IN PKSGATE NextAndGate OPTIONAL)
3061 {
3062 KsGateInitialize(OrGate,0,NextAndGate,FALSE);
3063 }
3064
3065 static
3066 void
3067 __inline
3068 KsGateAddOnInputToAnd(
3069 IN PKSGATE AndGate)
3070 {
3071 UNREFERENCED_PARAMETER (AndGate);
3072 }
3073
3074 static
3075 void
3076 __inline
3077 KsGateAddOffInputToAnd(
3078 IN PKSGATE AndGate)
3079 {
3080 KsGateTurnInputOff(AndGate);
3081 }
3082
3083 static
3084 void
3085 __inline
3086 KsGateRemoveOnInputFromAnd(
3087 IN PKSGATE AndGate)
3088 {
3089 UNREFERENCED_PARAMETER (AndGate);
3090 }
3091
3092 static
3093 void
3094 __inline
3095 KsGateRemoveOffInputFromAnd(
3096 IN PKSGATE AndGate)
3097 {
3098 KsGateTurnInputOn(AndGate);
3099 }
3100
3101 static
3102 void
3103 __inline
3104 KsGateAddOnInputToOr(
3105 IN PKSGATE OrGate)
3106 {
3107 KsGateTurnInputOn(OrGate);
3108 }
3109
3110 static
3111 void
3112 __inline
3113 KsGateAddOffInputToOr(
3114 IN PKSGATE OrGate)
3115 {
3116 UNREFERENCED_PARAMETER (OrGate);
3117 }
3118
3119 static
3120 void
3121 __inline
3122 KsGateRemoveOnInputFromOr(
3123 IN PKSGATE OrGate)
3124 {
3125 KsGateTurnInputOff(OrGate);
3126 }
3127
3128 static
3129 void
3130 __inline
3131 KsGateRemoveOffInputFromOr(
3132 IN PKSGATE OrGate)
3133 {
3134 UNREFERENCED_PARAMETER (OrGate);
3135 }
3136
3137 static
3138 void
3139 __inline
3140 KsGateTerminateAnd(
3141 IN PKSGATE AndGate)
3142 {
3143 ASSERT(AndGate);
3144 if (KsGateGetStateUnsafe(AndGate))
3145 {
3146 KsGateRemoveOnInputFromOr(AndGate->NextGate);
3147 }
3148 else
3149 {
3150 KsGateRemoveOffInputFromOr(AndGate->NextGate);
3151 }
3152 }
3153
3154 static
3155 void
3156 __inline
3157 KsGateTerminateOr(
3158 IN PKSGATE OrGate)
3159 {
3160 ASSERT(OrGate);
3161 if (KsGateGetStateUnsafe(OrGate))
3162 {
3163 KsGateRemoveOnInputFromAnd(OrGate->NextGate);
3164 }
3165 else
3166 {
3167 KsGateRemoveOffInputFromAnd(OrGate->NextGate);
3168 }
3169 }
3170
3171 #endif
3172
3173
3174 struct _KSMAPPING {
3175 PHYSICAL_ADDRESS PhysicalAddress;
3176 ULONG ByteCount;
3177 ULONG Alignment;
3178 };
3179 #endif
3180
3181 typedef enum {
3182 KSSTREAM_POINTER_STATE_UNLOCKED = 0,
3183 KSSTREAM_POINTER_STATE_LOCKED
3184 } KSSTREAM_POINTER_STATE;
3185
3186 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
3187
3188 struct _KSSTREAM_POINTER_OFFSET
3189 {
3190 #if defined(_NTDDK_)
3191 union {
3192 PUCHAR Data;
3193 PKSMAPPING Mappings;
3194 };
3195 #else
3196 PUCHAR Data;
3197 #endif
3198 #if !defined(_WIN64)
3199 PVOID Alignment;
3200 #endif
3201 ULONG Count;
3202 ULONG Remaining;
3203 };
3204 #if defined(_NTDDK_)
3205 struct _KSSTREAM_POINTER
3206 {
3207 PVOID Context;
3208 PKSPIN Pin;
3209 PKSSTREAM_HEADER StreamHeader;
3210 PKSSTREAM_POINTER_OFFSET Offset;
3211 KSSTREAM_POINTER_OFFSET OffsetIn;
3212 KSSTREAM_POINTER_OFFSET OffsetOut;
3213 };
3214
3215 struct _KSPROCESSPIN
3216 {
3217 PKSPIN Pin;
3218 PKSSTREAM_POINTER StreamPointer;
3219 PKSPROCESSPIN InPlaceCounterpart;
3220 PKSPROCESSPIN DelegateBranch;
3221 PKSPROCESSPIN CopySource;
3222 PVOID Data;
3223 ULONG BytesAvailable;
3224 ULONG BytesUsed;
3225 ULONG Flags;
3226 BOOLEAN Terminate;
3227 };
3228
3229 struct _KSPROCESSPIN_INDEXENTRY
3230 {
3231 PKSPROCESSPIN* Pins;
3232 ULONG Count;
3233 };
3234 #endif
3235
3236 /* ===============================================================
3237 Device Dispatch
3238 */
3239
3240
3241
3242 #if defined(_NTDDK_)
3243
3244 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
3245 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
3246 typedef struct _KSFILTER KSFILTER, *PKSFILTER;
3247 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
3248 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
3249 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
3250
3251 typedef NTSTATUS (NTAPI *PFNKSDEVICECREATE)(
3252 IN PKSDEVICE Device);
3253
3254 typedef NTSTATUS (NTAPI *PFNKSDEVICEPNPSTART)(
3255 IN PKSDEVICE Device,
3256 IN PIRP Irp,
3257 IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
3258 IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL);
3259
3260 typedef NTSTATUS (NTAPI *PFNKSDEVICE)(
3261 IN PKSDEVICE Device);
3262
3263 typedef NTSTATUS (NTAPI *PFNKSDEVICEIRP)(
3264 IN PKSDEVICE Device,
3265 IN PIRP Irp);
3266
3267 typedef VOID (NTAPI *PFNKSDEVICEIRPVOID)(
3268 IN PKSDEVICE Device,
3269 IN PIRP Irp);
3270
3271 typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)(
3272 IN PKSDEVICE Device,
3273 IN PIRP Irp,
3274 IN OUT PDEVICE_CAPABILITIES Capabilities);
3275
3276 typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYPOWER)(
3277 IN PKSDEVICE Device,
3278 IN PIRP Irp,
3279 IN DEVICE_POWER_STATE DeviceTo,
3280 IN DEVICE_POWER_STATE DeviceFrom,
3281 IN SYSTEM_POWER_STATE SystemTo,
3282 IN SYSTEM_POWER_STATE SystemFrom,
3283 IN POWER_ACTION Action);
3284
3285 typedef VOID (NTAPI *PFNKSDEVICESETPOWER)(
3286 IN PKSDEVICE Device,
3287 IN PIRP Irp,
3288 IN DEVICE_POWER_STATE To,
3289 IN DEVICE_POWER_STATE From);
3290
3291 typedef struct _KSDEVICE_DISPATCH {
3292 PFNKSDEVICECREATE Add;
3293 PFNKSDEVICEPNPSTART Start;
3294 PFNKSDEVICE PostStart;
3295 PFNKSDEVICEIRP QueryStop;
3296 PFNKSDEVICEIRPVOID CancelStop;
3297 PFNKSDEVICEIRPVOID Stop;
3298 PFNKSDEVICEIRP QueryRemove;
3299 PFNKSDEVICEIRPVOID CancelRemove;
3300 PFNKSDEVICEIRPVOID Remove;
3301 PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
3302 PFNKSDEVICEIRPVOID SurpriseRemoval;
3303 PFNKSDEVICEQUERYPOWER QueryPower;
3304 PFNKSDEVICESETPOWER SetPower;
3305 PFNKSDEVICEIRP QueryInterface;
3306 }KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
3307
3308 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3309 #define KSDEVICE_DESCRIPTOR_VERSION_2 (0x110)
3310 #define MIN_DEV_VER_FOR_FLAGS (0x110)
3311 #endif
3312
3313 struct _KSDEVICE
3314 {
3315 const KSDEVICE_DESCRIPTOR* Descriptor;
3316 KSOBJECT_BAG Bag;
3317 PVOID Context;
3318 PDEVICE_OBJECT FunctionalDeviceObject;
3319 PDEVICE_OBJECT PhysicalDeviceObject;
3320 PDEVICE_OBJECT NextDeviceObject;
3321 BOOLEAN Started;
3322 SYSTEM_POWER_STATE SystemPowerState;
3323 DEVICE_POWER_STATE DevicePowerState;
3324 };
3325 #endif
3326
3327 /* ===============================================================
3328 Filter Dispatch
3329 */
3330 #if defined(_NTDDK_)
3331 struct _KSFILTER
3332 {
3333 const KSFILTER_DESCRIPTOR* Descriptor;
3334 KSOBJECT_BAG Bag;
3335 PVOID Context;
3336 };
3337
3338 typedef
3339 void
3340 (NTAPI *PFNKSFILTERPOWER)(
3341 IN PKSFILTER Filter,
3342 IN DEVICE_POWER_STATE State
3343 );
3344
3345 typedef NTSTATUS (NTAPI *PFNKSFILTERIRP)(
3346 IN PKSFILTER Filter,
3347 IN PIRP Irp);
3348
3349 typedef NTSTATUS (NTAPI *PFNKSFILTERPROCESS)(
3350 IN PKSFILTER Filter,
3351 IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex);
3352
3353 typedef NTSTATUS (NTAPI *PFNKSFILTERVOID)(
3354 IN PKSFILTER Filter);
3355
3356 struct _KSFILTER_DISPATCH
3357 {
3358 PFNKSFILTERIRP Create;
3359 PFNKSFILTERIRP Close;
3360 PFNKSFILTERPROCESS Process;
3361 PFNKSFILTERVOID Reset;
3362 };
3363
3364 struct _KSNODE_DESCRIPTOR
3365 {
3366 const KSAUTOMATION_TABLE* AutomationTable;
3367 const GUID* Type;
3368 const GUID* Name;
3369 #if !defined(_WIN64)
3370 PVOID Alignment;
3371 #endif
3372 };
3373
3374 struct _KSFILTER_DESCRIPTOR
3375 {
3376 const KSFILTER_DISPATCH* Dispatch;
3377 const KSAUTOMATION_TABLE* AutomationTable;
3378 ULONG Version;
3379 ULONG Flags;
3380 const GUID* ReferenceGuid;
3381 ULONG PinDescriptorsCount;
3382 ULONG PinDescriptorSize;
3383 const KSPIN_DESCRIPTOR_EX* PinDescriptors;
3384 ULONG CategoriesCount;
3385 const GUID* Categories;
3386 ULONG NodeDescriptorsCount;
3387 ULONG NodeDescriptorSize;
3388 const KSNODE_DESCRIPTOR* NodeDescriptors;
3389 ULONG ConnectionsCount;
3390 const KSTOPOLOGY_CONNECTION* Connections;
3391 const KSCOMPONENTID* ComponentId;
3392 };
3393
3394 #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
3395
3396 struct _KSDEVICE_DESCRIPTOR
3397 {
3398 const KSDEVICE_DISPATCH* Dispatch;
3399 ULONG FilterDescriptorsCount;
3400 const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
3401 ULONG Version;
3402 ULONG Flags;
3403 };
3404
3405 struct _KSFILTERFACTORY {
3406 const KSFILTER_DESCRIPTOR* FilterDescriptor;
3407 KSOBJECT_BAG Bag;
3408 PVOID Context;
3409 };
3410
3411 #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
3412 const KSFILTER_DESCRIPTOR descriptor =
3413
3414 #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
3415 SIZEOF_ARRAY(table),\
3416 sizeof(table[0]),\
3417 table
3418
3419 #define DEFINE_KSFILTER_CATEGORIES(table)\
3420 SIZEOF_ARRAY(table),\
3421 table
3422
3423 #define DEFINE_KSFILTER_CATEGORY(category)\
3424 1,\
3425 &(category)
3426
3427 #define DEFINE_KSFILTER_CATEGORIES_NULL\
3428 0,\
3429 NULL
3430
3431 #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
3432 SIZEOF_ARRAY(table),\
3433 sizeof(table[0]),\
3434 table
3435
3436 #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
3437 0,\
3438 sizeof(KSNODE_DESCRIPTOR),\
3439 NULL
3440
3441 #define DEFINE_KSFILTER_CONNECTIONS(table)\
3442 SIZEOF_ARRAY(table),\
3443 table
3444
3445 #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
3446 0,\
3447 NULL
3448
3449 #endif
3450 /* ===============================================================
3451 Minidriver Callbacks
3452 */
3453 #if defined(_NTDDK_)
3454 typedef NTSTATUS (NTAPI *KStrMethodHandler)(
3455 IN PIRP Irp,
3456 IN PKSIDENTIFIER Request,
3457 IN OUT PVOID Data);
3458
3459 typedef NTSTATUS (NTAPI *KStrSupportHandler)(
3460 IN PIRP Irp,
3461 IN PKSIDENTIFIER Request,
3462 IN OUT PVOID Data);
3463 #endif
3464
3465 /* ===============================================================
3466 Allocator Functions
3467 */
3468 #if defined(_NTDDK_)
3469 KSDDKAPI NTSTATUS NTAPI
3470 KsCreateAllocator(
3471 IN HANDLE ConnectionHandle,
3472 IN PKSALLOCATOR_FRAMING AllocatorFraming,
3473 OUT PHANDLE AllocatorHandle);
3474
3475 KSDDKAPI NTSTATUS NTAPI
3476 KsCreateDefaultAllocator(
3477 IN PIRP Irp);
3478
3479 KSDDKAPI NTSTATUS NTAPI
3480 KsValidateAllocatorCreateRequest(
3481 IN PIRP Irp,
3482 OUT PKSALLOCATOR_FRAMING* AllocatorFraming);
3483
3484 KSDDKAPI NTSTATUS NTAPI
3485 KsCreateDefaultAllocatorEx(
3486 IN PIRP Irp,
3487 IN PVOID InitializeContext OPTIONAL,
3488 IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
3489 IN PFNKSDEFAULTFREE DefaultFree OPTIONAL,
3490 IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
3491 IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL);
3492
3493 KSDDKAPI NTSTATUS NTAPI
3494 KsValidateAllocatorFramingEx(
3495 IN PKSALLOCATOR_FRAMING_EX Framing,
3496 IN ULONG BufferSize,
3497 IN const KSALLOCATOR_FRAMING_EX* PinFraming);
3498 #endif
3499
3500 /* ===============================================================
3501 Clock Functions
3502 */
3503 #if defined(_NTDDK_)
3504 typedef BOOLEAN (NTAPI *PFNKSSETTIMER)(
3505 IN PVOID Context,
3506 IN PKTIMER Timer,
3507 IN LARGE_INTEGER DueTime,
3508 IN PKDPC Dpc);
3509
3510 typedef BOOLEAN (NTAPI *PFNKSCANCELTIMER)(
3511 IN PVOID Context,
3512 IN PKTIMER Timer);
3513
3514 typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(
3515 IN PVOID Context,
3516 OUT PLONGLONG SystemTime);
3517
3518 KSDDKAPI NTSTATUS NTAPI
3519 KsCreateClock(
3520 IN HANDLE ConnectionHandle,
3521 IN PKSCLOCK_CREATE ClockCreate,
3522 OUT PHANDLE ClockHandle);
3523
3524 KSDDKAPI NTSTATUS NTAPI
3525 KsCreateDefaultClock(
3526 IN PIRP Irp,
3527 IN PKSDEFAULTCLOCK DefaultClock);
3528
3529 KSDDKAPI NTSTATUS NTAPI
3530 KsAllocateDefaultClock(
3531 OUT PKSDEFAULTCLOCK* DefaultClock);
3532
3533 KSDDKAPI NTSTATUS NTAPI
3534 KsAllocateDefaultClockEx(
3535 OUT PKSDEFAULTCLOCK* DefaultClock,
3536 IN PVOID Context OPTIONAL,
3537 IN PFNKSSETTIMER SetTimer OPTIONAL,
3538 IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
3539 IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
3540 IN const KSRESOLUTION* Resolution OPTIONAL,
3541 IN ULONG Flags);
3542
3543 KSDDKAPI VOID NTAPI
3544 KsFreeDefaultClock(
3545 IN PKSDEFAULTCLOCK DefaultClock);
3546
3547 KSDDKAPI NTSTATUS NTAPI
3548 KsValidateClockCreateRequest(
3549 IN PIRP Irp,
3550 OUT PKSCLOCK_CREATE* ClockCreate);
3551
3552 KSDDKAPI KSSTATE NTAPI
3553 KsGetDefaultClockState(
3554 IN PKSDEFAULTCLOCK DefaultClock);
3555
3556 KSDDKAPI VOID NTAPI
3557 KsSetDefaultClockState(
3558 IN PKSDEFAULTCLOCK DefaultClock,
3559 IN KSSTATE State);
3560
3561 KSDDKAPI LONGLONG NTAPI
3562 KsGetDefaultClockTime(
3563 IN PKSDEFAULTCLOCK DefaultClock);
3564
3565 KSDDKAPI VOID NTAPI
3566 KsSetDefaultClockTime(
3567 IN PKSDEFAULTCLOCK DefaultClock,
3568 IN LONGLONG Time);
3569 #endif
3570
3571 /* ===============================================================
3572 Method Functions
3573 */
3574
3575 /* Method sets - TODO: Make into macros! */
3576 #if defined(_NTDDK_)
3577 #if 0
3578 VOID
3579 KSMETHOD_SET_IRP_STORAGE(
3580 IN IRP Irp);
3581
3582 VOID
3583 KSMETHOD_ITEM_IRP_STORAGE(
3584 IN IRP Irp);
3585
3586 VOID
3587 KSMETHOD_TYPE_IRP_STORAGE(
3588 IN IRP Irp);
3589 #endif
3590
3591 KSDDKAPI NTSTATUS NTAPI
3592 KsMethodHandler(
3593 IN PIRP Irp,
3594 IN ULONG MethodSetsCount,
3595 IN PKSMETHOD_SET MethodSet);
3596
3597 KSDDKAPI NTSTATUS NTAPI
3598 KsMethodHandlerWithAllocator(
3599 IN PIRP Irp,
3600 IN ULONG MethodSetsCount,
3601 IN PKSMETHOD_SET MethodSet,
3602 IN PFNKSALLOCATOR Allocator OPTIONAL,
3603 IN ULONG MethodItemSize OPTIONAL);
3604
3605 KSDDKAPI BOOLEAN NTAPI
3606 KsFastMethodHandler(
3607 IN PFILE_OBJECT FileObject,
3608 IN PKSMETHOD UNALIGNED Method,
3609 IN ULONG MethodLength,
3610 IN OUT PVOID UNALIGNED Data,
3611 IN ULONG DataLength,
3612 OUT PIO_STATUS_BLOCK IoStatus,
3613 IN ULONG MethodSetsCount,
3614 IN const KSMETHOD_SET* MethodSet);
3615 #endif
3616
3617 /* ===============================================================
3618 Property Functions
3619 */
3620 #if defined(_NTDDK_)
3621 KSDDKAPI NTSTATUS NTAPI
3622 KsPropertyHandler(
3623 IN PIRP Irp,
3624 IN ULONG PropertySetsCount,
3625 IN const KSPROPERTY_SET* PropertySet);
3626
3627 KSDDKAPI NTSTATUS NTAPI
3628 KsPropertyHandlerWithAllocator(
3629 IN PIRP Irp,
3630 IN ULONG PropertySetsCount,
3631 IN PKSPROPERTY_SET PropertySet,
3632 IN PFNKSALLOCATOR Allocator OPTIONAL,
3633 IN ULONG PropertyItemSize OPTIONAL);
3634
3635 KSDDKAPI NTSTATUS NTAPI
3636 KsUnserializeObjectPropertiesFromRegistry(
3637 IN PFILE_OBJECT FileObject,
3638 IN HANDLE ParentKey OPTIONAL,
3639 IN PUNICODE_STRING RegistryPath OPTIONAL);
3640
3641 KSDDKAPI BOOLEAN NTAPI
3642 KsFastPropertyHandler(
3643 IN PFILE_OBJECT FileObject,
3644 IN PKSPROPERTY UNALIGNED Property,
3645 IN ULONG PropertyLength,
3646 IN OUT PVOID UNALIGNED Data,
3647 IN ULONG DataLength,
3648 OUT PIO_STATUS_BLOCK IoStatus,
3649 IN ULONG PropertySetsCount,
3650 IN const KSPROPERTY_SET* PropertySet);
3651 #endif
3652
3653 /* ===============================================================
3654 Event Functions
3655 */
3656
3657 #if defined(_NTDDK_)
3658
3659 #define KSPROBE_STREAMREAD 0x00000000
3660 #define KSPROBE_STREAMWRITE 0x00000001
3661 #define KSPROBE_ALLOCATEMDL 0x00000010
3662 #define KSPROBE_PROBEANDLOCK 0x00000020
3663 #define KSPROBE_SYSTEMADDRESS 0x00000040
3664 #define KSPROBE_MODIFY 0x00000200
3665 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
3666 #define KSPROBE_ALLOWFORMATCHANGE 0x00000080
3667
3668 #define KSSTREAM_READ KSPROBE_STREAMREAD
3669 #define KSSTREAM_WRITE KSPROBE_STREAMWRITE
3670 #define KSSTREAM_PAGED_DATA 0x00000000
3671 #define KSSTREAM_NONPAGED_DATA 0x00000100
3672 #define KSSTREAM_SYNCHRONOUS 0x00001000
3673 #define KSSTREAM_FAILUREEXCEPTION 0x00002000
3674
3675 typedef
3676 BOOLEAN
3677 (NTAPI *PFNKSGENERATEEVENTCALLBACK)(
3678 IN PVOID Context,
3679 IN PKSEVENT_ENTRY EventEntry
3680 );
3681
3682 KSDDKAPI NTSTATUS NTAPI
3683 KsGenerateEvent(
3684 IN PKSEVENT_ENTRY EntryEvent);
3685
3686 KSDDKAPI void NTAPI
3687 KsGenerateEvents(
3688 IN PVOID Object,
3689 IN const GUID* EventSet OPTIONAL,
3690 IN ULONG EventId,
3691 IN ULONG DataSize,
3692 IN PVOID Data OPTIONAL,
3693 IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
3694 IN PVOID CallBackContext OPTIONAL
3695 );
3696
3697
3698 KSDDKAPI NTSTATUS NTAPI
3699 KsEnableEventWithAllocator(
3700 IN PIRP Irp,
3701 IN ULONG EventSetsCount,
3702 IN PKSEVENT_SET EventSet,
3703 IN OUT PLIST_ENTRY EventsList OPTIONAL,
3704 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
3705 IN PVOID EventsLock OPTIONAL,
3706 IN PFNKSALLOCATOR Allocator OPTIONAL,
3707 IN ULONG EventItemSize OPTIONAL);
3708
3709 KSDDKAPI NTSTATUS NTAPI
3710 KsGenerateDataEvent(
3711 IN PKSEVENT_ENTRY EventEntry,
3712 IN ULONG DataSize,
3713 IN PVOID Data);
3714
3715 KSDDKAPI NTSTATUS NTAPI
3716 KsEnableEvent(
3717 IN PIRP Irp,
3718 IN ULONG EventSetsCount,
3719 IN KSEVENT_SET* EventSet,
3720 IN OUT PLIST_ENTRY EventsList OPTIONAL,
3721 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
3722 IN PVOID EventsLock OPTIONAL);
3723
3724 KSDDKAPI VOID NTAPI
3725 KsDiscardEvent(
3726 IN PKSEVENT_ENTRY EventEntry);
3727
3728 KSDDKAPI NTSTATUS NTAPI
3729 KsDisableEvent(
3730 IN PIRP Irp,
3731 IN OUT PLIST_ENTRY EventsList,
3732 IN KSEVENTS_LOCKTYPE EventsFlags,
3733 IN PVOID EventsLock);
3734
3735 KSDDKAPI VOID NTAPI
3736 KsFreeEventList(
3737 IN PFILE_OBJECT FileObject,
3738 IN OUT PLIST_ENTRY EventsList,
3739 IN KSEVENTS_LOCKTYPE EVentsFlags,
3740 IN PVOID EventsLock);
3741
3742 /* ===============================================================
3743 Topology Functions
3744 */
3745
3746 KSDDKAPI NTSTATUS NTAPI
3747 KsValidateTopologyNodeCreateRequest(
3748 IN PIRP Irp,
3749 IN PKSTOPOLOGY Topology,
3750 OUT PKSNODE_CREATE* NodeCreate);
3751
3752 KSDDKAPI NTSTATUS NTAPI
3753 KsCreateTopologyNode(
3754 IN HANDLE ParentHandle,
3755 IN PKSNODE_CREATE NodeCreate,
3756 IN ACCESS_MASK DesiredAccess,
3757 OUT PHANDLE NodeHandle);
3758
3759 KSDDKAPI NTSTATUS NTAPI
3760 KsTopologyPropertyHandler(
3761 IN PIRP Irp,
3762 IN PKSPROPERTY Property,
3763 IN OUT PVOID Data,
3764 IN const KSTOPOLOGY* Topology);
3765
3766
3767
3768 /* ===============================================================
3769 Connectivity Functions
3770 */
3771
3772 KSDDKAPI NTSTATUS NTAPI
3773 KsCreatePin(
3774 IN HANDLE FilterHandle,
3775 IN PKSPIN_CONNECT Connect,
3776 IN ACCESS_MASK DesiredAccess,
3777 OUT PHANDLE ConnectionHandle);
3778
3779 KSDDKAPI NTSTATUS NTAPI
3780 KsValidateConnectRequest(
3781 IN PIRP Irp,
3782 IN ULONG DescriptorsCount,
3783 IN KSPIN_DESCRIPTOR* Descriptor,
3784 OUT PKSPIN_CONNECT* Connect);
3785
3786 KSDDKAPI NTSTATUS NTAPI
3787 KsPinPropertyHandler(
3788 IN PIRP Irp,
3789 IN PKSPROPERTY Property,
3790 IN OUT PVOID Data,
3791 IN ULONG DescriptorsCount,
3792 IN const KSPIN_DESCRIPTOR* Descriptor);
3793
3794 KSDDKAPI NTSTATUS NTAPI
3795 KsPinDataIntersection(
3796 IN PIRP Irp,
3797 IN PKSP_PIN Pin,
3798 OUT PVOID Data,
3799 IN ULONG DescriptorsCount,
3800 IN const KSPIN_DESCRIPTOR* Descriptor,
3801 IN PFNKSINTERSECTHANDLER IntersectHandler);
3802
3803 KSDDKAPI NTSTATUS NTAPI
3804 KsPinDataIntersectionEx(
3805 IN PIRP Irp,
3806 IN PKSP_PIN Pin,
3807 OUT PVOID Data,
3808 IN ULONG DescriptorsCount,
3809 IN const KSPIN_DESCRIPTOR* Descriptor,
3810 IN ULONG DescriptorSize,
3811 IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
3812 IN PVOID HandlerContext OPTIONAL);
3813
3814 KSDDKAPI PKSFILTER NTAPI
3815 KsPinGetParentFilter(
3816 IN PKSPIN Pin
3817 );
3818
3819 KSDDKAPI PKSPIN NTAPI
3820 KsPinGetNextSiblingPin(
3821 IN PKSPIN Pin
3822 );
3823
3824
3825 /* Does this belong here? */
3826
3827 KSDDKAPI NTSTATUS NTAPI
3828 KsHandleSizedListQuery(
3829 IN PIRP Irp,
3830 IN ULONG DataItemsCount,
3831 IN ULONG DataItemSize,
3832 IN const VOID* DataItems);
3833
3834
3835 /* ===============================================================
3836 IRP Helper Functions
3837 */
3838
3839 typedef NTSTATUS (NTAPI *PFNKSIRPLISTCALLBACK)(
3840 IN PIRP Irp,
3841 IN PVOID Context);
3842
3843 KSDDKAPI NTSTATUS NTAPI
3844 KsAcquireResetValue(
3845 IN PIRP Irp,
3846 OUT KSRESET* ResetValue);
3847
3848 KSDDKAPI VOID NTAPI
3849 KsAddIrpToCancelableQueue(
3850 IN OUT PLIST_ENTRY QueueHead,
3851 IN PKSPIN_LOCK SpinLock,
3852 IN PIRP Irp,
3853 IN KSLIST_ENTRY_LOCATION ListLocation,
3854 IN PDRIVER_CANCEL DriverCancel OPTIONAL);
3855
3856 KSDDKAPI NTSTATUS NTAPI
3857 KsAddObjectCreateItemToDeviceHeader(
3858 IN KSDEVICE_HEADER Header,
3859 IN PDRIVER_DISPATCH Create,
3860 IN PVOID Context,
3861 IN PWCHAR ObjectClass,
3862 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
3863
3864 KSDDKAPI NTSTATUS NTAPI
3865 KsAddObjectCreateItemToObjectHeader(
3866 IN KSOBJECT_HEADER Header,
3867 IN PDRIVER_DISPATCH Create,
3868 IN PVOID Context,
3869 IN PWCHAR ObjectClass,
3870 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
3871
3872 KSDDKAPI NTSTATUS NTAPI
3873 KsAllocateDeviceHeader(
3874 OUT KSDEVICE_HEADER* Header,
3875 IN ULONG ItemsCount,
3876 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL);
3877
3878 KSDDKAPI NTSTATUS NTAPI
3879 KsAllocateExtraData(
3880 IN PIRP Irp,
3881 IN ULONG ExtraSize,
3882 OUT PVOID* ExtraBuffer);
3883
3884 KSDDKAPI NTSTATUS NTAPI
3885 KsAllocateObjectCreateItem(
3886 IN KSDEVICE_HEADER Header,
3887 IN PKSOBJECT_CREATE_ITEM CreateItem,
3888 IN BOOLEAN AllocateEntry,
3889 IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL);
3890
3891 KSDDKAPI NTSTATUS NTAPI
3892 KsAllocateObjectHeader(
3893 OUT KSOBJECT_HEADER *Header,
3894 IN ULONG ItemsCount,
3895 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
3896 IN PIRP Irp,
3897 IN KSDISPATCH_TABLE* Table);
3898
3899 KSDDKAPI VOID NTAPI
3900 KsCancelIo(
3901 IN OUT PLIST_ENTRY QueueHead,
3902 IN PKSPIN_LOCK SpinLock);
3903
3904 KSDDKAPI VOID NTAPI
3905 KsCancelRoutine(
3906 IN PDEVICE_OBJECT DeviceObject,
3907 IN PIRP Irp);
3908
3909 KSDDKAPI NTSTATUS NTAPI
3910 KsDefaultDeviceIoCompletion(
3911 IN PDEVICE_OBJECT DeviceObject,
3912 IN PIRP Irp);
3913
3914 /* ELSEWHERE
3915 KSDDKAPI ULONG NTAPI
3916 KsDecrementCountedWorker(
3917 IN PKSWORKER Worker);
3918 */
3919
3920 KSDDKAPI BOOLEAN NTAPI
3921 KsDispatchFastIoDeviceControlFailure(
3922 IN PFILE_OBJECT FileObject,
3923 IN BOOLEAN Wait,
3924 IN PVOID InputBuffer OPTIONAL,
3925 IN ULONG InputBufferLength,
3926 OUT PVOID OutputBuffer OPTIONAL,
3927 IN ULONG OutputBufferLength,
3928 IN ULONG IoControlCode,
3929 OUT PIO_STATUS_BLOCK IoStatus,
3930 IN PDEVICE_OBJECT DeviceObject); /* always return false */
3931
3932 KSDDKAPI BOOLEAN NTAPI
3933 KsDispatchFastReadFailure(
3934 IN PFILE_OBJECT FileObject,
3935 IN PLARGE_INTEGER FileOffset,
3936 IN ULONG Length,
3937 IN BOOLEAN Wait,
3938 IN ULONG LockKey,
3939 OUT PVOID Buffer,
3940 OUT PIO_STATUS_BLOCK IoStatus,
3941 IN PDEVICE_OBJECT DeviceObject); /* always return false */
3942
3943 /* This function does the same as the above */
3944 #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
3945
3946 KSDDKAPI NTSTATUS NTAPI
3947 KsDispatchInvalidDeviceRequest(
3948 IN PDEVICE_OBJECT DeviceObject,
3949 IN PIRP Irp);
3950
3951 KSDDKAPI NTSTATUS NTAPI
3952 KsDispatchIrp(
3953 IN PDEVICE_OBJECT DeviceObject,
3954 IN PIRP Irp);
3955
3956 KSDDKAPI NTSTATUS NTAPI
3957 KsDispatchSpecificMethod(
3958 IN PIRP Irp,
3959 IN PFNKSHANDLER Handler);
3960
3961 KSDDKAPI NTSTATUS NTAPI
3962 KsDispatchSpecificProperty(
3963 IN PIRP Irp,
3964 IN PFNKSHANDLER Handler);
3965
3966 KSDDKAPI NTSTATUS NTAPI
3967 KsForwardAndCatchIrp(
3968 IN PDEVICE_OBJECT DeviceObject,
3969 IN PIRP Irp,
3970 IN PFILE_OBJECT FileObject,
3971 IN KSSTACK_USE StackUse);
3972
3973 KSDDKAPI NTSTATUS NTAPI
3974 KsForwardIrp(
3975 IN PIRP Irp,
3976 IN PFILE_OBJECT FileObject,
3977 IN BOOLEAN ReuseStackLocation);
3978
3979 KSDDKAPI VOID NTAPI
3980 KsFreeDeviceHeader(
3981 IN KSDEVICE_HEADER Header);
3982
3983 KSDDKAPI VOID NTAPI
3984 KsFreeObjectHeader(
3985 IN PVOID Header);
3986
3987 KSDDKAPI NTSTATUS NTAPI
3988 KsGetChildCreateParameter(
3989 IN PIRP Irp,
3990 OUT PVOID* CreateParameter);
3991
3992 KSDDKAPI NTSTATUS NTAPI
3993 KsMoveIrpsOnCancelableQueue(
3994 IN OUT PLIST_ENTRY SourceList,
3995 IN PKSPIN_LOCK SourceLock,
3996 IN OUT PLIST_ENTRY DestinationList,
3997 IN PKSPIN_LOCK DestinationLock OPTIONAL,
3998 IN KSLIST_ENTRY_LOCATION ListLocation,
3999 IN PFNKSIRPLISTCALLBACK ListCallback,
4000 IN PVOID Context);
4001
4002 KSDDKAPI NTSTATUS NTAPI
4003 KsProbeStreamIrp(
4004 IN PIRP Irp,
4005 IN ULONG ProbeFlags,
4006 IN ULONG HeaderSize);
4007
4008 KSDDKAPI NTSTATUS NTAPI
4009 KsQueryInformationFile(
4010 IN PFILE_OBJECT FileObject,
4011 OUT PVOID FileInformation,
4012 IN ULONG Length,
4013 IN FILE_INFORMATION_CLASS FileInformationClass);
4014
4015 KSDDKAPI ACCESS_MASK NTAPI
4016 KsQueryObjectAccessMask(
4017 IN KSOBJECT_HEADER Header);
4018
4019 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI
4020 KsQueryObjectCreateItem(
4021 IN KSOBJECT_HEADER Header);
4022
4023 KSDDKAPI NTSTATUS NTAPI
4024 KsReadFile(
4025 IN PFILE_OBJECT FileObject,
4026 IN PKEVENT Event OPTIONAL,
4027 IN PVOID PortContext OPTIONAL,
4028 OUT PIO_STATUS_BLOCK IoStatusBlock,
4029 OUT PVOID Buffer,
4030 IN ULONG Length,
4031 IN ULONG Key OPTIONAL,
4032 IN KPROCESSOR_MODE RequestorMode);
4033
4034 KSDDKAPI VOID NTAPI
4035 KsReleaseIrpOnCancelableQueue(
4036 IN PIRP Irp,
4037 IN PDRIVER_CANCEL DriverCancel OPTIONAL);
4038
4039 KSDDKAPI PIRP NTAPI
4040 KsRemoveIrpFromCancelableQueue(
4041 IN OUT PLIST_ENTRY QueueHead,
4042 IN PKSPIN_LOCK SpinLock,
4043 IN KSLIST_ENTRY_LOCATION ListLocation,
4044 IN KSIRP_REMOVAL_OPERATION RemovalOperation);
4045
4046 KSDDKAPI VOID NTAPI
4047 KsRemoveSpecificIrpFromCancelableQueue(
4048 IN PIRP Irp);
4049
4050 KSDDKAPI NTSTATUS NTAPI
4051 KsSetInformationFile(
4052 IN PFILE_OBJECT FileObject,
4053 IN PVOID FileInformation,
4054 IN ULONG Length,
4055 IN FILE_INFORMATION_CLASS FileInformationClass);
4056
4057 KSDDKAPI NTSTATUS NTAPI
4058 KsSetMajorFunctionHandler(
4059 IN PDRIVER_OBJECT DriverObject,
4060 IN ULONG MajorFunction);
4061
4062 KSDDKAPI NTSTATUS NTAPI
4063 KsStreamIo(
4064 IN PFILE_OBJECT FileObject,
4065 IN PKEVENT Event OPTIONAL,
4066 IN PVOID PortContext OPTIONAL,
4067 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
4068 IN PVOID CompletionContext OPTIONAL,
4069 IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
4070 OUT PIO_STATUS_BLOCK IoStatusBlock,
4071 IN OUT PVOID StreamHeaders,
4072 IN ULONG Length,
4073 IN ULONG Flags,
4074 IN KPROCESSOR_MODE RequestorMode);
4075
4076 KSDDKAPI NTSTATUS NTAPI
4077 KsWriteFile(
4078 IN PFILE_OBJECT FileObject,
4079 IN PKEVENT Event OPTIONAL,
4080 IN PVOID PortContext OPTIONAL,
4081 OUT PIO_STATUS_BLOCK IoStatusBlock,
4082 IN PVOID Buffer,
4083 IN ULONG Length,
4084 IN ULONG Key OPTIONAL,
4085 IN KPROCESSOR_MODE RequestorMode);
4086
4087
4088 KSDDKAPI NTSTATUS NTAPI
4089 KsDefaultForwardIrp(
4090 IN PDEVICE_OBJECT DeviceObject,
4091 IN PIRP Irp);
4092
4093 /* ===============================================================
4094 Worker Management Functions
4095 */
4096
4097 KSDDKAPI NTSTATUS NTAPI
4098 KsRegisterWorker(
4099 IN WORK_QUEUE_TYPE WorkQueueType,
4100 OUT PKSWORKER* Worker);
4101
4102 KSDDKAPI VOID NTAPI
4103 KsUnregisterWorker(
4104 IN PKSWORKER Worker);
4105
4106 KSDDKAPI NTSTATUS NTAPI
4107 KsRegisterCountedWorker(
4108 IN WORK_QUEUE_TYPE WorkQueueType,
4109 IN PWORK_QUEUE_ITEM CountedWorkItem,
4110 OUT PKSWORKER* Worker);
4111
4112 KSDDKAPI ULONG NTAPI
4113 KsDecrementCountedWorker(
4114 IN PKSWORKER Worker);
4115
4116 KSDDKAPI ULONG NTAPI
4117 KsIncrementCountedWorker(
4118 IN PKSWORKER Worker);
4119
4120 KSDDKAPI NTSTATUS NTAPI
4121 KsQueueWorkItem(
4122 IN PKSWORKER Worker,
4123 IN PWORK_QUEUE_ITEM WorkItem);
4124
4125
4126 /* ===============================================================
4127 Resources / Images
4128 */
4129
4130 KSDDKAPI NTSTATUS NTAPI
4131 KsLoadResource(
4132 IN PVOID ImageBase,
4133 IN POOL_TYPE PoolType,
4134 IN ULONG_PTR ResourceName,
4135 IN ULONG ResourceType,
4136 OUT PVOID* Resource,
4137 OUT PULONG ResourceSize);
4138
4139 /* TODO: Implement
4140 KSDDKAPI NTSTATUS NTAPI
4141 KsGetImageNameAndResourceId(
4142 IN HANDLE RegKey,
4143 OUT PUNICODE_STRING ImageName,
4144 OUT PULONG_PTR ResourceId,
4145 OUT PULONG ValueType);
4146
4147 KSDDKAPI NTSTATUS NTAPI
4148 KsMapModuleName(
4149 IN PDEVICE_OBJECT PhysicalDeviceObject,
4150 IN PUNICODE_STRING ModuleName,
4151 OUT PUNICODE_STRING ImageName,
4152 OUT PULONG_PTR ResourceId,
4153 OUT PULONG ValueType);
4154 */
4155
4156
4157 /* ===============================================================
4158 Misc. Helper Functions
4159 */
4160
4161 KSDDKAPI PVOID NTAPI
4162 KsGetNextSibling(
4163 IN PVOID Object);
4164
4165
4166 KSDDKAPI NTSTATUS NTAPI
4167 KsCacheMedium(
4168 IN PUNICODE_STRING SymbolicLink,
4169 IN PKSPIN_MEDIUM Medium,
4170 IN ULONG PinDirection);
4171
4172 KSDDKAPI NTSTATUS NTAPI
4173 KsDefaultDispatchPnp(
4174 IN PDEVICE_OBJECT DeviceObject,
4175 IN PIRP Irp);
4176
4177 KSDDKAPI VOID NTAPI
4178 KsSetDevicePnpAndBaseObject(
4179 IN KSDEVICE_HEADER Header,
4180 IN PDEVICE_OBJECT PnpDeviceObject,
4181 IN PDEVICE_OBJECT BaseDevice);
4182
4183 KSDDKAPI NTSTATUS NTAPI
4184 KsDefaultDispatchPower(
4185 IN PDEVICE_OBJECT DeviceObject,
4186 IN PIRP Irp);
4187
4188 KSDDKAPI VOID NTAPI
4189 KsSetPowerDispatch(
4190 IN KSOBJECT_HEADER Header,
4191 IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
4192 IN PVOID PowerContext OPTIONAL);
4193
4194 KSDDKAPI NTSTATUS NTAPI
4195 KsReferenceBusObject(
4196 IN KSDEVICE_HEADER Header);
4197
4198 KSDDKAPI VOID NTAPI
4199 KsDereferenceBusObject(
4200 IN KSDEVICE_HEADER Header);
4201
4202 KSDDKAPI NTSTATUS NTAPI
4203 KsFreeObjectCreateItem(
4204 IN KSDEVICE_HEADER Header,
4205 IN PUNICODE_STRING CreateItem);
4206
4207 KSDDKAPI NTSTATUS NTAPI
4208 KsFreeObjectCreateItemsByContext(
4209 IN KSDEVICE_HEADER Header,
4210 IN PVOID Context);
4211
4212 KSDDKAPI VOID NTAPI
4213 KsNullDriverUnload(
4214 IN PDRIVER_OBJECT DriverObject);
4215
4216 KSDDKAPI PDEVICE_OBJECT NTAPI
4217 KsQueryDevicePnpObject(
4218 IN KSDEVICE_HEADER Header);
4219
4220 KSDDKAPI VOID NTAPI
4221 KsRecalculateStackDepth(
4222 IN KSDEVICE_HEADER Header,
4223 IN BOOLEAN ReuseStackLocation);
4224
4225 KSDDKAPI VOID NTAPI
4226 KsSetTargetDeviceObject(
4227 IN KSOBJECT_HEADER Header,
4228 IN PDEVICE_OBJECT TargetDevice OPTIONAL);
4229
4230 KSDDKAPI VOID NTAPI
4231 KsSetTargetState(
4232 IN KSOBJECT_HEADER Header,
4233 IN KSTARGET_STATE TargetState);
4234
4235 KSDDKAPI NTSTATUS NTAPI
4236 KsSynchronousIoControlDevice(
4237 IN PFILE_OBJECT FileObject,
4238 IN KPROCESSOR_MODE RequestorMode,
4239 IN ULONG IoControl,
4240 IN PVOID InBuffer,
4241 IN ULONG InSize,
4242 OUT PVOID OutBuffer,
4243 IN ULONG OUtSize,
4244 OUT PULONG BytesReturned);
4245
4246 KSDDKAPI
4247 PKSPIN
4248 NTAPI
4249 KsFilterGetFirstChildPin(
4250 IN PKSFILTER Filter,
4251 IN ULONG PinId
4252 );
4253
4254 KSDDKAPI
4255 PFILE_OBJECT
4256 NTAPI
4257 KsPinGetConnectedPinFileObject(
4258 IN PKSPIN Pin
4259 );
4260
4261 #else
4262
4263 #if !defined( KS_NO_CREATE_FUNCTIONS )
4264
4265 KSDDKAPI
4266 DWORD
4267 WINAPI
4268 KsCreateAllocator(
4269 IN HANDLE ConnectionHandle,
4270 IN PKSALLOCATOR_FRAMING AllocatorFraming,
4271 OUT PHANDLE AllocatorHandle
4272 );
4273
4274 KSDDKAPI
4275 DWORD
4276 NTAPI
4277 KsCreateClock(
4278 IN HANDLE ConnectionHandle,
4279 IN PKSCLOCK_CREATE ClockCreate,
4280 OUT PHANDLE ClockHandle
4281 );
4282
4283 KSDDKAPI
4284 DWORD
4285 WINAPI
4286 KsCreatePin(
4287 IN HANDLE FilterHandle,
4288 IN PKSPIN_CONNECT Connect,
4289 IN ACCESS_MASK DesiredAccess,
4290 OUT PHANDLE ConnectionHandle
4291 );
4292
4293 KSDDKAPI
4294 DWORD
4295 WINAPI
4296 KsCreateTopologyNode(
4297 IN HANDLE ParentHandle,
4298 IN PKSNODE_CREATE NodeCreate,
4299 IN ACCESS_MASK DesiredAccess,
4300 OUT PHANDLE NodeHandle
4301 );
4302
4303 #endif
4304
4305 #endif
4306
4307 /* ===============================================================
4308 AVStream Functions (XP / DirectX 8)
4309 NOT IMPLEMENTED YET
4310 http://www.osronline.com/ddkx/stream/avstream_5q9f.htm
4311 */
4312
4313 #if defined(_NTDDK_)
4314
4315 KSDDKAPI
4316 NTSTATUS
4317 NTAPI
4318 KsMergeAutomationTables(
4319 OUT PKSAUTOMATION_TABLE* AutomationTableAB,
4320 IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
4321 IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
4322 IN KSOBJECT_BAG Bag OPTIONAL
4323 );
4324
4325 KSDDKAPI
4326 NTSTATUS
4327 NTAPI
4328 KsInitializeDriver(
4329 IN PDRIVER_OBJECT DriverObject,
4330 IN PUNICODE_STRING RegistryPath,
4331 IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL);
4332
4333 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME
4334
4335
4336
4337 KSDDKAPI
4338 NTSTATUS
4339 NTAPI
4340 KsInitializeDevice (
4341 IN PDEVICE_OBJECT FunctionalDeviceObject,
4342 IN PDEVICE_OBJECT PhysicalDeviceObject,
4343 IN PDEVICE_OBJECT NextDeviceObject,
4344 IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL);
4345
4346
4347 typedef void (NTAPI *PFNKSFILTERFACTORYPOWER)(
4348 IN PKSFILTERFACTORY FilterFactory,
4349 IN DEVICE_POWER_STATE State);
4350
4351 KSDDKAPI
4352 NTSTATUS
4353 NTAPI
4354 _KsEdit(
4355 IN KSOBJECT_BAG ObjectBag,
4356 IN OUT PVOID* PointerToPointerToItem,
4357 IN ULONG NewSize,
4358 IN ULONG OldSize,
4359 IN ULONG Tag);
4360
4361 KSDDKAPI
4362 VOID
4363 NTAPI
4364 KsAcquireControl(
4365 IN PVOID Object);
4366
4367 KSDDKAPI
4368 VOID
4369 NTAPI
4370 KsAcquireDevice(
4371 IN PKSDEVICE Device);
4372
4373 KSDDKAPI
4374 NTSTATUS
4375 NTAPI
4376 KsAddDevice(
4377 IN PDRIVER_OBJECT DriverObject,
4378 IN PDEVICE_OBJECT PhysicalDeviceObject);
4379
4380 KSDDKAPI
4381 VOID
4382 NTAPI
4383 KsAddEvent(
4384 IN PVOID Object,
4385 IN PKSEVENT_ENTRY EventEntry);
4386
4387 KSDDKAPI
4388 NTSTATUS
4389 NTAPI
4390 KsAddItemToObjectBag(
4391 IN KSOBJECT_BAG ObjectBag,
4392 IN PVOID Item,
4393 IN PFNKSFREE Free OPTIONAL);
4394
4395 KSDDKAPI
4396 ULONG
4397 NTAPI
4398 KsRemoveItemFromObjectBag(
4399 IN KSOBJECT_BAG ObjectBag,
4400 IN PVOID Item,
4401 IN BOOLEAN Free);
4402
4403 KSDDKAPI
4404 NTSTATUS
4405 NTAPI
4406 KsAllocateObjectBag(
4407 IN PKSDEVICE Device,
4408 OUT KSOBJECT_BAG* ObjectBag);
4409
4410 KSDDKAPI
4411 VOID
4412 NTAPI
4413 KsFreeObjectBag(
4414 IN KSOBJECT_BAG ObjectBag
4415 );
4416
4417 KSDDKAPI
4418 VOID
4419 NTAPI
4420 KsCompletePendingRequest(
4421 IN PIRP Irp);
4422
4423 KSDDKAPI
4424 NTSTATUS
4425 NTAPI
4426 KsCopyObjectBagItems(
4427 IN KSOBJECT_BAG ObjectBagDestination,
4428 IN KSOBJECT_BAG ObjectBagSource);
4429
4430 KSDDKAPI
4431 NTSTATUS
4432 NTAPI
4433 KsCreateDevice(
4434 IN PDRIVER_OBJECT DriverObject,
4435 IN PDEVICE_OBJECT PhysicalDeviceObject,
4436 IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
4437 IN ULONG ExtensionSize OPTIONAL,
4438 OUT PKSDEVICE* Device OPTIONAL);
4439
4440 KSDDKAPI
4441 NTSTATUS
4442 NTAPI
4443 KsCreateFilterFactory(
4444 IN PDEVICE_OBJECT DeviceObject,
4445 IN const KSFILTER_DESCRIPTOR* Descriptor,
4446 IN PWCHAR RefString OPTIONAL,
4447 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
4448 IN ULONG CreateItemFlags,
4449 IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
4450 IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
4451 OUT PKSFILTERFACTORY *FilterFactory OPTIONAL);
4452
4453 KSDDKAPI
4454 NTSTATUS
4455 NTAPI
4456 KsFilterFactorySetDeviceClassesState(
4457 IN PKSFILTERFACTORY FilterFactory,
4458 IN BOOLEAN NewState
4459 );
4460
4461 KSDDKAPI
4462 NTSTATUS
4463 NTAPI
4464 KsFilterFactoryUpdateCacheData(
4465 IN PKSFILTERFACTORY FilterFactory,
4466 IN const KSFILTER_DESCRIPTOR *FilterDescriptor OPTIONAL
4467 );
4468
4469 KSDDKAPI
4470 PKSPIN
4471 NTAPI
4472 KsGetPinFromIrp(
4473 IN PIRP Irp
4474 );
4475
4476 KSDDKAPI
4477 PKSFILTER
4478 NTAPI
4479 KsGetFilterFromIrp(
4480 IN PIRP Irp
4481 );
4482
4483 KSDDKAPI
4484 NTSTATUS
4485 NTAPI
4486 KsDefaultAddEventHandler(
4487 IN PIRP Irp,
4488 IN PKSEVENTDATA EventData,
4489 IN OUT PKSEVENT_ENTRY EventEntry);
4490
4491 KSDDKAPI
4492 NTSTATUS
4493 NTAPI
4494 KsDispatchQuerySecurity(
4495 IN PDEVICE_OBJECT DeviceObject,
4496 IN PIRP Irp
4497 );
4498
4499 KSDDKAPI
4500 NTSTATUS
4501 NTAPI
4502 KsDispatchSetSecurity(
4503 IN PDEVICE_OBJECT DeviceObject,
4504 IN PIRP Irp
4505 );
4506
4507 KSDDKAPI
4508 PVOID
4509 NTAPI
4510 KsGetParent(
4511 IN PVOID Object
4512 );
4513
4514
4515 static
4516 PKSFILTERFACTORY
4517 __inline
4518 KsFilterGetParentFilterFactory(
4519 IN PKSFILTER Filter
4520 )
4521 {
4522 return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
4523 }
4524
4525 static
4526 PKSDEVICE
4527 __inline
4528 KsFilterFactoryGetParentDevice(
4529 IN PKSFILTERFACTORY FilterFactory
4530 )
4531 {
4532 return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
4533 }
4534
4535
4536
4537 #define KsDeleteFilterFactory(FilterFactory) \
4538 KsFreeObjectCreateItemsByContext( \
4539 *(KSDEVICE_HEADER *)( \
4540 KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject-> \
4541 DeviceExtension), \
4542 FilterFactory)
4543
4544 KSDDKAPI
4545 ULONG
4546 NTAPI
4547 KsDeviceGetBusData(
4548 IN PKSDEVICE Device,
4549 IN ULONG DataType,
4550 IN PVOID Buffer,
4551 IN ULONG Offset,
4552 IN ULONG Length);
4553
4554
4555 KSDDKAPI
4556 PVOID
4557 NTAPI
4558 KsGetFirstChild(
4559 IN PVOID Object
4560 );
4561
4562 KSDDKAPI
4563 PKSFILTERFACTORY
4564 NTAPI
4565 KsDeviceGetFirstChildFilterFactory(
4566 IN PKSDEVICE Device);
4567
4568 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
4569
4570 KSDDKAPI
4571 PUNKNOWN
4572 NTAPI
4573 KsGetOuterUnknown(
4574 IN PVOID Object
4575 );
4576
4577 static
4578 __inline
4579 PUNKNOWN
4580 KsDeviceGetOuterUnknown(
4581 IN PKSDEVICE Device)
4582 {
4583 return KsGetOuterUnknown((PVOID) Device);
4584 }
4585
4586 KSDDKAPI
4587 PUNKNOWN
4588 NTAPI
4589 KsDeviceRegisterAggregatedClientUnknown(
4590 IN PKSDEVICE Device,
4591 IN PUNKNOWN ClientUnknown);
4592
4593
4594 #endif
4595
4596 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
4597
4598 typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
4599
4600 #undef INTERFACE
4601 #define INTERFACE IKsReferenceClock
4602 DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
4603 {
4604 DEFINE_ABSTRACT_UNKNOWN() // For C
4605
4606 STDMETHOD_(LONGLONG,GetTime)(THIS
4607 ) PURE;
4608 STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
4609 ) PURE;
4610 STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
4611 OUT PLONGLONG SystemTime
4612 ) PURE;
4613 STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
4614 OUT PLONGLONG SystemTime
4615 ) PURE;
4616 STDMETHOD_(NTSTATUS, GetResolution)(THIS_
4617 OUT PKSRESOLUTION Resolution
4618 ) PURE;
4619 STDMETHOD_(NTSTATUS, GetState)(THIS_
4620 OUT PKSSTATE State
4621 ) PURE;
4622 };
4623
4624 #undef INTERFACE
4625 #define INTERFACE IKsControl
4626
4627 DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
4628
4629 DECLARE_INTERFACE_(IKsControl,IUnknown)
4630 {
4631 STDMETHOD_(NTSTATUS, QueryInterface)( THIS_
4632 REFIID InterfaceId,
4633 PVOID* Interface)PURE;
4634
4635 STDMETHOD_(ULONG, AddRef)(THIS) PURE;
4636
4637 STDMETHOD_(ULONG, Release)(THIS) PURE;
4638
4639 STDMETHOD_(NTSTATUS, KsProperty)(THIS_
4640 IN PKSPROPERTY Property,
4641 IN ULONG PropertyLength,
4642 IN OUT PVOID PropertyData,
4643 IN ULONG DataLength,
4644 OUT ULONG* BytesReturned
4645 ) PURE;
4646 STDMETHOD_(NTSTATUS, KsMethod)(THIS_
4647 IN PKSMETHOD Method,
4648 IN ULONG MethodLength,
4649 IN OUT PVOID MethodData,
4650 IN ULONG DataLength,
4651 OUT ULONG* BytesReturned
4652 ) PURE;
4653 STDMETHOD_(NTSTATUS, KsEvent)(THIS_
4654 IN PKSEVENT Event OPTIONAL,
4655 IN ULONG EventLength,
4656 IN OUT PVOID EventData,
4657 IN ULONG DataLength,
4658 OUT ULONG* BytesReturned
4659 ) PURE;
4660 };
4661
4662 #undef INTERFACE
4663 typedef IKsControl* PIKSCONTROL;
4664
4665 #endif
4666
4667 KSDDKAPI
4668 VOID
4669 NTAPI
4670 KsDeviceRegisterAdapterObject(
4671 IN PKSDEVICE Device,
4672 IN PADAPTER_OBJECT AdapterObject,
4673 IN ULONG MaxMappingByteCount,
4674 IN ULONG MappingTableStride);
4675
4676 KSDDKAPI
4677 ULONG
4678 NTAPI
4679 KsDeviceSetBusData(
4680 IN PKSDEVICE Device,
4681 IN ULONG DataType,
4682 IN PVOID Buffer,
4683 IN ULONG Offset,
4684 IN ULONG Length);
4685
4686
4687 KSDDKAPI
4688 VOID
4689 NTAPI
4690 KsReleaseControl(
4691 IN PVOID Object
4692 );
4693
4694 #define KsDiscard(object, pointer) \
4695 KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE)
4696
4697 #define KsFilterAcquireControl(Filter) \
4698 KsAcquireControl((PVOID) Filter);
4699
4700 #define KsFilterReleaseControl(Filter) \
4701 KsReleaseControl((PVOID) Filter);
4702
4703 #define KsFilterAddEvent(Filter, EventEntry) \
4704 KsAddEvent(Filter,EventEntry);
4705
4706 KSDDKAPI
4707 VOID
4708 NTAPI
4709 KsFilterAcquireProcessingMutex(
4710 IN PKSFILTER Filter);
4711
4712
4713 KSDDKAPI
4714 NTSTATUS
4715 NTAPI
4716 KsFilterAddTopologyConnections(
4717 IN PKSFILTER Filter,
4718 IN ULONG NewConnectionsCount,
4719 IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
4720
4721 KSDDKAPI
4722 VOID
4723 NTAPI
4724 KsFilterAttemptProcessing(
4725 IN PKSFILTER Filter,
4726 IN BOOLEAN Asynchronous);
4727
4728 KSDDKAPI
4729 NTSTATUS
4730 NTAPI
4731 KsFilterCreateNode(
4732 IN PKSFILTER Filter,
4733 IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
4734 OUT PULONG NodeID);
4735
4736 KSDDKAPI
4737 NTSTATUS
4738 NTAPI
4739 KsFilterCreatePinFactory(
4740 IN PKSFILTER Filter,
4741 IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
4742 OUT PULONG PinID);
4743
4744 KSDDKAPI
4745 PKSDEVICE
4746 __inline
4747 KsFilterFactoryGetDevice(
4748 IN PKSFILTERFACTORY FilterFactory);
4749
4750 /* etc. */
4751 #endif /* avstream */
4752
4753 #ifdef __cplusplus
4754 }
4755 #endif
4756
4757 #endif