source: Daodan/MSYS2/mingw32/i686-w64-mingw32/include/ks.h@ 1194

Last change on this file since 1194 was 1166, checked in by rossy, 3 years ago

Daodan: Replace MinGW build env with an up-to-date MSYS2 env

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