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