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