/[cvs]/api/include/ks.h
ViewVC logotype

Annotation of /api/include/ks.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Sun Jul 1 20:47:59 2001 UTC (22 years, 10 months ago) by bearsoft
Branch point for: lazy, MAIN
File MIME type: text/plain
Initial revision

1 bearsoft 1.1 /*++
2    
3     Copyright (C) Microsoft Corporation, 1996 - 1999
4    
5     Module Name:
6    
7     ks.h
8    
9     Abstract:
10    
11     Windows Driver Model/Connection and Streaming Architecture (WDM-CSA)
12     core definitions.
13    
14     --*/
15    
16     #if !defined(_KS_)
17     #define _KS_
18    
19     #if defined(__TCS__)
20     #define _KS_NO_ANONYMOUS_STRUCTURES_ 1
21     #endif
22    
23     #if !defined(_NTRTL_)
24     #ifndef DEFINE_GUIDEX
25     #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
26     #endif // !defined(DEFINE_GUIDEX)
27    
28     #ifndef STATICGUIDOF
29     #define STATICGUIDOF(guid) STATIC_##guid
30     #endif // !defined(STATICGUIDOF)
31     #endif // !defined(_NTRTL_)
32    
33     #ifndef SIZEOF_ARRAY
34     #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0]))
35     #endif // !defined(SIZEOF_ARRAY)
36    
37     #if defined(__cplusplus) && _MSC_VER >= 1100
38     #define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n
39     #define DEFINE_GUIDNAMED(n) __uuidof(struct n)
40     #else // !defined(__cplusplus)
41     #define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n)
42     #define DEFINE_GUIDNAMED(n) n
43     #endif // !defined(__cplusplus)
44    
45     //===========================================================================
46    
47     #define STATIC_GUID_NULL \
48     0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
49    
50     DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
51     #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
52    
53     //===========================================================================
54    
55     #define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS)
56     #define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS)
57     #define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS)
58     #define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS)
59     #define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS)
60     #define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS)
61     #define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS)
62    
63     //===========================================================================
64    
65     typedef enum {
66     KSRESET_BEGIN,
67     KSRESET_END
68     } KSRESET;
69    
70     typedef enum {
71     KSSTATE_STOP,
72     KSSTATE_ACQUIRE,
73     KSSTATE_PAUSE,
74     KSSTATE_RUN
75     } KSSTATE, *PKSSTATE;
76    
77     #define KSPRIORITY_LOW 0x00000001
78     #define KSPRIORITY_NORMAL 0x40000000
79     #define KSPRIORITY_HIGH 0x80000000
80     #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF
81    
82     typedef struct {
83     ULONG PriorityClass;
84     ULONG PrioritySubClass;
85     } KSPRIORITY, *PKSPRIORITY;
86    
87     typedef struct {
88     union {
89     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
90     struct _IDENTIFIER {
91     #else
92     struct {
93     #endif
94     GUID Set;
95     ULONG Id;
96     ULONG Flags;
97     };
98     LONGLONG Alignment;
99     };
100     } KSIDENTIFIER, *PKSIDENTIFIER;
101    
102     typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT;
103    
104     #define KSMETHOD_TYPE_NONE 0x00000000
105     #define KSMETHOD_TYPE_READ 0x00000001
106     #define KSMETHOD_TYPE_WRITE 0x00000002
107     #define KSMETHOD_TYPE_MODIFY 0x00000003
108     #define KSMETHOD_TYPE_SOURCE 0x00000004
109    
110     #define KSMETHOD_TYPE_SEND 0x00000001
111     #define KSMETHOD_TYPE_SETSUPPORT 0x00000100
112     #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200
113    
114     #define KSMETHOD_TYPE_TOPOLOGY 0x10000000
115    
116     #define KSPROPERTY_TYPE_GET 0x00000001
117     #define KSPROPERTY_TYPE_SET 0x00000002
118     #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100
119     #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200
120     #define KSPROPERTY_TYPE_RELATIONS 0x00000400
121     #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800
122     #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000
123     #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000
124     #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000
125     #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000
126     #define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000
127    
128     #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000
129    
130     typedef struct {
131     KSPROPERTY Property;
132     ULONG NodeId;
133     ULONG Reserved;
134     } KSP_NODE, *PKSP_NODE;
135    
136     typedef struct {
137     KSMETHOD Method;
138     ULONG NodeId;
139     ULONG Reserved;
140     } KSM_NODE, *PKSM_NODE;
141    
142     typedef struct {
143     KSEVENT Event;
144     ULONG NodeId;
145     ULONG Reserved;
146     } KSE_NODE, *PKSE_NODE;
147    
148     #define STATIC_KSPROPTYPESETID_General \
149     0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
150     DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
151     #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
152    
153     #if defined(_NTDDK_) && !defined(__wtypes_h__)
154     enum VARENUM {
155     VT_EMPTY = 0,
156     VT_NULL = 1,
157     VT_I2 = 2,
158     VT_I4 = 3,
159     VT_R4 = 4,
160     VT_R8 = 5,
161     VT_CY = 6,
162     VT_DATE = 7,
163     VT_BSTR = 8,
164     VT_DISPATCH = 9,
165     VT_ERROR = 10,
166     VT_BOOL = 11,
167     VT_VARIANT = 12,
168     VT_UNKNOWN = 13,
169     VT_DECIMAL = 14,
170     VT_I1 = 16,
171     VT_UI1 = 17,
172     VT_UI2 = 18,
173     VT_UI4 = 19,
174     VT_I8 = 20,
175     VT_UI8 = 21,
176     VT_INT = 22,
177     VT_UINT = 23,
178     VT_VOID = 24,
179     VT_HRESULT = 25,
180     VT_PTR = 26,
181     VT_SAFEARRAY = 27,
182     VT_CARRAY = 28,
183     VT_USERDEFINED = 29,
184     VT_LPSTR = 30,
185     VT_LPWSTR = 31,
186     VT_FILETIME = 64,
187     VT_BLOB = 65,
188     VT_STREAM = 66,
189     VT_STORAGE = 67,
190     VT_STREAMED_OBJECT = 68,
191     VT_STORED_OBJECT = 69,
192     VT_BLOB_OBJECT = 70,
193     VT_CF = 71,
194     VT_CLSID = 72,
195     VT_VECTOR = 0x1000,
196     VT_ARRAY = 0x2000,
197     VT_BYREF = 0x4000,
198     VT_RESERVED = 0x8000,
199     VT_ILLEGAL = 0xffff,
200     VT_ILLEGALMASKED = 0xfff,
201     VT_TYPEMASK = 0xfff
202     };
203     #endif // _NTDDK_ && !__wtypes_h__
204    
205     typedef struct {
206     ULONG Size;
207     ULONG Count;
208     } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
209    
210     typedef struct {
211     ULONG AccessFlags;
212     ULONG DescriptionSize;
213     KSIDENTIFIER PropTypeSet;
214     ULONG MembersListCount;
215     ULONG Reserved;
216     } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
217    
218     #define KSPROPERTY_MEMBER_RANGES 0x00000001
219     #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002
220     #define KSPROPERTY_MEMBER_VALUES 0x00000003
221    
222     #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001
223    
224     typedef struct {
225     ULONG MembersFlags;
226     ULONG MembersSize;
227     ULONG MembersCount;
228     ULONG Flags;
229     } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
230    
231     typedef union {
232     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
233     struct _SIGNED {
234     #else
235     struct {
236     #endif
237     LONG SignedMinimum;
238     LONG SignedMaximum;
239     };
240     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
241     struct _UNSIGNED {
242     #else
243     struct {
244     #endif
245     ULONG UnsignedMinimum;
246     ULONG UnsignedMaximum;
247     };
248     } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
249    
250     typedef union {
251     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
252     struct _SIGNED64 {
253     #else
254     struct {
255     #endif
256     LONGLONG SignedMinimum;
257     LONGLONG SignedMaximum;
258     };
259     #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
260     struct _UNSIGNED64 {
261     #else
262     struct {
263     #endif
264     #if defined(_NTDDK_)
265     ULONGLONG UnsignedMinimum;
266     ULONGLONG UnsignedMaximum;
267     #else // !_NTDDK_
268     DWORDLONG UnsignedMinimum;
269     DWORDLONG UnsignedMaximum;
270     #endif // !_NTDDK_
271     };
272     } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
273    
274     typedef struct {
275     ULONG SteppingDelta;
276     ULONG Reserved;
277     KSPROPERTY_BOUNDS_LONG Bounds;
278     } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
279    
280     typedef struct {
281     #if defined(_NTDDK_)
282     ULONGLONG SteppingDelta;
283     #else // !_NTDDK_
284     DWORDLONG SteppingDelta;
285     #endif // !_NTDDK_
286     KSPROPERTY_BOUNDS_LONGLONG Bounds;
287     } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
288    
289     //===========================================================================
290    
291     #if defined(_NTDDK_)
292     //
293     // Structure forward declarations.
294     //
295     typedef struct _KSDEVICE_DESCRIPTOR
296     KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
297     typedef struct _KSDEVICE_DISPATCH
298     KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
299     typedef struct _KSDEVICE
300     KSDEVICE, *PKSDEVICE;
301     typedef struct _KSFILTERFACTORY
302     KSFILTERFACTORY, *PKSFILTERFACTORY;
303     typedef struct _KSFILTER_DESCRIPTOR
304     KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
305     typedef struct _KSFILTER_DISPATCH
306     KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
307     typedef struct _KSFILTER
308     KSFILTER, *PKSFILTER;
309     typedef struct _KSPIN_DESCRIPTOR_EX
310     KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
311     typedef struct _KSPIN_DISPATCH
312     KSPIN_DISPATCH, *PKSPIN_DISPATCH;
313     typedef struct _KSCLOCK_DISPATCH
314     KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
315     typedef struct _KSALLOCATOR_DISPATCH
316     KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
317     typedef struct _KSPIN
318     KSPIN, *PKSPIN;
319     typedef struct _KSNODE_DESCRIPTOR
320     KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
321     typedef struct _KSSTREAM_POINTER_OFFSET
322     KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
323     typedef struct _KSSTREAM_POINTER
324     KSSTREAM_POINTER, *PKSSTREAM_POINTER;
325     typedef struct _KSMAPPING
326     KSMAPPING, *PKSMAPPING;
327     typedef struct _KSPROCESSPIN
328     KSPROCESSPIN, *PKSPROCESSPIN;
329     typedef struct _KSPROCESSPIN_INDEXENTRY
330     KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
331     #endif // _NTDDK_
332    
333     typedef PVOID PKSWORKER;
334    
335     typedef struct {
336     ULONG NotificationType;
337     union {
338     struct {
339     HANDLE Event;
340     ULONG_PTR Reserved[2];
341     } EventHandle;
342     struct {
343     HANDLE Semaphore;
344     ULONG Reserved;
345     LONG Adjustment;
346     } SemaphoreHandle;
347     #if defined(_NTDDK_)
348     struct {
349     PVOID Event;
350     KPRIORITY Increment;
351     ULONG_PTR Reserved;
352     } EventObject;
353     struct {
354     PVOID Semaphore;
355     KPRIORITY Increment;
356     LONG Adjustment;
357     } SemaphoreObject;
358     struct {
359     PKDPC Dpc;
360     ULONG ReferenceCount;
361     ULONG_PTR Reserved;
362     } Dpc;
363     struct {
364     PWORK_QUEUE_ITEM WorkQueueItem;
365     WORK_QUEUE_TYPE WorkQueueType;
366     ULONG_PTR Reserved;
367     } WorkItem;
368     struct {
369     PWORK_QUEUE_ITEM WorkQueueItem;
370     PKSWORKER KsWorkerObject;
371     ULONG_PTR Reserved;
372     } KsWorkItem;
373     // @@BEGIN_DDKSPLIT
374     struct {
375     PKSFILTER Filter;
376     ULONG_PTR Reserved[2];
377     } KsFilterProcessing;
378     struct {
379     PKSPIN Pin;
380     ULONG_PTR Reserved[2];
381     } KsPinProcessing;
382     // @@END_DDKSPLIT
383     #endif // defined(_NTDDK_)
384     struct {
385     PVOID Unused;
386     LONG_PTR Alignment[2];
387     } Alignment;
388     };
389     } KSEVENTDATA, *PKSEVENTDATA;
390    
391     #define KSEVENTF_EVENT_HANDLE 0x00000001
392     #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002
393     #if defined(_NTDDK_)
394     #define KSEVENTF_EVENT_OBJECT 0x00000004
395     #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008
396     #define KSEVENTF_DPC 0x00000010
397     #define KSEVENTF_WORKITEM 0x00000020
398     #define KSEVENTF_KSWORKITEM 0x00000080
399     // @@BEGIN_DDKSPLIT
400     #define KSEVENTF_KSFILTERPROCESSING 0x00000100
401     #define KSEVENTF_KSPINPROCESSING 0x00000200
402     // @@END_DDKSPLIT
403     #endif // defined(_NTDDK_)
404    
405     #define KSEVENT_TYPE_ENABLE 0x00000001
406     #define KSEVENT_TYPE_ONESHOT 0x00000002
407     #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
408     #define KSEVENT_TYPE_SETSUPPORT 0x00000100
409     #define KSEVENT_TYPE_BASICSUPPORT 0x00000200
410     #define KSEVENT_TYPE_QUERYBUFFER 0x00000400
411    
412     #define KSEVENT_TYPE_TOPOLOGY 0x10000000
413    
414     typedef struct {
415     KSEVENT Event;
416     PKSEVENTDATA EventData;
417     PVOID Reserved;
418     } KSQUERYBUFFER, *PKSQUERYBUFFER;
419    
420     typedef struct {
421     ULONG Size;
422     ULONG Flags;
423     union {
424     HANDLE ObjectHandle;
425     PVOID ObjectPointer;
426     };
427     PVOID Reserved;
428     KSEVENT Event;
429     KSEVENTDATA EventData;
430     } KSRELATIVEEVENT;
431    
432     #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
433     #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
434    
435     //===========================================================================
436    
437     typedef struct {
438     KSEVENTDATA EventData;
439     LONGLONG MarkTime;
440     } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
441    
442     typedef struct {
443     KSEVENTDATA EventData;
444     LONGLONG TimeBase;
445     LONGLONG Interval;
446     } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
447    
448     typedef struct {
449     LONGLONG TimeBase;
450     LONGLONG Interval;
451     } KSINTERVAL, *PKSINTERVAL;
452    
453     //===========================================================================
454    
455     #define STATIC_KSPROPSETID_General\
456     0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
457     DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
458     #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
459    
460     typedef enum {
461     KSPROPERTY_GENERAL_COMPONENTID
462     } KSPROPERTY_GENERAL;
463    
464     typedef struct {
465     GUID Manufacturer;
466     GUID Product;
467     GUID Component;
468     GUID Name;
469     ULONG Version;
470     ULONG Revision;
471     } KSCOMPONENTID, *PKSCOMPONENTID;
472    
473     #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\
474     DEFINE_KSPROPERTY_ITEM(\
475     KSPROPERTY_GENERAL_COMPONENTID,\
476     (Handler),\
477     sizeof(KSPROPERTY),\
478     sizeof(KSCOMPONENTID),\
479     NULL, NULL, 0, NULL, NULL, 0)
480    
481     #define STATIC_KSMETHODSETID_StreamIo\
482     0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
483     DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196", KSMETHODSETID_StreamIo);
484     #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
485    
486     typedef enum {
487     KSMETHOD_STREAMIO_READ,
488     KSMETHOD_STREAMIO_WRITE
489     } KSMETHOD_STREAMIO;
490    
491     #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)\
492     DEFINE_KSMETHOD_ITEM(\
493     KSMETHOD_STREAMIO_READ,\
494     KSMETHOD_TYPE_WRITE,\
495     (Handler),\
496     sizeof(KSMETHOD),\
497     0,\
498     NULL)
499    
500     #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)\
501     DEFINE_KSMETHOD_ITEM(\
502     KSMETHOD_STREAMIO_WRITE,\
503     KSMETHOD_TYPE_READ,\
504     (Handler),\
505     sizeof(KSMETHOD),\
506     0,\
507     NULL)
508    
509     #define STATIC_KSPROPSETID_MediaSeeking\
510     0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
511     DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
512     #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
513    
514     typedef enum {
515     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
516     KSPROPERTY_MEDIASEEKING_FORMATS,
517     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
518     KSPROPERTY_MEDIASEEKING_POSITION,
519     KSPROPERTY_MEDIASEEKING_STOPPOSITION,
520     KSPROPERTY_MEDIASEEKING_POSITIONS,
521     KSPROPERTY_MEDIASEEKING_DURATION,
522     KSPROPERTY_MEDIASEEKING_AVAILABLE,
523     KSPROPERTY_MEDIASEEKING_PREROLL,
524     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
525     } KSPROPERTY_MEDIASEEKING;
526    
527     typedef enum {
528     KS_SEEKING_NoPositioning,
529     KS_SEEKING_AbsolutePositioning,
530     KS_SEEKING_RelativePositioning,
531     KS_SEEKING_IncrementalPositioning,
532     KS_SEEKING_PositioningBitsMask = 0x3,
533     KS_SEEKING_SeekToKeyFrame,
534     KS_SEEKING_ReturnTime = 0x8
535     } KS_SEEKING_FLAGS;
536    
537     typedef enum {
538     KS_SEEKING_CanSeekAbsolute = 0x1,
539     KS_SEEKING_CanSeekForwards = 0x2,
540     KS_SEEKING_CanSeekBackwards = 0x4,
541     KS_SEEKING_CanGetCurrentPos = 0x8,
542     KS_SEEKING_CanGetStopPos = 0x10,
543     KS_SEEKING_CanGetDuration = 0x20,
544     KS_SEEKING_CanPlayBackwards = 0x40
545     } KS_SEEKING_CAPABILITIES;
546    
547     typedef struct {
548     LONGLONG Current;
549     LONGLONG Stop;
550     KS_SEEKING_FLAGS CurrentFlags;
551     KS_SEEKING_FLAGS StopFlags;
552     } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
553    
554     typedef struct {
555     LONGLONG Earliest;
556     LONGLONG Latest;
557     } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
558    
559     typedef struct {
560     KSPROPERTY Property;
561     GUID SourceFormat;
562     GUID TargetFormat;
563     LONGLONG Time;
564     } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
565    
566     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
567     DEFINE_KSPROPERTY_ITEM(\
568     KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
569     (Handler),\
570     sizeof(KSPROPERTY),\
571     sizeof(KS_SEEKING_CAPABILITIES),\
572     NULL, NULL, 0, NULL, NULL, 0)
573    
574     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
575     DEFINE_KSPROPERTY_ITEM(\
576     KSPROPERTY_MEDIASEEKING_FORMATS,\
577     (Handler),\
578     sizeof(KSPROPERTY),\
579     0,\
580     NULL, NULL, 0, NULL, NULL, 0)
581    
582     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
583     DEFINE_KSPROPERTY_ITEM(\
584     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
585     (GetHandler),\
586     sizeof(KSPROPERTY),\
587     sizeof(GUID),\
588     (SetHandler),\
589     NULL, 0, NULL, NULL, 0)
590    
591     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
592     DEFINE_KSPROPERTY_ITEM(\
593     KSPROPERTY_MEDIASEEKING_POSITION,\
594     (Handler),\
595     sizeof(KSPROPERTY),\
596     sizeof(LONGLONG),\
597     NULL, NULL, 0, NULL, NULL, 0)
598    
599     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
600     DEFINE_KSPROPERTY_ITEM(\
601     KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
602     (Handler),\
603     sizeof(KSPROPERTY),\
604     sizeof(LONGLONG),\
605     NULL, NULL, 0, NULL, NULL, 0)
606    
607     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
608     DEFINE_KSPROPERTY_ITEM(\
609     KSPROPERTY_MEDIASEEKING_POSITIONS,\
610     NULL,\
611     sizeof(KSPROPERTY),\
612     sizeof(KSPROPERTY_POSITIONS),\
613     (Handler),\
614     NULL, 0, NULL, NULL, 0)
615    
616     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
617     DEFINE_KSPROPERTY_ITEM(\
618     KSPROPERTY_MEDIASEEKING_DURATION,\
619     (Handler),\
620     sizeof(KSPROPERTY),\
621     sizeof(LONGLONG),\
622     NULL, NULL, 0, NULL, NULL, 0)
623    
624     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
625     DEFINE_KSPROPERTY_ITEM(\
626     KSPROPERTY_MEDIASEEKING_AVAILABLE,\
627     (Handler),\
628     sizeof(KSPROPERTY),\
629     sizeof(KSPROPERTY_MEDIAAVAILABLE),\
630     NULL, NULL, 0, NULL, NULL, 0)
631    
632     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
633     DEFINE_KSPROPERTY_ITEM(\
634     KSPROPERTY_MEDIASEEKING_PREROLL,\
635     (Handler),\
636     sizeof(KSPROPERTY),\
637     sizeof(LONGLONG),\
638     NULL, NULL, 0, NULL, NULL, 0)
639    
640     #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
641     DEFINE_KSPROPERTY_ITEM(\
642     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
643     (Handler),\
644     sizeof(KSP_TIMEFORMAT),\
645     sizeof(LONGLONG),\
646     NULL, NULL, 0, NULL, NULL, 0)
647    
648     //===========================================================================
649    
650     #define STATIC_KSPROPSETID_Topology\
651     0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
652     DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
653     #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
654    
655     typedef enum {
656     KSPROPERTY_TOPOLOGY_CATEGORIES,
657     KSPROPERTY_TOPOLOGY_NODES,
658     KSPROPERTY_TOPOLOGY_CONNECTIONS,
659     KSPROPERTY_TOPOLOGY_NAME
660     } KSPROPERTY_TOPOLOGY;
661    
662     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
663     DEFINE_KSPROPERTY_ITEM(\
664     KSPROPERTY_TOPOLOGY_CATEGORIES,\
665     (Handler),\
666     sizeof(KSPROPERTY),\
667     0,\
668     NULL, NULL, 0, NULL, NULL, 0)
669    
670     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
671     DEFINE_KSPROPERTY_ITEM(\
672     KSPROPERTY_TOPOLOGY_NODES,\
673     (Handler),\
674     sizeof(KSPROPERTY),\
675     0,\
676     NULL, NULL, 0, NULL, NULL, 0)
677    
678     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
679     DEFINE_KSPROPERTY_ITEM(\
680     KSPROPERTY_TOPOLOGY_CONNECTIONS,\
681     (Handler),\
682     sizeof(KSPROPERTY),\
683     0,\
684     NULL, NULL, 0, NULL, NULL, 0)
685    
686     #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
687     DEFINE_KSPROPERTY_ITEM(\
688     KSPROPERTY_TOPOLOGY_NAME,\
689     (Handler),\
690     sizeof(KSP_NODE),\
691     0,\
692     NULL, NULL, 0, NULL, NULL, 0)
693    
694     #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
695     DEFINE_KSPROPERTY_TABLE(TopologySet) {\
696     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
697     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
698     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
699     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
700     }
701    
702     //=============================================================================
703    
704     //
705     // properties used by graph manager to talk to particular filters
706     //
707     #if defined(_NTDDK_)
708    
709     #define STATIC_KSPROPSETID_GM \
710     0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D
711     DEFINE_GUIDSTRUCT("AF627536-E719-11D2-8A1D-006097D2DF5D", KSPROPSETID_GM);
712     #define KSPROPSETID_GM DEFINE_GUIDNAMED(KSPROPSETID_GM)
713    
714     typedef VOID (*PFNKSGRAPHMANAGER_NOTIFY)(IN PFILE_OBJECT GraphManager,
715     IN ULONG EventId,
716     IN PVOID Filter,
717     IN PVOID Pin,
718     IN PVOID Frame,
719     IN ULONG Duration);
720    
721     typedef struct KSGRAPHMANAGER_FUNCTIONTABLE {
722     PFNKSGRAPHMANAGER_NOTIFY NotifyEvent;
723     } KSGRAPHMANAGER_FUNCTIONTABLE, PKSGRAPHMANAGER_FUNCTIONTABLE;
724    
725     typedef struct _KSPROPERTY_GRAPHMANAGER_INTERFACE {
726     PFILE_OBJECT GraphManager;
727     KSGRAPHMANAGER_FUNCTIONTABLE FunctionTable;
728     } KSPROPERTY_GRAPHMANAGER_INTERFACE, *PKSPROPERTY_GRAPHMANAGER_INTERFACE;
729    
730    
731     //
732     // Commands
733     //
734     typedef enum {
735     KSPROPERTY_GM_GRAPHMANAGER,
736     KSPROPERTY_GM_TIMESTAMP_CLOCK,
737     KSPROPERTY_GM_RATEMATCH,
738     KSPROPERTY_GM_RENDER_CLOCK,
739     } KSPROPERTY_GM;
740    
741     #endif
742    
743     //===========================================================================
744    
745    
746     #define STATIC_KSCATEGORY_BRIDGE \
747     0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
748     DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
749     #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
750    
751     #define STATIC_KSCATEGORY_CAPTURE \
752     0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
753     DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
754     #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
755    
756     #define STATIC_KSCATEGORY_RENDER \
757     0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
758     DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
759     #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
760    
761     #define STATIC_KSCATEGORY_MIXER \
762     0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
763     DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
764     #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
765    
766     #define STATIC_KSCATEGORY_SPLITTER \
767     0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
768     DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
769     #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
770    
771     #define STATIC_KSCATEGORY_DATACOMPRESSOR \
772     0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
773     DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
774     #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
775    
776     #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
777     0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
778     DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
779     #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
780    
781     #define STATIC_KSCATEGORY_DATATRANSFORM \
782     0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
783     DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
784     #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
785    
786     #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
787     0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
788     DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
789     #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
790    
791     #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
792     0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
793     DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
794     #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
795    
796     #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
797     0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
798     DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
799     #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
800    
801     #define STATIC_KSCATEGORY_FILESYSTEM \
802     0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
803     DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
804     #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
805    
806     // KSNAME_Clock
807     #define STATIC_KSCATEGORY_CLOCK \
808     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
809     DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
810     #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
811    
812     #define STATIC_KSCATEGORY_PROXY \
813     0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
814     DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
815     #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
816    
817     #define STATIC_KSCATEGORY_QUALITY \
818     0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
819     DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
820     #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
821    
822     typedef struct {
823     ULONG FromNode;
824     ULONG FromNodePin;
825     ULONG ToNode;
826     ULONG ToNodePin;
827     } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
828    
829     typedef struct {
830     ULONG CategoriesCount;
831     const GUID* Categories;
832     ULONG TopologyNodesCount;
833     const GUID* TopologyNodes;
834     ULONG TopologyConnectionsCount;
835     const KSTOPOLOGY_CONNECTION* TopologyConnections;
836     const GUID* TopologyNodesNames;
837     ULONG Reserved;
838     } KSTOPOLOGY, *PKSTOPOLOGY;
839    
840     #define KSFILTER_NODE ((ULONG)-1)
841     #define KSALL_NODES ((ULONG)-1)
842    
843     typedef struct {
844     ULONG CreateFlags;
845     ULONG Node;
846     } KSNODE_CREATE, *PKSNODE_CREATE;
847    
848     //===========================================================================
849    
850     // TIME_FORMAT_NONE
851     #define STATIC_KSTIME_FORMAT_NONE STATIC_GUID_NULL
852     #define KSTIME_FORMAT_NONE GUID_NULL
853    
854     // TIME_FORMAT_FRAME
855     #define STATIC_KSTIME_FORMAT_FRAME\
856     0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
857     DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME);
858     #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME)
859    
860     // TIME_FORMAT_BYTE
861     #define STATIC_KSTIME_FORMAT_BYTE\
862     0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
863     DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE);
864     #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE)
865    
866     // TIME_FORMAT_SAMPLE
867     #define STATIC_KSTIME_FORMAT_SAMPLE\
868     0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
869     DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE);
870     #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE)
871    
872     // TIME_FORMAT_FIELD
873     #define STATIC_KSTIME_FORMAT_FIELD\
874     0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
875     DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD);
876     #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD)
877    
878     // TIME_FORMAT_MEDIA_TIME
879     #define STATIC_KSTIME_FORMAT_MEDIA_TIME\
880     0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
881     DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME);
882     #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
883    
884     //===========================================================================
885    
886     typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
887    
888     #define STATIC_KSINTERFACESETID_Standard \
889     0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
890     DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
891     #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
892    
893     typedef enum {
894     KSINTERFACE_STANDARD_STREAMING,
895     KSINTERFACE_STANDARD_LOOPED_STREAMING,
896     KSINTERFACE_STANDARD_CONTROL
897     } KSINTERFACE_STANDARD;
898    
899     #define STATIC_KSINTERFACESETID_FileIo \
900     0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
901     DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
902     #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
903    
904     typedef enum {
905     KSINTERFACE_FILEIO_STREAMING
906     } KSINTERFACE_FILEIO;
907    
908     //===========================================================================
909    
910     #define KSMEDIUM_TYPE_ANYINSTANCE 0
911    
912     #define STATIC_KSMEDIUMSETID_Standard \
913     0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
914     DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
915     #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
916    
917     //For compatibility only
918     #define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE
919    
920     //===========================================================================
921    
922     #define STATIC_KSPROPSETID_Pin\
923     0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
924     DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
925     #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
926    
927     typedef enum {
928     KSPROPERTY_PIN_CINSTANCES,
929     KSPROPERTY_PIN_CTYPES,
930     KSPROPERTY_PIN_DATAFLOW,
931     KSPROPERTY_PIN_DATARANGES,
932     KSPROPERTY_PIN_DATAINTERSECTION,
933     KSPROPERTY_PIN_INTERFACES,
934     KSPROPERTY_PIN_MEDIUMS,
935     KSPROPERTY_PIN_COMMUNICATION,
936     KSPROPERTY_PIN_GLOBALCINSTANCES,
937     KSPROPERTY_PIN_NECESSARYINSTANCES,
938     KSPROPERTY_PIN_PHYSICALCONNECTION,
939     KSPROPERTY_PIN_CATEGORY,
940     KSPROPERTY_PIN_NAME,
941     KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
942     KSPROPERTY_PIN_PROPOSEDATAFORMAT
943     } KSPROPERTY_PIN;
944    
945     typedef struct {
946     KSPROPERTY Property;
947     ULONG PinId;
948     ULONG Reserved;
949     } KSP_PIN, *PKSP_PIN;
950    
951     #define KSINSTANCE_INDETERMINATE ((ULONG)-1)
952    
953     typedef struct {
954     ULONG PossibleCount;
955     ULONG CurrentCount;
956     } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
957    
958     typedef enum {
959     KSPIN_DATAFLOW_IN = 1,
960     KSPIN_DATAFLOW_OUT
961     } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
962    
963     #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION 0
964     #define KSDATAFORMAT_TEMPORAL_COMPRESSION (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION)
965     #define KSDATAFORMAT_BIT_ATTRIBUTES 1
966     #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES)
967    
968     #define KSDATARANGE_BIT_ATTRIBUTES 1
969     #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES)
970     #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2
971     #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES)
972    
973     #if !defined( _MSC_VER )
974     typedef struct {
975     ULONG FormatSize;
976     ULONG Flags;
977     ULONG SampleSize;
978     ULONG Reserved;
979     GUID MajorFormat;
980     GUID SubFormat;
981     GUID Specifier;
982     } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
983     #else
984     typedef union {
985     struct {
986     ULONG FormatSize;
987     ULONG Flags;
988     ULONG SampleSize;
989     ULONG Reserved;
990     GUID MajorFormat;
991     GUID SubFormat;
992     GUID Specifier;
993     };
994     LONGLONG Alignment;
995     } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
996     #endif
997    
998     #define KSATTRIBUTE_REQUIRED 0x00000001
999    
1000     typedef struct {
1001     ULONG Size;
1002     ULONG Flags;
1003     GUID Attribute;
1004     } KSATTRIBUTE, *PKSATTRIBUTE;
1005    
1006     #if defined(_NTDDK_)
1007     typedef struct {
1008     ULONG Count;
1009     PKSATTRIBUTE* Attributes;
1010     } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
1011     #endif // _NTDDK_
1012    
1013     typedef enum {
1014     KSPIN_COMMUNICATION_NONE,
1015     KSPIN_COMMUNICATION_SINK,
1016     KSPIN_COMMUNICATION_SOURCE,
1017     KSPIN_COMMUNICATION_BOTH,
1018     KSPIN_COMMUNICATION_BRIDGE
1019     } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
1020    
1021     typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
1022    
1023     typedef struct {
1024     KSPIN_INTERFACE Interface;
1025     KSPIN_MEDIUM Medium;
1026     ULONG PinId;
1027     HANDLE PinToHandle;
1028     KSPRIORITY Priority;
1029     } KSPIN_CONNECT, *PKSPIN_CONNECT;
1030    
1031     typedef struct {
1032     ULONG Size;
1033     ULONG Pin;
1034     WCHAR SymbolicLinkName[1];
1035     } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
1036    
1037     #if defined(_NTDDK_)
1038     typedef
1039     NTSTATUS
1040     (*PFNKSINTERSECTHANDLER)(
1041     IN PIRP Irp,
1042     IN PKSP_PIN Pin,
1043     IN PKSDATARANGE DataRange,
1044     OUT PVOID Data OPTIONAL
1045     );
1046     typedef
1047     NTSTATUS
1048     (*PFNKSINTERSECTHANDLEREX)(
1049     IN PVOID Context,
1050     IN PIRP Irp,
1051     IN PKSP_PIN Pin,
1052     IN PKSDATARANGE DataRange,
1053     IN PKSDATARANGE MatchingDataRange,
1054     IN ULONG DataBufferSize,
1055     OUT PVOID Data OPTIONAL,
1056     OUT PULONG DataSize
1057     );
1058     #endif // _NTDDK_
1059    
1060     #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\
1061     const KSPIN_INTERFACE tablename[] =
1062    
1063     #define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\
1064     {\
1065     STATICGUIDOF(guid),\
1066     (interface),\
1067     0\
1068     }
1069    
1070     #define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\
1071     const KSPIN_MEDIUM tablename[] =
1072    
1073     #define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\
1074     DEFINE_KSPIN_INTERFACE_ITEM(guid, medium)
1075    
1076     #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
1077     DEFINE_KSPROPERTY_ITEM(\
1078     KSPROPERTY_PIN_CINSTANCES,\
1079     (Handler),\
1080     sizeof(KSP_PIN),\
1081     sizeof(KSPIN_CINSTANCES),\
1082     NULL, NULL, 0, NULL, NULL, 0)
1083    
1084     #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
1085     DEFINE_KSPROPERTY_ITEM(\
1086     KSPROPERTY_PIN_CTYPES,\
1087     (Handler),\
1088     sizeof(KSPROPERTY),\
1089     sizeof(ULONG),\
1090     NULL, NULL, 0, NULL, NULL, 0)
1091    
1092     #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
1093     DEFINE_KSPROPERTY_ITEM(\
1094     KSPROPERTY_PIN_DATAFLOW,\
1095     (Handler),\
1096     sizeof(KSP_PIN),\
1097     sizeof(KSPIN_DATAFLOW),\
1098     NULL, NULL, 0, NULL, NULL, 0)
1099    
1100     #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
1101     DEFINE_KSPROPERTY_ITEM(\
1102     KSPROPERTY_PIN_DATARANGES,\
1103     (Handler),\
1104     sizeof(KSP_PIN),\
1105     0,\
1106     NULL, NULL, 0, NULL, NULL, 0)
1107    
1108     #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
1109     DEFINE_KSPROPERTY_ITEM(\
1110     KSPROPERTY_PIN_DATAINTERSECTION,\
1111     (Handler),\
1112     sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
1113     0,\
1114     NULL, NULL, 0, NULL, NULL, 0)
1115    
1116     #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
1117     DEFINE_KSPROPERTY_ITEM(\
1118     KSPROPERTY_PIN_INTERFACES,\
1119     (Handler),\
1120     sizeof(KSP_PIN),\
1121     0,\
1122     NULL, NULL, 0, NULL, NULL, 0)
1123    
1124     #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
1125     DEFINE_KSPROPERTY_ITEM(\
1126     KSPROPERTY_PIN_MEDIUMS,\
1127     (Handler),\
1128     sizeof(KSP_PIN),\
1129     0,\
1130     NULL, NULL, 0, NULL, NULL, 0)
1131    
1132     #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
1133     DEFINE_KSPROPERTY_ITEM(\
1134     KSPROPERTY_PIN_COMMUNICATION,\
1135     (Handler),\
1136     sizeof(KSP_PIN),\
1137     sizeof(KSPIN_COMMUNICATION),\
1138     NULL, NULL, 0, NULL, NULL, 0)
1139    
1140     #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
1141     DEFINE_KSPROPERTY_ITEM(\
1142     KSPROPERTY_PIN_GLOBALCINSTANCES,\
1143     (Handler),\
1144     sizeof(KSP_PIN),\
1145     sizeof(KSPIN_CINSTANCES),\
1146     NULL, NULL, 0, NULL, NULL, 0)
1147    
1148     #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
1149     DEFINE_KSPROPERTY_ITEM(\
1150     KSPROPERTY_PIN_NECESSARYINSTANCES,\
1151     (Handler),\
1152     sizeof(KSP_PIN),\
1153     sizeof(ULONG),\
1154     NULL, NULL, 0, NULL, NULL, 0)
1155    
1156     #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
1157     DEFINE_KSPROPERTY_ITEM(\
1158     KSPROPERTY_PIN_PHYSICALCONNECTION,\
1159     (Handler),\
1160     sizeof(KSP_PIN),\
1161     0,\
1162     NULL, NULL, 0, NULL, NULL, 0)
1163    
1164     #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
1165     DEFINE_KSPROPERTY_ITEM(\
1166     KSPROPERTY_PIN_CATEGORY,\
1167     (Handler),\
1168     sizeof(KSP_PIN),\
1169     sizeof(GUID),\
1170     NULL, NULL, 0, NULL, NULL, 0)
1171    
1172     #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
1173     DEFINE_KSPROPERTY_ITEM(\
1174     KSPROPERTY_PIN_NAME,\
1175     (Handler),\
1176     sizeof(KSP_PIN),\
1177     0,\
1178     NULL, NULL, 0, NULL, NULL, 0)
1179    
1180     #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
1181     DEFINE_KSPROPERTY_ITEM(\
1182     KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
1183     (Handler),\
1184     sizeof(KSP_PIN),\
1185     0,\
1186     NULL, NULL, 0, NULL, NULL, 0)
1187    
1188     #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
1189     DEFINE_KSPROPERTY_ITEM(\
1190     KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
1191     NULL,\
1192     sizeof(KSP_PIN),\
1193     sizeof(KSDATAFORMAT),\
1194     (Handler), NULL, 0, NULL, NULL, 0)
1195    
1196     #define DEFINE_KSPROPERTY_PINSET(PinSet,\
1197     PropGeneral, PropInstances, PropIntersection)\
1198     DEFINE_KSPROPERTY_TABLE(PinSet) {\
1199     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
1200     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
1201     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
1202     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
1203     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
1204     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
1205     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
1206     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
1207     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
1208     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
1209     }
1210    
1211     #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
1212     PropGeneral, PropInstances, PropIntersection)\
1213     DEFINE_KSPROPERTY_TABLE(PinSet) {\
1214     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
1215     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
1216     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
1217     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
1218     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
1219     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
1220     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
1221     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
1222     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
1223     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
1224     DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
1225     }
1226    
1227     #define STATIC_KSNAME_Filter\
1228     0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1229     DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
1230     #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
1231    
1232     #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
1233    
1234     #define STATIC_KSNAME_Pin\
1235     0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1236     DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
1237     #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
1238    
1239     #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
1240    
1241     #define STATIC_KSNAME_Clock\
1242     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1243     DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock);
1244     #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock)
1245    
1246     #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
1247    
1248     #define STATIC_KSNAME_Allocator\
1249     0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1250     DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator);
1251     #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator)
1252    
1253     #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
1254    
1255     #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}"
1256    
1257     #define STATIC_KSNAME_TopologyNode\
1258     0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1259     DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode);
1260     #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode)
1261    
1262     #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
1263    
1264     #if defined(_NTDDK_)
1265    
1266     typedef struct {
1267     ULONG InterfacesCount;
1268     const KSPIN_INTERFACE* Interfaces;
1269     ULONG MediumsCount;
1270     const KSPIN_MEDIUM* Mediums;
1271     ULONG DataRangesCount;
1272     const PKSDATARANGE* DataRanges;
1273     KSPIN_DATAFLOW DataFlow;
1274     KSPIN_COMMUNICATION Communication;
1275     const GUID* Category;
1276     const GUID* Name;
1277     union {
1278     LONGLONG Reserved;
1279     struct {
1280     ULONG ConstrainedDataRangesCount;
1281     PKSDATARANGE* ConstrainedDataRanges;
1282     };
1283     };
1284     } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
1285     typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR;
1286    
1287     #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\
1288     const KSPIN_DESCRIPTOR tablename[] =
1289    
1290     #define DEFINE_KSPIN_DESCRIPTOR_ITEM(\
1291     InterfacesCount, Interfaces,\
1292     MediumsCount, Mediums,\
1293     DataRangesCount, DataRanges,\
1294     DataFlow, Communication)\
1295     {\
1296     InterfacesCount, Interfaces, MediumsCount, Mediums,\
1297     DataRangesCount, DataRanges, DataFlow, Communication,\
1298     NULL, NULL, 0\
1299     }
1300     #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\
1301     InterfacesCount, Interfaces,\
1302     MediumsCount, Mediums,\
1303     DataRangesCount, DataRanges,\
1304     DataFlow, Communication,\
1305     Category, Name)\
1306     {\
1307     InterfacesCount, Interfaces, MediumsCount, Mediums,\
1308     DataRangesCount, DataRanges, DataFlow, Communication,\
1309     Category, Name, 0\
1310     }
1311    
1312     #endif // defined(_NTDDK_)
1313    
1314     //===========================================================================
1315    
1316     // MEDIATYPE_NULL
1317     #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL
1318     #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL
1319    
1320     // MEDIASUBTYPE_NULL
1321     #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL
1322     #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL
1323    
1324     // MEDIATYPE_Stream
1325     #define STATIC_KSDATAFORMAT_TYPE_STREAM\
1326     0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
1327     DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM);
1328     #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM)
1329    
1330     // MEDIASUBTYPE_None
1331     #define STATIC_KSDATAFORMAT_SUBTYPE_NONE\
1332     0xE436EB8EL, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
1333     DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_SUBTYPE_NONE);
1334     #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE)
1335    
1336     #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL
1337     #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL
1338    
1339     #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\
1340     0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1341     DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME);
1342     #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME)
1343    
1344     #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\
1345     0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1346     DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE);
1347     #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE)
1348    
1349     // FORMAT_None
1350     #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
1351     0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
1352     DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
1353     #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
1354    
1355     //===========================================================================
1356    
1357     #define STATIC_KSPROPSETID_Quality \
1358     0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1359     DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality);
1360     #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
1361    
1362     typedef enum {
1363     KSPROPERTY_QUALITY_REPORT,
1364     KSPROPERTY_QUALITY_ERROR
1365     } KSPROPERTY_QUALITY;
1366    
1367     #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\
1368     DEFINE_KSPROPERTY_ITEM(\
1369     KSPROPERTY_QUALITY_REPORT,\
1370     (GetHandler),\
1371     sizeof(KSPROPERTY),\
1372     sizeof(KSQUALITY),\
1373     (SetHandler),\
1374     NULL, 0, NULL, NULL, 0)
1375    
1376     #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler, SetHandler)\
1377     DEFINE_KSPROPERTY_ITEM(\
1378     KSPROPERTY_QUALITY_ERROR,\
1379     (GetHandler),\
1380     sizeof(KSPROPERTY),\
1381     sizeof(KSERROR),\
1382     (SetHandler),\
1383     NULL, 0, NULL, NULL, 0)
1384    
1385     //===========================================================================
1386    
1387     #define STATIC_KSPROPSETID_Connection \
1388     0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
1389     DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
1390     #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
1391    
1392     typedef enum {
1393     KSPROPERTY_CONNECTION_STATE,
1394     KSPROPERTY_CONNECTION_PRIORITY,
1395     KSPROPERTY_CONNECTION_DATAFORMAT,
1396     KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
1397     KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
1398     KSPROPERTY_CONNECTION_ACQUIREORDERING,
1399     KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
1400     KSPROPERTY_CONNECTION_STARTAT
1401     } KSPROPERTY_CONNECTION;
1402    
1403     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
1404     DEFINE_KSPROPERTY_ITEM(\
1405     KSPROPERTY_CONNECTION_STATE,\
1406     (GetHandler),\
1407     sizeof(KSPROPERTY),\
1408     sizeof(KSSTATE),\
1409     (SetHandler),\
1410     NULL, 0, NULL, NULL, 0)
1411    
1412     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
1413     DEFINE_KSPROPERTY_ITEM(\
1414     KSPROPERTY_CONNECTION_PRIORITY,\
1415     (GetHandler),\
1416     sizeof(KSPROPERTY),\
1417     sizeof(KSPRIORITY),\
1418     (SetHandler),\
1419     NULL, 0, NULL, NULL, 0)
1420    
1421     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
1422     DEFINE_KSPROPERTY_ITEM(\
1423     KSPROPERTY_CONNECTION_DATAFORMAT,\
1424     (GetHandler),\
1425     sizeof(KSPROPERTY),\
1426     0,\
1427     (SetHandler),\
1428     NULL, 0, NULL, NULL, 0)
1429    
1430     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
1431     DEFINE_KSPROPERTY_ITEM(\
1432     KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
1433     (Handler),\
1434     sizeof(KSPROPERTY),\
1435     sizeof(KSALLOCATOR_FRAMING),\
1436     NULL, NULL, 0, NULL, NULL, 0)
1437    
1438     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
1439     DEFINE_KSPROPERTY_ITEM(\
1440     KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
1441     (Handler),\
1442     sizeof(KSPROPERTY),\
1443     sizeof(KSALLOCATOR_FRAMING_EX),\
1444     NULL, NULL, 0, NULL, NULL, 0)
1445    
1446     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
1447     DEFINE_KSPROPERTY_ITEM(\
1448     KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
1449     NULL,\
1450     sizeof(KSPROPERTY),\
1451     sizeof(KSDATAFORMAT),\
1452     (Handler),\
1453     NULL, 0, NULL, NULL, 0)
1454    
1455     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
1456     DEFINE_KSPROPERTY_ITEM(\
1457     KSPROPERTY_CONNECTION_ACQUIREORDERING,\
1458     (Handler),\
1459     sizeof(KSPROPERTY),\
1460     sizeof(int),\
1461     NULL, NULL, 0, NULL, NULL, 0)
1462    
1463     #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
1464     DEFINE_KSPROPERTY_ITEM(\
1465     KSPROPERTY_CONNECTION_STARTAT,\
1466     NULL,\
1467     sizeof(KSPROPERTY),\
1468     sizeof(KSRELATIVEEVENT),\
1469     (Handler),\
1470     NULL, 0, NULL, NULL, 0)
1471    
1472     //===========================================================================
1473     //
1474     // pins flags
1475     //
1476     #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001
1477     #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002
1478     #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004
1479     #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008
1480     #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000
1481    
1482     #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001
1483     #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002
1484     #define KSALLOCATOR_OPTIONF_VALID 0x00000003
1485     //
1486     // pins extended framing flags
1487     //
1488     #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010
1489     #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020
1490     #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040
1491     #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080
1492     //
1493     // allocator pipes flags
1494     //
1495     // there is at least one data modification in a pipe
1496     #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY 0x00000100
1497     #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT 0x00000200
1498     #define KSALLOCATOR_FLAG_CYCLE 0x00000400
1499     #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS 0x00000800
1500     // there is no framing dependency between neighbouring pipes.
1501     #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES 0x00001000
1502     #define KSALLOCATOR_FLAG_ATTENTION_STEPPING 0x00002000
1503    
1504    
1505     //
1506     // old Framing structure
1507     //
1508     typedef struct {
1509     union {
1510     ULONG OptionsFlags; // allocator options (create)
1511     ULONG RequirementsFlags; // allocation requirements (query)
1512     };
1513     #if defined(_NTDDK_)
1514     POOL_TYPE PoolType;
1515     #else // !_NTDDK_
1516     ULONG PoolType;
1517     #endif // !_NTDDK_
1518     ULONG Frames; // total number of allowable outstanding frames
1519     ULONG FrameSize; // total size of frame
1520     ULONG FileAlignment;
1521     ULONG Reserved;
1522     } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
1523    
1524     #if defined(_NTDDK_)
1525     typedef
1526     PVOID
1527     (*PFNKSDEFAULTALLOCATE)(
1528     IN PVOID Context
1529     );
1530    
1531     typedef
1532     VOID
1533     (*PFNKSDEFAULTFREE)(
1534     IN PVOID Context,
1535     IN PVOID Buffer
1536     );
1537    
1538     typedef
1539     NTSTATUS
1540     (*PFNKSINITIALIZEALLOCATOR)(
1541     IN PVOID InitialContext,
1542     IN PKSALLOCATOR_FRAMING AllocatorFraming,
1543     OUT PVOID* Context
1544     );
1545    
1546     typedef
1547     VOID
1548     (*PFNKSDELETEALLOCATOR)(
1549     IN PVOID Context
1550     );
1551     #endif // !_NTDDK_
1552    
1553     //
1554     // new Framing structure, eventually will replace KSALLOCATOR_FRAMING.
1555     //
1556     typedef struct {
1557     ULONG MinFrameSize;
1558     ULONG MaxFrameSize;
1559     ULONG Stepping;
1560     } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
1561    
1562    
1563     typedef struct {
1564     KS_FRAMING_RANGE Range;
1565     ULONG InPlaceWeight;
1566     ULONG NotInPlaceWeight;
1567     } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
1568    
1569    
1570     typedef struct {
1571     ULONG RatioNumerator; // compression/expansion ratio
1572     ULONG RatioDenominator;
1573     ULONG RatioConstantMargin;
1574     } KS_COMPRESSION, *PKS_COMPRESSION;
1575    
1576    
1577     //
1578     // Memory Types and Buses are repeated in each entry.
1579     // Easiest to use but takes a little more memory than the varsize layout Pin\Memories\Buses\Ranges.
1580     //
1581     typedef struct {
1582     GUID MemoryType;
1583     GUID BusType;
1584     ULONG MemoryFlags;
1585     ULONG BusFlags;
1586     ULONG Flags;
1587     ULONG Frames; // total number of allowable outstanding frames
1588     ULONG FileAlignment;
1589     ULONG MemoryTypeWeight; // this memory type Weight pin-wide
1590     KS_FRAMING_RANGE PhysicalRange;
1591     KS_FRAMING_RANGE_WEIGHTED FramingRange;
1592     } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
1593    
1594    
1595     typedef struct {
1596     ULONG CountItems; // count of FramingItem-s below.
1597     ULONG PinFlags;
1598     KS_COMPRESSION OutputCompression;
1599     ULONG PinWeight; // this pin framing's Weight graph-wide
1600     KS_FRAMING_ITEM FramingItem[1];
1601     } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
1602    
1603    
1604    
1605     //
1606     // define memory type GUIDs
1607     //
1608     #define KSMEMORY_TYPE_WILDCARD GUID_NULL
1609     #define STATIC_KSMEMORY_TYPE_WILDCARD STATIC_GUID_NULL
1610    
1611     #define KSMEMORY_TYPE_DONT_CARE GUID_NULL
1612     #define STATIC_KSMEMORY_TYPE_DONT_CARE STATIC_GUID_NULL
1613    
1614     #define KS_TYPE_DONT_CARE GUID_NULL
1615     #define STATIC_KS_TYPE_DONT_CARE STATIC_GUID_NULL
1616    
1617     #define STATIC_KSMEMORY_TYPE_SYSTEM \
1618     0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1619     DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_SYSTEM);
1620     #define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM)
1621    
1622     #define STATIC_KSMEMORY_TYPE_USER \
1623     0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1624     DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802", KSMEMORY_TYPE_USER);
1625     #define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER)
1626    
1627     #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
1628     0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1629     DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
1630     #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
1631    
1632     #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \
1633     0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1634     DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_NONPAGED);
1635     #define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED)
1636    
1637     // old KS clients did not specify the device memory type
1638     #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \
1639     0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
1640     DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_DEVICE_UNKNOWN);
1641     #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN)
1642    
1643     //
1644     // Helper framing macros.
1645     //
1646     #define DECLARE_SIMPLE_FRAMING_EX(FramingExName, MemoryType, Flags, Frames, Alignment, MinFrameSize, MaxFrameSize) \
1647     const KSALLOCATOR_FRAMING_EX FramingExName = \
1648     {\
1649     1, \
1650     0, \
1651     {\
1652     1, \
1653     1, \
1654     0 \
1655     }, \
1656     0, \
1657     {\
1658     {\
1659     MemoryType, \
1660     STATIC_KS_TYPE_DONT_CARE, \
1661     0, \
1662     0, \
1663     Flags, \
1664     Frames, \
1665     Alignment, \
1666     0, \
1667     {\
1668     0, \
1669     (ULONG)-1, \
1670     1 \
1671     }, \
1672     {\
1673     {\
1674     MinFrameSize, \
1675     MaxFrameSize, \
1676     1 \
1677     }, \
1678     0, \
1679     0 \
1680     }\
1681     }\
1682     }\
1683     }
1684    
1685     #define SetDefaultKsCompression(KsCompressionPointer) \
1686     {\
1687     KsCompressionPointer->RatioNumerator = 1;\
1688     KsCompressionPointer->RatioDenominator = 1;\
1689     KsCompressionPointer->RatioConstantMargin = 0;\
1690     }
1691    
1692     #define SetDontCareKsFramingRange(KsFramingRangePointer) \
1693     {\
1694     KsFramingRangePointer->MinFrameSize = 0;\
1695     KsFramingRangePointer->MaxFrameSize = (ULONG) -1;\
1696     KsFramingRangePointer->Stepping = 1;\
1697     }
1698    
1699     #define SetKsFramingRange(KsFramingRangePointer, P_MinFrameSize, P_MaxFrameSize) \
1700     {\
1701     KsFramingRangePointer->MinFrameSize = P_MinFrameSize;\
1702     KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;\
1703     KsFramingRangePointer->Stepping = 1;\
1704     }
1705    
1706     #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer, P_MinFrameSize, P_MaxFrameSize) \
1707     {\
1708     KS_FRAMING_RANGE *KsFramingRange = &KsFramingRangeWeightedPointer->Range;\
1709     SetKsFramingRange(KsFramingRange, P_MinFrameSize, P_MaxFrameSize);\
1710     KsFramingRangeWeightedPointer->InPlaceWeight = 0;\
1711     KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;\
1712     }
1713    
1714     #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer, P_MemoryType, P_Flags, P_Frames, P_Alignment, P_MinFrameSize, P_MaxFrameSize) \
1715     {\
1716     KS_COMPRESSION *KsCompression = &FramingExPointer->OutputCompression;\
1717     KS_FRAMING_RANGE *KsFramingRange = &FramingExPointer->FramingItem[0].PhysicalRange;\
1718     KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = &FramingExPointer->FramingItem[0].FramingRange;\
1719     FramingExPointer->CountItems = 1;\
1720     FramingExPointer->PinFlags = 0;\
1721     SetDefaultKsCompression(KsCompression);\
1722     FramingExPointer->PinWeight = 0;\
1723     FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;\
1724     FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;\
1725     FramingExPointer->FramingItem[0].MemoryFlags = 0;\
1726     FramingExPointer->FramingItem[0].BusFlags = 0;\
1727     FramingExPointer->FramingItem[0].Flags = P_Flags;\
1728     FramingExPointer->FramingItem[0].Frames = P_Frames;\
1729     FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;\
1730     FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;\
1731     SetDontCareKsFramingRange(KsFramingRange);\
1732     SetKsFramingRangeWeighted(KsFramingRangeWeighted, P_MinFrameSize, P_MaxFrameSize);\
1733     }
1734    
1735    
1736    
1737     // KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4}
1738    
1739     #define STATIC_KSEVENTSETID_StreamAllocator\
1740     0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1741     DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator);
1742     #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
1743    
1744     typedef enum {
1745     KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
1746     KSEVENT_STREAMALLOCATOR_FREEFRAME
1747     } KSEVENT_STREAMALLOCATOR;
1748    
1749     #define STATIC_KSMETHODSETID_StreamAllocator\
1750     0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1751     DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator);
1752     #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
1753    
1754     typedef enum {
1755     KSMETHOD_STREAMALLOCATOR_ALLOC,
1756     KSMETHOD_STREAMALLOCATOR_FREE
1757     } KSMETHOD_STREAMALLOCATOR;
1758    
1759     #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\
1760     DEFINE_KSMETHOD_ITEM(\
1761     KSMETHOD_STREAMALLOCATOR_ALLOC,\
1762     KSMETHOD_TYPE_WRITE,\
1763     (Handler),\
1764     sizeof(KSMETHOD),\
1765     sizeof(PVOID),\
1766     NULL)
1767    
1768     #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\
1769     DEFINE_KSMETHOD_ITEM(\
1770     KSMETHOD_STREAMALLOCATOR_FREE,\
1771     KSMETHOD_TYPE_READ,\
1772     (Handler),\
1773     sizeof(KSMETHOD),\
1774     sizeof(PVOID),\
1775     NULL)
1776    
1777     #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\
1778     DEFINE_KSMETHOD_TABLE(AllocatorSet) {\
1779     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\
1780     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\
1781     }
1782    
1783     #define STATIC_KSPROPSETID_StreamAllocator\
1784     0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1785     DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
1786     #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
1787    
1788     #if defined(_NTDDK_)
1789     typedef enum {
1790     KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
1791     KSPROPERTY_STREAMALLOCATOR_STATUS
1792     } KSPROPERTY_STREAMALLOCATOR;
1793    
1794     #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\
1795     DEFINE_KSPROPERTY_ITEM(\
1796     KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\
1797     (Handler),\
1798     sizeof(KSPROPERTY),\
1799     sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\
1800     NULL, NULL, 0, NULL, NULL, 0)
1801    
1802     #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\
1803     DEFINE_KSPROPERTY_ITEM(\
1804     KSPROPERTY_STREAMALLOCATOR_STATUS,\
1805     (Handler),\
1806     sizeof(KSPROPERTY),\
1807     sizeof(KSSTREAMALLOCATOR_STATUS),\
1808     NULL, NULL, 0, NULL, NULL, 0)
1809    
1810     #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\
1811     DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\
1812     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\
1813     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
1814     }
1815    
1816     typedef
1817     NTSTATUS
1818     (*PFNALLOCATOR_ALLOCATEFRAME)(
1819     IN PFILE_OBJECT FileObject,
1820     PVOID *Frame
1821     );
1822    
1823     typedef
1824     VOID
1825     (*PFNALLOCATOR_FREEFRAME)(
1826     IN PFILE_OBJECT FileObject,
1827     IN PVOID Frame
1828     );
1829    
1830     typedef struct {
1831     PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
1832     PFNALLOCATOR_FREEFRAME FreeFrame;
1833     } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
1834     #endif // defined(_NTDDK_)
1835    
1836     typedef struct {
1837     KSALLOCATOR_FRAMING Framing;
1838     ULONG AllocatedFrames;
1839     ULONG Reserved;
1840     } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
1841    
1842     typedef struct {
1843     KSALLOCATOR_FRAMING_EX Framing;
1844     ULONG AllocatedFrames;
1845     ULONG Reserved;
1846     } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
1847    
1848    
1849     #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001
1850     #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002
1851     #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004
1852     #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008
1853     #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010
1854     #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040
1855     #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080
1856     #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100
1857     #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200
1858     #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000
1859    
1860     typedef struct {
1861     LONGLONG Time;
1862     ULONG Numerator;
1863     ULONG Denominator;
1864     } KSTIME, *PKSTIME;
1865    
1866     typedef struct {
1867     ULONG Size;
1868     ULONG TypeSpecificFlags;
1869     KSTIME PresentationTime;
1870     LONGLONG Duration;
1871     ULONG FrameExtent;
1872     ULONG DataUsed;
1873     PVOID Data;
1874     ULONG OptionsFlags;
1875     #if _WIN64
1876     ULONG Reserved;
1877     #endif
1878     } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
1879    
1880     #define STATIC_KSPROPSETID_StreamInterface\
1881     0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
1882     DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface);
1883     #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
1884    
1885     typedef enum {
1886     KSPROPERTY_STREAMINTERFACE_HEADERSIZE
1887     } KSPROPERTY_STREAMINTERFACE;
1888    
1889     #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\
1890     DEFINE_KSPROPERTY_ITEM(\
1891     KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\
1892     (GetHandler),\
1893     sizeof(KSPROPERTY),\
1894     sizeof(ULONG),\
1895     NULL, NULL, 0, NULL, NULL, 0)
1896    
1897     #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\
1898     HeaderSizeHandler)\
1899     DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\
1900     DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\
1901     }
1902    
1903     #define STATIC_KSPROPSETID_Stream\
1904     0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
1905     DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
1906     #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
1907    
1908     typedef enum {
1909     KSPROPERTY_STREAM_ALLOCATOR,
1910     KSPROPERTY_STREAM_QUALITY,
1911     KSPROPERTY_STREAM_DEGRADATION,
1912     KSPROPERTY_STREAM_MASTERCLOCK,
1913     KSPROPERTY_STREAM_TIMEFORMAT,
1914     KSPROPERTY_STREAM_PRESENTATIONTIME,
1915     KSPROPERTY_STREAM_PRESENTATIONEXTENT,
1916     KSPROPERTY_STREAM_FRAMETIME,
1917     KSPROPERTY_STREAM_RATECAPABILITY,
1918     KSPROPERTY_STREAM_RATE,
1919     KSPROPERTY_STREAM_PIPE_ID
1920     } KSPROPERTY_STREAM;
1921    
1922     #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
1923     DEFINE_KSPROPERTY_ITEM(\
1924     KSPROPERTY_STREAM_ALLOCATOR,\
1925     (GetHandler),\
1926     sizeof(KSPROPERTY),\
1927     sizeof(HANDLE),\
1928     (SetHandler),\
1929     NULL, 0, NULL, NULL, 0)
1930    
1931     #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
1932     DEFINE_KSPROPERTY_ITEM(\
1933     KSPROPERTY_STREAM_QUALITY,\
1934     (Handler),\
1935     sizeof(KSPROPERTY),\
1936     sizeof(KSQUALITY_MANAGER),\
1937     NULL, NULL, 0, NULL, NULL, 0)
1938    
1939     #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
1940     DEFINE_KSPROPERTY_ITEM(\
1941     KSPROPERTY_STREAM_DEGRADATION,\
1942     (GetHandler),\
1943     sizeof(KSPROPERTY),\
1944     0,\
1945     (SetHandler),\
1946     NULL, 0, NULL, NULL, 0)
1947    
1948     #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
1949     DEFINE_KSPROPERTY_ITEM(\
1950     KSPROPERTY_STREAM_MASTERCLOCK,\
1951     (GetHandler),\
1952     sizeof(KSPROPERTY),\
1953     sizeof(HANDLE),\
1954     (SetHandler),\
1955     NULL, 0, NULL, NULL, 0)
1956    
1957     #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
1958     DEFINE_KSPROPERTY_ITEM(\
1959     KSPROPERTY_STREAM_TIMEFORMAT,\
1960     (Handler),\
1961     sizeof(KSPROPERTY),\
1962     sizeof(GUID),\
1963     NULL, NULL, 0, NULL, NULL, 0)
1964    
1965     #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
1966     DEFINE_KSPROPERTY_ITEM(\
1967     KSPROPERTY_STREAM_PRESENTATIONTIME,\
1968     (GetHandler),\
1969     sizeof(KSPROPERTY),\
1970     sizeof(KSTIME),\
1971     (SetHandler),\
1972     NULL, 0, NULL, NULL, 0)
1973    
1974     #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
1975     DEFINE_KSPROPERTY_ITEM(\
1976     KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
1977     (Handler),\
1978     sizeof(KSPROPERTY),\
1979     sizeof(LONGLONG),\
1980     NULL, NULL, 0, NULL, NULL, 0)
1981    
1982     #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
1983     DEFINE_KSPROPERTY_ITEM(\
1984     KSPROPERTY_STREAM_FRAMETIME,\
1985     (Handler),\
1986     sizeof(KSPROPERTY),\
1987     sizeof(KSFRAMETIME),\
1988     NULL, NULL, 0, NULL, NULL, 0)
1989    
1990     #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
1991     DEFINE_KSPROPERTY_ITEM(\
1992     KSPROPERTY_STREAM_RATECAPABILITY,\
1993     (Handler),\
1994     sizeof(KSRATE_CAPABILITY),\
1995     sizeof(KSRATE),\
1996     NULL, NULL, 0, NULL, NULL, 0)
1997    
1998     #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
1999     DEFINE_KSPROPERTY_ITEM(\
2000     KSPROPERTY_STREAM_RATE,\
2001     (GetHandler),\
2002     sizeof(KSPROPERTY),\
2003     sizeof(KSRATE),\
2004     (SetHandler),\
2005     NULL, 0, NULL, NULL, 0)
2006    
2007     #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
2008     DEFINE_KSPROPERTY_ITEM(\
2009     KSPROPERTY_STREAM_PIPE_ID,\
2010     (GetHandler),\
2011     sizeof(KSPROPERTY),\
2012     sizeof(HANDLE),\
2013     (SetHandler),\
2014     NULL, 0, NULL, NULL, 0)
2015    
2016     typedef struct {
2017     HANDLE QualityManager;
2018     PVOID Context;
2019     } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
2020    
2021     typedef struct {
2022     LONGLONG Duration;
2023     ULONG FrameFlags;
2024     ULONG Reserved;
2025     } KSFRAMETIME, *PKSFRAMETIME;
2026    
2027     #define KSFRAMETIME_VARIABLESIZE 0x00000001
2028    
2029     typedef struct {
2030     LONGLONG PresentationStart;
2031     LONGLONG Duration;
2032     KSPIN_INTERFACE Interface;
2033     LONG Rate;
2034     ULONG Flags;
2035     } KSRATE, *PKSRATE;
2036    
2037     #define KSRATE_NOPRESENTATIONSTART 0x00000001
2038     #define KSRATE_NOPRESENTATIONDURATION 0x00000002
2039    
2040     typedef struct {
2041     KSPROPERTY Property;
2042     KSRATE Rate;
2043     } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
2044    
2045     #define STATIC_KSPROPSETID_Clock \
2046     0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
2047     DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
2048     #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
2049    
2050     //
2051     // Performs a x*y/z operation on 64 bit quantities by splitting the operation. The equation
2052     // is simplified with respect to adding in the remainder for the upper 32 bits.
2053     //
2054     // (xh * 10000000 / Frequency) * 2^32 + ((((xh * 10000000) % Frequency) * 2^32 + (xl * 10000000)) / Frequency)
2055     //
2056     #define NANOSECONDS 10000000
2057     #define KSCONVERT_PERFORMANCE_TIME(Frequency, PerformanceTime) \
2058     ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS / (Frequency)) << 32) + \
2059     ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS) % (Frequency)) << 32) + \
2060     ((ULONGLONG)(PerformanceTime).LowPart * NANOSECONDS)) / (Frequency)))
2061    
2062     typedef struct {
2063     ULONG CreateFlags;
2064     } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
2065    
2066     typedef struct {
2067     LONGLONG Time;
2068     LONGLONG SystemTime;
2069     } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
2070    
2071     typedef struct {
2072     LONGLONG Granularity;
2073     LONGLONG Error;
2074     } KSRESOLUTION, *PKSRESOLUTION;
2075    
2076     typedef enum {
2077     KSPROPERTY_CLOCK_TIME,
2078     KSPROPERTY_CLOCK_PHYSICALTIME,
2079     KSPROPERTY_CLOCK_CORRELATEDTIME,
2080     KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
2081     KSPROPERTY_CLOCK_RESOLUTION,
2082     KSPROPERTY_CLOCK_STATE,
2083     #if defined(_NTDDK_)
2084     KSPROPERTY_CLOCK_FUNCTIONTABLE
2085     #endif // defined(_NTDDK_)
2086     } KSPROPERTY_CLOCK;
2087    
2088     #if defined(_NTDDK_)
2089    
2090     typedef
2091     LONGLONG
2092     (FASTCALL *PFNKSCLOCK_GETTIME)(
2093     IN PFILE_OBJECT FileObject
2094     );
2095     typedef
2096     LONGLONG
2097     (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
2098     IN PFILE_OBJECT FileObject,
2099     OUT PLONGLONG SystemTime);
2100    
2101     typedef struct {
2102     PFNKSCLOCK_GETTIME GetTime;
2103     PFNKSCLOCK_GETTIME GetPhysicalTime;
2104     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
2105     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
2106     } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
2107    
2108     typedef
2109     BOOLEAN
2110     (*PFNKSSETTIMER)(
2111     IN PVOID Context,
2112     IN PKTIMER Timer,
2113     IN LARGE_INTEGER DueTime,
2114     IN PKDPC Dpc
2115     );
2116    
2117     typedef
2118     BOOLEAN
2119     (*PFNKSCANCELTIMER)(
2120     IN PVOID Context,
2121     IN PKTIMER Timer
2122     );
2123    
2124     typedef
2125     LONGLONG
2126     (FASTCALL *PFNKSCORRELATEDTIME)(
2127     IN PVOID Context,
2128     OUT PLONGLONG SystemTime);
2129    
2130     typedef PVOID PKSDEFAULTCLOCK;
2131    
2132     #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
2133     DEFINE_KSPROPERTY_ITEM(\
2134     KSPROPERTY_CLOCK_TIME,\
2135     (Handler),\
2136     sizeof(KSPROPERTY),\
2137     sizeof(LONGLONG),\
2138     NULL, NULL, 0, NULL, NULL, 0)
2139    
2140     #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
2141     DEFINE_KSPROPERTY_ITEM(\
2142     KSPROPERTY_CLOCK_PHYSICALTIME,\
2143     (Handler),\
2144     sizeof(KSPROPERTY),\
2145     sizeof(LONGLONG),\
2146     NULL, NULL, 0, NULL, NULL, 0)
2147    
2148     #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
2149     DEFINE_KSPROPERTY_ITEM(\
2150     KSPROPERTY_CLOCK_CORRELATEDTIME,\
2151     (Handler),\
2152     sizeof(KSPROPERTY),\
2153     sizeof(KSCORRELATED_TIME),\
2154     NULL, NULL, 0, NULL, NULL, 0)
2155    
2156     #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
2157     DEFINE_KSPROPERTY_ITEM(\
2158     KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
2159     (Handler),\
2160     sizeof(KSPROPERTY),\
2161     sizeof(KSCORRELATED_TIME),\
2162     NULL, NULL, 0, NULL, NULL, 0)
2163    
2164     #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
2165     DEFINE_KSPROPERTY_ITEM(\
2166     KSPROPERTY_CLOCK_RESOLUTION,\
2167     (Handler),\
2168     sizeof(KSPROPERTY),\
2169     sizeof(KSRESOLUTION),\
2170     NULL, NULL, 0, NULL, NULL, 0)
2171    
2172     #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
2173     DEFINE_KSPROPERTY_ITEM(\
2174     KSPROPERTY_CLOCK_STATE,\
2175     (Handler),\
2176     sizeof(KSPROPERTY),\
2177     sizeof(KSSTATE),\
2178     NULL, NULL, 0, NULL, NULL, 0)
2179    
2180     #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
2181     DEFINE_KSPROPERTY_ITEM(\
2182     KSPROPERTY_CLOCK_FUNCTIONTABLE,\
2183     (Handler),\
2184     sizeof(KSPROPERTY),\
2185     sizeof(KSCLOCK_FUNCTIONTABLE),\
2186     NULL, NULL, 0, NULL, NULL, 0)
2187    
2188     #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
2189     PropTime, PropPhysicalTime,\
2190     PropCorrelatedTime, PropCorrelatedPhysicalTime,\
2191     PropResolution, PropState, PropFunctionTable)\
2192     DEFINE_KSPROPERTY_TABLE(ClockSet) {\
2193     DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
2194     DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
2195     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
2196     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
2197     DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
2198     DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
2199     DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\
2200     }
2201    
2202     #endif // defined(_NTDDK_)
2203    
2204     #define STATIC_KSEVENTSETID_Clock \
2205     0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
2206     DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
2207     #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
2208    
2209     typedef enum {
2210     KSEVENT_CLOCK_INTERVAL_MARK,
2211     KSEVENT_CLOCK_POSITION_MARK
2212     } KSEVENT_CLOCK_POSITION;
2213    
2214     #define STATIC_KSEVENTSETID_Connection\
2215     0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
2216     DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
2217     #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
2218    
2219     typedef enum {
2220     KSEVENT_CONNECTION_POSITIONUPDATE,
2221     KSEVENT_CONNECTION_DATADISCONTINUITY,
2222     KSEVENT_CONNECTION_TIMEDISCONTINUITY,
2223     KSEVENT_CONNECTION_PRIORITY,
2224     KSEVENT_CONNECTION_ENDOFSTREAM
2225     } KSEVENT_CONNECTION;
2226    
2227     typedef struct {
2228     PVOID Context;
2229     ULONG Proportion;
2230     LONGLONG DeltaTime;
2231     } KSQUALITY, *PKSQUALITY;
2232    
2233     typedef struct {
2234     PVOID Context;
2235     ULONG Status;
2236     } KSERROR, *PKSERROR;
2237    
2238     typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
2239    
2240     #define STATIC_KSDEGRADESETID_Standard\
2241     0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
2242     DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard);
2243     #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
2244    
2245     typedef enum {
2246     KSDEGRADE_STANDARD_SAMPLE,
2247     KSDEGRADE_STANDARD_QUALITY,
2248     KSDEGRADE_STANDARD_COMPUTATION,
2249     KSDEGRADE_STANDARD_SKIP
2250     } KSDEGRADE_STANDARD;
2251    
2252     #if defined(_NTDDK_)
2253    
2254     #define KSPROBE_STREAMREAD 0x00000000
2255     #define KSPROBE_STREAMWRITE 0x00000001
2256     #define KSPROBE_ALLOCATEMDL 0x00000010
2257     #define KSPROBE_PROBEANDLOCK 0x00000020
2258     #define KSPROBE_SYSTEMADDRESS 0x00000040
2259     #define KSPROBE_MODIFY 0x00000200
2260     #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
2261     #define KSPROBE_ALLOWFORMATCHANGE 0x00000080
2262    
2263     #define KSSTREAM_READ KSPROBE_STREAMREAD
2264     #define KSSTREAM_WRITE KSPROBE_STREAMWRITE
2265     #define KSSTREAM_PAGED_DATA 0x00000000
2266     #define KSSTREAM_NONPAGED_DATA 0x00000100
2267     #define KSSTREAM_SYNCHRONOUS 0x00001000
2268     #define KSSTREAM_FAILUREEXCEPTION 0x00002000
2269    
2270     typedef
2271     NTSTATUS
2272     (*PFNKSCONTEXT_DISPATCH)(
2273     IN PVOID Context,
2274     IN PIRP Irp
2275     );
2276    
2277     typedef
2278     NTSTATUS
2279     (*PFNKSHANDLER)(
2280     IN PIRP Irp,
2281     IN PKSIDENTIFIER Request,
2282     IN OUT PVOID Data
2283     );
2284    
2285     typedef
2286     BOOLEAN
2287     (*PFNKSFASTHANDLER)(
2288     IN PFILE_OBJECT FileObject,
2289     IN PKSIDENTIFIER UNALIGNED Request,
2290     IN ULONG RequestLength,
2291     IN OUT PVOID UNALIGNED Data,
2292     IN ULONG DataLength,
2293     OUT PIO_STATUS_BLOCK IoStatus
2294     );
2295    
2296     typedef
2297     NTSTATUS
2298     (*PFNKSALLOCATOR)(
2299     IN PIRP Irp,
2300     IN ULONG BufferSize,
2301     IN BOOLEAN InputOperation
2302     );
2303    
2304     typedef struct {
2305     KSPROPERTY_MEMBERSHEADER MembersHeader;
2306     const VOID* Members;
2307     } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
2308    
2309     typedef struct {
2310     KSIDENTIFIER PropTypeSet;
2311     ULONG MembersListCount;
2312     const KSPROPERTY_MEMBERSLIST* MembersList;
2313     } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
2314    
2315     #define DEFINE_KSPROPERTY_TABLE(tablename)\
2316     const KSPROPERTY_ITEM tablename[] =
2317    
2318     #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
2319     MinProperty,\
2320     MinData,\
2321     SetHandler,\
2322     Values, RelationsCount, Relations, SupportHandler,\
2323     SerializedSize)\
2324     {\
2325     PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
2326     (PFNKSHANDLER)SetHandler,\
2327     (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
2328     (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
2329     }
2330    
2331     typedef struct {
2332     ULONG PropertyId;
2333     union {
2334     PFNKSHANDLER GetPropertyHandler;
2335     BOOLEAN GetSupported;
2336     };
2337     ULONG MinProperty;
2338     ULONG MinData;
2339     union {
2340     PFNKSHANDLER SetPropertyHandler;
2341     BOOLEAN SetSupported;
2342     };
2343     const KSPROPERTY_VALUES*Values;
2344     ULONG RelationsCount;
2345     const KSPROPERTY* Relations;
2346     PFNKSHANDLER SupportHandler;
2347     ULONG SerializedSize;
2348     } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
2349    
2350     #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\
2351     {\
2352     PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\
2353     }
2354    
2355     typedef struct {
2356     ULONG PropertyId;
2357     union {
2358     PFNKSFASTHANDLER GetPropertyHandler;
2359     BOOLEAN GetSupported;
2360     };
2361     union {
2362     PFNKSFASTHANDLER SetPropertyHandler;
2363     BOOLEAN SetSupported;
2364     };
2365     ULONG Reserved;
2366     } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
2367    
2368     #define DEFINE_KSPROPERTY_SET(Set,\
2369     PropertiesCount,\
2370     PropertyItem,\
2371     FastIoCount,\
2372     FastIoTable)\
2373     {\
2374     Set,\
2375     PropertiesCount,\
2376     PropertyItem,\
2377     FastIoCount,\
2378     FastIoTable\
2379     }
2380    
2381     #define DEFINE_KSPROPERTY_SET_TABLE(tablename)\
2382     const KSPROPERTY_SET tablename[] =
2383    
2384     typedef struct {
2385     const GUID* Set;
2386     ULONG PropertiesCount;
2387     const KSPROPERTY_ITEM* PropertyItem;
2388     ULONG FastIoCount;
2389     const KSFASTPROPERTY_ITEM* FastIoTable;
2390     } KSPROPERTY_SET, *PKSPROPERTY_SET;
2391    
2392     #define DEFINE_KSMETHOD_TABLE(tablename)\
2393     const KSMETHOD_ITEM tablename[] =
2394    
2395     #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
2396     MethodHandler,\
2397     MinMethod, MinData, SupportHandler)\
2398     {\
2399     MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
2400     SupportHandler, Flags\
2401     }
2402    
2403     typedef struct {
2404     ULONG MethodId;
2405     union {
2406     PFNKSHANDLER MethodHandler;
2407     BOOLEAN MethodSupported;
2408     };
2409     ULONG MinMethod;
2410     ULONG MinData;
2411     PFNKSHANDLER SupportHandler;
2412     ULONG Flags;
2413     } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
2414    
2415     #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
2416     {\
2417     MethodId, (PFNKSFASTHANDLER)MethodHandler\
2418     }
2419    
2420     typedef struct {
2421     ULONG MethodId;
2422     union {
2423     PFNKSFASTHANDLER MethodHandler;
2424     BOOLEAN MethodSupported;
2425     };
2426     } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
2427    
2428     #define DEFINE_KSMETHOD_SET(Set,\
2429     MethodsCount,\
2430     MethodItem,\
2431     FastIoCount,\
2432     FastIoTable)\
2433     {\
2434     Set,\
2435     MethodsCount,\
2436     MethodItem,\
2437     FastIoCount,\
2438     FastIoTable\
2439     }
2440    
2441     #define DEFINE_KSMETHOD_SET_TABLE(tablename)\
2442     const KSMETHOD_SET tablename[] =
2443    
2444     typedef struct {
2445     const GUID* Set;
2446     ULONG MethodsCount;
2447     const KSMETHOD_ITEM* MethodItem;
2448     ULONG FastIoCount;
2449     const KSFASTMETHOD_ITEM*FastIoTable;
2450     } KSMETHOD_SET, *PKSMETHOD_SET;
2451    
2452     typedef struct _KSEVENT_ENTRY
2453     KSEVENT_ENTRY, *PKSEVENT_ENTRY;
2454    
2455     typedef
2456     NTSTATUS
2457     (*PFNKSADDEVENT)(
2458     IN PIRP Irp,
2459     IN PKSEVENTDATA EventData,
2460     IN struct _KSEVENT_ENTRY* EventEntry
2461     );
2462    
2463     typedef
2464     VOID
2465     (*PFNKSREMOVEEVENT)(
2466     IN PFILE_OBJECT FileObject,
2467     IN struct _KSEVENT_ENTRY* EventEntry
2468     );
2469    
2470     #define DEFINE_KSEVENT_TABLE(tablename)\
2471     const KSEVENT_ITEM tablename[] =
2472    
2473     #define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\
2474     AddHandler, RemoveHandler, SupportHandler)\
2475     {\
2476     EventId,\
2477     DataInput,\
2478     ExtraEntryData,\
2479     AddHandler,\
2480     RemoveHandler,\
2481     SupportHandler\
2482     }
2483    
2484     typedef struct {
2485     ULONG EventId;
2486     ULONG DataInput;
2487     ULONG ExtraEntryData;
2488     PFNKSADDEVENT AddHandler;
2489     PFNKSREMOVEEVENT RemoveHandler;
2490     PFNKSHANDLER SupportHandler;
2491     } KSEVENT_ITEM, *PKSEVENT_ITEM;
2492    
2493     #define DEFINE_KSEVENT_SET(Set,\
2494     EventsCount,\
2495     EventItem)\
2496     {\
2497     Set, EventsCount, EventItem\
2498     }
2499    
2500     #define DEFINE_KSEVENT_SET_TABLE(tablename)\
2501     const KSEVENT_SET tablename[] =
2502    
2503     typedef struct {
2504     const GUID* Set;
2505     ULONG EventsCount;
2506     const KSEVENT_ITEM* EventItem;
2507     } KSEVENT_SET, *PKSEVENT_SET;
2508    
2509     typedef struct {
2510     KDPC Dpc;
2511     ULONG ReferenceCount;
2512     KSPIN_LOCK AccessLock;
2513     } KSDPC_ITEM, *PKSDPC_ITEM;
2514    
2515     typedef struct {
2516     KSDPC_ITEM DpcItem;
2517     LIST_ENTRY BufferList;
2518     } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
2519    
2520     #define KSEVENT_ENTRY_DELETED 1
2521     #define KSEVENT_ENTRY_ONESHOT 2
2522     #define KSEVENT_ENTRY_BUFFERED 4
2523    
2524     struct _KSEVENT_ENTRY {
2525     LIST_ENTRY ListEntry;
2526     PVOID Object;
2527     union {
2528     PKSDPC_ITEM DpcItem;
2529     PKSBUFFER_ITEM BufferItem;
2530     };
2531     PKSEVENTDATA EventData;
2532     ULONG NotificationType;
2533     const KSEVENT_SET* EventSet;
2534     const KSEVENT_ITEM* EventItem;
2535     PFILE_OBJECT FileObject;
2536     ULONG SemaphoreAdjustment;
2537     ULONG Reserved;
2538     ULONG Flags;
2539     };
2540    
2541     typedef enum {
2542     KSEVENTS_NONE,
2543     KSEVENTS_SPINLOCK,
2544     KSEVENTS_MUTEX,
2545     KSEVENTS_FMUTEX,
2546     KSEVENTS_FMUTEXUNSAFE,
2547     KSEVENTS_INTERRUPT,
2548     KSEVENTS_ERESOURCE
2549     } KSEVENTS_LOCKTYPE;
2550    
2551     #define KSDISPATCH_FASTIO 0x80000000
2552    
2553     typedef struct {
2554     PDRIVER_DISPATCH Create;
2555     PVOID Context;
2556     UNICODE_STRING ObjectClass;
2557     PSECURITY_DESCRIPTOR SecurityDescriptor;
2558     ULONG Flags;
2559     } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
2560    
2561     typedef
2562     VOID
2563     (*PFNKSITEMFREECALLBACK)(
2564     IN PKSOBJECT_CREATE_ITEM CreateItem
2565     );
2566    
2567     #define KSCREATE_ITEM_SECURITYCHANGED 0x00000001
2568     #define KSCREATE_ITEM_WILDCARD 0x00000002
2569     #define KSCREATE_ITEM_NOPARAMETERS 0x00000004
2570     #define KSCREATE_ITEM_FREEONSTOP 0x00000008
2571    
2572     #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\
2573     KSOBJECT_CREATE_ITEM tablename[] =
2574    
2575     #define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\
2576     {\
2577     (DispatchCreate),\
2578     (PVOID)(Context),\
2579     {\
2580     sizeof(TypeName) - sizeof(UNICODE_NULL),\
2581     sizeof(TypeName),\
2582     (PWCHAR)(TypeName)\
2583     },\
2584     NULL, 0\
2585     }
2586    
2587     #define DEFINE_KSCREATE_ITEMEX(DispatchCreate, TypeName, Context, Flags)\
2588     {\
2589     (DispatchCreate),\
2590     (PVOID)(Context),\
2591     {\
2592     sizeof(TypeName) - sizeof(UNICODE_NULL),\
2593     sizeof(TypeName),\
2594     (PWCHAR)(TypeName)\
2595     },\
2596     NULL, (Flags)\
2597     }
2598    
2599     #define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\
2600     {\
2601     DispatchCreate,\
2602     Context,\
2603     {\
2604     0,\
2605     0,\
2606     NULL,\
2607     },\
2608     NULL, 0\
2609     }
2610    
2611     typedef struct {
2612     ULONG CreateItemsCount;
2613     PKSOBJECT_CREATE_ITEM CreateItemsList;
2614     } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
2615    
2616     typedef struct {
2617     PDRIVER_DISPATCH DeviceIoControl;
2618     PDRIVER_DISPATCH Read;
2619     PDRIVER_DISPATCH Write;
2620     PDRIVER_DISPATCH Flush;
2621     PDRIVER_DISPATCH Close;
2622     PDRIVER_DISPATCH QuerySecurity;
2623     PDRIVER_DISPATCH SetSecurity;
2624     PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
2625     PFAST_IO_READ FastRead;
2626     PFAST_IO_WRITE FastWrite;
2627     } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
2628    
2629     #define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\
2630     Flush, Close, QuerySecurity, SetSecurity,\
2631     FastDeviceIoControl, FastRead, FastWrite )\
2632     const KSDISPATCH_TABLE tablename = \
2633     {\
2634     DeviceIoControl, \
2635     Read, \
2636     Write, \
2637     Flush, \
2638     Close, \
2639     QuerySecurity, \
2640     SetSecurity, \
2641     FastDeviceIoControl, \
2642     FastRead, \
2643     FastWrite, \
2644     }
2645    
2646     #define KSCREATE_ITEM_IRP_STORAGE(Irp) ((PKSOBJECT_CREATE_ITEM)(Irp)->Tail.Overlay.DriverContext[0])
2647     #define KSEVENT_SET_IRP_STORAGE(Irp) ((const KSEVENT_SET*)(Irp)->Tail.Overlay.DriverContext[0])
2648     #define KSEVENT_ITEM_IRP_STORAGE(Irp) ((const KSEVENT_ITEM*)(Irp)->Tail.Overlay.DriverContext[3])
2649     #define KSEVENT_ENTRY_IRP_STORAGE(Irp) ((PKSEVENT_ENTRY)(Irp)->Tail.Overlay.DriverContext[0])
2650     #define KSMETHOD_SET_IRP_STORAGE(Irp) ((const KSMETHOD_SET*)(Irp)->Tail.Overlay.DriverContext[0])
2651     #define KSMETHOD_ITEM_IRP_STORAGE(Irp) ((const KSMETHOD_ITEM*)(Irp)->Tail.Overlay.DriverContext[3])
2652     #define KSMETHOD_TYPE_IRP_STORAGE(Irp) ((ULONG_PTR)((Irp)->Tail.Overlay.DriverContext[2]))
2653     #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) ((PKSPIN_LOCK)(Irp)->Tail.Overlay.DriverContext[1])
2654     #define KSPROPERTY_SET_IRP_STORAGE(Irp) ((const KSPROPERTY_SET*)(Irp)->Tail.Overlay.DriverContext[0])
2655     #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) ((const KSPROPERTY_ITEM*)(Irp)->Tail.Overlay.DriverContext[3])
2656     #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) ((PKSATTRIBUTE_LIST)(Irp)->Tail.Overlay.DriverContext[2])
2657    
2658     typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER;
2659    
2660     typedef enum {
2661     KsInvokeOnSuccess = 1,
2662     KsInvokeOnError = 2,
2663     KsInvokeOnCancel = 4
2664     } KSCOMPLETION_INVOCATION;
2665    
2666     typedef enum {
2667     KsListEntryTail,
2668     KsListEntryHead
2669     } KSLIST_ENTRY_LOCATION;
2670    
2671     typedef enum {
2672     KsAcquireOnly,
2673     KsAcquireAndRemove,
2674     KsAcquireOnlySingleItem,
2675     KsAcquireAndRemoveOnlySingleItem
2676     } KSIRP_REMOVAL_OPERATION;
2677    
2678     typedef enum {
2679     KsStackCopyToNewLocation,
2680     KsStackReuseCurrentLocation,
2681     KsStackUseNewLocation
2682     } KSSTACK_USE;
2683    
2684     typedef enum {
2685     KSTARGET_STATE_DISABLED,
2686     KSTARGET_STATE_ENABLED
2687     } KSTARGET_STATE;
2688    
2689     typedef
2690     NTSTATUS
2691     (*PFNKSIRPLISTCALLBACK)(
2692     IN PIRP Irp,
2693     IN PVOID Context
2694     );
2695    
2696     typedef
2697     VOID
2698     (*PFNREFERENCEDEVICEOBJECT)(
2699     IN PVOID Context
2700     );
2701    
2702     typedef
2703     VOID
2704     (*PFNDEREFERENCEDEVICEOBJECT)(
2705     IN PVOID Context
2706     );
2707    
2708     typedef
2709     NTSTATUS
2710     (*PFNQUERYREFERENCESTRING)(
2711     IN PVOID Context,
2712     IN OUT PWCHAR *String
2713     );
2714    
2715     #define BUS_INTERFACE_REFERENCE_VERSION 0x100
2716    
2717     typedef struct {
2718     //
2719     // Standard interface header
2720     //
2721    
2722     INTERFACE Interface;
2723    
2724     //
2725     // Standard bus interfaces
2726     //
2727    
2728     PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject;
2729     PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject;
2730     PFNQUERYREFERENCESTRING QueryReferenceString;
2731    
2732     } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
2733    
2734     #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard
2735     #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard
2736    
2737     typedef
2738     NTSTATUS
2739     (*PFNQUERYMEDIUMSLIST)(
2740     IN PVOID Context,
2741     OUT ULONG* MediumsCount,
2742     OUT PKSPIN_MEDIUM* MediumList
2743     );
2744    
2745     typedef struct {
2746     //
2747     // Standard interface header
2748     //
2749    
2750     INTERFACE Interface;
2751    
2752     //
2753     // Interface definition
2754     //
2755    
2756     PFNQUERYMEDIUMSLIST QueryMediumsList;
2757    
2758     } BUS_INTERFACE_MEDIUMS, *PBUS_INTERFACE_MEDIUMS;
2759    
2760     #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \
2761     0x4EC35C3EL, 0x201B, 0x11D2, 0x87, 0x45, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
2762     DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS);
2763     #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS)
2764    
2765     #endif // defined(_NTDDK_)
2766    
2767     #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
2768     #include <pshpack1.h>
2769     #endif
2770    
2771     typedef struct {
2772     GUID PropertySet;
2773     ULONG Count;
2774     } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
2775    
2776     #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
2777     #include <poppack.h>
2778     #endif
2779    
2780     typedef struct {
2781     KSIDENTIFIER PropTypeSet;
2782     ULONG Id;
2783     ULONG PropertyLength;
2784     } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
2785    
2786     #if defined(_NTDDK_)
2787    
2788     #define IOCTL_KS_HANDSHAKE CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
2789    
2790     typedef struct {
2791     GUID ProtocolId;
2792     PVOID Argument1;
2793     PVOID Argument2;
2794     } KSHANDSHAKE, *PKSHANDSHAKE;
2795    
2796     typedef struct _KSGATE
2797     KSGATE, *PKSGATE;
2798    
2799     struct _KSGATE {
2800     LONG Count;
2801     PKSGATE NextGate;
2802     };
2803    
2804     #ifndef _NTOS_
2805    
2806     void __inline
2807     KsGateTurnInputOn(
2808     IN PKSGATE Gate OPTIONAL
2809     )
2810     {
2811     while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) {
2812     Gate = Gate->NextGate;
2813     }
2814     }
2815    
2816     void __inline
2817     KsGateTurnInputOff(
2818     IN PKSGATE Gate OPTIONAL
2819     )
2820     {
2821     while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) {
2822     Gate = Gate->NextGate;
2823     }
2824     }
2825    
2826     BOOLEAN __inline
2827     KsGateGetStateUnsafe(
2828     IN PKSGATE Gate
2829     )
2830     {
2831     ASSERT(Gate);
2832     return Gate->Count > 0;
2833     }
2834    
2835     BOOLEAN __inline
2836     KsGateCaptureThreshold(
2837     IN PKSGATE Gate
2838     )
2839     {
2840     BOOLEAN captured;
2841    
2842     ASSERT(Gate);
2843    
2844     captured = (InterlockedCompareExchange(&Gate->Count,0,1) == 1);
2845    
2846     //
2847     // If we made a transition, it must be propagated.
2848     //
2849     if (captured) {
2850     KsGateTurnInputOff(Gate->NextGate);
2851     }
2852    
2853     //
2854     // We return whatever the state was prior to the compare/exchange. If
2855     // the state was on, the state is now off.
2856     //
2857     return captured;
2858     }
2859    
2860     void __inline
2861     KsGateInitialize(
2862     IN PKSGATE Gate,
2863     IN LONG InitialCount,
2864     IN PKSGATE NextGate OPTIONAL,
2865     IN BOOLEAN StateToPropagate // IN BOOLEAN NextGateIsAnOrGate
2866     )
2867     {
2868     ASSERT(Gate);
2869     Gate->Count = InitialCount;
2870     Gate->NextGate = NextGate;
2871    
2872     if (NextGate) {
2873     if (InitialCount > 0) {
2874     if (StateToPropagate) {
2875     KsGateTurnInputOn(NextGate);
2876     }
2877     } else {
2878     if (! StateToPropagate) {
2879     KsGateTurnInputOff(NextGate);
2880     }
2881     }
2882     }
2883     }
2884    
2885     void __inline
2886     KsGateInitializeAnd(
2887     IN PKSGATE AndGate,
2888     IN PKSGATE NextOrGate OPTIONAL
2889     )
2890     {
2891     KsGateInitialize(AndGate,1,NextOrGate,TRUE);
2892     }
2893    
2894     void __inline
2895     KsGateInitializeOr(
2896     IN PKSGATE OrGate,
2897     IN PKSGATE NextAndGate OPTIONAL
2898     )
2899     {
2900     KsGateInitialize(OrGate,0,NextAndGate,FALSE);
2901     }
2902    
2903     void __inline KsGateAddOnInputToAnd(IN PKSGATE AndGate) {}
2904     void __inline KsGateAddOffInputToAnd(IN PKSGATE AndGate) { KsGateTurnInputOff(AndGate); }
2905     void __inline KsGateRemoveOnInputFromAnd(IN PKSGATE AndGate) {}
2906     void __inline KsGateRemoveOffInputFromAnd(IN PKSGATE AndGate) { KsGateTurnInputOn(AndGate); }
2907    
2908     void __inline KsGateAddOnInputToOr(IN PKSGATE OrGate) { KsGateTurnInputOn(OrGate); }
2909     void __inline KsGateAddOffInputToOr(IN PKSGATE OrGate) {}
2910     void __inline KsGateRemoveOnInputFromOr(IN PKSGATE OrGate) { KsGateTurnInputOff(OrGate); }
2911     void __inline KsGateRemoveOffInputFromOr(IN PKSGATE OrGate) {}
2912    
2913     void __inline
2914     KsGateTerminateAnd(
2915     IN PKSGATE AndGate
2916     )
2917     {
2918     ASSERT(AndGate);
2919     if (KsGateGetStateUnsafe(AndGate)) {
2920     KsGateRemoveOnInputFromOr(AndGate->NextGate);
2921     } else {
2922     KsGateRemoveOffInputFromOr(AndGate->NextGate);
2923     }
2924     }
2925    
2926     void __inline
2927     KsGateTerminateOr(
2928     IN PKSGATE OrGate
2929     )
2930     {
2931     ASSERT(OrGate);
2932     if (KsGateGetStateUnsafe(OrGate)) {
2933     KsGateRemoveOnInputFromAnd(OrGate->NextGate);
2934     } else {
2935     KsGateRemoveOffInputFromAnd(OrGate->NextGate);
2936     }
2937     }
2938    
2939     #endif // !_NTOS_
2940    
2941     typedef PVOID KSOBJECT_BAG;
2942    
2943     typedef
2944     BOOLEAN
2945     (*PFNKSGENERATEEVENTCALLBACK)(
2946     IN PVOID Context,
2947     IN PKSEVENT_ENTRY EventEntry
2948     );
2949    
2950     typedef
2951     NTSTATUS
2952     (*PFNKSDEVICECREATE)(
2953     IN PKSDEVICE Device
2954     );
2955     typedef
2956     NTSTATUS
2957     (*PFNKSDEVICEPNPSTART)(
2958     IN PKSDEVICE Device,
2959     IN PIRP Irp,
2960     IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
2961     IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL
2962     );
2963     typedef
2964     NTSTATUS
2965     (*PFNKSDEVICE)(
2966     IN PKSDEVICE Device
2967     );
2968     typedef
2969     NTSTATUS
2970     (*PFNKSDEVICEIRP)(
2971     IN PKSDEVICE Device,
2972     IN PIRP Irp
2973     );
2974     typedef
2975     void
2976     (*PFNKSDEVICEIRPVOID)(
2977     IN PKSDEVICE Device,
2978     IN PIRP Irp
2979     );
2980     typedef
2981     NTSTATUS
2982     (*PFNKSDEVICEQUERYCAPABILITIES)(
2983     IN PKSDEVICE Device,
2984     IN PIRP Irp,
2985     IN OUT PDEVICE_CAPABILITIES Capabilities
2986     );
2987     typedef
2988     NTSTATUS
2989     (*PFNKSDEVICEQUERYPOWER)(
2990     IN PKSDEVICE Device,
2991     IN PIRP Irp,
2992     IN DEVICE_POWER_STATE DeviceTo,
2993     IN DEVICE_POWER_STATE DeviceFrom,
2994     IN SYSTEM_POWER_STATE SystemTo,
2995     IN SYSTEM_POWER_STATE SystemFrom,
2996     IN POWER_ACTION Action
2997     );
2998     typedef
2999     void
3000     (*PFNKSDEVICESETPOWER)(
3001     IN PKSDEVICE Device,
3002     IN PIRP Irp,
3003     IN DEVICE_POWER_STATE To,
3004     IN DEVICE_POWER_STATE From
3005     );
3006     typedef
3007     NTSTATUS
3008     (*PFNKSFILTERFACTORYVOID)(
3009     IN PKSFILTERFACTORY FilterFactory
3010     );
3011     typedef
3012     void
3013     (*PFNKSFILTERFACTORYPOWER)(
3014     IN PKSFILTERFACTORY FilterFactory,
3015     IN DEVICE_POWER_STATE State
3016     );
3017     typedef
3018     NTSTATUS
3019     (*PFNKSFILTERIRP)(
3020     IN PKSFILTER Filter,
3021     IN PIRP Irp
3022     );
3023     typedef
3024     NTSTATUS
3025     (*PFNKSFILTERPROCESS)(
3026     IN PKSFILTER Filter,
3027     IN PKSPROCESSPIN_INDEXENTRY Index
3028     );
3029     typedef
3030     NTSTATUS
3031     (*PFNKSFILTERVOID)(
3032     IN PKSFILTER Filter
3033     );
3034     typedef
3035     void
3036     (*PFNKSFILTERPOWER)(
3037     IN PKSFILTER Filter,
3038     IN DEVICE_POWER_STATE State
3039     );
3040     typedef
3041     NTSTATUS
3042     (*PFNKSPINIRP)(
3043     IN PKSPIN Pin,
3044     IN PIRP Irp
3045     );
3046     typedef
3047     NTSTATUS
3048     (*PFNKSPINSETDEVICESTATE)(
3049     IN PKSPIN Pin,
3050     IN KSSTATE ToState,
3051     IN KSSTATE FromState
3052     );
3053     typedef
3054     NTSTATUS
3055     (*PFNKSPINSETDATAFORMAT)(
3056     IN PKSPIN Pin,
3057     IN PKSDATAFORMAT OldFormat OPTIONAL,
3058     IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
3059     IN const KSDATARANGE* DataRange,
3060     IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
3061     );
3062     typedef
3063     NTSTATUS
3064     (*PFNKSPINHANDSHAKE)(
3065     IN PKSPIN Pin,
3066     IN PKSHANDSHAKE In,
3067     IN PKSHANDSHAKE Out
3068     );
3069     typedef
3070     NTSTATUS
3071     (*PFNKSPIN)(
3072     IN PKSPIN Pin
3073     );
3074     typedef
3075     void
3076     (*PFNKSPINVOID)(
3077     IN PKSPIN Pin
3078     );
3079     typedef
3080     void
3081     (*PFNKSPINPOWER)(
3082     IN PKSPIN Pin,
3083     IN DEVICE_POWER_STATE State
3084     );
3085     typedef
3086     BOOLEAN
3087     (*PFNKSPINSETTIMER)(
3088     IN PKSPIN Pin,
3089     IN PKTIMER Timer,
3090     IN LARGE_INTEGER DueTime,
3091     IN PKDPC Dpc
3092     );
3093     typedef
3094     BOOLEAN
3095     (*PFNKSPINCANCELTIMER)(
3096     IN PKSPIN Pin,
3097     IN PKTIMER Timer
3098     );
3099     typedef
3100     LONGLONG
3101     (FASTCALL *PFNKSPINCORRELATEDTIME)(
3102     IN PKSPIN Pin,
3103     OUT PLONGLONG SystemTime
3104     );
3105     typedef
3106     void
3107     (*PFNKSPINRESOLUTION)(
3108     IN PKSPIN Pin,
3109     OUT PKSRESOLUTION Resolution
3110     );
3111     typedef
3112     NTSTATUS
3113     (*PFNKSPININITIALIZEALLOCATOR)(
3114     IN PKSPIN Pin,
3115     IN PKSALLOCATOR_FRAMING AllocatorFraming,
3116     OUT PVOID* Context
3117     );
3118     typedef
3119     void
3120     (*PFNKSSTREAMPOINTER)(
3121     IN PKSSTREAM_POINTER StreamPointer
3122     );
3123    
3124     typedef struct KSAUTOMATION_TABLE_
3125     KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
3126     struct KSAUTOMATION_TABLE_ {
3127     ULONG PropertySetsCount;
3128     ULONG PropertyItemSize;
3129     const KSPROPERTY_SET* PropertySets;
3130     ULONG MethodSetsCount;
3131     ULONG MethodItemSize;
3132     const KSMETHOD_SET* MethodSets;
3133     ULONG EventSetsCount;
3134     ULONG EventItemSize;
3135     const KSEVENT_SET* EventSets;
3136     #if !defined(_WIN64)
3137     PVOID Alignment;
3138     #endif // !defined(_WIN64)
3139     };
3140    
3141     #define DEFINE_KSAUTOMATION_TABLE(table)\
3142     const KSAUTOMATION_TABLE table =
3143    
3144     #define DEFINE_KSAUTOMATION_PROPERTIES(table)\
3145     SIZEOF_ARRAY(table),\
3146     sizeof(KSPROPERTY_ITEM),\
3147     table
3148    
3149     #define DEFINE_KSAUTOMATION_METHODS(table)\
3150     SIZEOF_ARRAY(table),\
3151     sizeof(KSMETHOD_ITEM),\
3152     table
3153    
3154     #define DEFINE_KSAUTOMATION_EVENTS(table)\
3155     SIZEOF_ARRAY(table),\
3156     sizeof(KSEVENT_ITEM),\
3157     table
3158    
3159     #define DEFINE_KSAUTOMATION_PROPERTIES_NULL\
3160     0,\
3161     sizeof(KSPROPERTY_ITEM),\
3162     NULL
3163    
3164     #define DEFINE_KSAUTOMATION_METHODS_NULL\
3165     0,\
3166     sizeof(KSMETHOD_ITEM),\
3167     NULL
3168    
3169     #define DEFINE_KSAUTOMATION_EVENTS_NULL\
3170     0,\
3171     sizeof(KSEVENT_ITEM),\
3172     NULL
3173    
3174     #define MIN_DEV_VER_FOR_QI (0x100)
3175    
3176     struct _KSDEVICE_DISPATCH {
3177     PFNKSDEVICECREATE Add;
3178     PFNKSDEVICEPNPSTART Start;
3179     PFNKSDEVICE PostStart;
3180     PFNKSDEVICEIRP QueryStop;
3181     PFNKSDEVICEIRPVOID CancelStop;
3182     PFNKSDEVICEIRPVOID Stop;
3183     PFNKSDEVICEIRP QueryRemove;
3184     PFNKSDEVICEIRPVOID CancelRemove;
3185     PFNKSDEVICEIRPVOID Remove;
3186     PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
3187     PFNKSDEVICEIRPVOID SurpriseRemoval;
3188     PFNKSDEVICEQUERYPOWER QueryPower;
3189     PFNKSDEVICESETPOWER SetPower;
3190     PFNKSDEVICEIRP QueryInterface; // added in version 0x100
3191     };
3192    
3193     struct _KSFILTER_DISPATCH {
3194     PFNKSFILTERIRP Create;
3195     PFNKSFILTERIRP Close;
3196     PFNKSFILTERPROCESS Process;
3197     PFNKSFILTERVOID Reset;
3198     };
3199    
3200     struct _KSPIN_DISPATCH {
3201     PFNKSPINIRP Create;
3202     PFNKSPINIRP Close;
3203     PFNKSPIN Process;
3204     PFNKSPINVOID Reset;
3205     PFNKSPINSETDATAFORMAT SetDataFormat;
3206     PFNKSPINSETDEVICESTATE SetDeviceState;
3207     PFNKSPIN Connect;
3208     PFNKSPINVOID Disconnect;
3209     const KSCLOCK_DISPATCH* Clock;
3210     const KSALLOCATOR_DISPATCH* Allocator;
3211     };
3212    
3213     struct _KSCLOCK_DISPATCH {
3214     PFNKSPINSETTIMER SetTimer;
3215     PFNKSPINCANCELTIMER CancelTimer;
3216     PFNKSPINCORRELATEDTIME CorrelatedTime;
3217     PFNKSPINRESOLUTION Resolution;
3218     };
3219    
3220     struct _KSALLOCATOR_DISPATCH {
3221     PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
3222     PFNKSDELETEALLOCATOR DeleteAllocator;
3223     PFNKSDEFAULTALLOCATE Allocate;
3224     PFNKSDEFAULTFREE Free;
3225     };
3226    
3227     #define KSDEVICE_DESCRIPTOR_VERSION (0x100)
3228    
3229     struct _KSDEVICE_DESCRIPTOR {
3230     const KSDEVICE_DISPATCH* Dispatch;
3231     ULONG FilterDescriptorsCount;
3232     const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
3233     ULONG Version; // this is 0 for pre-version 100 driver
3234     //#if !defined(_WIN64)
3235     //PVOID Alignment;
3236     //#endif //!defined(_WIN64)
3237     };
3238    
3239     struct _KSFILTER_DESCRIPTOR {
3240     const KSFILTER_DISPATCH* Dispatch;
3241     const KSAUTOMATION_TABLE* AutomationTable;
3242     ULONG Version;
3243     #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
3244     ULONG Flags;
3245     #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
3246     #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
3247     #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
3248     const GUID* ReferenceGuid;
3249     ULONG PinDescriptorsCount;
3250     ULONG PinDescriptorSize;
3251     const KSPIN_DESCRIPTOR_EX* PinDescriptors;
3252     ULONG CategoriesCount;
3253     const GUID* Categories;
3254     ULONG NodeDescriptorsCount;
3255     ULONG NodeDescriptorSize;
3256     const KSNODE_DESCRIPTOR* NodeDescriptors;
3257     ULONG ConnectionsCount;
3258     const KSTOPOLOGY_CONNECTION* Connections;
3259     const KSCOMPONENTID* ComponentId;
3260     };
3261    
3262     #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
3263     const KSFILTER_DESCRIPTOR descriptor =
3264    
3265     #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
3266     SIZEOF_ARRAY(table),\
3267     sizeof(table[0]),\
3268     table
3269    
3270     #define DEFINE_KSFILTER_CATEGORIES(table)\
3271     SIZEOF_ARRAY(table),\
3272     table
3273    
3274     #define DEFINE_KSFILTER_CATEGORY(category)\
3275     1,\
3276     &(category)
3277    
3278     #define DEFINE_KSFILTER_CATEGORIES_NULL\
3279     0,\
3280     NULL
3281    
3282     #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
3283     SIZEOF_ARRAY(table),\
3284     sizeof(table[0]),\
3285     table
3286    
3287     #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
3288     0,\
3289     sizeof(KSNODE_DESCRIPTOR),\
3290     NULL
3291    
3292     #define DEFINE_KSFILTER_CONNECTIONS(table)\
3293     SIZEOF_ARRAY(table),\
3294     table
3295    
3296     #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
3297     0,\
3298     NULL
3299    
3300     #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)\
3301     const KSFILTER_DESCRIPTOR*const table[] =
3302    
3303     struct _KSPIN_DESCRIPTOR_EX {
3304     const KSPIN_DISPATCH* Dispatch;
3305     const KSAUTOMATION_TABLE* AutomationTable;
3306     KSPIN_DESCRIPTOR PinDescriptor;
3307     ULONG Flags;
3308     #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
3309     #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
3310     #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
3311     #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
3312     #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
3313     #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
3314     #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
3315     #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
3316    
3317     #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
3318     #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
3319    
3320     #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
3321     #define KSPIN_FLAG_SPLITTER 0x00020000
3322     #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
3323     #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
3324     #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
3325     #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
3326     #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
3327     #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
3328     ULONG InstancesPossible;
3329     ULONG InstancesNecessary;
3330     const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
3331     PFNKSINTERSECTHANDLEREX IntersectHandler;
3332     };
3333    
3334     #define DEFINE_KSPIN_DEFAULT_INTERFACES\
3335     0,\
3336     NULL
3337    
3338     #define DEFINE_KSPIN_DEFAULT_MEDIUMS\
3339     0,\
3340     NULL
3341    
3342     struct _KSNODE_DESCRIPTOR {
3343     const KSAUTOMATION_TABLE* AutomationTable;
3344     const GUID* Type;
3345     const GUID* Name;
3346     #if !defined(_WIN64)
3347     PVOID Alignment;
3348     #endif // !defined(_WIN64)
3349     };
3350    
3351     #if !defined(_WIN64)
3352     #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
3353     { (automation), (type), (name), NULL }
3354     #else // !defined(_WIN64)
3355     #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
3356     { (automation), (type), (name) }
3357     #endif // !defined(_WIN64)
3358    
3359     struct _KSDEVICE {
3360     const KSDEVICE_DESCRIPTOR* Descriptor;
3361     KSOBJECT_BAG Bag;
3362     PVOID Context;
3363     PDEVICE_OBJECT FunctionalDeviceObject;
3364     PDEVICE_OBJECT PhysicalDeviceObject;
3365     PDEVICE_OBJECT NextDeviceObject;
3366     BOOLEAN Started;
3367     SYSTEM_POWER_STATE SystemPowerState;
3368     DEVICE_POWER_STATE DevicePowerState;
3369     };
3370    
3371     struct _KSFILTERFACTORY {
3372     const KSFILTER_DESCRIPTOR* FilterDescriptor;
3373     KSOBJECT_BAG Bag;
3374     PVOID Context;
3375     };
3376    
3377     struct _KSFILTER {
3378     const KSFILTER_DESCRIPTOR* Descriptor;
3379     KSOBJECT_BAG Bag;
3380     PVOID Context;
3381     };
3382    
3383     struct _KSPIN {
3384     const KSPIN_DESCRIPTOR_EX* Descriptor;
3385     KSOBJECT_BAG Bag;
3386     PVOID Context;
3387     ULONG Id;
3388     KSPIN_COMMUNICATION Communication;
3389     BOOLEAN ConnectionIsExternal;
3390     KSPIN_INTERFACE ConnectionInterface;
3391     KSPIN_MEDIUM ConnectionMedium;
3392     KSPRIORITY ConnectionPriority;
3393     PKSDATAFORMAT ConnectionFormat;
3394     PKSMULTIPLE_ITEM AttributeList;
3395     ULONG StreamHeaderSize;
3396     KSPIN_DATAFLOW DataFlow;
3397     KSSTATE DeviceState;
3398     KSRESET ResetState;
3399     };
3400    
3401     struct _KSMAPPING {
3402     PHYSICAL_ADDRESS PhysicalAddress;
3403     ULONG ByteCount;
3404     ULONG Alignment;
3405     };
3406    
3407     struct _KSSTREAM_POINTER_OFFSET
3408     {
3409     #if defined(_NTDDK_)
3410     union {
3411     PUCHAR Data;
3412     PKSMAPPING Mappings;
3413     };
3414     #else // !defined(_NTDDK_)
3415     PUCHAR Data;
3416     #endif // !defined(_NTDDK_)
3417     #if !defined(_WIN64)
3418     PVOID Alignment;
3419     #endif // !defined(_WIN64)
3420     ULONG Count;
3421     ULONG Remaining;
3422     };
3423    
3424     struct _KSSTREAM_POINTER
3425     {
3426     PVOID Context;
3427     PKSPIN Pin;
3428     PKSSTREAM_HEADER StreamHeader;
3429     PKSSTREAM_POINTER_OFFSET Offset;
3430     KSSTREAM_POINTER_OFFSET OffsetIn;
3431     KSSTREAM_POINTER_OFFSET OffsetOut;
3432     };
3433    
3434     struct _KSPROCESSPIN {
3435     PKSPIN Pin;
3436     PKSSTREAM_POINTER StreamPointer;
3437     PKSPROCESSPIN InPlaceCounterpart;
3438     PKSPROCESSPIN DelegateBranch;
3439     PKSPROCESSPIN CopySource;
3440     PVOID Data;
3441     ULONG BytesAvailable;
3442     ULONG BytesUsed;
3443     ULONG Flags;
3444     BOOLEAN Terminate;
3445     };
3446    
3447     struct _KSPROCESSPIN_INDEXENTRY {
3448     PKSPROCESSPIN *Pins;
3449     ULONG Count;
3450     };
3451    
3452     typedef enum {
3453     KsObjectTypeDevice,
3454     KsObjectTypeFilterFactory,
3455     KsObjectTypeFilter,
3456     KsObjectTypePin
3457     } KSOBJECTTYPE;
3458    
3459     typedef
3460     void
3461     (*PFNKSFREE)(
3462     IN PVOID Data
3463     );
3464    
3465     typedef
3466     void
3467     (*PFNKSPINFRAMERETURN)(
3468     IN PKSPIN Pin,
3469     IN PVOID Data OPTIONAL,
3470     IN ULONG Size OPTIONAL,
3471     IN PMDL Mdl OPTIONAL,
3472     IN PVOID Context OPTIONAL,
3473     IN NTSTATUS Status
3474     );
3475    
3476     #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3477     #if !defined(_IKsControl_)
3478     #define _IKsControl_
3479    
3480     typedef interface IKsControl* PIKSCONTROL;
3481    
3482     #if !defined(DEFINE_ABSTRACT_UNKNOWN)
3483    
3484     #define DEFINE_ABSTRACT_UNKNOWN() \
3485     STDMETHOD_(NTSTATUS, QueryInterface)(THIS_ \
3486     REFIID InterfaceId, \
3487     PVOID* Interface \
3488     ) PURE; \
3489     STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
3490     STDMETHOD_(ULONG,Release)(THIS) PURE;
3491    
3492     #endif //!defined(DEFINE_ABSTRACT_UNKNOWN)
3493    
3494     #undef INTERFACE
3495     #define INTERFACE IKsControl
3496     DECLARE_INTERFACE_(IKsControl,IUnknown)
3497     {
3498     DEFINE_ABSTRACT_UNKNOWN() // For C
3499    
3500     STDMETHOD_(NTSTATUS, KsProperty)(THIS_
3501     IN PKSPROPERTY Property,
3502     IN ULONG PropertyLength,
3503     IN OUT PVOID PropertyData,
3504     IN ULONG DataLength,
3505     OUT ULONG* BytesReturned
3506     ) PURE;
3507     STDMETHOD_(NTSTATUS, KsMethod)(THIS_
3508     IN PKSMETHOD Method,
3509     IN ULONG MethodLength,
3510     IN OUT PVOID MethodData,
3511     IN ULONG DataLength,
3512     OUT ULONG* BytesReturned
3513     ) PURE;
3514     STDMETHOD_(NTSTATUS, KsEvent)(THIS_
3515     IN PKSEVENT Event OPTIONAL,
3516     IN ULONG EventLength,
3517     IN OUT PVOID EventData,
3518     IN ULONG DataLength,
3519     OUT ULONG* BytesReturned
3520     ) PURE;
3521     };
3522    
3523     typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
3524    
3525     #undef INTERFACE
3526     #define INTERFACE IKsReferenceClock
3527     DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
3528     {
3529     DEFINE_ABSTRACT_UNKNOWN() // For C
3530    
3531     STDMETHOD_(LONGLONG,GetTime)(THIS
3532     ) PURE;
3533     STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
3534     ) PURE;
3535     STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
3536     OUT PLONGLONG SystemTime
3537     ) PURE;
3538     STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
3539     OUT PLONGLONG SystemTime
3540     ) PURE;
3541     STDMETHOD_(NTSTATUS, GetResolution)(THIS_
3542     OUT PKSRESOLUTION Resolution
3543     ) PURE;
3544     STDMETHOD_(NTSTATUS, GetState)(THIS_
3545     OUT PKSSTATE State
3546     ) PURE;
3547     };
3548     #undef INTERFACE
3549    
3550     #define STATIC_IID_IKsControl \
3551     0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
3552     DEFINE_GUID(IID_IKsControl,
3553     0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
3554     #if defined(__cplusplus) && _MSC_VER >= 1100
3555     struct __declspec(uuid("28F54685-06FD-11D2-B27A-00A0C9223196")) IKsControl;
3556     #endif
3557    
3558     #define STATIC_IID_IKsFastClock \
3559     0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e
3560     DEFINE_GUID(IID_IKsFastClock,
3561     0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e);
3562     #if defined(__cplusplus) && _MSC_VER >= 1100
3563     struct __declspec(uuid("C9902485-C180-11d2-8473-D42394459E5E")) IKsFastClock;
3564     #endif
3565    
3566     #endif // !defined(_IKsControl_)
3567     #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
3568    
3569     #endif // defined(_NTDDK_)
3570    
3571     //===========================================================================
3572    
3573     #if defined(__cplusplus)
3574     extern "C" {
3575     #endif // defined(__cplusplus)
3576    
3577     //
3578     // exported prototypes
3579     //
3580    
3581     #ifdef _KSDDK_
3582     #define KSDDKAPI
3583     #else // !_KSDDK_
3584     #define KSDDKAPI DECLSPEC_IMPORT
3585     #endif // _KSDDK_
3586    
3587     #if defined(_NTDDK_)
3588    
3589     KSDDKAPI
3590     NTSTATUS
3591     NTAPI
3592     KsEnableEvent(
3593     IN PIRP Irp,
3594     IN ULONG EventSetsCount,
3595     IN const KSEVENT_SET* EventSet,
3596     IN OUT PLIST_ENTRY EventsList OPTIONAL,
3597     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
3598     IN PVOID EventsLock OPTIONAL
3599     );
3600    
3601     KSDDKAPI
3602     NTSTATUS
3603     NTAPI
3604     KsEnableEventWithAllocator(
3605     IN PIRP Irp,
3606     IN ULONG EventSetsCount,
3607     IN const KSEVENT_SET* EventSet,
3608     IN OUT PLIST_ENTRY EventsList OPTIONAL,
3609     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
3610     IN PVOID EventsLock OPTIONAL,
3611     IN PFNKSALLOCATOR Allocator OPTIONAL,
3612     IN ULONG EventItemSize OPTIONAL
3613     );
3614    
3615     KSDDKAPI
3616     NTSTATUS
3617     NTAPI
3618     KsDisableEvent(
3619     IN PIRP Irp,
3620     IN OUT PLIST_ENTRY EventsList,
3621     IN KSEVENTS_LOCKTYPE EventsFlags,
3622     IN PVOID EventsLock
3623     );
3624    
3625     KSDDKAPI
3626     VOID
3627     NTAPI
3628     KsDiscardEvent(
3629     IN PKSEVENT_ENTRY EventEntry
3630     );
3631    
3632     KSDDKAPI
3633     VOID
3634     NTAPI
3635     KsFreeEventList(
3636     IN PFILE_OBJECT FileObject,
3637     IN OUT PLIST_ENTRY EventsList,
3638     IN KSEVENTS_LOCKTYPE EventsFlags,
3639     IN PVOID EventsLock
3640     );
3641    
3642     KSDDKAPI
3643     NTSTATUS
3644     NTAPI
3645     KsGenerateEvent(
3646     IN PKSEVENT_ENTRY EventEntry
3647     );
3648    
3649     KSDDKAPI
3650     NTSTATUS
3651     NTAPI
3652     KsGenerateDataEvent(
3653     IN PKSEVENT_ENTRY EventEntry,
3654     IN ULONG DataSize,
3655     IN PVOID Data
3656     );
3657    
3658     KSDDKAPI
3659     VOID
3660     NTAPI
3661     KsGenerateEventList(
3662     IN GUID* Set OPTIONAL,
3663     IN ULONG EventId,
3664     IN PLIST_ENTRY EventsList,
3665     IN KSEVENTS_LOCKTYPE EventsFlags,
3666     IN PVOID EventsLock
3667     );
3668    
3669     // property.c:
3670    
3671     KSDDKAPI
3672     NTSTATUS
3673     NTAPI
3674     KsPropertyHandler(
3675     IN PIRP Irp,
3676     IN ULONG PropertySetsCount,
3677     IN const KSPROPERTY_SET* PropertySet
3678     );
3679    
3680     KSDDKAPI
3681     NTSTATUS
3682     NTAPI
3683     KsPropertyHandlerWithAllocator(
3684     IN PIRP Irp,
3685     IN ULONG PropertySetsCount,
3686     IN const KSPROPERTY_SET* PropertySet,
3687     IN PFNKSALLOCATOR Allocator OPTIONAL,
3688     IN ULONG PropertyItemSize OPTIONAL
3689     );
3690    
3691     KSDDKAPI
3692     BOOLEAN
3693     NTAPI
3694     KsFastPropertyHandler(
3695     IN PFILE_OBJECT FileObject,
3696     IN PKSPROPERTY UNALIGNED Property,
3697     IN ULONG PropertyLength,
3698     IN OUT PVOID UNALIGNED Data,
3699     IN ULONG DataLength,
3700     OUT PIO_STATUS_BLOCK IoStatus,
3701     IN ULONG PropertySetsCount,
3702     IN const KSPROPERTY_SET* PropertySet
3703     );
3704    
3705     // method.c:
3706    
3707     KSDDKAPI
3708     NTSTATUS
3709     NTAPI
3710     KsMethodHandler(
3711     IN PIRP Irp,
3712     IN ULONG MethodSetsCount,
3713     IN const KSMETHOD_SET* MethodSet
3714     );
3715    
3716     KSDDKAPI
3717     NTSTATUS
3718     NTAPI
3719     KsMethodHandlerWithAllocator(
3720     IN PIRP Irp,
3721     IN ULONG MethodSetsCount,
3722     IN const KSMETHOD_SET* MethodSet,
3723     IN PFNKSALLOCATOR Allocator OPTIONAL,
3724     IN ULONG MethodItemSize OPTIONAL
3725     );
3726    
3727     KSDDKAPI
3728     BOOLEAN
3729     NTAPI
3730     KsFastMethodHandler(
3731     IN PFILE_OBJECT FileObject,
3732     IN PKSMETHOD UNALIGNED Method,
3733     IN ULONG MethodLength,
3734     IN OUT PVOID UNALIGNED Data,
3735     IN ULONG DataLength,
3736     OUT PIO_STATUS_BLOCK IoStatus,
3737     IN ULONG MethodSetsCount,
3738     IN const KSMETHOD_SET* MethodSet
3739     );
3740    
3741     // alloc.c:
3742    
3743     KSDDKAPI
3744     NTSTATUS
3745     NTAPI
3746     KsCreateDefaultAllocator(
3747     IN PIRP Irp
3748     );
3749    
3750     KSDDKAPI
3751     NTSTATUS
3752     NTAPI
3753     KsCreateDefaultAllocatorEx(
3754     IN PIRP Irp,
3755     IN PVOID InitializeContext OPTIONAL,
3756     IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
3757     IN PFNKSDEFAULTFREE DefaultFree OPTIONAL,
3758     IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
3759     IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL
3760     );
3761    
3762     KSDDKAPI
3763     NTSTATUS
3764     NTAPI
3765     KsCreateAllocator(
3766     IN HANDLE ConnectionHandle,
3767     IN PKSALLOCATOR_FRAMING AllocatorFraming,
3768     OUT PHANDLE AllocatorHandle
3769     );
3770    
3771     KSDDKAPI
3772     NTSTATUS
3773     NTAPI
3774     KsValidateAllocatorCreateRequest(
3775     IN PIRP Irp,
3776     OUT PKSALLOCATOR_FRAMING* AllocatorFraming
3777     );
3778    
3779     KSDDKAPI
3780     NTSTATUS
3781     NTAPI
3782     KsValidateAllocatorFramingEx(
3783     IN PKSALLOCATOR_FRAMING_EX Framing,
3784     IN ULONG BufferSize,
3785     IN const KSALLOCATOR_FRAMING_EX *PinFraming
3786     );
3787    
3788     // clock.c:
3789    
3790     KSDDKAPI
3791     NTSTATUS
3792     NTAPI
3793     KsAllocateDefaultClock(
3794     OUT PKSDEFAULTCLOCK* DefaultClock
3795     );
3796    
3797     KSDDKAPI
3798     NTSTATUS
3799     NTAPI
3800     KsAllocateDefaultClockEx(
3801     OUT PKSDEFAULTCLOCK* DefaultClock,
3802     IN PVOID Context OPTIONAL,
3803     IN PFNKSSETTIMER SetTimer OPTIONAL,
3804     IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
3805     IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
3806     IN const KSRESOLUTION* Resolution OPTIONAL,
3807     IN ULONG Flags
3808     );
3809    
3810     KSDDKAPI
3811     VOID
3812     NTAPI
3813     KsFreeDefaultClock(
3814     IN PKSDEFAULTCLOCK DefaultClock
3815     );
3816    
3817     KSDDKAPI
3818     NTSTATUS
3819     NTAPI
3820     KsCreateDefaultClock(
3821     IN PIRP Irp,
3822     IN PKSDEFAULTCLOCK DefaultClock
3823     );
3824    
3825     KSDDKAPI
3826     NTSTATUS
3827     NTAPI
3828     KsCreateClock(
3829     IN HANDLE ConnectionHandle,
3830     IN PKSCLOCK_CREATE ClockCreate,
3831     OUT PHANDLE ClockHandle
3832     );
3833    
3834     KSDDKAPI
3835     NTSTATUS
3836     NTAPI
3837     KsValidateClockCreateRequest(
3838     IN PIRP Irp,
3839     OUT PKSCLOCK_CREATE* ClockCreate
3840     );
3841    
3842     KSDDKAPI
3843     KSSTATE
3844     NTAPI
3845     KsGetDefaultClockState(
3846     IN PKSDEFAULTCLOCK DefaultClock
3847     );
3848    
3849     KSDDKAPI
3850     VOID
3851     NTAPI
3852     KsSetDefaultClockState(
3853     IN PKSDEFAULTCLOCK DefaultClock,
3854     IN KSSTATE State
3855     );
3856    
3857     KSDDKAPI
3858     LONGLONG
3859     NTAPI
3860     KsGetDefaultClockTime(
3861     IN PKSDEFAULTCLOCK DefaultClock
3862     );
3863    
3864     KSDDKAPI
3865     VOID
3866     NTAPI
3867     KsSetDefaultClockTime(
3868     IN PKSDEFAULTCLOCK DefaultClock,
3869     IN LONGLONG Time
3870     );
3871    
3872     // connect.c:
3873    
3874     KSDDKAPI
3875     NTSTATUS
3876     NTAPI
3877     KsCreatePin(
3878     IN HANDLE FilterHandle,
3879     IN PKSPIN_CONNECT Connect,
3880     IN ACCESS_MASK DesiredAccess,
3881     OUT PHANDLE ConnectionHandle
3882     );
3883    
3884     KSDDKAPI
3885     NTSTATUS
3886     NTAPI
3887     KsValidateConnectRequest(
3888     IN PIRP Irp,
3889     IN ULONG DescriptorsCount,
3890     IN const KSPIN_DESCRIPTOR* Descriptor,
3891     OUT PKSPIN_CONNECT* Connect
3892     );
3893    
3894     KSDDKAPI
3895     NTSTATUS
3896     NTAPI
3897     KsPinPropertyHandler(
3898     IN PIRP Irp,
3899     IN PKSPROPERTY Property,
3900     IN OUT PVOID Data,
3901     IN ULONG DescriptorsCount,
3902     IN const KSPIN_DESCRIPTOR* Descriptor
3903     );
3904    
3905     KSDDKAPI
3906     NTSTATUS
3907     NTAPI
3908     KsPinDataIntersection(
3909     IN PIRP Irp,
3910     IN PKSP_PIN Pin,
3911     OUT PVOID Data OPTIONAL,
3912     IN ULONG DescriptorsCount,
3913     IN const KSPIN_DESCRIPTOR* Descriptor,
3914     IN PFNKSINTERSECTHANDLER IntersectHandler
3915     );
3916    
3917     KSDDKAPI
3918     NTSTATUS
3919     NTAPI
3920     KsPinDataIntersectionEx(
3921     IN PIRP Irp,
3922     IN PKSP_PIN Pin,
3923     OUT PVOID Data,
3924     IN ULONG DescriptorsCount,
3925     IN const KSPIN_DESCRIPTOR* Descriptor,
3926     IN ULONG DescriptorSize,
3927     IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
3928     IN PVOID HandlerContext OPTIONAL
3929     );
3930    
3931     KSDDKAPI
3932     NTSTATUS
3933     NTAPI
3934     KsHandleSizedListQuery(
3935     IN PIRP Irp,
3936     IN ULONG DataItemsCount,
3937     IN ULONG DataItemSize,
3938     IN const VOID* DataItems
3939     );
3940    
3941     // image.c:
3942    
3943     #if (!defined( MAKEINTRESOURCE ))
3944     #define MAKEINTRESOURCE( res ) ((ULONG_PTR) (USHORT) res)
3945     #endif
3946    
3947     #if (!defined( RT_STRING ))
3948     #define RT_STRING MAKEINTRESOURCE( 6 )
3949     #define RT_RCDATA MAKEINTRESOURCE( 10 )
3950     #endif
3951    
3952     KSDDKAPI
3953     NTSTATUS
3954     NTAPI
3955     KsLoadResource(
3956     IN PVOID ImageBase,
3957     IN POOL_TYPE PoolType,
3958     IN ULONG_PTR ResourceName,
3959     IN ULONG ResourceType,
3960     OUT PVOID *Resource,
3961     OUT PULONG ResourceSize
3962     );
3963    
3964     KSDDKAPI
3965     NTSTATUS
3966     NTAPI
3967     KsGetImageNameAndResourceId(
3968     IN HANDLE RegKey,
3969     OUT PUNICODE_STRING ImageName,
3970     OUT PULONG_PTR ResourceId,
3971     OUT PULONG ValueType
3972     );
3973    
3974     KSDDKAPI
3975     NTSTATUS
3976     NTAPI
3977     KsMapModuleName(
3978     IN PDEVICE_OBJECT PhysicalDeviceObject,
3979     IN PUNICODE_STRING ModuleName,
3980     OUT PUNICODE_STRING ImageName,
3981     OUT PULONG_PTR ResourceId,
3982     OUT PULONG ValueType
3983     );
3984    
3985     // irp.c:
3986    
3987     KSDDKAPI
3988     NTSTATUS
3989     NTAPI
3990     KsReferenceBusObject(
3991     IN KSDEVICE_HEADER Header
3992     );
3993    
3994     KSDDKAPI
3995     VOID
3996     NTAPI
3997     KsDereferenceBusObject(
3998     IN KSDEVICE_HEADER Header
3999     );
4000    
4001     KSDDKAPI
4002     NTSTATUS
4003     NTAPI
4004     KsDispatchQuerySecurity(
4005     IN PDEVICE_OBJECT DeviceObject,
4006     IN PIRP Irp
4007     );
4008    
4009     KSDDKAPI
4010     NTSTATUS
4011     NTAPI
4012     KsDispatchSetSecurity(
4013     IN PDEVICE_OBJECT DeviceObject,
4014     IN PIRP Irp
4015     );
4016    
4017     KSDDKAPI
4018     NTSTATUS
4019     NTAPI
4020     KsDispatchSpecificProperty(
4021     IN PIRP Irp,
4022     IN PFNKSHANDLER Handler
4023     );
4024    
4025     KSDDKAPI
4026     NTSTATUS
4027     NTAPI
4028     KsDispatchSpecificMethod(
4029     IN PIRP Irp,
4030     IN PFNKSHANDLER Handler
4031     );
4032    
4033     KSDDKAPI
4034     NTSTATUS
4035     NTAPI
4036     KsReadFile(
4037     IN PFILE_OBJECT FileObject,
4038     IN PKEVENT Event OPTIONAL,
4039     IN PVOID PortContext OPTIONAL,
4040     OUT PIO_STATUS_BLOCK IoStatusBlock,
4041     OUT PVOID Buffer,
4042     IN ULONG Length,
4043     IN ULONG Key OPTIONAL,
4044     IN KPROCESSOR_MODE RequestorMode
4045     );
4046    
4047     KSDDKAPI
4048     NTSTATUS
4049     NTAPI
4050     KsWriteFile(
4051     IN PFILE_OBJECT FileObject,
4052     IN PKEVENT Event OPTIONAL,
4053     IN PVOID PortContext OPTIONAL,
4054     OUT PIO_STATUS_BLOCK IoStatusBlock,
4055     IN PVOID Buffer,
4056     IN ULONG Length,
4057     IN ULONG Key OPTIONAL,
4058     IN KPROCESSOR_MODE RequestorMode
4059     );
4060    
4061     KSDDKAPI
4062     NTSTATUS
4063     NTAPI
4064     KsQueryInformationFile(
4065     IN PFILE_OBJECT FileObject,
4066     OUT PVOID FileInformation,
4067     IN ULONG Length,
4068     IN FILE_INFORMATION_CLASS FileInformationClass
4069     );
4070    
4071     KSDDKAPI
4072     NTSTATUS
4073     NTAPI
4074     KsSetInformationFile(
4075     IN PFILE_OBJECT FileObject,
4076     IN PVOID FileInformation,
4077     IN ULONG Length,
4078     IN FILE_INFORMATION_CLASS FileInformationClass
4079     );
4080    
4081     KSDDKAPI
4082     NTSTATUS
4083     NTAPI
4084     KsStreamIo(
4085     IN PFILE_OBJECT FileObject,
4086     IN PKEVENT Event OPTIONAL,
4087     IN PVOID PortContext OPTIONAL,
4088     IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
4089     IN PVOID CompletionContext OPTIONAL,
4090     IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
4091     OUT PIO_STATUS_BLOCK IoStatusBlock,
4092     IN OUT PVOID StreamHeaders,
4093     IN ULONG Length,
4094     IN ULONG Flags,
4095     IN KPROCESSOR_MODE RequestorMode
4096     );
4097    
4098     KSDDKAPI
4099     NTSTATUS
4100     NTAPI
4101     KsProbeStreamIrp(
4102     IN OUT PIRP Irp,
4103     IN ULONG ProbeFlags,
4104     IN ULONG HeaderSize OPTIONAL
4105     );
4106    
4107     KSDDKAPI
4108     NTSTATUS
4109     NTAPI
4110     KsAllocateExtraData(
4111     IN OUT PIRP Irp,
4112     IN ULONG ExtraSize,
4113     OUT PVOID* ExtraBuffer
4114     );
4115    
4116     KSDDKAPI
4117     VOID
4118     NTAPI
4119     KsNullDriverUnload(
4120     IN PDRIVER_OBJECT DriverObject
4121     );
4122    
4123     KSDDKAPI
4124     NTSTATUS
4125     NTAPI
4126     KsSetMajorFunctionHandler(
4127     IN PDRIVER_OBJECT DriverObject,
4128     IN ULONG MajorFunction
4129     );
4130    
4131     KSDDKAPI
4132     NTSTATUS
4133     NTAPI
4134     KsDispatchInvalidDeviceRequest(
4135     IN PDEVICE_OBJECT DeviceObject,
4136     IN PIRP Irp
4137     );
4138    
4139     KSDDKAPI
4140     NTSTATUS
4141     NTAPI
4142     KsDefaultDeviceIoCompletion(
4143     IN PDEVICE_OBJECT DeviceObject,
4144     IN PIRP Irp
4145     );
4146    
4147     KSDDKAPI
4148     NTSTATUS
4149     NTAPI
4150     KsDispatchIrp(
4151     IN PDEVICE_OBJECT DeviceObject,
4152     IN PIRP Irp
4153     );
4154    
4155     KSDDKAPI
4156     BOOLEAN
4157     NTAPI
4158     KsDispatchFastIoDeviceControlFailure(
4159     IN PFILE_OBJECT FileObject,
4160     IN BOOLEAN Wait,
4161     IN PVOID InputBuffer OPTIONAL,
4162     IN ULONG InputBufferLength,
4163     OUT PVOID OutputBuffer OPTIONAL,
4164     IN ULONG OutputBufferLength,
4165     IN ULONG IoControlCode,
4166     OUT PIO_STATUS_BLOCK IoStatus,
4167     IN PDEVICE_OBJECT DeviceObject
4168     );
4169    
4170     KSDDKAPI
4171     BOOLEAN
4172     NTAPI
4173     KsDispatchFastReadFailure(
4174     IN PFILE_OBJECT FileObject,
4175     IN PLARGE_INTEGER FileOffset,
4176     IN ULONG Length,
4177     IN BOOLEAN Wait,
4178     IN ULONG LockKey,
4179     OUT PVOID Buffer,
4180     OUT PIO_STATUS_BLOCK IoStatus,
4181     IN PDEVICE_OBJECT DeviceObject
4182     );
4183    
4184     #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
4185    
4186     KSDDKAPI
4187     VOID
4188     NTAPI
4189     KsCancelRoutine(
4190     IN PDEVICE_OBJECT DeviceObject,
4191     IN PIRP Irp
4192     );
4193    
4194     KSDDKAPI
4195     VOID
4196     NTAPI
4197     KsCancelIo(
4198     IN OUT PLIST_ENTRY QueueHead,
4199     IN PKSPIN_LOCK SpinLock
4200     );
4201    
4202     KSDDKAPI
4203     VOID
4204     NTAPI
4205     KsReleaseIrpOnCancelableQueue(
4206     IN PIRP Irp,
4207     IN PDRIVER_CANCEL DriverCancel OPTIONAL
4208     );
4209    
4210     KSDDKAPI
4211     PIRP
4212     NTAPI
4213     KsRemoveIrpFromCancelableQueue(
4214     IN OUT PLIST_ENTRY QueueHead,
4215     IN PKSPIN_LOCK SpinLock,
4216     IN KSLIST_ENTRY_LOCATION ListLocation,
4217     IN KSIRP_REMOVAL_OPERATION RemovalOperation
4218     );
4219    
4220     KSDDKAPI
4221     NTSTATUS
4222     NTAPI
4223     KsMoveIrpsOnCancelableQueue(
4224     IN OUT PLIST_ENTRY SourceList,
4225     IN PKSPIN_LOCK SourceLock,
4226     IN OUT PLIST_ENTRY DestinationList,
4227     IN PKSPIN_LOCK DestinationLock OPTIONAL,
4228     IN KSLIST_ENTRY_LOCATION ListLocation,
4229     IN PFNKSIRPLISTCALLBACK ListCallback,
4230     IN PVOID Context
4231     );
4232    
4233     KSDDKAPI
4234     VOID
4235     NTAPI
4236     KsRemoveSpecificIrpFromCancelableQueue(
4237     IN PIRP Irp
4238     );
4239    
4240     KSDDKAPI
4241     VOID
4242     NTAPI
4243     KsAddIrpToCancelableQueue(
4244     IN OUT PLIST_ENTRY QueueHead,
4245     IN PKSPIN_LOCK SpinLock,
4246     IN PIRP Irp,
4247     IN KSLIST_ENTRY_LOCATION ListLocation,
4248     IN PDRIVER_CANCEL DriverCancel OPTIONAL
4249     );
4250    
4251     // api.c:
4252    
4253     KSDDKAPI
4254     NTSTATUS
4255     NTAPI
4256     KsAcquireResetValue(
4257     IN PIRP Irp,
4258     OUT KSRESET* ResetValue
4259     );
4260    
4261     KSDDKAPI
4262     NTSTATUS
4263     NTAPI
4264     KsTopologyPropertyHandler(
4265     IN PIRP Irp,
4266     IN PKSPROPERTY Property,
4267     IN OUT PVOID Data,
4268     IN const KSTOPOLOGY* Topology
4269     );
4270    
4271     KSDDKAPI
4272     VOID
4273     NTAPI
4274     KsAcquireDeviceSecurityLock(
4275     IN KSDEVICE_HEADER Header,
4276     IN BOOLEAN Exclusive
4277     );
4278    
4279     KSDDKAPI
4280     VOID
4281     NTAPI
4282     KsReleaseDeviceSecurityLock(
4283     IN KSDEVICE_HEADER Header
4284     );
4285    
4286     KSDDKAPI
4287     NTSTATUS
4288     NTAPI
4289     KsDefaultDispatchPnp(
4290     IN PDEVICE_OBJECT DeviceObject,
4291     IN PIRP Irp
4292     );
4293    
4294     KSDDKAPI
4295     NTSTATUS
4296     NTAPI
4297     KsDefaultDispatchPower(
4298     IN PDEVICE_OBJECT DeviceObject,
4299     IN PIRP Irp
4300     );
4301    
4302     KSDDKAPI
4303     NTSTATUS
4304     NTAPI
4305     KsDefaultForwardIrp(
4306     IN PDEVICE_OBJECT DeviceObject,
4307     IN PIRP Irp
4308     );
4309    
4310     KSDDKAPI
4311     VOID
4312     NTAPI
4313     KsSetDevicePnpAndBaseObject(
4314     IN KSDEVICE_HEADER Header,
4315     IN PDEVICE_OBJECT PnpDeviceObject,
4316     IN PDEVICE_OBJECT BaseObject
4317     );
4318    
4319     KSDDKAPI
4320     PDEVICE_OBJECT
4321     NTAPI
4322     KsQueryDevicePnpObject(
4323     IN KSDEVICE_HEADER Header
4324     );
4325    
4326     KSDDKAPI
4327     ACCESS_MASK
4328     NTAPI
4329     KsQueryObjectAccessMask(
4330     IN KSOBJECT_HEADER Header
4331     );
4332    
4333     KSDDKAPI
4334     VOID
4335     NTAPI
4336     KsRecalculateStackDepth(
4337     IN KSDEVICE_HEADER Header,
4338     IN BOOLEAN ReuseStackLocation
4339     );
4340    
4341     KSDDKAPI
4342     VOID
4343     NTAPI
4344     KsSetTargetState(
4345     IN KSOBJECT_HEADER Header,
4346     IN KSTARGET_STATE TargetState
4347     );
4348    
4349     KSDDKAPI
4350     VOID
4351     NTAPI
4352     KsSetTargetDeviceObject(
4353     IN KSOBJECT_HEADER Header,
4354     IN PDEVICE_OBJECT TargetDevice OPTIONAL
4355     );
4356    
4357     KSDDKAPI
4358     VOID
4359     NTAPI
4360     KsSetPowerDispatch(
4361     IN KSOBJECT_HEADER Header,
4362     IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
4363     IN PVOID PowerContext OPTIONAL
4364     );
4365    
4366     KSDDKAPI
4367     PKSOBJECT_CREATE_ITEM
4368     NTAPI
4369     KsQueryObjectCreateItem(
4370     IN KSOBJECT_HEADER Header
4371     );
4372    
4373     KSDDKAPI
4374     NTSTATUS
4375     NTAPI
4376     KsAllocateDeviceHeader(
4377     OUT KSDEVICE_HEADER* Header,
4378     IN ULONG ItemsCount,
4379     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
4380     );
4381    
4382     KSDDKAPI
4383     VOID
4384     NTAPI
4385     KsFreeDeviceHeader(
4386     IN KSDEVICE_HEADER Header
4387     );
4388    
4389     KSDDKAPI
4390     NTSTATUS
4391     NTAPI
4392     KsAllocateObjectHeader(
4393     OUT KSOBJECT_HEADER* Header,
4394     IN ULONG ItemsCount,
4395     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
4396     IN PIRP Irp,
4397     IN const KSDISPATCH_TABLE* Table
4398     );
4399    
4400     KSDDKAPI
4401     VOID
4402     NTAPI
4403     KsFreeObjectHeader(
4404     IN KSOBJECT_HEADER Header
4405     );
4406    
4407     KSDDKAPI
4408     NTSTATUS
4409     NTAPI
4410     KsAddObjectCreateItemToDeviceHeader(
4411     IN KSDEVICE_HEADER Header,
4412     IN PDRIVER_DISPATCH Create,
4413     IN PVOID Context,
4414     IN PWCHAR ObjectClass,
4415     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
4416     );
4417    
4418     KSDDKAPI
4419     NTSTATUS
4420     NTAPI
4421     KsAddObjectCreateItemToObjectHeader(
4422     IN KSOBJECT_HEADER Header,
4423     IN PDRIVER_DISPATCH Create,
4424     IN PVOID Context,
4425     IN PWCHAR ObjectClass,
4426     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
4427     );
4428    
4429     KSDDKAPI
4430     NTSTATUS
4431     NTAPI
4432     KsAllocateObjectCreateItem(
4433     IN KSDEVICE_HEADER Header,
4434     IN PKSOBJECT_CREATE_ITEM CreateItem,
4435     IN BOOLEAN AllocateEntry,
4436     IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
4437     );
4438    
4439     KSDDKAPI
4440     NTSTATUS
4441     NTAPI
4442     KsFreeObjectCreateItem(
4443     IN KSDEVICE_HEADER Header,
4444     IN PUNICODE_STRING CreateItem
4445     );
4446    
4447     KSDDKAPI
4448     NTSTATUS
4449     NTAPI
4450     KsFreeObjectCreateItemsByContext(
4451     IN KSDEVICE_HEADER Header,
4452     IN PVOID Context
4453     );
4454    
4455     KSDDKAPI
4456     NTSTATUS
4457     NTAPI
4458     KsCreateDefaultSecurity(
4459     IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL,
4460     OUT PSECURITY_DESCRIPTOR* DefaultSecurity
4461     );
4462    
4463     KSDDKAPI
4464     NTSTATUS
4465     NTAPI
4466     KsForwardIrp(
4467     IN PIRP Irp,
4468     IN PFILE_OBJECT FileObject,
4469     IN BOOLEAN ReuseStackLocation
4470     );
4471    
4472     KSDDKAPI
4473     NTSTATUS
4474     NTAPI
4475     KsForwardAndCatchIrp(
4476     IN PDEVICE_OBJECT DeviceObject,
4477     IN PIRP Irp,
4478     IN PFILE_OBJECT FileObject,
4479     IN KSSTACK_USE StackUse
4480     );
4481    
4482     KSDDKAPI
4483     NTSTATUS
4484     NTAPI
4485     KsSynchronousIoControlDevice(
4486     IN PFILE_OBJECT FileObject,
4487     IN KPROCESSOR_MODE RequestorMode,
4488     IN ULONG IoControl,
4489     IN PVOID InBuffer,
4490     IN ULONG InSize,
4491     OUT PVOID OutBuffer,
4492     IN ULONG OutSize,
4493     OUT PULONG BytesReturned
4494     );
4495    
4496     KSDDKAPI
4497     NTSTATUS
4498     NTAPI
4499     KsUnserializeObjectPropertiesFromRegistry(
4500     IN PFILE_OBJECT FileObject,
4501     IN HANDLE ParentKey OPTIONAL,
4502     IN PUNICODE_STRING RegistryPath OPTIONAL
4503     );
4504    
4505     KSDDKAPI
4506     NTSTATUS
4507     NTAPI
4508     KsCacheMedium(
4509     IN PUNICODE_STRING SymbolicLink,
4510     IN PKSPIN_MEDIUM Medium,
4511     IN ULONG PinDirection
4512     );
4513    
4514     // thread.c:
4515    
4516     KSDDKAPI
4517     NTSTATUS
4518     NTAPI
4519     KsRegisterWorker(
4520     IN WORK_QUEUE_TYPE WorkQueueType,
4521     OUT PKSWORKER* Worker
4522     );
4523     KSDDKAPI
4524     NTSTATUS
4525     NTAPI
4526     KsRegisterCountedWorker(
4527     IN WORK_QUEUE_TYPE WorkQueueType,
4528     IN PWORK_QUEUE_ITEM CountedWorkItem,
4529     OUT PKSWORKER* Worker
4530     );
4531     KSDDKAPI
4532     VOID
4533     NTAPI
4534     KsUnregisterWorker(
4535     IN PKSWORKER Worker
4536     );
4537     KSDDKAPI
4538     NTSTATUS
4539     NTAPI
4540     KsQueueWorkItem(
4541     IN PKSWORKER Worker,
4542     IN PWORK_QUEUE_ITEM WorkItem
4543     );
4544     KSDDKAPI
4545     ULONG
4546     NTAPI
4547     KsIncrementCountedWorker(
4548     IN PKSWORKER Worker
4549     );
4550     KSDDKAPI
4551     ULONG
4552     NTAPI
4553     KsDecrementCountedWorker(
4554     IN PKSWORKER Worker
4555     );
4556    
4557     // topology.c:
4558    
4559     KSDDKAPI
4560     NTSTATUS
4561     NTAPI
4562     KsCreateTopologyNode(
4563     IN HANDLE ParentHandle,
4564     IN PKSNODE_CREATE NodeCreate,
4565     IN ACCESS_MASK DesiredAccess,
4566     OUT PHANDLE NodeHandle
4567     );
4568    
4569     KSDDKAPI
4570     NTSTATUS
4571     NTAPI
4572     KsValidateTopologyNodeCreateRequest(
4573     IN PIRP Irp,
4574     IN PKSTOPOLOGY Topology,
4575     OUT PKSNODE_CREATE* NodeCreate
4576     );
4577    
4578     KSDDKAPI
4579     NTSTATUS
4580     NTAPI
4581     KsMergeAutomationTables(
4582     OUT PKSAUTOMATION_TABLE* AutomationTableAB,
4583     IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
4584     IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
4585     IN KSOBJECT_BAG Bag OPTIONAL
4586     );
4587    
4588     KSDDKAPI
4589     NTSTATUS
4590     NTAPI
4591     KsInitializeDriver(
4592     IN PDRIVER_OBJECT DriverObject,
4593     IN PUNICODE_STRING RegistryPathName,
4594     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
4595     );
4596    
4597     KSDDKAPI
4598     NTSTATUS
4599     NTAPI
4600     KsAddDevice(
4601     IN PDRIVER_OBJECT DriverObject,
4602     IN PDEVICE_OBJECT PhysicalDeviceObject
4603     );
4604    
4605     KSDDKAPI
4606     NTSTATUS
4607     NTAPI
4608     KsCreateDevice(
4609     IN PDRIVER_OBJECT DriverObject,
4610     IN PDEVICE_OBJECT PhysicalDeviceObject,
4611     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
4612     IN ULONG ExtensionSize OPTIONAL,
4613     OUT PKSDEVICE* Device OPTIONAL
4614     );
4615    
4616     KSDDKAPI
4617     NTSTATUS
4618     NTAPI
4619     KsInitializeDevice(
4620     IN PDEVICE_OBJECT FunctionalDeviceObject,
4621     IN PDEVICE_OBJECT PhysicalDeviceObject,
4622     IN PDEVICE_OBJECT NextDeviceObject,
4623     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
4624     );
4625    
4626     KSDDKAPI
4627     void
4628     NTAPI
4629     KsTerminateDevice(
4630     IN PDEVICE_OBJECT DeviceObject
4631     );
4632    
4633     KSDDKAPI
4634     PKSDEVICE
4635     NTAPI
4636     KsGetDeviceForDeviceObject(
4637     IN PDEVICE_OBJECT FunctionalDeviceObject
4638     );
4639    
4640     KSDDKAPI
4641     void
4642     NTAPI
4643     KsAcquireDevice(
4644     IN PKSDEVICE Device
4645     );
4646    
4647     KSDDKAPI
4648     void
4649     NTAPI
4650     KsReleaseDevice(
4651     IN PKSDEVICE Device
4652     );
4653    
4654     KSDDKAPI
4655     void
4656     NTAPI
4657     KsDeviceRegisterAdapterObject(
4658     IN PKSDEVICE Device,
4659     IN PADAPTER_OBJECT AdapterObject,
4660     IN ULONG MaxMappingsByteCount,
4661     IN ULONG MappingTableStride
4662     );
4663    
4664     KSDDKAPI
4665     ULONG
4666     NTAPI
4667     KsDeviceGetBusData(
4668     IN PKSDEVICE Device,
4669     IN ULONG DataType,
4670     IN PVOID Buffer,
4671     IN ULONG Offset,
4672     IN ULONG Length
4673     );
4674    
4675     KSDDKAPI
4676     ULONG
4677     NTAPI
4678     KsDeviceSetBusData(
4679     IN PKSDEVICE Device,
4680     IN ULONG DataType,
4681     IN PVOID Buffer,
4682     IN ULONG Offset,
4683     IN ULONG Length
4684     );
4685    
4686     KSDDKAPI
4687     NTSTATUS
4688     NTAPI
4689     KsCreateFilterFactory(
4690     IN PDEVICE_OBJECT DeviceObject,
4691     IN const KSFILTER_DESCRIPTOR* Descriptor,
4692     IN PWCHAR RefString OPTIONAL,
4693     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
4694     IN ULONG CreateItemFlags,
4695     IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
4696     IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
4697     OUT PKSFILTERFACTORY* FilterFactory OPTIONAL
4698     );
4699    
4700     #define KsDeleteFilterFactory(FilterFactory) \
4701     KsFreeObjectCreateItemsByContext(\
4702     *(KSDEVICE_HEADER *)(\
4703     KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->\
4704     DeviceExtension),\
4705     FilterFactory)
4706    
4707     KSDDKAPI
4708     NTSTATUS
4709     NTAPI
4710     KsFilterFactoryAddCreateItem(
4711     IN PKSFILTERFACTORY FilterFactory,
4712     IN PWCHAR RefString,
4713     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
4714     IN ULONG CreateItemFlags
4715     );
4716    
4717     KSDDKAPI
4718     NTSTATUS
4719     NTAPI
4720     KsFilterFactorySetDeviceClassesState(
4721     IN PKSFILTERFACTORY FilterFactory,
4722     IN BOOLEAN NewState
4723     );
4724    
4725     KSDDKAPI
4726     PUNICODE_STRING
4727     NTAPI
4728     KsFilterFactoryGetSymbolicLink(
4729     IN PKSFILTERFACTORY FilterFactory
4730     );
4731    
4732     KSDDKAPI
4733     void
4734     NTAPI
4735     KsAddEvent(
4736     IN PVOID Object,
4737     IN PKSEVENT_ENTRY EventEntry
4738     );
4739    
4740     void _inline
4741     KsFilterAddEvent(
4742     IN PKSFILTER Filter,
4743     IN PKSEVENT_ENTRY EventEntry
4744     )
4745     {
4746     KsAddEvent(Filter,EventEntry);
4747     }
4748    
4749     void _inline
4750     KsPinAddEvent(
4751     IN PKSPIN Pin,
4752     IN PKSEVENT_ENTRY EventEntry
4753     )
4754     {
4755     KsAddEvent(Pin,EventEntry);
4756     }
4757    
4758     KSDDKAPI
4759     NTSTATUS
4760     NTAPI
4761     KsDefaultAddEventHandler(
4762     IN PIRP Irp,
4763     IN PKSEVENTDATA EventData,
4764     IN OUT PKSEVENT_ENTRY EventEntry
4765     );
4766    
4767     KSDDKAPI
4768     void
4769     NTAPI
4770     KsGenerateEvents(
4771     IN PVOID Object,
4772     IN const GUID* EventSet OPTIONAL,
4773     IN ULONG EventId,
4774     IN ULONG DataSize,
4775     IN PVOID Data OPTIONAL,
4776     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
4777     IN PVOID CallBackContext OPTIONAL
4778     );
4779    
4780     void _inline
4781     KsFilterGenerateEvents(
4782     IN PKSFILTER Filter,
4783     IN const GUID* EventSet OPTIONAL,
4784     IN ULONG EventId,
4785     IN ULONG DataSize,
4786     IN PVOID Data OPTIONAL,
4787     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
4788     IN PVOID CallBackContext OPTIONAL
4789     )
4790     {
4791     KsGenerateEvents(
4792     Filter,
4793     EventSet,
4794     EventId,
4795     DataSize,
4796     Data,
4797     CallBack,
4798     CallBackContext);
4799     }
4800    
4801     void _inline
4802     KsPinGenerateEvents(
4803     IN PKSPIN Pin,
4804     IN const GUID* EventSet OPTIONAL,
4805     IN ULONG EventId,
4806     IN ULONG DataSize,
4807     IN PVOID Data OPTIONAL,
4808     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
4809     IN PVOID CallBackContext OPTIONAL
4810     )
4811     {
4812     KsGenerateEvents(
4813     Pin,
4814     EventSet,
4815     EventId,
4816     DataSize,
4817     Data,
4818     CallBack,
4819     CallBackContext);
4820     }
4821    
4822     typedef enum {
4823     KSSTREAM_POINTER_STATE_UNLOCKED = 0,
4824     KSSTREAM_POINTER_STATE_LOCKED
4825     } KSSTREAM_POINTER_STATE;
4826    
4827     KSDDKAPI
4828     NTSTATUS
4829     NTAPI
4830     KsPinGetAvailableByteCount(
4831     IN PKSPIN Pin,
4832     OUT PLONG InputDataBytes OPTIONAL,
4833     OUT PLONG OutputBufferBytes OPTIONAL
4834     );
4835    
4836     KSDDKAPI
4837     PKSSTREAM_POINTER
4838     NTAPI
4839     KsPinGetLeadingEdgeStreamPointer(
4840     IN PKSPIN Pin,
4841     IN KSSTREAM_POINTER_STATE State
4842     );
4843    
4844     KSDDKAPI
4845     PKSSTREAM_POINTER
4846     NTAPI
4847     KsPinGetTrailingEdgeStreamPointer(
4848     IN PKSPIN Pin,
4849     IN KSSTREAM_POINTER_STATE State
4850     );
4851    
4852     KSDDKAPI
4853     NTSTATUS
4854     NTAPI
4855     KsStreamPointerLock(
4856     IN PKSSTREAM_POINTER StreamPointer
4857     );
4858    
4859     KSDDKAPI
4860     void
4861     NTAPI
4862     KsStreamPointerUnlock(
4863     IN PKSSTREAM_POINTER StreamPointer,
4864     IN BOOLEAN Eject
4865     );
4866    
4867     KSDDKAPI
4868     void
4869     NTAPI
4870     KsStreamPointerAdvanceOffsetsAndUnlock(
4871     IN PKSSTREAM_POINTER StreamPointer,
4872     IN ULONG InUsed,
4873     IN ULONG OutUsed,
4874     IN BOOLEAN Eject
4875     );
4876    
4877     KSDDKAPI
4878     void
4879     NTAPI
4880     KsStreamPointerDelete(
4881     IN PKSSTREAM_POINTER StreamPointer
4882     );
4883    
4884     KSDDKAPI
4885     NTSTATUS
4886     NTAPI
4887     KsStreamPointerClone(
4888     IN PKSSTREAM_POINTER StreamPointer,
4889     IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL,
4890     IN ULONG ContextSize,
4891     OUT PKSSTREAM_POINTER* CloneStreamPointer
4892     );
4893    
4894     KSDDKAPI
4895     NTSTATUS
4896     NTAPI
4897     KsStreamPointerAdvanceOffsets(
4898     IN PKSSTREAM_POINTER StreamPointer,
4899     IN ULONG InUsed,
4900     IN ULONG OutUsed,
4901     IN BOOLEAN Eject
4902     );
4903    
4904     KSDDKAPI
4905     NTSTATUS
4906     NTAPI
4907     KsStreamPointerAdvance(
4908     IN PKSSTREAM_POINTER StreamPointer
4909     );
4910    
4911     KSDDKAPI
4912     PMDL
4913     NTAPI
4914     KsStreamPointerGetMdl(
4915     IN PKSSTREAM_POINTER StreamPointer
4916     );
4917    
4918     KSDDKAPI
4919     PIRP
4920     NTAPI
4921     KsStreamPointerGetIrp(
4922     IN PKSSTREAM_POINTER StreamPointer,
4923     OUT PBOOLEAN FirstFrameInIrp OPTIONAL,
4924     OUT PBOOLEAN LastFrameInIrp OPTIONAL
4925     );
4926    
4927     KSDDKAPI
4928     void
4929     NTAPI
4930     KsStreamPointerScheduleTimeout(
4931     IN PKSSTREAM_POINTER StreamPointer,
4932     IN PFNKSSTREAMPOINTER Callback,
4933     IN ULONGLONG Interval
4934     );
4935    
4936     KSDDKAPI
4937     void
4938     NTAPI
4939     KsStreamPointerCancelTimeout(
4940     IN PKSSTREAM_POINTER StreamPointer
4941     );
4942    
4943     KSDDKAPI
4944     PKSSTREAM_POINTER
4945     NTAPI
4946     KsPinGetFirstCloneStreamPointer(
4947     IN PKSPIN Pin
4948     );
4949    
4950     KSDDKAPI
4951     PKSSTREAM_POINTER
4952     NTAPI
4953     KsStreamPointerGetNextClone(
4954     IN PKSSTREAM_POINTER StreamPointer
4955     );
4956    
4957     KSDDKAPI
4958     NTSTATUS
4959     NTAPI
4960     KsPinHandshake(
4961     IN PKSPIN Pin,
4962     IN PKSHANDSHAKE In,
4963     OUT PKSHANDSHAKE Out
4964     );
4965    
4966     KSDDKAPI
4967     void
4968     NTAPI
4969     KsCompletePendingRequest(
4970     IN PIRP Irp
4971     );
4972    
4973     KSDDKAPI
4974     KSOBJECTTYPE
4975     NTAPI
4976     KsGetObjectTypeFromIrp(
4977     IN PIRP Irp
4978     );
4979    
4980     KSDDKAPI
4981     PVOID
4982     NTAPI
4983     KsGetObjectFromFileObject(
4984     IN PFILE_OBJECT FileObject
4985     );
4986    
4987     KSDDKAPI
4988     KSOBJECTTYPE
4989     NTAPI
4990     KsGetObjectTypeFromFileObject(
4991     IN PFILE_OBJECT FileObject
4992     );
4993    
4994     PKSFILTER __inline
4995     KsGetFilterFromFileObject(
4996     IN PFILE_OBJECT FileObject
4997     )
4998     {
4999     return (PKSFILTER) KsGetObjectFromFileObject(FileObject);
5000     }
5001    
5002     PKSPIN __inline
5003     KsGetPinFromFileObject(
5004     IN PFILE_OBJECT FileObject
5005     )
5006     {
5007     return (PKSPIN) KsGetObjectFromFileObject(FileObject);
5008     }
5009    
5010     KSDDKAPI
5011     PKSGATE
5012     NTAPI
5013     KsFilterGetAndGate(
5014     IN PKSFILTER Filter
5015     );
5016    
5017     KSDDKAPI
5018     void
5019     NTAPI
5020     KsFilterAcquireProcessingMutex(
5021     IN PKSFILTER Filter
5022     );
5023    
5024     KSDDKAPI
5025     void
5026     NTAPI
5027     KsFilterReleaseProcessingMutex(
5028     IN PKSFILTER Filter
5029     );
5030    
5031     KSDDKAPI
5032     void
5033     NTAPI
5034     KsFilterAttemptProcessing(
5035     IN PKSFILTER Filter,
5036     IN BOOLEAN Asynchronous
5037     );
5038    
5039     KSDDKAPI
5040     PKSGATE
5041     NTAPI
5042     KsPinGetAndGate(
5043     IN PKSPIN Pin
5044     );
5045    
5046     KSDDKAPI
5047     void
5048     NTAPI
5049     KsPinAttachAndGate(
5050     IN PKSPIN Pin,
5051     IN PKSGATE AndGate OPTIONAL
5052     );
5053    
5054     KSDDKAPI
5055     void
5056     NTAPI
5057     KsPinAttachOrGate(
5058     IN PKSPIN Pin,
5059     IN PKSGATE OrGate OPTIONAL
5060     );
5061    
5062     KSDDKAPI
5063     void
5064     NTAPI
5065     KsPinAcquireProcessingMutex(
5066     IN PKSPIN Pin
5067     );
5068    
5069     KSDDKAPI
5070     void
5071     NTAPI
5072     KsPinReleaseProcessingMutex(
5073     IN PKSPIN Pin
5074     );
5075    
5076     KSDDKAPI
5077     BOOLEAN
5078     NTAPI
5079     KsProcessPinUpdate(
5080     IN PKSPROCESSPIN ProcessPin
5081     );
5082    
5083     KSDDKAPI
5084     void
5085     NTAPI
5086     KsPinAttemptProcessing(
5087     IN PKSPIN Pin,
5088     IN BOOLEAN Asynchronous
5089     );
5090    
5091     KSDDKAPI
5092     PVOID
5093     NTAPI
5094     KsGetParent(
5095     IN PVOID Object
5096     );
5097    
5098     PKSDEVICE __inline
5099     KsFilterFactoryGetParentDevice(
5100     IN PKSFILTERFACTORY FilterFactory
5101     )
5102     {
5103     return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
5104     }
5105    
5106     PKSFILTERFACTORY __inline
5107     KsFilterGetParentFilterFactory(
5108     IN PKSFILTER Filter
5109     )
5110     {
5111     return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
5112     }
5113    
5114     KSDDKAPI
5115     PKSFILTER
5116     NTAPI
5117     KsPinGetParentFilter(
5118     IN PKSPIN Pin
5119     );
5120    
5121     KSDDKAPI
5122     PVOID
5123     NTAPI
5124     KsGetFirstChild(
5125     IN PVOID Object
5126     );
5127    
5128     PKSFILTERFACTORY __inline
5129     KsDeviceGetFirstChildFilterFactory(
5130     IN PKSDEVICE Device
5131     )
5132     {
5133     return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device);
5134     }
5135    
5136     PKSFILTER __inline
5137     KsFilterFactoryGetFirstChildFilter(
5138     IN PKSFILTERFACTORY FilterFactory
5139     )
5140     {
5141     return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory);
5142     }
5143    
5144     KSDDKAPI
5145     ULONG
5146     NTAPI
5147     KsFilterGetChildPinCount(
5148     IN PKSFILTER Filter,
5149     IN ULONG PinId
5150     );
5151    
5152     KSDDKAPI
5153     PKSPIN
5154     NTAPI
5155     KsFilterGetFirstChildPin(
5156     IN PKSFILTER Filter,
5157     IN ULONG PinId
5158     );
5159    
5160     KSDDKAPI
5161     PVOID
5162     NTAPI
5163     KsGetNextSibling(
5164     IN PVOID Object
5165     );
5166    
5167     KSDDKAPI
5168     PKSPIN
5169     NTAPI
5170     KsPinGetNextSiblingPin(
5171     IN PKSPIN Pin
5172     );
5173    
5174     PKSFILTERFACTORY __inline
5175     KsFilterFactoryGetNextSiblingFilterFactory(
5176     IN PKSFILTERFACTORY FilterFactory
5177     )
5178     {
5179     return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory);
5180     }
5181    
5182     PKSFILTER __inline
5183     KsFilterGetNextSiblingFilter(
5184     IN PKSFILTER Filter
5185     )
5186     {
5187     return (PKSFILTER) KsGetNextSibling((PVOID) Filter);
5188     }
5189    
5190    
5191     KSDDKAPI
5192     PKSDEVICE
5193     NTAPI
5194     KsGetDevice(
5195     IN PVOID Object
5196     );
5197    
5198     PKSDEVICE __inline
5199     KsFilterFactoryGetDevice(
5200     IN PKSFILTERFACTORY FilterFactory
5201     )
5202     {
5203     return KsGetDevice((PVOID) FilterFactory);
5204     }
5205    
5206     PKSDEVICE __inline
5207     KsFilterGetDevice(
5208     IN PKSFILTER Filter
5209     )
5210     {
5211     return KsGetDevice((PVOID) Filter);
5212     }
5213    
5214     PKSDEVICE __inline
5215     KsPinGetDevice(
5216     IN PKSPIN Pin
5217     )
5218     {
5219     return KsGetDevice((PVOID) Pin);
5220     }
5221    
5222     KSDDKAPI
5223     PKSFILTER
5224     NTAPI
5225     KsGetFilterFromIrp(
5226     IN PIRP Irp
5227     );
5228    
5229     KSDDKAPI
5230     PKSPIN
5231     NTAPI
5232     KsGetPinFromIrp(
5233     IN PIRP Irp
5234     );
5235    
5236     KSDDKAPI
5237     ULONG
5238     NTAPI
5239     KsGetNodeIdFromIrp(
5240     IN PIRP Irp
5241     );
5242    
5243     KSDDKAPI
5244     void
5245     NTAPI
5246     KsAcquireControl(
5247     IN PVOID Object
5248     );
5249    
5250     KSDDKAPI
5251     void
5252     NTAPI
5253     KsReleaseControl(
5254     IN PVOID Object
5255     );
5256    
5257     void __inline
5258     KsFilterAcquireControl(
5259     IN PKSFILTER Filter
5260     )
5261     {
5262     KsAcquireControl((PVOID) Filter);
5263     }
5264    
5265     void __inline
5266     KsFilterReleaseControl(
5267     IN PKSFILTER Filter
5268     )
5269     {
5270     KsReleaseControl((PVOID) Filter);
5271     }
5272    
5273     void __inline
5274     KsPinAcquireControl(
5275     IN PKSPIN Pin
5276     )
5277     {
5278     KsAcquireControl((PVOID) Pin);
5279     }
5280    
5281     void __inline
5282     KsPinReleaseControl(
5283     IN PKSPIN Pin
5284     )
5285     {
5286     KsReleaseControl((PVOID) Pin);
5287     }
5288    
5289     KSDDKAPI
5290     NTSTATUS
5291     NTAPI
5292     KsAddItemToObjectBag(
5293     IN KSOBJECT_BAG ObjectBag,
5294     IN PVOID Item,
5295     IN PFNKSFREE Free OPTIONAL
5296     );
5297    
5298     KSDDKAPI
5299     ULONG
5300     NTAPI
5301     KsRemoveItemFromObjectBag(
5302     IN KSOBJECT_BAG ObjectBag,
5303     IN PVOID Item,
5304     IN BOOLEAN Free
5305     );
5306    
5307     #define KsDiscard(Object,Pointer)\
5308     KsRemoveItemFromObjectBag(\
5309     (Object)->Bag,\
5310     (PVOID)(Pointer),\
5311     TRUE)
5312    
5313     KSDDKAPI
5314     NTSTATUS
5315     NTAPI
5316     KsAllocateObjectBag(
5317     IN PKSDEVICE Device,
5318     OUT KSOBJECT_BAG* ObjectBag
5319     );
5320    
5321     KSDDKAPI
5322     void
5323     NTAPI
5324     KsFreeObjectBag(
5325     IN KSOBJECT_BAG ObjectBag
5326     );
5327    
5328     KSDDKAPI
5329     NTSTATUS
5330     NTAPI
5331     KsCopyObjectBagItems(
5332     IN KSOBJECT_BAG ObjectBagDestination,
5333     IN KSOBJECT_BAG ObjectBagSource
5334     );
5335    
5336     KSDDKAPI
5337     NTSTATUS
5338     NTAPI
5339     _KsEdit(
5340     IN KSOBJECT_BAG ObjectBag,
5341     IN OUT PVOID* PointerToPointerToItem,
5342     IN ULONG NewSize,
5343     IN ULONG OldSize,
5344     IN ULONG Tag
5345     );
5346    
5347     #define KsEdit(Object,PointerToPointer,Tag)\
5348     _KsEdit(\
5349     (Object)->Bag,\
5350     (PVOID*)(PointerToPointer),\
5351     sizeof(**(PointerToPointer)),\
5352     sizeof(**(PointerToPointer)),\
5353     (Tag))
5354     #define KsEditSized(Object,PointerToPointer,NewSize,OldSize,Tag)\
5355     _KsEdit((Object)->Bag,(PVOID*)(PointerToPointer),(NewSize),(OldSize),(Tag))
5356    
5357     KSDDKAPI
5358     NTSTATUS
5359     NTAPI
5360     KsRegisterFilterWithNoKSPins(
5361     IN PDEVICE_OBJECT DeviceObject,
5362     IN const GUID * InterfaceClassGUID,
5363     IN ULONG PinCount,
5364     IN BOOL * PinDirection,
5365     IN KSPIN_MEDIUM * MediumList,
5366     IN OPTIONAL GUID * CategoryList
5367     );
5368    
5369     KSDDKAPI
5370     NTSTATUS
5371     NTAPI
5372     KsFilterCreatePinFactory (
5373     IN PKSFILTER Filter,
5374     IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
5375     OUT PULONG PinID
5376     );
5377    
5378     KSDDKAPI
5379     NTSTATUS
5380     NTAPI
5381     KsFilterCreateNode (
5382     IN PKSFILTER Filter,
5383     IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
5384     OUT PULONG NodeID
5385     );
5386    
5387     KSDDKAPI
5388     NTSTATUS
5389     NTAPI
5390     KsFilterAddTopologyConnections (
5391     IN PKSFILTER Filter,
5392     IN ULONG NewConnectionsCount,
5393     IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections
5394     );
5395    
5396     KSDDKAPI
5397     NTSTATUS
5398     NTAPI
5399     KsPinGetConnectedPinInterface(
5400     IN PKSPIN Pin,
5401     IN const GUID* InterfaceId,
5402     OUT PVOID* Interface
5403     );
5404    
5405     KSDDKAPI
5406     PFILE_OBJECT
5407     NTAPI
5408     KsPinGetConnectedPinFileObject(
5409     IN PKSPIN Pin
5410     );
5411    
5412     KSDDKAPI
5413     NTSTATUS
5414     NTAPI
5415     KsPinGetConnectedFilterInterface(
5416     IN PKSPIN Pin,
5417     IN const GUID* InterfaceId,
5418     OUT PVOID* Interface
5419     );
5420    
5421     #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
5422    
5423     KSDDKAPI
5424     NTSTATUS
5425     NTAPI
5426     KsPinGetReferenceClockInterface(
5427     IN PKSPIN Pin,
5428     OUT PIKSREFERENCECLOCK* Interface
5429     );
5430    
5431     #endif //defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
5432    
5433     KSDDKAPI
5434     VOID
5435     NTAPI
5436     KsPinSetPinClockTime(
5437     IN PKSPIN Pin,
5438     IN LONGLONG Time
5439     );
5440    
5441     KSDDKAPI
5442     NTSTATUS
5443     NTAPI
5444     KsPinSubmitFrame(
5445     IN PKSPIN Pin,
5446     IN PVOID Data OPTIONAL,
5447     IN ULONG Size OPTIONAL,
5448     IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
5449     IN PVOID Context OPTIONAL
5450     );
5451    
5452     KSDDKAPI
5453     NTSTATUS
5454     NTAPI
5455     KsPinSubmitFrameMdl(
5456     IN PKSPIN Pin,
5457     IN PMDL Mdl OPTIONAL,
5458     IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
5459     IN PVOID Context OPTIONAL
5460     );
5461    
5462     KSDDKAPI
5463     void
5464     NTAPI
5465     KsPinRegisterFrameReturnCallback(
5466     IN PKSPIN Pin,
5467     IN PFNKSPINFRAMERETURN FrameReturn
5468     );
5469    
5470     KSDDKAPI
5471     void
5472     NTAPI
5473     KsPinRegisterHandshakeCallback(
5474     IN PKSPIN Pin,
5475     IN PFNKSPINHANDSHAKE Handshake
5476     );
5477    
5478     KSDDKAPI
5479     void
5480     NTAPI
5481     KsFilterRegisterPowerCallbacks(
5482     IN PKSFILTER Filter,
5483     IN PFNKSFILTERPOWER Sleep OPTIONAL,
5484     IN PFNKSFILTERPOWER Wake OPTIONAL
5485     );
5486    
5487     KSDDKAPI
5488     void
5489     NTAPI
5490     KsPinRegisterPowerCallbacks(
5491     IN PKSPIN Pin,
5492     IN PFNKSPINPOWER Sleep OPTIONAL,
5493     IN PFNKSPINPOWER Wake OPTIONAL
5494     );
5495    
5496     #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
5497    
5498     KSDDKAPI
5499     PUNKNOWN
5500     NTAPI
5501     KsRegisterAggregatedClientUnknown(
5502     IN PVOID Object,
5503     IN PUNKNOWN ClientUnknown
5504     );
5505    
5506     KSDDKAPI
5507     PUNKNOWN
5508     NTAPI
5509     KsGetOuterUnknown(
5510     IN PVOID Object
5511     );
5512    
5513     PUNKNOWN __inline
5514     KsDeviceRegisterAggregatedClientUnknown(
5515     IN PKSDEVICE Device,
5516     IN PUNKNOWN ClientUnknown
5517     )
5518     {
5519     return KsRegisterAggregatedClientUnknown((PVOID) Device,ClientUnknown);
5520     }
5521    
5522     PUNKNOWN __inline
5523     KsDeviceGetOuterUnknown(
5524     IN PKSDEVICE Device
5525     )
5526     {
5527     return KsGetOuterUnknown((PVOID) Device);
5528     }
5529    
5530     PUNKNOWN __inline
5531     KsFilterFactoryRegisterAggregatedClientUnknown(
5532     IN PKSFILTERFACTORY FilterFactory,
5533     IN PUNKNOWN ClientUnknown
5534     )
5535     {
5536     return KsRegisterAggregatedClientUnknown((PVOID) FilterFactory,ClientUnknown);
5537     }
5538    
5539     PUNKNOWN __inline
5540     KsFilterFactoryGetOuterUnknown(
5541     IN PKSFILTERFACTORY FilterFactory
5542     )
5543     {
5544     return KsGetOuterUnknown((PVOID) FilterFactory);
5545     }
5546    
5547     PUNKNOWN __inline
5548     KsFilterRegisterAggregatedClientUnknown(
5549     IN PKSFILTER Filter,
5550     IN PUNKNOWN ClientUnknown
5551     )
5552     {
5553     return KsRegisterAggregatedClientUnknown((PVOID) Filter,ClientUnknown);
5554     }
5555    
5556     PUNKNOWN __inline
5557     KsFilterGetOuterUnknown(
5558     IN PKSFILTER Filter
5559     )
5560     {
5561     return KsGetOuterUnknown((PVOID) Filter);
5562     }
5563    
5564     PUNKNOWN __inline
5565     KsPinRegisterAggregatedClientUnknown(
5566     IN PKSPIN Pin,
5567     IN PUNKNOWN ClientUnknown
5568     )
5569     {
5570     return KsRegisterAggregatedClientUnknown((PVOID) Pin,ClientUnknown);
5571     }
5572    
5573     PUNKNOWN __inline
5574     KsPinGetOuterUnknown(
5575     IN PKSPIN Pin
5576     )
5577     {
5578     return KsGetOuterUnknown((PVOID) Pin);
5579     }
5580    
5581     #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
5582    
5583     #else // !defined(_NTDDK_)
5584    
5585     #if !defined( KS_NO_CREATE_FUNCTIONS )
5586    
5587     KSDDKAPI
5588     DWORD
5589     WINAPI
5590     KsCreateAllocator(
5591     IN HANDLE ConnectionHandle,
5592     IN PKSALLOCATOR_FRAMING AllocatorFraming,
5593     OUT PHANDLE AllocatorHandle
5594     );
5595    
5596     KSDDKAPI
5597     DWORD
5598     NTAPI
5599     KsCreateClock(
5600     IN HANDLE ConnectionHandle,
5601     IN PKSCLOCK_CREATE ClockCreate,
5602     OUT PHANDLE ClockHandle
5603     );
5604    
5605     KSDDKAPI
5606     DWORD
5607     WINAPI
5608     KsCreatePin(
5609     IN HANDLE FilterHandle,
5610     IN PKSPIN_CONNECT Connect,
5611     IN ACCESS_MASK DesiredAccess,
5612     OUT PHANDLE ConnectionHandle
5613     );
5614    
5615     KSDDKAPI
5616     DWORD
5617     WINAPI
5618     KsCreateTopologyNode(
5619     IN HANDLE ParentHandle,
5620     IN PKSNODE_CREATE NodeCreate,
5621     IN ACCESS_MASK DesiredAccess,
5622     OUT PHANDLE NodeHandle
5623     );
5624    
5625     #endif
5626    
5627     #endif // !defined(_NTDDK_)
5628    
5629     #if defined(__cplusplus)
5630     }
5631     #endif // defined(__cplusplus)
5632    
5633     #endif // !_KS_

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26