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