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