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