- Add flags
[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 (*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 (*PFNREFERENCEDEVICEOBJECT)(
1264 IN PVOID Context
1265 );
1266
1267 typedef
1268 VOID
1269 (*PFNDEREFERENCEDEVICEOBJECT)(
1270 IN PVOID Context
1271 );
1272
1273 typedef
1274 NTSTATUS
1275 (*PFNQUERYREFERENCESTRING)(
1276 IN PVOID Context,
1277 IN OUT PWCHAR *String
1278 );
1279
1280 typedef struct
1281 {
1282 INTERFACE Interface;
1283 PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject;
1284 PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject;
1285 PFNQUERYREFERENCESTRING QueryReferenceString;
1286 } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
1287
1288 typedef struct
1289 {
1290 KDPC Dpc;
1291 ULONG ReferenceCount;
1292 KSPIN_LOCK AccessLock;
1293 } KSDPC_ITEM, *PKSDPC_ITEM;
1294
1295 typedef struct
1296 {
1297 KSDPC_ITEM DpcItem;
1298 LIST_ENTRY BufferList;
1299 } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
1300
1301 #endif
1302
1303 typedef struct
1304 {
1305 GUID Manufacturer;
1306 GUID Product;
1307 GUID Component;
1308 GUID Name;
1309 ULONG Version;
1310 ULONG Revision;
1311 } KSCOMPONENTID, *PKSCOMPONENTID;
1312
1313 /* ===============================================================
1314 Properties
1315 */
1316
1317 #define KSPROPERTY_MEMBER_RANGES 0x00000001
1318 #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002
1319 #define KSPROPERTY_MEMBER_VALUES 0x00000003
1320 #define KSPROPERTY_MEMBER_FLAG_DEFAULT KSPROPERTY_MEMBER_RANGES
1321
1322 typedef enum {
1323 KS_SEEKING_NoPositioning,
1324 KS_SEEKING_AbsolutePositioning,
1325 KS_SEEKING_RelativePositioning,
1326 KS_SEEKING_IncrementalPositioning,
1327 KS_SEEKING_PositioningBitsMask = 0x3,
1328 KS_SEEKING_SeekToKeyFrame,
1329 KS_SEEKING_ReturnTime = 0x8
1330 } KS_SEEKING_FLAGS;
1331
1332 typedef struct
1333 {
1334 LONGLONG Current;
1335 LONGLONG Stop;
1336 KS_SEEKING_FLAGS CurrentFlags;
1337 KS_SEEKING_FLAGS StopFlags;
1338 } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
1339
1340 typedef struct
1341 {
1342 GUID PropertySet;
1343 ULONG Count;
1344 } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
1345
1346 typedef struct
1347 {
1348 KSIDENTIFIER PropTypeSet;
1349 ULONG Id;
1350 ULONG PropertyLength;
1351 } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
1352
1353
1354 typedef union
1355 {
1356 struct {
1357 LONG SignedMinimum;
1358 LONG SignedMaximum;
1359
1360 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1361 }_SIGNED;
1362 #else
1363 };
1364 #endif
1365
1366 struct {
1367 ULONG UnsignedMinimum;
1368 ULONG UnsignedMaximum;
1369 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1370 }_UNSIGNED;
1371 #else
1372 };
1373 #endif
1374
1375 } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
1376
1377 typedef union
1378 {
1379 struct {
1380 LONGLONG SignedMinimum;
1381 LONGLONG SignedMaximum;
1382 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1383 }_SIGNED64;
1384 #else
1385 };
1386 #endif
1387
1388 struct {
1389 #if defined(_NTDDK_)
1390 ULONGLONG UnsignedMinimum;
1391 ULONGLONG UnsignedMaximum;
1392 #else
1393 DWORDLONG UnsignedMinimum;
1394 DWORDLONG UnsignedMaximum;
1395 #endif
1396 #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
1397 }_UNSIGNED64;
1398 #else
1399 };
1400 #endif
1401 } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
1402
1403 typedef struct
1404 {
1405 ULONG AccessFlags;
1406 ULONG DescriptionSize;
1407 KSIDENTIFIER PropTypeSet;
1408 ULONG MembersListCount;
1409 ULONG Reserved;
1410 } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
1411
1412 typedef struct
1413 {
1414 LONGLONG Earliest;
1415 LONGLONG Latest;
1416 } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
1417
1418
1419 typedef struct
1420 {
1421 ULONG MembersFlags;
1422 ULONG MembersSize;
1423 ULONG MembersCount;
1424 ULONG Flags;
1425 } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
1426
1427 typedef struct {
1428 KSPROPERTY_MEMBERSHEADER MembersHeader;
1429 const VOID* Members;
1430 } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
1431
1432 typedef struct {
1433 KSIDENTIFIER PropTypeSet;
1434 ULONG MembersListCount;
1435 const KSPROPERTY_MEMBERSLIST* MembersList;
1436 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
1437
1438 #if defined(_NTDDK_)
1439 typedef NTSTATUS (*PFNKSHANDLER)(
1440 IN PIRP Irp,
1441 IN PKSIDENTIFIER Request,
1442 IN OUT PVOID Data);
1443
1444 typedef struct
1445 {
1446 ULONG PropertyId;
1447 union
1448 {
1449 PFNKSHANDLER GetPropertyHandler;
1450 BOOLEAN GetSupported;
1451 };
1452 ULONG MinProperty;
1453 ULONG MinData;
1454 union {
1455 PFNKSHANDLER SetPropertyHandler;
1456 BOOLEAN SetSupported;
1457 };
1458 const KSPROPERTY_VALUES * Values;
1459 ULONG RelationsCount;
1460 const KSPROPERTY * Relations;
1461 PFNKSHANDLER SupportHandler;
1462 ULONG SerializedSize;
1463 } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
1464
1465
1466 typedef
1467 BOOLEAN
1468 NTAPI
1469 (*PFNKSFASTHANDLER)(
1470 IN PFILE_OBJECT FileObject,
1471 IN PKSIDENTIFIER Request,
1472 IN ULONG RequestLength,
1473 IN OUT PVOID Data,
1474 IN ULONG DataLength,
1475 OUT PIO_STATUS_BLOCK IoStatus
1476 );
1477
1478 typedef struct {
1479 ULONG PropertyId;
1480 union {
1481 PFNKSFASTHANDLER GetPropertyHandler;
1482 BOOLEAN GetSupported;
1483 };
1484 union {
1485 PFNKSFASTHANDLER SetPropertyHandler;
1486 BOOLEAN SetSupported;
1487 };
1488 ULONG Reserved;
1489 } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
1490
1491 typedef struct
1492 {
1493 const GUID* Set;
1494 ULONG PropertiesCount;
1495 const KSPROPERTY_ITEM * PropertyItem;
1496 ULONG FastIoCount;
1497 const KSFASTPROPERTY_ITEM* FastIoTable;
1498 } KSPROPERTY_SET, *PKSPROPERTY_SET;
1499
1500 #endif
1501
1502 typedef struct
1503 {
1504 ULONG SteppingDelta;
1505 ULONG Reserved;
1506 KSPROPERTY_BOUNDS_LONG Bounds;
1507 } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
1508
1509 typedef struct
1510 {
1511 #if defined(_NTDDK_)
1512 ULONGLONG SteppingDelta;
1513 #else
1514 DWORDLONG SteppingDelta;
1515 #endif
1516 KSPROPERTY_BOUNDS_LONGLONG Bounds;
1517 } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
1518
1519 /* ===============================================================
1520 Allocator Framing
1521 */
1522
1523 typedef struct
1524 {
1525 union {
1526 ULONG OptionsFlags;
1527 ULONG RequirementsFlags;
1528 };
1529 #if defined(_NTDDK_)
1530 POOL_TYPE PoolType;
1531 #else
1532 ULONG PoolType;
1533 #endif
1534 ULONG Frames;
1535 ULONG FrameSize;
1536 ULONG FileAlignment;
1537 ULONG Reserved;
1538 } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
1539
1540 typedef struct
1541 {
1542 ULONG CountItems;
1543 ULONG PinFlags;
1544 KS_COMPRESSION OutputCompression;
1545 ULONG PinWeight;
1546 KS_FRAMING_ITEM FramingItem[1];
1547 } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
1548
1549 #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001
1550 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002
1551 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004
1552 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008
1553 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000
1554
1555 #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001
1556 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002
1557 #define KSALLOCATOR_OPTIONF_VALID 0x00000003
1558
1559 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010
1560 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020
1561 #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040
1562 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080
1563
1564 /* ===============================================================
1565 Quality
1566 */
1567
1568 typedef struct
1569 {
1570 PVOID Context;
1571 ULONG Proportion;
1572 LONGLONG DeltaTime;
1573 } KSQUALITY, *PKSQUALITY;
1574
1575 typedef struct
1576 {
1577 HANDLE QualityManager;
1578 PVOID Context;
1579 } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
1580
1581 typedef struct
1582 {
1583 LONGLONG PresentationStart;
1584 LONGLONG Duration;
1585 KSPIN_INTERFACE Interface;
1586 LONG Rate;
1587 ULONG Flags;
1588 } KSRATE, *PKSRATE;
1589
1590 typedef struct
1591 {
1592 KSPROPERTY Property;
1593 KSRATE Rate;
1594 } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
1595
1596 typedef struct
1597 {
1598 LONGLONG Granularity;
1599 LONGLONG Error;
1600 } KSRESOLUTION, *PKSRESOLUTION;
1601
1602 typedef struct
1603 {
1604 ULONG NotificationType;
1605 union {
1606 struct {
1607 HANDLE Event;
1608 ULONG_PTR Reserved[2];
1609 } EventHandle;
1610 struct {
1611 HANDLE Semaphore;
1612 ULONG Reserved;
1613 LONG Adjustment;
1614 } SemaphoreHandle;
1615 #if defined(_NTDDK_)
1616 struct {
1617 PVOID Event;
1618 KPRIORITY Increment;
1619 ULONG_PTR Reserved;
1620 } EventObject;
1621 struct {
1622 PVOID Semaphore;
1623 KPRIORITY Increment;
1624 LONG Adjustment;
1625 } SemaphoreObject;
1626 struct {
1627 PKDPC Dpc;
1628 ULONG ReferenceCount;
1629 ULONG_PTR Reserved;
1630 } Dpc;
1631 struct {
1632 PWORK_QUEUE_ITEM WorkQueueItem;
1633 WORK_QUEUE_TYPE WorkQueueType;
1634 ULONG_PTR Reserved;
1635 } WorkItem;
1636 struct {
1637 PWORK_QUEUE_ITEM WorkQueueItem;
1638 PKSWORKER KsWorkerObject;
1639 ULONG_PTR Reserved;
1640 } KsWorkItem;
1641 #endif
1642 struct {
1643 PVOID Unused;
1644 LONG_PTR Alignment[2];
1645 } Alignment;
1646 };
1647 } KSEVENTDATA, *PKSEVENTDATA;
1648
1649 typedef struct
1650 {
1651 ULONG Size;
1652 ULONG Flags;
1653 union {
1654 HANDLE ObjectHandle;
1655 PVOID ObjectPointer;
1656 };
1657 PVOID Reserved;
1658 KSEVENT Event;
1659 KSEVENTDATA EventData;
1660 } KSRELATIVEEVENT, *PKSRELATIVEEVENT;
1661
1662
1663 /* ===============================================================
1664 Timing
1665 */
1666
1667 typedef struct
1668 {
1669 LONGLONG Time;
1670 ULONG Numerator;
1671 ULONG Denominator;
1672 } KSTIME, *PKSTIME;
1673
1674 typedef struct
1675 {
1676 LONGLONG Time;
1677 LONGLONG SystemTime;
1678 } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
1679
1680 typedef struct
1681 {
1682 KSPROPERTY Property;
1683 GUID SourceFormat;
1684 GUID TargetFormat;
1685 LONGLONG Time;
1686 } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
1687
1688 typedef struct
1689 {
1690 LONGLONG TimeBase;
1691 LONGLONG Interval;
1692 } KSINTERVAL, *PKSINTERVAL;
1693
1694 typedef struct
1695 {
1696 LONGLONG Duration;
1697 ULONG FrameFlags;
1698 ULONG Reserved;
1699 } KSFRAMETIME, *PKSFRAMETIME;
1700
1701
1702 /* ===============================================================
1703 Clocks
1704 */
1705
1706 typedef PVOID PKSDEFAULTCLOCK;
1707
1708 typedef struct
1709 {
1710 ULONG CreateFlags;
1711 } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
1712
1713 #if defined(_NTDDK_)
1714
1715 typedef
1716 LONGLONG
1717 (FASTCALL *PFNKSCLOCK_GETTIME)(
1718 IN PFILE_OBJECT FileObject
1719 );
1720 typedef
1721 LONGLONG
1722 (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
1723 IN PFILE_OBJECT FileObject,
1724 OUT PLONGLONG SystemTime);
1725
1726 typedef struct
1727 {
1728 PFNKSCLOCK_GETTIME GetTime;
1729 PFNKSCLOCK_GETTIME GetPhysicalTime;
1730 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
1731 PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
1732 } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
1733
1734
1735 /* ===============================================================
1736 Objects ??? SORT ME!
1737 */
1738
1739 #define KSCREATE_ITEM_SECURITYCHANGED 0x1
1740 #define KSCREATE_ITEM_WILDCARD 0x2
1741 #define KSCREATE_ITEM_NOPARAMETERS 0x4
1742 #define KSCREATE_ITEM_FREEONSTOP 0x8
1743
1744 typedef struct
1745 {
1746 PDRIVER_DISPATCH Create;
1747 PVOID Context;
1748 UNICODE_STRING ObjectClass;
1749 PSECURITY_DESCRIPTOR SecurityDescriptor;
1750 ULONG Flags;
1751 } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
1752
1753 typedef struct
1754 {
1755 ULONG CreateItemsCount;
1756 PKSOBJECT_CREATE_ITEM CreateItemsList;
1757 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
1758
1759 typedef VOID (NTAPI *PFNKSITEMFREECALLBACK)(
1760 IN PKSOBJECT_CREATE_ITEM CreateItem);
1761
1762 #endif
1763
1764 typedef struct
1765 {
1766 ULONG Size;
1767 ULONG Count;
1768 } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
1769
1770 typedef struct
1771 {
1772 KSEVENT Event;
1773 PKSEVENTDATA EventData;
1774 PVOID Reserved;
1775 } KSQUERYBUFFER, *PKSQUERYBUFFER;
1776
1777 typedef struct
1778 {
1779 PVOID Context;
1780 ULONG Status;
1781 } KSERROR, *PKSERROR;
1782
1783 /* ===============================================================
1784 Methods
1785 */
1786 #if defined(_NTDDK_)
1787
1788 typedef struct
1789 {
1790 ULONG MethodId;
1791 union {
1792 PFNKSHANDLER MethodHandler;
1793 BOOLEAN MethodSupported;
1794 };
1795 ULONG MinMethod;
1796 ULONG MinData;
1797 PFNKSHANDLER SupportHandler;
1798 ULONG Flags;
1799 } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
1800
1801
1802 typedef struct
1803 {
1804 ULONG MethodId;
1805 union {
1806 PFNKSFASTHANDLER MethodHandler;
1807 BOOLEAN MethodSupported;
1808 };
1809 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
1810
1811 typedef struct
1812 {
1813 const GUID* Set;
1814 ULONG MethodsCount;
1815 const KSMETHOD_ITEM* MethodItem;
1816 ULONG FastIoCount;
1817 const KSFASTMETHOD_ITEM*FastIoTable;
1818 } KSMETHOD_SET, *PKSMETHOD_SET;
1819
1820 #endif
1821 /* ===============================================================
1822 Nodes
1823 */
1824
1825 typedef struct
1826 {
1827 KSPROPERTY Property;
1828 ULONG NodeId;
1829 ULONG Reserved;
1830 } KSP_NODE, *PKSP_NODE;
1831
1832 typedef struct
1833 {
1834 KSMETHOD Method;
1835 ULONG NodeID;
1836 ULONG Reserved;
1837 } KSM_NODE, *PKSM_NODE;
1838
1839 typedef struct
1840 {
1841 KSEVENT Event;
1842 ULONG NodeId;
1843 ULONG Reserved;
1844 } KSE_NODE, *PKSE_NODE;
1845
1846 typedef struct {
1847 ULONG CreateFlags;
1848 ULONG Node;
1849 } KSNODE_CREATE, *PKSNODE_CREATE;
1850
1851
1852 /* ===============================================================
1853 Events
1854 */
1855 typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY;
1856
1857 #if defined(_NTDDK_)
1858 typedef struct
1859 {
1860 KSEVENTDATA EventData;
1861 LONGLONG MarkTime;
1862 } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
1863
1864 typedef struct
1865 {
1866 KSEVENTDATA EventData;
1867 LONGLONG TimeBase;
1868 LONGLONG Interval;
1869 } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
1870
1871 typedef NTSTATUS (*PFNKSADDEVENT)(
1872 IN PIRP Irp,
1873 IN PKSEVENTDATA EventData,
1874 IN struct _KSEVENT_ENTRY* EventEntry);
1875
1876 typedef
1877 VOID
1878 (*PFNKSREMOVEEVENT)(
1879 IN PFILE_OBJECT FileObject,
1880 IN struct _KSEVENT_ENTRY* EventEntry
1881 );
1882
1883 typedef struct
1884 {
1885 ULONG EventId;
1886 ULONG DataInput;
1887 ULONG ExtraEntryData;
1888 PFNKSADDEVENT AddHandler;
1889 PFNKSREMOVEEVENT RemoveHandler;
1890 PFNKSHANDLER SupportHandler;
1891 } KSEVENT_ITEM, *PKSEVENT_ITEM;
1892
1893 typedef struct
1894 {
1895 const GUID* Set;
1896 ULONG EventsCount;
1897 const KSEVENT_ITEM* EventItem;
1898 } KSEVENT_SET, *PKSEVENT_SET;
1899
1900 struct _KSEVENT_ENTRY
1901 {
1902 LIST_ENTRY ListEntry;
1903 PVOID Object;
1904 union {
1905 PKSDPC_ITEM DpcItem;
1906 PKSBUFFER_ITEM BufferItem;
1907 };
1908 PKSEVENTDATA EventData;
1909 ULONG NotificationType;
1910 const KSEVENT_SET* EventSet;
1911 const KSEVENT_ITEM* EventItem;
1912 PFILE_OBJECT FileObject;
1913 ULONG SemaphoreAdjustment;
1914 ULONG Reserved;
1915 ULONG Flags;
1916 };
1917
1918 #endif
1919 /* ===============================================================
1920 Pins
1921 */
1922
1923 #if defined(_NTDDK_)
1924
1925 typedef struct _KSPIN KSPIN, *PKSPIN;
1926 typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER;
1927 typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
1928 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
1929 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
1930
1931 typedef
1932 NTSTATUS
1933 (*PFNKSPINIRP)(
1934 IN PKSPIN Pin,
1935 IN PIRP Irp
1936 );
1937
1938 typedef
1939 NTSTATUS
1940 (*PFNKSPIN)(
1941 IN PKSPIN Pin
1942 );
1943
1944 typedef
1945 void
1946 (*PFNKSPINVOID)(
1947 IN PKSPIN Pin
1948 );
1949
1950 typedef
1951 void
1952 (*PFNKSSTREAMPOINTER)(
1953 IN PKSSTREAM_POINTER StreamPointer
1954 );
1955
1956 typedef struct {
1957 ULONG Count;
1958 PKSATTRIBUTE* Attributes;
1959 } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
1960
1961 typedef
1962 NTSTATUS
1963 (*PFNKSPINSETDATAFORMAT)(
1964 IN PKSPIN Pin,
1965 IN PKSDATAFORMAT OldFormat OPTIONAL,
1966 IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
1967 IN const KSDATARANGE* DataRange,
1968 IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
1969 );
1970
1971 typedef
1972 NTSTATUS
1973 (*PFNKSPINSETDEVICESTATE)(
1974 IN PKSPIN Pin,
1975 IN KSSTATE ToState,
1976 IN KSSTATE FromState
1977 );
1978
1979 typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
1980 typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
1981
1982 typedef struct
1983 {
1984 PFNKSPINIRP Create;
1985 PFNKSPINIRP Close;
1986 PFNKSPIN Process;
1987 PFNKSPINVOID Reset;
1988 PFNKSPINSETDATAFORMAT SetDataFormat;
1989 PFNKSPINSETDEVICESTATE SetDeviceState;
1990 PFNKSPIN Connect;
1991 PFNKSPINVOID Disconnect;
1992 const KSCLOCK_DISPATCH* Clock;
1993 const KSALLOCATOR_DISPATCH* Allocator;
1994 } KSPIN_DISPATCH, *PKSPIN_DISPATCH;
1995
1996 typedef
1997 BOOLEAN
1998 (*PFNKSPINSETTIMER)(
1999 IN PKSPIN Pin,
2000 IN PKTIMER Timer,
2001 IN LARGE_INTEGER DueTime,
2002 IN PKDPC Dpc
2003 );
2004
2005 typedef
2006 BOOLEAN
2007 (*PFNKSPINCANCELTIMER)(
2008 IN PKSPIN Pin,
2009 IN PKTIMER Timer
2010 );
2011
2012 typedef
2013 LONGLONG
2014 (FASTCALL *PFNKSPINCORRELATEDTIME)(
2015 IN PKSPIN Pin,
2016 OUT PLONGLONG SystemTime
2017 );
2018
2019 typedef
2020 void
2021 (*PFNKSPINRESOLUTION)(
2022 IN PKSPIN Pin,
2023 OUT PKSRESOLUTION Resolution
2024 );
2025
2026 struct _KSCLOCK_DISPATCH {
2027 PFNKSPINSETTIMER SetTimer;
2028 PFNKSPINCANCELTIMER CancelTimer;
2029 PFNKSPINCORRELATEDTIME CorrelatedTime;
2030 PFNKSPINRESOLUTION Resolution;
2031 };
2032
2033 typedef
2034 NTSTATUS
2035 (*PFNKSPININITIALIZEALLOCATOR)(
2036 IN PKSPIN Pin,
2037 IN PKSALLOCATOR_FRAMING AllocatorFraming,
2038 OUT PVOID* Context
2039 );
2040
2041 typedef PVOID (*PFNKSDELETEALLOCATOR)(
2042 IN PVOID Context);
2043
2044 typedef PVOID (*PFNKSDEFAULTALLOCATE)(
2045 IN PVOID Context);
2046
2047 typedef PVOID (*PFNKSDEFAULTFREE)(
2048 IN PVOID Context,
2049 IN PVOID Buffer);
2050
2051 struct _KSALLOCATOR_DISPATCH {
2052 PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
2053 PFNKSDELETEALLOCATOR DeleteAllocator;
2054 PFNKSDEFAULTALLOCATE Allocate;
2055 PFNKSDEFAULTFREE Free;
2056 };
2057
2058 typedef struct
2059 {
2060 ULONG PropertySetsCount;
2061 ULONG PropertyItemSize;
2062 const KSPROPERTY_SET* PropertySets;
2063 ULONG MethodSetsCount;
2064 ULONG MethodItemSize;
2065 const KSMETHOD_SET* MethodSets;
2066 ULONG EventSetsCount;
2067 ULONG EventItemSize;
2068 const KSEVENT_SET* EventSets;
2069 #if !defined(_WIN64)
2070 PVOID Alignment;
2071 #endif
2072 } KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
2073
2074
2075
2076 typedef struct
2077 {
2078 ULONG InterfacesCount;
2079 const KSPIN_INTERFACE* Interfaces;
2080 ULONG MediumsCount;
2081 const KSPIN_MEDIUM* Mediums;
2082 ULONG DataRangesCount;
2083 const PKSDATARANGE* DataRanges;
2084 KSPIN_DATAFLOW DataFlow;
2085 KSPIN_COMMUNICATION Communication;
2086 const GUID* Category;
2087 const GUID* Name;
2088 union {
2089 LONGLONG Reserved;
2090 struct {
2091 ULONG ConstrainedDataRangesCount;
2092 PKSDATARANGE* ConstrainedDataRanges;
2093 };
2094 };
2095 } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
2096
2097 typedef
2098 NTSTATUS
2099 (*PFNKSINTERSECTHANDLER)(
2100 IN PIRP Irp,
2101 IN PKSP_PIN Pin,
2102 IN PKSDATARANGE DataRange,
2103 OUT PVOID Data OPTIONAL
2104 );
2105
2106 typedef
2107 NTSTATUS
2108 (*PFNKSINTERSECTHANDLEREX)(
2109 IN PVOID Context,
2110 IN PIRP Irp,
2111 IN PKSP_PIN Pin,
2112 IN PKSDATARANGE DataRange,
2113 IN PKSDATARANGE MatchingDataRange,
2114 IN ULONG DataBufferSize,
2115 OUT PVOID Data OPTIONAL,
2116 OUT PULONG DataSize
2117 );
2118
2119 typedef struct
2120 {
2121 const KSPIN_DISPATCH* Dispatch;
2122 const KSAUTOMATION_TABLE* AutomationTable;
2123 KSPIN_DESCRIPTOR PinDescriptor;
2124 ULONG Flags;
2125 ULONG InstancesPossible;
2126 ULONG InstancesNecessary;
2127 const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
2128 PFNKSINTERSECTHANDLEREX IntersectHandler;
2129 } KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
2130
2131 /* TODO */
2132 #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING
2133 #define KSPIN_FLAG_CRITICAL_PROCESSING
2134 #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING
2135 #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING
2136 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING
2137 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL
2138 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING
2139 #define KSPIN_FLAG_ENFORCE_FIFO
2140 #define KSPIN_FLAG_GENERATE_MAPPINGS
2141 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE
2142 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY
2143 #define KSPIN_FLAG_SPLITTER
2144 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT
2145 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT
2146 #define KSPIN_FLAG_FIXED_FORMAT
2147 #define KSPIN_FLAG_GENERATE_EOS_EVENTS
2148 #define KSPIN_FLAG_RENDERER
2149 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING
2150 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE
2151 #define KSPIN_FLAG_DENY_USERMODE_ACCESS
2152 #define KSPIN_FLAG_IMPLEMENT_CLOCK
2153
2154 struct _KSPIN
2155 {
2156 const KSPIN_DESCRIPTOR_EX* Descriptor;
2157 KSOBJECT_BAG Bag;
2158 PVOID Context;
2159 ULONG Id;
2160 KSPIN_COMMUNICATION Communication;
2161 BOOLEAN ConnectionIsExternal;
2162 KSPIN_INTERFACE ConnectionInterface;
2163 KSPIN_MEDIUM ConnectionMedium;
2164 KSPRIORITY ConnectionPriority;
2165 PKSDATAFORMAT ConnectionFormat;
2166 PKSMULTIPLE_ITEM AttributeList;
2167 ULONG StreamHeaderSize;
2168 KSPIN_DATAFLOW DataFlow;
2169 KSSTATE DeviceState;
2170 KSRESET ResetState;
2171 KSSTATE ClientState;
2172 };
2173
2174 #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
2175 DEFINE_KSPROPERTY_ITEM(\
2176 KSPROPERTY_PIN_CINSTANCES,\
2177 (Handler),\
2178 sizeof(KSP_PIN),\
2179 sizeof(KSPIN_CINSTANCES),\
2180 NULL, NULL, 0, NULL, NULL, 0)
2181
2182 #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
2183 DEFINE_KSPROPERTY_ITEM(\
2184 KSPROPERTY_PIN_CTYPES,\
2185 (Handler),\
2186 sizeof(KSPROPERTY),\
2187 sizeof(ULONG),\
2188 NULL, NULL, 0, NULL, NULL, 0)
2189
2190 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
2191 DEFINE_KSPROPERTY_ITEM(\
2192 KSPROPERTY_PIN_DATAFLOW,\
2193 (Handler),\
2194 sizeof(KSP_PIN),\
2195 sizeof(KSPIN_DATAFLOW),\
2196 NULL, NULL, 0, NULL, NULL, 0)
2197
2198 #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
2199 DEFINE_KSPROPERTY_ITEM(\
2200 KSPROPERTY_PIN_DATARANGES,\
2201 (Handler),\
2202 sizeof(KSP_PIN),\
2203 0,\
2204 NULL, NULL, 0, NULL, NULL, 0)
2205
2206 #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
2207 DEFINE_KSPROPERTY_ITEM(\
2208 KSPROPERTY_PIN_DATAINTERSECTION,\
2209 (Handler),\
2210 sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
2211 0,\
2212 NULL, NULL, 0, NULL, NULL, 0)
2213
2214 #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
2215 DEFINE_KSPROPERTY_ITEM(\
2216 KSPROPERTY_PIN_INTERFACES,\
2217 (Handler),\
2218 sizeof(KSP_PIN),\
2219 0,\
2220 NULL, NULL, 0, NULL, NULL, 0)
2221
2222 #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
2223 DEFINE_KSPROPERTY_ITEM(\
2224 KSPROPERTY_PIN_MEDIUMS,\
2225 (Handler),\
2226 sizeof(KSP_PIN),\
2227 0,\
2228 NULL, NULL, 0, NULL, NULL, 0)
2229
2230 #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
2231 DEFINE_KSPROPERTY_ITEM(\
2232 KSPROPERTY_PIN_COMMUNICATION,\
2233 (Handler),\
2234 sizeof(KSP_PIN),\
2235 sizeof(KSPIN_COMMUNICATION),\
2236 NULL, NULL, 0, NULL, NULL, 0)
2237
2238 #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
2239 DEFINE_KSPROPERTY_ITEM(\
2240 KSPROPERTY_PIN_GLOBALCINSTANCES,\
2241 (Handler),\
2242 sizeof(KSP_PIN),\
2243 sizeof(KSPIN_CINSTANCES),\
2244 NULL, NULL, 0, NULL, NULL, 0)
2245
2246 #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
2247 DEFINE_KSPROPERTY_ITEM(\
2248 KSPROPERTY_PIN_NECESSARYINSTANCES,\
2249 (Handler),\
2250 sizeof(KSP_PIN),\
2251 sizeof(ULONG),\
2252 NULL, NULL, 0, NULL, NULL, 0)
2253
2254 #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
2255 DEFINE_KSPROPERTY_ITEM(\
2256 KSPROPERTY_PIN_PHYSICALCONNECTION,\
2257 (Handler),\
2258 sizeof(KSP_PIN),\
2259 0,\
2260 NULL, NULL, 0, NULL, NULL, 0)
2261
2262 #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
2263 DEFINE_KSPROPERTY_ITEM(\
2264 KSPROPERTY_PIN_CATEGORY,\
2265 (Handler),\
2266 sizeof(KSP_PIN),\
2267 sizeof(GUID),\
2268 NULL, NULL, 0, NULL, NULL, 0)
2269
2270 #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
2271 DEFINE_KSPROPERTY_ITEM(\
2272 KSPROPERTY_PIN_NAME,\
2273 (Handler),\
2274 sizeof(KSP_PIN),\
2275 0,\
2276 NULL, NULL, 0, NULL, NULL, 0)
2277
2278 #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
2279 DEFINE_KSPROPERTY_ITEM(\
2280 KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
2281 (Handler),\
2282 sizeof(KSP_PIN),\
2283 0,\
2284 NULL, NULL, 0, NULL, NULL, 0)
2285
2286 #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
2287 DEFINE_KSPROPERTY_ITEM(\
2288 KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
2289 NULL,\
2290 sizeof(KSP_PIN),\
2291 sizeof(KSDATAFORMAT),\
2292 (Handler), NULL, 0, NULL, NULL, 0)
2293
2294 #define DEFINE_KSPROPERTY_PINSET(PinSet,\
2295 PropGeneral, PropInstances, PropIntersection)\
2296 DEFINE_KSPROPERTY_TABLE(PinSet) {\
2297 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
2298 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
2299 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
2300 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
2301 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
2302 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
2303 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
2304 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
2305 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
2306 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
2307 }
2308
2309 #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
2310 PropGeneral, PropInstances, PropIntersection)\
2311 DEFINE_KSPROPERTY_TABLE(PinSet) {\
2312 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
2313 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
2314 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
2315 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
2316 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
2317 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
2318 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
2319 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
2320 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
2321 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
2322 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
2323 }
2324
2325
2326
2327 typedef
2328 void
2329 (*PFNKSFREE)(
2330 IN PVOID Data
2331 );
2332
2333
2334
2335 #define DEFINE_KSPROPERTY_TABLE(tablename)\
2336 const KSPROPERTY_ITEM tablename[] =
2337
2338 #endif
2339
2340 typedef struct
2341 {
2342 KSPIN_INTERFACE Interface;
2343 KSPIN_MEDIUM Medium;
2344 ULONG PinId;
2345 HANDLE PinToHandle;
2346 KSPRIORITY Priority;
2347 } KSPIN_CONNECT, *PKSPIN_CONNECT;
2348
2349 /* ===============================================================
2350 Topology
2351 */
2352
2353 typedef struct
2354 {
2355 ULONG FromNode;
2356 ULONG FromNodePin;
2357 ULONG ToNode;
2358 ULONG ToNodePin;
2359 } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
2360
2361 typedef struct
2362 {
2363 ULONG CategoriesCount;
2364 const GUID* Categories;
2365 ULONG TopologyNodesCount;
2366 const GUID* TopologyNodes;
2367 ULONG TopologyConnectionsCount;
2368 const KSTOPOLOGY_CONNECTION* TopologyConnections;
2369 const GUID* TopologyNodesNames;
2370 ULONG Reserved;
2371 } KSTOPOLOGY, *PKSTOPOLOGY;
2372
2373
2374 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
2375 DEFINE_KSPROPERTY_ITEM(\
2376 KSPROPERTY_TOPOLOGY_CATEGORIES,\
2377 (Handler),\
2378 sizeof(KSPROPERTY),\
2379 0,\
2380 NULL, NULL, 0, NULL, NULL, 0)
2381
2382 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
2383 DEFINE_KSPROPERTY_ITEM(\
2384 KSPROPERTY_TOPOLOGY_NODES,\
2385 (Handler),\
2386 sizeof(KSPROPERTY),\
2387 0,\
2388 NULL, NULL, 0, NULL, NULL, 0)
2389
2390 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
2391 DEFINE_KSPROPERTY_ITEM(\
2392 KSPROPERTY_TOPOLOGY_CONNECTIONS,\
2393 (Handler),\
2394 sizeof(KSPROPERTY),\
2395 0,\
2396 NULL, NULL, 0, NULL, NULL, 0)
2397
2398 #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
2399 DEFINE_KSPROPERTY_ITEM(\
2400 KSPROPERTY_TOPOLOGY_NAME,\
2401 (Handler),\
2402 sizeof(KSP_NODE),\
2403 0,\
2404 NULL, NULL, 0, NULL, NULL, 0)
2405
2406 #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
2407 DEFINE_KSPROPERTY_TABLE(TopologySet) {\
2408 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
2409 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
2410 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
2411 DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
2412 }
2413
2414 /* ===============================================================
2415 ??? SORT ME
2416 */
2417
2418 /* TODO */
2419 typedef void* UNKNOWN;
2420
2421 typedef PVOID NTAPI(*PFNKSINITIALIZEALLOCATOR)(
2422 IN PVOID InitialContext,
2423 IN PKSALLOCATOR_FRAMING AllocatorFraming,
2424 OUT PVOID* Context);
2425
2426 #if defined(_NTDDK_)
2427 typedef NTSTATUS (*PFNKSALLOCATOR)(
2428 IN PIRP Irp,
2429 IN ULONG BufferSize,
2430 IN BOOLEAN InputOperation);
2431
2432 typedef NTSTATUS (*PFNKINTERSECTHANDLEREX)(
2433 IN PVOID Context,
2434 IN PIRP Irp,
2435 IN PKSP_PIN Pin,
2436 IN PKSDATARANGE DataRange,
2437 IN PKSDATARANGE MatchingDataRange,
2438 IN ULONG DataBufferSize,
2439 OUT PVOID Data OPTIONAL,
2440 OUT PULONG DataSize);
2441
2442
2443 typedef
2444 NTSTATUS
2445 NTAPI
2446 (*PFNALLOCATOR_ALLOCATEFRAME)(
2447 IN PFILE_OBJECT FileObject,
2448 PVOID *Frame
2449 );
2450
2451 typedef
2452 VOID
2453 NTAPI
2454 (*PFNALLOCATOR_FREEFRAME)(
2455 IN PFILE_OBJECT FileObject,
2456 IN PVOID Frame
2457 );
2458
2459 typedef struct {
2460 PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
2461 PFNALLOCATOR_FREEFRAME FreeFrame;
2462 } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
2463
2464 #endif
2465
2466 typedef struct
2467 {
2468 KSALLOCATOR_FRAMING Framing;
2469 ULONG AllocatedFrames;
2470 ULONG Reserved;
2471 } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
2472
2473 typedef struct
2474 {
2475 KSALLOCATOR_FRAMING_EX Framing;
2476 ULONG AllocatedFrames;
2477 ULONG Reserved;
2478 } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
2479
2480 typedef struct
2481 {
2482 ULONG Size;
2483 ULONG TypeSpecificFlags;
2484 KSTIME PresentationTime;
2485 LONGLONG Duration;
2486 ULONG FrameExtent;
2487 ULONG DataUsed;
2488 PVOID Data;
2489 ULONG OptionsFlags;
2490 } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
2491
2492
2493
2494 /* ===============================================================
2495 XP / DX8
2496 */
2497 #if defined(_NTDDK_)
2498 struct _KSMAPPING {
2499 PHYSICAL_ADDRESS PhysicalAddress;
2500 ULONG ByteCount;
2501 ULONG Alignment;
2502 };
2503 #endif
2504
2505
2506 typedef struct {
2507 GUID ProtocolId;
2508 PVOID Argument1;
2509 PVOID Argument2;
2510 } KSHANDSHAKE, *PKSHANDSHAKE;
2511
2512 typedef struct _KSGATE KSGATE, *PKSGATE;
2513 typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
2514
2515 struct _KSGATE {
2516 LONG Count;
2517 PKSGATE NextGate;
2518 };
2519
2520 struct _KSSTREAM_POINTER_OFFSET
2521 {
2522 #if defined(_NTDDK_)
2523 union {
2524 PUCHAR Data;
2525 PKSMAPPING Mappings;
2526 };
2527 #else
2528 PUCHAR Data;
2529 #endif
2530 #if !defined(_WIN64)
2531 PVOID Alignment;
2532 #endif
2533 ULONG Count;
2534 ULONG Remaining;
2535 };
2536 #if defined(_NTDDK_)
2537 struct _KSSTREAM_POINTER
2538 {
2539 PVOID Context;
2540 PKSPIN Pin;
2541 PKSSTREAM_HEADER StreamHeader;
2542 PKSSTREAM_POINTER_OFFSET Offset;
2543 KSSTREAM_POINTER_OFFSET OffsetIn;
2544 KSSTREAM_POINTER_OFFSET OffsetOut;
2545 };
2546
2547 struct _KSPROCESSPIN
2548 {
2549 PKSPIN Pin;
2550 PKSSTREAM_POINTER StreamPointer;
2551 PKSPROCESSPIN InPlaceCounterpart;
2552 PKSPROCESSPIN DelegateBranch;
2553 PKSPROCESSPIN CopySource;
2554 PVOID Data;
2555 ULONG BytesAvailable;
2556 ULONG BytesUsed;
2557 ULONG Flags;
2558 BOOLEAN Terminate;
2559 };
2560
2561 struct _KSPROCESSPIN_INDEXENTRY
2562 {
2563 PKSPROCESSPIN* Pins;
2564 ULONG Count;
2565 };
2566 #endif
2567
2568 /* ===============================================================
2569 Device Dispatch
2570 */
2571
2572
2573
2574 #if defined(_NTDDK_)
2575
2576 typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
2577 typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE;
2578 typedef struct _KSFILTER KSFILTER, *PKSFILTER;
2579 typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
2580 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
2581 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
2582
2583 typedef NTSTATUS (*PFNKSDEVICECREATE)(
2584 IN PKSDEVICE Device);
2585
2586 typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(
2587 IN PKSDEVICE Device,
2588 IN PIRP Irp,
2589 IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
2590 IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL);
2591
2592 typedef NTSTATUS (*PFNKSDEVICE)(
2593 IN PKSDEVICE Device);
2594
2595 typedef NTSTATUS (*PFNKSDEVICEIRP)(
2596 IN PKSDEVICE Device,
2597 IN PIRP Irp);
2598
2599 typedef VOID (*PFNKSDEVICEIRPVOID)(
2600 IN PKSDEVICE Device,
2601 IN PIRP Irp);
2602
2603 typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(
2604 IN PKSDEVICE Device,
2605 IN PIRP Irp,
2606 IN OUT PDEVICE_CAPABILITIES Capabilities);
2607
2608 typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(
2609 IN PKSDEVICE Device,
2610 IN PIRP Irp,
2611 IN DEVICE_POWER_STATE DeviceTo,
2612 IN DEVICE_POWER_STATE DeviceFrom,
2613 IN SYSTEM_POWER_STATE SystemTo,
2614 IN SYSTEM_POWER_STATE SystemFrom,
2615 IN POWER_ACTION Action);
2616
2617 typedef VOID (*PFNKSDEVICESETPOWER)(
2618 IN PKSDEVICE Device,
2619 IN PIRP Irp,
2620 IN DEVICE_POWER_STATE To,
2621 IN DEVICE_POWER_STATE From);
2622
2623 typedef struct _KSDEVICE_DISPATCH {
2624 PFNKSDEVICECREATE Add;
2625 PFNKSDEVICEPNPSTART Start;
2626 PFNKSDEVICE PostStart;
2627 PFNKSDEVICEIRP QueryStop;
2628 PFNKSDEVICEIRPVOID CancelStop;
2629 PFNKSDEVICEIRPVOID Stop;
2630 PFNKSDEVICEIRP QueryRemove;
2631 PFNKSDEVICEIRPVOID CancelRemove;
2632 PFNKSDEVICEIRPVOID Remove;
2633 PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
2634 PFNKSDEVICEIRPVOID SurpriseRemoval;
2635 PFNKSDEVICEQUERYPOWER QueryPower;
2636 PFNKSDEVICESETPOWER SetPower;
2637 PFNKSDEVICEIRP QueryInterface;
2638 }KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
2639
2640 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
2641 #define KSDEVICE_DESCRIPTOR_VERSION_2 (0x110)
2642 #define MIN_DEV_VER_FOR_FLAGS (0x110)
2643 #endif
2644
2645 struct _KSDEVICE
2646 {
2647 const KSDEVICE_DESCRIPTOR* Descriptor;
2648 KSOBJECT_BAG Bag;
2649 PVOID Context;
2650 PDEVICE_OBJECT FunctionalDeviceObject;
2651 PDEVICE_OBJECT PhysicalDeviceObject;
2652 PDEVICE_OBJECT NextDeviceObject;
2653 BOOLEAN Started;
2654 SYSTEM_POWER_STATE SystemPowerState;
2655 DEVICE_POWER_STATE DevicePowerState;
2656 };
2657 #endif
2658
2659 /* ===============================================================
2660 Filter Dispatch
2661 */
2662 #if defined(_NTDDK_)
2663 struct _KSFILTER
2664 {
2665 const KSFILTER_DESCRIPTOR* Descriptor;
2666 KSOBJECT_BAG Bag;
2667 PVOID Context;
2668 };
2669
2670 typedef NTSTATUS (*PFNKSFILTERIRP)(
2671 IN PKSFILTER Filter,
2672 IN PIRP Irp);
2673
2674 typedef NTSTATUS (*PFNKSFILTERPROCESS)(
2675 IN PKSFILTER FIlter,
2676 IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex);
2677
2678 typedef NTSTATUS (*PFNKSFILTERVOID)(
2679 IN PKSFILTER Filter);
2680
2681 struct _KSFILTER_DISPATCH
2682 {
2683 PFNKSFILTERIRP Create;
2684 PFNKSFILTERIRP Close;
2685 PFNKSFILTERPROCESS Process;
2686 PFNKSFILTERVOID Reset;
2687 };
2688
2689 struct _KSNODE_DESCRIPTOR
2690 {
2691 const KSAUTOMATION_TABLE* AutomationTable;
2692 const GUID* Type;
2693 const GUID* Name;
2694 };
2695
2696 struct _KSFILTER_DESCRIPTOR
2697 {
2698 const KSFILTER_DISPATCH* Dispatch;
2699 const KSAUTOMATION_TABLE* AutomationTable;
2700 ULONG Version;
2701 ULONG Flags;
2702 const GUID* ReferenceGuid;
2703 ULONG PinDescriptorsCount;
2704 ULONG PinDescriptorSize;
2705 const KSPIN_DESCRIPTOR_EX* PinDescriptors;
2706 ULONG CategoriesCount;
2707 const GUID* Categories;
2708 ULONG NodeDescriptorsCount;
2709 ULONG NodeDescriptorSize;
2710 const KSNODE_DESCRIPTOR* NodeDescriptors;
2711 ULONG ConnectionsCount;
2712 const KSTOPOLOGY_CONNECTION* Connections;
2713 const KSCOMPONENTID* ComponentId;
2714 };
2715
2716 struct _KSDEVICE_DESCRIPTOR
2717 {
2718 const KSDEVICE_DISPATCH* Dispatch;
2719 ULONG FilterDescriptorsCount;
2720 const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
2721 ULONG Version;
2722 ULONG Flags;
2723 };
2724
2725 struct _KSFILTERFACTORY {
2726 const KSFILTER_DESCRIPTOR* FilterDescriptor;
2727 KSOBJECT_BAG Bag;
2728 PVOID Context;
2729 };
2730
2731 #endif
2732 /* ===============================================================
2733 Minidriver Callbacks
2734 */
2735 #if defined(_NTDDK_)
2736 typedef NTSTATUS (*KStrMethodHandler)(
2737 IN PIRP Irp,
2738 IN PKSIDENTIFIER Request,
2739 IN OUT PVOID Data);
2740
2741 typedef NTSTATUS (*KStrSupportHandler)(
2742 IN PIRP Irp,
2743 IN PKSIDENTIFIER Request,
2744 IN OUT PVOID Data);
2745 #endif
2746
2747 /* ===============================================================
2748 Allocator Functions
2749 */
2750 #if defined(_NTDDK_)
2751 KSDDKAPI NTSTATUS NTAPI
2752 KsCreateAllocator(
2753 IN HANDLE ConnectionHandle,
2754 IN PKSALLOCATOR_FRAMING AllocatorFraming,
2755 OUT PHANDLE AllocatorHandle);
2756
2757 KSDDKAPI NTSTATUS NTAPI
2758 KsCreateDefaultAllocator(
2759 IN PIRP Irp);
2760
2761 KSDDKAPI NTSTATUS NTAPI
2762 KsValidateAllocatorCreateRequest(
2763 IN PIRP Irp,
2764 OUT PKSALLOCATOR_FRAMING* AllocatorFraming);
2765
2766 KSDDKAPI NTSTATUS NTAPI
2767 KsCreateDefaultAllocatorEx(
2768 IN PIRP Irp,
2769 IN PVOID InitializeContext OPTIONAL,
2770 IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
2771 IN PFNKSDEFAULTFREE DefaultFree OPTIONAL,
2772 IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
2773 IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL);
2774
2775 KSDDKAPI NTSTATUS NTAPI
2776 KsValidateAllocatorFramingEx(
2777 IN PKSALLOCATOR_FRAMING_EX Framing,
2778 IN ULONG BufferSize,
2779 IN const KSALLOCATOR_FRAMING_EX* PinFraming);
2780 #endif
2781
2782 /* ===============================================================
2783 Clock Functions
2784 */
2785 #if defined(_NTDDK_)
2786 typedef BOOLEAN (*PFNKSSETTIMER)(
2787 IN PVOID Context,
2788 IN PKTIMER Timer,
2789 IN LARGE_INTEGER DueTime,
2790 IN PKDPC Dpc);
2791
2792 typedef BOOLEAN (*PFNKSCANCELTIMER)(
2793 IN PVOID Context,
2794 IN PKTIMER Timer);
2795
2796 typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(
2797 IN PVOID Context,
2798 OUT PLONGLONG SystemTime);
2799
2800 KSDDKAPI NTSTATUS NTAPI
2801 KsCreateClock(
2802 IN HANDLE ConnectionHandle,
2803 IN PKSCLOCK_CREATE ClockCreate,
2804 OUT PHANDLE ClockHandle);
2805
2806 KSDDKAPI NTSTATUS NTAPI
2807 KsCreateDefaultClock(
2808 IN PIRP Irp,
2809 IN PKSDEFAULTCLOCK DefaultClock);
2810
2811 KSDDKAPI NTSTATUS NTAPI
2812 KsAllocateDefaultClock(
2813 OUT PKSDEFAULTCLOCK* DefaultClock);
2814
2815 KSDDKAPI NTSTATUS NTAPI
2816 KsAllocateDefaultClockEx(
2817 OUT PKSDEFAULTCLOCK* DefaultClock,
2818 IN PVOID Context OPTIONAL,
2819 IN PFNKSSETTIMER SetTimer OPTIONAL,
2820 IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
2821 IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
2822 IN const KSRESOLUTION* Resolution OPTIONAL,
2823 IN ULONG Flags);
2824
2825 KSDDKAPI VOID NTAPI
2826 KsFreeDefaultClock(
2827 IN PKSDEFAULTCLOCK DefaultClock);
2828
2829 KSDDKAPI NTSTATUS NTAPI
2830 KsValidateClockCreateRequest(
2831 IN PIRP Irp,
2832 OUT PKSCLOCK_CREATE* ClockCreate);
2833
2834 KSDDKAPI KSSTATE NTAPI
2835 KsGetDefaultClockState(
2836 IN PKSDEFAULTCLOCK DefaultClock);
2837
2838 KSDDKAPI VOID NTAPI
2839 KsSetDefaultClockState(
2840 IN PKSDEFAULTCLOCK DefaultClock,
2841 IN KSSTATE State);
2842
2843 KSDDKAPI LONGLONG NTAPI
2844 KsGetDefaultClockTime(
2845 IN PKSDEFAULTCLOCK DefaultClock);
2846
2847 KSDDKAPI VOID NTAPI
2848 KsSetDefaultClockTime(
2849 IN PKSDEFAULTCLOCK DefaultClock,
2850 IN LONGLONG Time);
2851 #endif
2852
2853 /* ===============================================================
2854 Method Functions
2855 */
2856
2857 /* Method sets - TODO: Make into macros! */
2858 #if defined(_NTDDK_)
2859 #if 0
2860 VOID
2861 KSMETHOD_SET_IRP_STORAGE(
2862 IN IRP Irp);
2863
2864 VOID
2865 KSMETHOD_ITEM_IRP_STORAGE(
2866 IN IRP Irp);
2867
2868 VOID
2869 KSMETHOD_TYPE_IRP_STORAGE(
2870 IN IRP Irp);
2871 #endif
2872
2873 KSDDKAPI NTSTATUS NTAPI
2874 KsMethodHandler(
2875 IN PIRP Irp,
2876 IN ULONG MethodSetsCount,
2877 IN PKSMETHOD_SET MethodSet);
2878
2879 KSDDKAPI NTSTATUS NTAPI
2880 KsMethodHandlerWithAllocator(
2881 IN PIRP Irp,
2882 IN ULONG MethodSetsCount,
2883 IN PKSMETHOD_SET MethodSet,
2884 IN PFNKSALLOCATOR Allocator OPTIONAL,
2885 IN ULONG MethodItemSize OPTIONAL);
2886
2887 KSDDKAPI BOOLEAN NTAPI
2888 KsFastMethodHandler(
2889 IN PFILE_OBJECT FileObject,
2890 IN PKSMETHOD UNALIGNED Method,
2891 IN ULONG MethodLength,
2892 IN OUT PVOID UNALIGNED Data,
2893 IN ULONG DataLength,
2894 OUT PIO_STATUS_BLOCK IoStatus,
2895 IN ULONG MethodSetsCount,
2896 IN const KSMETHOD_SET* MethodSet);
2897 #endif
2898
2899 /* ===============================================================
2900 Property Functions
2901 */
2902 #if defined(_NTDDK_)
2903 KSDDKAPI NTSTATUS NTAPI
2904 KsPropertyHandler(
2905 IN PIRP Irp,
2906 IN ULONG PropertySetsCount,
2907 IN const KSPROPERTY_SET* PropertySet);
2908
2909 KSDDKAPI NTSTATUS NTAPI
2910 KsPropertyHandlerWithAllocator(
2911 IN PIRP Irp,
2912 IN ULONG PropertySetsCount,
2913 IN PKSPROPERTY_SET PropertySet,
2914 IN PFNKSALLOCATOR Allocator OPTIONAL,
2915 IN ULONG PropertyItemSize OPTIONAL);
2916
2917 KSDDKAPI NTSTATUS NTAPI
2918 KsUnserializeObjectPropertiesFromRegistry(
2919 IN PFILE_OBJECT FileObject,
2920 IN HANDLE ParentKey OPTIONAL,
2921 IN PUNICODE_STRING RegistryPath OPTIONAL);
2922
2923 KSDDKAPI BOOLEAN NTAPI
2924 KsFastPropertyHandler(
2925 IN PFILE_OBJECT FileObject,
2926 IN PKSPROPERTY UNALIGNED Property,
2927 IN ULONG PropertyLength,
2928 IN OUT PVOID UNALIGNED Data,
2929 IN ULONG DataLength,
2930 OUT PIO_STATUS_BLOCK IoStatus,
2931 IN ULONG PropertySetsCount,
2932 IN const KSPROPERTY_SET* PropertySet);
2933 #endif
2934
2935 /* ===============================================================
2936 Event Functions
2937 */
2938 #if defined(_NTDDK_)
2939
2940 #define KSPROBE_STREAMREAD 0x00000000
2941 #define KSPROBE_STREAMWRITE 0x00000001
2942 #define KSPROBE_ALLOCATEMDL 0x00000010
2943 #define KSPROBE_PROBEANDLOCK 0x00000020
2944 #define KSPROBE_SYSTEMADDRESS 0x00000040
2945 #define KSPROBE_MODIFY 0x00000200
2946 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
2947 #define KSPROBE_ALLOWFORMATCHANGE 0x00000080
2948
2949 #define KSSTREAM_READ KSPROBE_STREAMREAD
2950 #define KSSTREAM_WRITE KSPROBE_STREAMWRITE
2951 #define KSSTREAM_PAGED_DATA 0x00000000
2952 #define KSSTREAM_NONPAGED_DATA 0x00000100
2953 #define KSSTREAM_SYNCHRONOUS 0x00001000
2954 #define KSSTREAM_FAILUREEXCEPTION 0x00002000
2955
2956 KSDDKAPI NTSTATUS NTAPI
2957 KsGenerateEvent(
2958 IN PKSEVENT_ENTRY EntryEvent);
2959
2960 KSDDKAPI NTSTATUS NTAPI
2961 KsEnableEventWithAllocator(
2962 IN PIRP Irp,
2963 IN ULONG EventSetsCount,
2964 IN PKSEVENT_SET EventSet,
2965 IN OUT PLIST_ENTRY EventsList OPTIONAL,
2966 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
2967 IN PVOID EventsLock OPTIONAL,
2968 IN PFNKSALLOCATOR Allocator OPTIONAL,
2969 IN ULONG EventItemSize OPTIONAL);
2970
2971 KSDDKAPI NTSTATUS NTAPI
2972 KsGenerateDataEvent(
2973 IN PKSEVENT_ENTRY EventEntry,
2974 IN ULONG DataSize,
2975 IN PVOID Data);
2976
2977 KSDDKAPI NTSTATUS NTAPI
2978 KsEnableEvent(
2979 IN PIRP Irp,
2980 IN ULONG EventSetsCount,
2981 IN KSEVENT_SET* EventSet,
2982 IN OUT PLIST_ENTRY EventsList OPTIONAL,
2983 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
2984 IN PVOID EventsLock OPTIONAL);
2985
2986 KSDDKAPI VOID NTAPI
2987 KsDiscardEvent(
2988 IN PKSEVENT_ENTRY EventEntry);
2989
2990 KSDDKAPI NTSTATUS NTAPI
2991 KsDisableEvent(
2992 IN PIRP Irp,
2993 IN OUT PLIST_ENTRY EventsList,
2994 IN KSEVENTS_LOCKTYPE EventsFlags,
2995 IN PVOID EventsLock);
2996
2997 KSDDKAPI VOID NTAPI
2998 KsFreeEventList(
2999 IN PFILE_OBJECT FileObject,
3000 IN OUT PLIST_ENTRY EventsList,
3001 IN KSEVENTS_LOCKTYPE EVentsFlags,
3002 IN PVOID EventsLock);
3003
3004 /* ===============================================================
3005 Topology Functions
3006 */
3007
3008 KSDDKAPI NTSTATUS NTAPI
3009 KsValidateTopologyNodeCreateRequest(
3010 IN PIRP Irp,
3011 IN PKSTOPOLOGY Topology,
3012 OUT PKSNODE_CREATE* NodeCreate);
3013
3014 KSDDKAPI NTSTATUS NTAPI
3015 KsCreateTopologyNode(
3016 IN HANDLE ParentHandle,
3017 IN PKSNODE_CREATE NodeCreate,
3018 IN ACCESS_MASK DesiredAccess,
3019 OUT PHANDLE NodeHandle);
3020
3021 KSDDKAPI NTSTATUS NTAPI
3022 KsTopologyPropertyHandler(
3023 IN PIRP Irp,
3024 IN PKSPROPERTY Property,
3025 IN OUT PVOID Data,
3026 IN const KSTOPOLOGY* Topology);
3027
3028
3029
3030 /* ===============================================================
3031 Connectivity Functions
3032 */
3033
3034 KSDDKAPI NTSTATUS NTAPI
3035 KsCreatePin(
3036 IN HANDLE FilterHandle,
3037 IN PKSPIN_CONNECT Connect,
3038 IN ACCESS_MASK DesiredAccess,
3039 OUT PHANDLE ConnectionHandle);
3040
3041 KSDDKAPI NTSTATUS NTAPI
3042 KsValidateConnectRequest(
3043 IN PIRP Irp,
3044 IN ULONG DescriptorsCount,
3045 IN KSPIN_DESCRIPTOR* Descriptor,
3046 OUT PKSPIN_CONNECT* Connect);
3047
3048 KSDDKAPI NTSTATUS NTAPI
3049 KsPinPropertyHandler(
3050 IN PIRP Irp,
3051 IN PKSPROPERTY Property,
3052 IN OUT PVOID Data,
3053 IN ULONG DescriptorsCount,
3054 IN const KSPIN_DESCRIPTOR* Descriptor);
3055
3056 KSDDKAPI NTSTATUS NTAPI
3057 KsPinDataIntersection(
3058 IN PIRP Irp,
3059 IN PKSP_PIN Pin,
3060 OUT PVOID Data,
3061 IN ULONG DescriptorsCount,
3062 IN const KSPIN_DESCRIPTOR* Descriptor,
3063 IN PFNKSINTERSECTHANDLER IntersectHandler);
3064
3065 KSDDKAPI NTSTATUS NTAPI
3066 KsPinDataIntersectionEx(
3067 IN PIRP Irp,
3068 IN PKSP_PIN Pin,
3069 OUT PVOID Data,
3070 IN ULONG DescriptorsCount,
3071 IN const KSPIN_DESCRIPTOR* Descriptor,
3072 IN ULONG DescriptorSize,
3073 IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
3074 IN PVOID HandlerContext OPTIONAL);
3075
3076 /* Does this belong here? */
3077
3078 KSDDKAPI NTSTATUS NTAPI
3079 KsHandleSizedListQuery(
3080 IN PIRP Irp,
3081 IN ULONG DataItemsCount,
3082 IN ULONG DataItemSize,
3083 IN const VOID* DataItems);
3084
3085
3086 /* ===============================================================
3087 IRP Helper Functions
3088 */
3089
3090 typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(
3091 IN PIRP Irp,
3092 IN PVOID Context);
3093
3094 KSDDKAPI NTSTATUS NTAPI
3095 KsAcquireResetValue(
3096 IN PIRP Irp,
3097 OUT KSRESET* ResetValue);
3098
3099 KSDDKAPI VOID NTAPI
3100 KsAddIrpToCancelableQueue(
3101 IN OUT PLIST_ENTRY QueueHead,
3102 IN PKSPIN_LOCK SpinLock,
3103 IN PIRP Irp,
3104 IN KSLIST_ENTRY_LOCATION ListLocation,
3105 IN PDRIVER_CANCEL DriverCancel OPTIONAL);
3106
3107 KSDDKAPI NTSTATUS NTAPI
3108 KsAddObjectCreateItemToDeviceHeader(
3109 IN KSDEVICE_HEADER Header,
3110 IN PDRIVER_DISPATCH Create,
3111 IN PVOID Context,
3112 IN PWCHAR ObjectClass,
3113 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
3114
3115 KSDDKAPI NTSTATUS NTAPI
3116 KsAddObjectCreateItemToObjectHeader(
3117 IN KSOBJECT_HEADER Header,
3118 IN PDRIVER_DISPATCH Create,
3119 IN PVOID Context,
3120 IN PWCHAR ObjectClass,
3121 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
3122
3123 KSDDKAPI NTSTATUS NTAPI
3124 KsAllocateDeviceHeader(
3125 OUT KSDEVICE_HEADER* Header,
3126 IN ULONG ItemsCount,
3127 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL);
3128
3129 KSDDKAPI NTSTATUS NTAPI
3130 KsAllocateExtraData(
3131 IN PIRP Irp,
3132 IN ULONG ExtraSize,
3133 OUT PVOID* ExtraBuffer);
3134
3135 KSDDKAPI NTSTATUS NTAPI
3136 KsAllocateObjectCreateItem(
3137 IN KSDEVICE_HEADER Header,
3138 IN PKSOBJECT_CREATE_ITEM CreateItem,
3139 IN BOOLEAN AllocateEntry,
3140 IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL);
3141
3142 KSDDKAPI NTSTATUS NTAPI
3143 KsAllocateObjectHeader(
3144 OUT KSOBJECT_HEADER *Header,
3145 IN ULONG ItemsCount,
3146 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
3147 IN PIRP Irp,
3148 IN KSDISPATCH_TABLE* Table);
3149
3150 KSDDKAPI VOID NTAPI
3151 KsCancelIo(
3152 IN OUT PLIST_ENTRY QueueHead,
3153 IN PKSPIN_LOCK SpinLock);
3154
3155 KSDDKAPI VOID NTAPI
3156 KsCancelRoutine(
3157 IN PDEVICE_OBJECT DeviceObject,
3158 IN PIRP Irp);
3159
3160 KSDDKAPI NTSTATUS NTAPI
3161 KsDefaultDeviceIoCompletion(
3162 IN PDEVICE_OBJECT DeviceObject,
3163 IN PIRP Irp);
3164
3165 /* ELSEWHERE
3166 KSDDKAPI ULONG NTAPI
3167 KsDecrementCountedWorker(
3168 IN PKSWORKER Worker);
3169 */
3170
3171 KSDDKAPI BOOLEAN NTAPI
3172 KsDispatchFastIoDeviceControlFailure(
3173 IN PFILE_OBJECT FileObject,
3174 IN BOOLEAN Wait,
3175 IN PVOID InputBuffer OPTIONAL,
3176 IN ULONG InputBufferLength,
3177 OUT PVOID OutputBuffer OPTIONAL,
3178 IN ULONG OutputBufferLength,
3179 IN ULONG IoControlCode,
3180 OUT PIO_STATUS_BLOCK IoStatus,
3181 IN PDEVICE_OBJECT DeviceObject); /* always return false */
3182
3183 KSDDKAPI BOOLEAN NTAPI
3184 KsDispatchFastReadFailure(
3185 IN PFILE_OBJECT FileObject,
3186 IN PLARGE_INTEGER FileOffset,
3187 IN ULONG Length,
3188 IN BOOLEAN Wait,
3189 IN ULONG LockKey,
3190 OUT PVOID Buffer,
3191 OUT PIO_STATUS_BLOCK IoStatus,
3192 IN PDEVICE_OBJECT DeviceObject); /* always return false */
3193
3194 /* This function does the same as the above */
3195 #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
3196
3197 KSDDKAPI NTSTATUS NTAPI
3198 KsDispatchInvalidDeviceRequest(
3199 IN PDEVICE_OBJECT DeviceObject,
3200 IN PIRP Irp);
3201
3202 KSDDKAPI NTSTATUS NTAPI
3203 KsDispatchIrp(
3204 IN PDEVICE_OBJECT DeviceObject,
3205 IN PIRP Irp);
3206
3207 KSDDKAPI NTSTATUS NTAPI
3208 KsDispatchSpecificMethod(
3209 IN PIRP Irp,
3210 IN PFNKSHANDLER Handler);
3211
3212 KSDDKAPI NTSTATUS NTAPI
3213 KsDispatchSpecificProperty(
3214 IN PIRP Irp,
3215 IN PFNKSHANDLER Handler);
3216
3217 KSDDKAPI NTSTATUS NTAPI
3218 KsForwardAndCatchIrp(
3219 IN PDEVICE_OBJECT DeviceObject,
3220 IN PIRP Irp,
3221 IN PFILE_OBJECT FileObject,
3222 IN KSSTACK_USE StackUse);
3223
3224 KSDDKAPI NTSTATUS NTAPI
3225 KsForwardIrp(
3226 IN PIRP Irp,
3227 IN PFILE_OBJECT FileObject,
3228 IN BOOLEAN ReuseStackLocation);
3229
3230 KSDDKAPI VOID NTAPI
3231 KsFreeDeviceHeader(
3232 IN KSDEVICE_HEADER Header);
3233
3234 KSDDKAPI VOID NTAPI
3235 KsFreeObjectHeader(
3236 IN PVOID Header);
3237
3238 KSDDKAPI NTSTATUS NTAPI
3239 KsGetChildCreateParameter(
3240 IN PIRP Irp,
3241 OUT PVOID* CreateParameter);
3242
3243 KSDDKAPI NTSTATUS NTAPI
3244 KsMoveIrpsOnCancelableQueue(
3245 IN OUT PLIST_ENTRY SourceList,
3246 IN PKSPIN_LOCK SourceLock,
3247 IN OUT PLIST_ENTRY DestinationList,
3248 IN PKSPIN_LOCK DestinationLock OPTIONAL,
3249 IN KSLIST_ENTRY_LOCATION ListLocation,
3250 IN PFNKSIRPLISTCALLBACK ListCallback,
3251 IN PVOID Context);
3252
3253 KSDDKAPI NTSTATUS NTAPI
3254 KsProbeStreamIrp(
3255 IN PIRP Irp,
3256 IN ULONG ProbeFlags,
3257 IN ULONG HeaderSize);
3258
3259 KSDDKAPI NTSTATUS NTAPI
3260 KsQueryInformationFile(
3261 IN PFILE_OBJECT FileObject,
3262 OUT PVOID FileInformation,
3263 IN ULONG Length,
3264 IN FILE_INFORMATION_CLASS FileInformationClass);
3265
3266 KSDDKAPI ACCESS_MASK NTAPI
3267 KsQueryObjectAccessMask(
3268 IN KSOBJECT_HEADER Header);
3269
3270 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI
3271 KsQueryObjectCreateItem(
3272 IN KSOBJECT_HEADER Header);
3273
3274 KSDDKAPI NTSTATUS NTAPI
3275 KsReadFile(
3276 IN PFILE_OBJECT FileObject,
3277 IN PKEVENT Event OPTIONAL,
3278 IN PVOID PortContext OPTIONAL,
3279 OUT PIO_STATUS_BLOCK IoStatusBlock,
3280 OUT PVOID Buffer,
3281 IN ULONG Length,
3282 IN ULONG Key OPTIONAL,
3283 IN KPROCESSOR_MODE RequestorMode);
3284
3285 KSDDKAPI VOID NTAPI
3286 KsReleaseIrpOnCancelableQueue(
3287 IN PIRP Irp,
3288 IN PDRIVER_CANCEL DriverCancel OPTIONAL);
3289
3290 KSDDKAPI PIRP NTAPI
3291 KsRemoveIrpFromCancelableQueue(
3292 IN OUT PLIST_ENTRY QueueHead,
3293 IN PKSPIN_LOCK SpinLock,
3294 IN KSLIST_ENTRY_LOCATION ListLocation,
3295 IN KSIRP_REMOVAL_OPERATION RemovalOperation);
3296
3297 KSDDKAPI VOID NTAPI
3298 KsRemoveSpecificIrpFromCancelableQueue(
3299 IN PIRP Irp);
3300
3301 KSDDKAPI NTSTATUS NTAPI
3302 KsSetInformationFile(
3303 IN PFILE_OBJECT FileObject,
3304 IN PVOID FileInformation,
3305 IN ULONG Length,
3306 IN FILE_INFORMATION_CLASS FileInformationClass);
3307
3308 KSDDKAPI NTSTATUS NTAPI
3309 KsSetMajorFunctionHandler(
3310 IN PDRIVER_OBJECT DriverObject,
3311 IN ULONG MajorFunction);
3312
3313 KSDDKAPI NTSTATUS NTAPI
3314 KsStreamIo(
3315 IN PFILE_OBJECT FileObject,
3316 IN PKEVENT Event OPTIONAL,
3317 IN PVOID PortContext OPTIONAL,
3318 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
3319 IN PVOID CompletionContext OPTIONAL,
3320 IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
3321 OUT PIO_STATUS_BLOCK IoStatusBlock,
3322 IN OUT PVOID StreamHeaders,
3323 IN ULONG Length,
3324 IN ULONG Flags,
3325 IN KPROCESSOR_MODE RequestorMode);
3326
3327 KSDDKAPI NTSTATUS NTAPI
3328 KsWriteFile(
3329 IN PFILE_OBJECT FileObject,
3330 IN PKEVENT Event OPTIONAL,
3331 IN PVOID PortContext OPTIONAL,
3332 OUT PIO_STATUS_BLOCK IoStatusBlock,
3333 IN PVOID Buffer,
3334 IN ULONG Length,
3335 IN ULONG Key OPTIONAL,
3336 IN KPROCESSOR_MODE RequestorMode);
3337
3338
3339 KSDDKAPI NTSTATUS NTAPI
3340 KsDefaultForwardIrp(
3341 IN PDEVICE_OBJECT DeviceObject,
3342 IN PIRP Irp);
3343
3344 /* ===============================================================
3345 Worker Management Functions
3346 */
3347
3348 KSDDKAPI NTSTATUS NTAPI
3349 KsRegisterWorker(
3350 IN WORK_QUEUE_TYPE WorkQueueType,
3351 OUT PKSWORKER* Worker);
3352
3353 KSDDKAPI VOID NTAPI
3354 KsUnregisterWorker(
3355 IN PKSWORKER Worker);
3356
3357 KSDDKAPI NTSTATUS NTAPI
3358 KsRegisterCountedWorker(
3359 IN WORK_QUEUE_TYPE WorkQueueType,
3360 IN PWORK_QUEUE_ITEM CountedWorkItem,
3361 OUT PKSWORKER* Worker);
3362
3363 KSDDKAPI ULONG NTAPI
3364 KsDecrementCountedWorker(
3365 IN PKSWORKER Worker);
3366
3367 KSDDKAPI ULONG NTAPI
3368 KsIncrementCountedWorker(
3369 IN PKSWORKER Worker);
3370
3371 KSDDKAPI NTSTATUS NTAPI
3372 KsQueueWorkItem(
3373 IN PKSWORKER Worker,
3374 IN PWORK_QUEUE_ITEM WorkItem);
3375
3376
3377 /* ===============================================================
3378 Resources / Images
3379 */
3380
3381 KSDDKAPI NTSTATUS NTAPI
3382 KsLoadResource(
3383 IN PVOID ImageBase,
3384 IN POOL_TYPE PoolType,
3385 IN ULONG_PTR ResourceName,
3386 IN ULONG ResourceType,
3387 OUT PVOID* Resource,
3388 OUT PULONG ResourceSize);
3389
3390 /* TODO: Implement
3391 KSDDKAPI NTSTATUS NTAPI
3392 KsGetImageNameAndResourceId(
3393 IN HANDLE RegKey,
3394 OUT PUNICODE_STRING ImageName,
3395 OUT PULONG_PTR ResourceId,
3396 OUT PULONG ValueType);
3397
3398 KSDDKAPI NTSTATUS NTAPI
3399 KsMapModuleName(
3400 IN PDEVICE_OBJECT PhysicalDeviceObject,
3401 IN PUNICODE_STRING ModuleName,
3402 OUT PUNICODE_STRING ImageName,
3403 OUT PULONG_PTR ResourceId,
3404 OUT PULONG ValueType);
3405 */
3406
3407
3408 /* ===============================================================
3409 Misc. Helper Functions
3410 */
3411
3412 KSDDKAPI NTSTATUS NTAPI
3413 KsCacheMedium(
3414 IN PUNICODE_STRING SymbolicLink,
3415 IN PKSPIN_MEDIUM Medium,
3416 IN ULONG PinDirection);
3417
3418 KSDDKAPI NTSTATUS NTAPI
3419 KsDefaultDispatchPnp(
3420 IN PDEVICE_OBJECT DeviceObject,
3421 IN PIRP Irp);
3422
3423 KSDDKAPI VOID NTAPI
3424 KsSetDevicePnpAndBaseObject(
3425 IN KSDEVICE_HEADER Header,
3426 IN PDEVICE_OBJECT PnpDeviceObject,
3427 IN PDEVICE_OBJECT BaseDevice);
3428
3429 KSDDKAPI NTSTATUS NTAPI
3430 KsDefaultDispatchPower(
3431 IN PDEVICE_OBJECT DeviceObject,
3432 IN PIRP Irp);
3433
3434 KSDDKAPI VOID NTAPI
3435 KsSetPowerDispatch(
3436 IN KSOBJECT_HEADER Header,
3437 IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
3438 IN PVOID PowerContext OPTIONAL);
3439
3440 KSDDKAPI NTSTATUS NTAPI
3441 KsReferenceBusObject(
3442 IN KSDEVICE_HEADER Header);
3443
3444 KSDDKAPI VOID NTAPI
3445 KsDereferenceBusObject(
3446 IN KSDEVICE_HEADER Header);
3447
3448 KSDDKAPI NTSTATUS NTAPI
3449 KsFreeObjectCreateItem(
3450 IN KSDEVICE_HEADER Header,
3451 IN PUNICODE_STRING CreateItem);
3452
3453 KSDDKAPI NTSTATUS NTAPI
3454 KsFreeObjectCreateItemsByContext(
3455 IN KSDEVICE_HEADER Header,
3456 IN PVOID Context);
3457
3458 KSDDKAPI VOID NTAPI
3459 KsNullDriverUnload(
3460 IN PDRIVER_OBJECT DriverObject);
3461
3462 KSDDKAPI PDEVICE_OBJECT NTAPI
3463 KsQueryDevicePnpObject(
3464 IN KSDEVICE_HEADER Header);
3465
3466 KSDDKAPI VOID NTAPI
3467 KsRecalculateStackDepth(
3468 IN KSDEVICE_HEADER Header,
3469 IN BOOLEAN ReuseStackLocation);
3470
3471 KSDDKAPI VOID NTAPI
3472 KsSetTargetDeviceObject(
3473 IN KSOBJECT_HEADER Header,
3474 IN PDEVICE_OBJECT TargetDevice OPTIONAL);
3475
3476 KSDDKAPI VOID NTAPI
3477 KsSetTargetState(
3478 IN KSOBJECT_HEADER Header,
3479 IN KSTARGET_STATE TargetState);
3480
3481 KSDDKAPI NTSTATUS NTAPI
3482 KsSynchronousIoControlDevice(
3483 IN PFILE_OBJECT FileObject,
3484 IN KPROCESSOR_MODE RequestorMode,
3485 IN ULONG IoControl,
3486 IN PVOID InBuffer,
3487 IN ULONG InSize,
3488 OUT PVOID OutBuffer,
3489 IN ULONG OUtSize,
3490 OUT PULONG BytesReturned);
3491
3492 #endif
3493
3494 /* ===============================================================
3495 AVStream Functions (XP / DirectX 8)
3496 NOT IMPLEMENTED YET
3497 http://www.osronline.com/ddkx/stream/avstream_5q9f.htm
3498 */
3499
3500 #if defined(_NTDDK_)
3501 KSDDKAPI
3502 NTSTATUS
3503 NTAPI
3504 KsInitializeDriver(
3505 IN PDRIVER_OBJECT DriverObject,
3506 IN PUNICODE_STRING RegistryPath,
3507 IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL);
3508
3509 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME
3510
3511
3512 KSDDKAPI
3513 NTSTATUS
3514 NTAPI
3515 KsInitializeDevice (
3516 IN PDEVICE_OBJECT FunctionalDeviceObject,
3517 IN PDEVICE_OBJECT PhysicalDeviceObject,
3518 IN PDEVICE_OBJECT NextDeviceObject,
3519 IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL);
3520
3521
3522 typedef void (*PFNKSFILTERFACTORYPOWER)(
3523 IN PKSFILTERFACTORY FilterFactory,
3524 IN DEVICE_POWER_STATE State);
3525
3526 KSDDKAPI
3527 NTSTATUS
3528 NTAPI
3529 _KsEdit(
3530 IN KSOBJECT_BAG ObjectBag,
3531 IN OUT PVOID* PointerToPointerToItem,
3532 IN ULONG NewSize,
3533 IN ULONG OldSize,
3534 IN ULONG Tag);
3535
3536 KSDDKAPI
3537 VOID
3538 NTAPI
3539 KsAcquireControl(
3540 IN PVOID Object);
3541
3542 KSDDKAPI
3543 VOID
3544 NTAPI
3545 KsAcquireDevice(
3546 IN PKSDEVICE Device);
3547
3548 KSDDKAPI
3549 NTSTATUS
3550 NTAPI
3551 KsAddDevice(
3552 IN PDRIVER_OBJECT DriverObject,
3553 IN PDEVICE_OBJECT PhysicalDeviceObject);
3554
3555 KSDDKAPI
3556 VOID
3557 NTAPI
3558 KsAddEvent(
3559 IN PVOID Object,
3560 IN PKSEVENT_ENTRY EventEntry);
3561
3562 KSDDKAPI
3563 NTSTATUS
3564 NTAPI
3565 KsAddItemToObjectBag(
3566 IN KSOBJECT_BAG ObjectBag,
3567 IN PVOID Item,
3568 IN PFNKSFREE Free OPTIONAL);
3569
3570 KSDDKAPI
3571 NTSTATUS
3572 NTAPI
3573 KsAllocateObjectBag(
3574 IN PKSDEVICE Device,
3575 OUT KSOBJECT_BAG* ObjectBag);
3576
3577 KSDDKAPI
3578 VOID
3579 NTAPI
3580 KsCompletePendingRequest(
3581 IN PIRP Irp);
3582
3583 KSDDKAPI
3584 NTSTATUS
3585 NTAPI
3586 KsCopyObjectBagItems(
3587 IN KSOBJECT_BAG ObjectBagDestination,
3588 IN KSOBJECT_BAG ObjectBagSource);
3589
3590 KSDDKAPI
3591 NTSTATUS
3592 NTAPI
3593 KsCreateDevice(
3594 IN PDRIVER_OBJECT DriverObject,
3595 IN PDEVICE_OBJECT PhysicalDeviceObject,
3596 IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
3597 IN ULONG ExtensionSize OPTIONAL,
3598 OUT PKSDEVICE* Device OPTIONAL);
3599
3600 KSDDKAPI
3601 NTSTATUS
3602 NTAPI
3603 KsCreateFilterFactory(
3604 IN PDEVICE_OBJECT DeviceObject,
3605 IN const KSFILTER_DESCRIPTOR* Descriptor,
3606 IN PWCHAR RefString OPTIONAL,
3607 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
3608 IN ULONG CreateItemFlags,
3609 IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
3610 IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
3611 OUT PKSFILTERFACTORY *FilterFactory OPTIONAL);
3612
3613 KSDDKAPI
3614 NTSTATUS
3615 NTAPI
3616 KsDefaultAddEventHandler(
3617 IN PIRP Irp,
3618 IN PKSEVENTDATA EventData,
3619 IN OUT PKSEVENT_ENTRY EventEntry);
3620
3621 KSDDKAPI
3622 NTSTATUS
3623 NTAPI
3624 KsDispatchQuerySecurity(
3625 IN PDEVICE_OBJECT DeviceObject,
3626 IN PIRP Irp
3627 );
3628
3629 KSDDKAPI
3630 NTSTATUS
3631 NTAPI
3632 KsDispatchSetSecurity(
3633 IN PDEVICE_OBJECT DeviceObject,
3634 IN PIRP Irp
3635 );
3636
3637
3638
3639 #define KsDeleteFilterFactory(FilterFactory) \
3640 KsFreeObjectCreateItemsByContext( \
3641 *(KSDEVICE_HEADER *)( \
3642 KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject-> \
3643 DeviceExtension), \
3644 FilterFactory)
3645
3646 KSDDKAPI
3647 ULONG
3648 NTAPI
3649 KsDeviceGetBusData(
3650 IN PKSDEVICE Device,
3651 IN ULONG DataType,
3652 IN PVOID Buffer,
3653 IN ULONG Offset,
3654 IN ULONG Length);
3655
3656
3657 KSDDKAPI
3658 PVOID
3659 NTAPI
3660 KsGetFirstChild(
3661 IN PVOID Object
3662 );
3663
3664 KSDDKAPI
3665 PKSFILTERFACTORY
3666 NTAPI
3667 KsDeviceGetFirstChildFilterFactory(
3668 IN PKSDEVICE Device);
3669
3670 #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3671
3672 KSDDKAPI
3673 PUNKNOWN
3674 NTAPI
3675 KsGetOuterUnknown(
3676 IN PVOID Object
3677 );
3678
3679 static
3680 __inline
3681 PUNKNOWN
3682 KsDeviceGetOuterUnknown(
3683 IN PKSDEVICE Device)
3684 {
3685 return KsGetOuterUnknown((PVOID) Device);
3686 }
3687
3688 KSDDKAPI
3689 PUNKNOWN
3690 NTAPI
3691 KsDeviceRegisterAggregatedClientUnknown(
3692 IN PKSDEVICE Device,
3693 IN PUNKNOWN ClientUnknown);
3694
3695
3696 #endif
3697
3698 #undef INTERFACE
3699 #define INTERFACE IKsControl
3700
3701 DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
3702
3703 DECLARE_INTERFACE_(IKsControl,IUnknown)
3704 {
3705 STDMETHOD_(NTSTATUS, QueryInterface)( THIS_
3706 REFIID InterfaceId,
3707 PVOID* Interface)PURE;
3708
3709 STDMETHOD_(ULONG, AddRef)(THIS) PURE;
3710
3711 STDMETHOD_(ULONG, Release)(THIS) PURE;
3712
3713 STDMETHOD_(NTSTATUS, KsProperty)(THIS_
3714 IN PKSPROPERTY Property,
3715 IN ULONG PropertyLength,
3716 IN OUT PVOID PropertyData,
3717 IN ULONG DataLength,
3718 OUT ULONG* BytesReturned
3719 ) PURE;
3720 STDMETHOD_(NTSTATUS, KsMethod)(THIS_
3721 IN PKSMETHOD Method,
3722 IN ULONG MethodLength,
3723 IN OUT PVOID MethodData,
3724 IN ULONG DataLength,
3725 OUT ULONG* BytesReturned
3726 ) PURE;
3727 STDMETHOD_(NTSTATUS, KsEvent)(THIS_
3728 IN PKSEVENT Event OPTIONAL,
3729 IN ULONG EventLength,
3730 IN OUT PVOID EventData,
3731 IN ULONG DataLength,
3732 OUT ULONG* BytesReturned
3733 ) PURE;
3734 };
3735
3736 #undef INTERFACE
3737 typedef IKsControl* PIKSCONTROL;
3738
3739 KSDDKAPI
3740 VOID
3741 NTAPI
3742 KsDeviceRegisterAdapterObject(
3743 IN PKSDEVICE Device,
3744 IN PADAPTER_OBJECT AdapterObject,
3745 IN ULONG MaxMappingByteCount,
3746 IN ULONG MappingTableStride);
3747
3748 KSDDKAPI
3749 ULONG
3750 NTAPI
3751 KsDeviceSetBusData(
3752 IN PKSDEVICE Device,
3753 IN ULONG DataType,
3754 IN PVOID Buffer,
3755 IN ULONG Offset,
3756 IN ULONG Length);
3757
3758
3759 #define KsDiscard(object, pointer) \
3760 KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE)
3761
3762 #define KsFilterAcquireControl(Filter) \
3763 KsAcquireControl((PVOID) Filter);
3764
3765 #define KsFilterAddEvent(Filter, EventEntry) \
3766 KsAddEvent(Filter,EventEntry);
3767
3768 KSDDKAPI
3769 VOID
3770 NTAPI
3771 KsFilterAcquireProcessingMutex(
3772 IN PKSFILTER Filter);
3773
3774 KSDDKAPI
3775 NTSTATUS
3776 NTAPI
3777 KsFilterAddTopologyConnections(
3778 IN PKSFILTER Filter,
3779 IN ULONG NewConnectionsCount,
3780 IN const KSTOPOLOGY_CONNECTION* NewTopologyConnections);
3781
3782 KSDDKAPI
3783 VOID
3784 NTAPI
3785 KsFilterAttemptProcessing(
3786 IN PKSFILTER Filter,
3787 IN BOOLEAN Asynchronous);
3788
3789 KSDDKAPI
3790 NTSTATUS
3791 NTAPI
3792 KsFilterCreateNode(
3793 IN PKSFILTER Filter,
3794 IN const KSNODE_DESCRIPTOR* NodeDescriptor,
3795 OUT PULONG NodeID);
3796
3797 KSDDKAPI
3798 NTSTATUS
3799 NTAPI
3800 KsFilterCreatePinFactory(
3801 IN PKSFILTER Filter,
3802 IN const KSPIN_DESCRIPTOR_EX* PinDescriptor,
3803 OUT PULONG PinID);
3804
3805 KSDDKAPI
3806 PKSDEVICE
3807 __inline
3808 KsFilterFactoryGetDevice(
3809 IN PKSFILTERFACTORY FilterFactory);
3810
3811 /* etc. */
3812 #endif /* avstream */
3813
3814 #ifdef __cplusplus
3815 }
3816 #endif
3817
3818 #endif