/** * This file has no copyright assigned and is placed in the Public Domain. * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ #ifndef _KS_ #define _KS_ #ifdef __TCS__ #define _KS_NO_ANONYMOUS_STRUCTURES_ 1 #endif #ifdef _KS_NO_ANONYMOUS_STRUCTURES_ #define _KS_ANON_STRUCT(X) struct X #else #define _KS_ANON_STRUCT(X) __C89_NAMELESS struct #endif #ifndef _NTRTL_ #ifndef DEFINE_GUIDEX #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name #endif #ifndef STATICGUIDOF #define STATICGUIDOF(guid) STATIC_##guid #endif #endif /* _NTRTL_ */ #ifndef SIZEOF_ARRAY #define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0])) #endif #define DEFINE_GUIDSTRUCT(g,n) DEFINE_GUIDEX(n) #define DEFINE_GUIDNAMED(n) n #define STATIC_GUID_NULL \ 0x00000000,0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000",GUID_NULL); #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL) #define IOCTL_KS_PROPERTY CTL_CODE(FILE_DEVICE_KS,0x000,METHOD_NEITHER,FILE_ANY_ACCESS) #define IOCTL_KS_ENABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x001,METHOD_NEITHER,FILE_ANY_ACCESS) #define IOCTL_KS_DISABLE_EVENT CTL_CODE(FILE_DEVICE_KS,0x002,METHOD_NEITHER,FILE_ANY_ACCESS) #define IOCTL_KS_METHOD CTL_CODE(FILE_DEVICE_KS,0x003,METHOD_NEITHER,FILE_ANY_ACCESS) #define IOCTL_KS_WRITE_STREAM CTL_CODE(FILE_DEVICE_KS,0x004,METHOD_NEITHER,FILE_WRITE_ACCESS) #define IOCTL_KS_READ_STREAM CTL_CODE(FILE_DEVICE_KS,0x005,METHOD_NEITHER,FILE_READ_ACCESS) #define IOCTL_KS_RESET_STATE CTL_CODE(FILE_DEVICE_KS,0x006,METHOD_NEITHER,FILE_ANY_ACCESS) typedef enum { KSRESET_BEGIN, KSRESET_END } KSRESET; typedef enum { KSSTATE_STOP, KSSTATE_ACQUIRE, KSSTATE_PAUSE, KSSTATE_RUN } KSSTATE,*PKSSTATE; #define KSPRIORITY_LOW 0x00000001 #define KSPRIORITY_NORMAL 0x40000000 #define KSPRIORITY_HIGH 0x80000000 #define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF typedef struct { ULONG PriorityClass; ULONG PrioritySubClass; } KSPRIORITY,*PKSPRIORITY; typedef struct { __C89_NAMELESS union { _KS_ANON_STRUCT(_IDENTIFIER) { GUID Set; ULONG Id; ULONG Flags; }; LONGLONG Alignment; }; } KSIDENTIFIER,*PKSIDENTIFIER; typedef KSIDENTIFIER KSPROPERTY,*PKSPROPERTY,KSMETHOD,*PKSMETHOD,KSEVENT,*PKSEVENT; #define KSMETHOD_TYPE_NONE 0x00000000 #define KSMETHOD_TYPE_READ 0x00000001 #define KSMETHOD_TYPE_WRITE 0x00000002 #define KSMETHOD_TYPE_MODIFY 0x00000003 #define KSMETHOD_TYPE_SOURCE 0x00000004 #define KSMETHOD_TYPE_SEND 0x00000001 #define KSMETHOD_TYPE_SETSUPPORT 0x00000100 #define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 #define KSMETHOD_TYPE_TOPOLOGY 0x10000000 #define KSPROPERTY_TYPE_GET 0x00000001 #define KSPROPERTY_TYPE_SET 0x00000002 #define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 #define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 #define KSPROPERTY_TYPE_RELATIONS 0x00000400 #define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 #define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 #define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 #define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 #define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 #define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 typedef struct { KSPROPERTY Property; ULONG NodeId; ULONG Reserved; } KSP_NODE,*PKSP_NODE; typedef struct { KSMETHOD Method; ULONG NodeId; ULONG Reserved; } KSM_NODE,*PKSM_NODE; typedef struct { KSEVENT Event; ULONG NodeId; ULONG Reserved; } KSE_NODE,*PKSE_NODE; #define STATIC_KSPROPTYPESETID_General \ 0x97E99BA0,0xBDEA,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000",KSPROPTYPESETID_General); #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General) #if defined(_NTDDK_) #include <psdk_inc/_varenum.h> #endif typedef struct { ULONG Size; ULONG Count; } KSMULTIPLE_ITEM,*PKSMULTIPLE_ITEM; typedef struct { ULONG AccessFlags; ULONG DescriptionSize; KSIDENTIFIER PropTypeSet; ULONG MembersListCount; ULONG Reserved; } KSPROPERTY_DESCRIPTION,*PKSPROPERTY_DESCRIPTION; #define KSPROPERTY_MEMBER_RANGES 0x00000001 #define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 #define KSPROPERTY_MEMBER_VALUES 0x00000003 #define KSPROPERTY_MEMBER_FLAG_DEFAULT 0x00000001 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 0x00000002 #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 0x00000004 typedef struct { ULONG MembersFlags; ULONG MembersSize; ULONG MembersCount; ULONG Flags; } KSPROPERTY_MEMBERSHEADER,*PKSPROPERTY_MEMBERSHEADER; typedef union { _KS_ANON_STRUCT(_SIGNED) { LONG SignedMinimum; LONG SignedMaximum; }; _KS_ANON_STRUCT(_UNSIGNED) { ULONG UnsignedMinimum; ULONG UnsignedMaximum; }; } KSPROPERTY_BOUNDS_LONG,*PKSPROPERTY_BOUNDS_LONG; typedef union { _KS_ANON_STRUCT(_SIGNED64) { LONGLONG SignedMinimum; LONGLONG SignedMaximum; }; _KS_ANON_STRUCT(_UNSIGNED64) { DWORDLONG UnsignedMinimum; DWORDLONG UnsignedMaximum; }; } KSPROPERTY_BOUNDS_LONGLONG,*PKSPROPERTY_BOUNDS_LONGLONG; typedef struct { ULONG SteppingDelta; ULONG Reserved; KSPROPERTY_BOUNDS_LONG Bounds; } KSPROPERTY_STEPPING_LONG,*PKSPROPERTY_STEPPING_LONG; typedef struct { DWORDLONG SteppingDelta; KSPROPERTY_BOUNDS_LONGLONG Bounds; } KSPROPERTY_STEPPING_LONGLONG,*PKSPROPERTY_STEPPING_LONGLONG; #if defined(_NTDDK_) typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR; typedef struct _KSDEVICE_DISPATCH KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; typedef struct _KSDEVICE KSDEVICE, *PKSDEVICE; typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR; typedef struct _KSFILTER_DISPATCH KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; typedef struct _KSFILTER KSFILTER, *PKSFILTER; typedef struct _KSPIN_DESCRIPTOR_EX KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; typedef struct _KSPIN_DISPATCH KSPIN_DISPATCH, *PKSPIN_DISPATCH; typedef struct _KSCLOCK_DISPATCH KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH; typedef struct _KSALLOCATOR_DISPATCH KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH; typedef struct _KSPIN KSPIN, *PKSPIN; typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR; typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET; typedef struct _KSSTREAM_POINTER KSSTREAM_POINTER, *PKSSTREAM_POINTER; typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING; typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN; typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; #endif /* _NTDDK_ */ typedef PVOID PKSWORKER; typedef struct { ULONG NotificationType; __C89_NAMELESS union { struct { HANDLE Event; ULONG_PTR Reserved[2]; } EventHandle; struct { HANDLE Semaphore; ULONG Reserved; LONG Adjustment; } SemaphoreHandle; #if defined(_NTDDK_) struct { PVOID Event; KPRIORITY Increment; ULONG_PTR Reserved; } EventObject; struct { PVOID Semaphore; KPRIORITY Increment; LONG Adjustment; } SemaphoreObject; struct { PKDPC Dpc; ULONG ReferenceCount; ULONG_PTR Reserved; } Dpc; struct { PWORK_QUEUE_ITEM WorkQueueItem; WORK_QUEUE_TYPE WorkQueueType; ULONG_PTR Reserved; } WorkItem; struct { PWORK_QUEUE_ITEM WorkQueueItem; PKSWORKER KsWorkerObject; ULONG_PTR Reserved; } KsWorkItem; #endif /* _NTDDK_ */ struct { PVOID Unused; LONG_PTR Alignment[2]; } Alignment; }; } KSEVENTDATA,*PKSEVENTDATA; #define KSEVENTF_EVENT_HANDLE 0x00000001 #define KSEVENTF_SEMAPHORE_HANDLE 0x00000002 #if defined(_NTDDK_) #define KSEVENTF_EVENT_OBJECT 0x00000004 #define KSEVENTF_SEMAPHORE_OBJECT 0x00000008 #define KSEVENTF_DPC 0x00000010 #define KSEVENTF_WORKITEM 0x00000020 #define KSEVENTF_KSWORKITEM 0x00000080 #endif /* _NTDDK_ */ #define KSEVENT_TYPE_ENABLE 0x00000001 #define KSEVENT_TYPE_ONESHOT 0x00000002 #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004 #define KSEVENT_TYPE_SETSUPPORT 0x00000100 #define KSEVENT_TYPE_BASICSUPPORT 0x00000200 #define KSEVENT_TYPE_QUERYBUFFER 0x00000400 #define KSEVENT_TYPE_TOPOLOGY 0x10000000 typedef struct { KSEVENT Event; PKSEVENTDATA EventData; PVOID Reserved; } KSQUERYBUFFER,*PKSQUERYBUFFER; typedef struct { ULONG Size; ULONG Flags; __C89_NAMELESS union { HANDLE ObjectHandle; PVOID ObjectPointer; }; PVOID Reserved; KSEVENT Event; KSEVENTDATA EventData; } KSRELATIVEEVENT; #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 typedef struct { KSEVENTDATA EventData; LONGLONG MarkTime; } KSEVENT_TIME_MARK,*PKSEVENT_TIME_MARK; typedef struct { KSEVENTDATA EventData; LONGLONG TimeBase; LONGLONG Interval; } KSEVENT_TIME_INTERVAL,*PKSEVENT_TIME_INTERVAL; typedef struct { LONGLONG TimeBase; LONGLONG Interval; } KSINTERVAL,*PKSINTERVAL; #define STATIC_KSPROPSETID_General \ 0x1464EDA5,0x6A8F,0x11D1,0x9A,0xA7,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196",KSPROPSETID_General); #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General) typedef enum { KSPROPERTY_GENERAL_COMPONENTID } KSPROPERTY_GENERAL; typedef struct { GUID Manufacturer; GUID Product; GUID Component; GUID Name; ULONG Version; ULONG Revision; } KSCOMPONENTID,*PKSCOMPONENTID; #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_GENERAL_COMPONENTID, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSCOMPONENTID), \ NULL, NULL, 0, NULL, NULL, 0) #define STATIC_KSMETHODSETID_StreamIo \ 0x65D003CA,0x1523,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196",KSMETHODSETID_StreamIo); #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo) typedef enum { KSMETHOD_STREAMIO_READ, KSMETHOD_STREAMIO_WRITE } KSMETHOD_STREAMIO; #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler) \ DEFINE_KSMETHOD_ITEM( \ KSMETHOD_STREAMIO_READ, \ KSMETHOD_TYPE_WRITE, \ (Handler), \ sizeof(KSMETHOD), \ 0, \ NULL) #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler) \ DEFINE_KSMETHOD_ITEM( \ KSMETHOD_STREAMIO_WRITE, \ KSMETHOD_TYPE_READ, \ (Handler), \ sizeof(KSMETHOD), \ 0, \ NULL) #define STATIC_KSPROPSETID_MediaSeeking \ 0xEE904F0C,0xD09B,0x11D0,0xAB,0xE9,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196",KSPROPSETID_MediaSeeking); #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) typedef enum { KSPROPERTY_MEDIASEEKING_CAPABILITIES, KSPROPERTY_MEDIASEEKING_FORMATS, KSPROPERTY_MEDIASEEKING_TIMEFORMAT, KSPROPERTY_MEDIASEEKING_POSITION, KSPROPERTY_MEDIASEEKING_STOPPOSITION, KSPROPERTY_MEDIASEEKING_POSITIONS, KSPROPERTY_MEDIASEEKING_DURATION, KSPROPERTY_MEDIASEEKING_AVAILABLE, KSPROPERTY_MEDIASEEKING_PREROLL, KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT } KSPROPERTY_MEDIASEEKING; typedef enum { KS_SEEKING_NoPositioning, KS_SEEKING_AbsolutePositioning, KS_SEEKING_RelativePositioning, KS_SEEKING_IncrementalPositioning, KS_SEEKING_PositioningBitsMask = 0x3, KS_SEEKING_SeekToKeyFrame, KS_SEEKING_ReturnTime = 0x8 } KS_SEEKING_FLAGS; typedef enum { KS_SEEKING_CanSeekAbsolute = 0x1, KS_SEEKING_CanSeekForwards = 0x2, KS_SEEKING_CanSeekBackwards = 0x4, KS_SEEKING_CanGetCurrentPos = 0x8, KS_SEEKING_CanGetStopPos = 0x10, KS_SEEKING_CanGetDuration = 0x20, KS_SEEKING_CanPlayBackwards = 0x40 } KS_SEEKING_CAPABILITIES; typedef struct { LONGLONG Current; LONGLONG Stop; KS_SEEKING_FLAGS CurrentFlags; KS_SEEKING_FLAGS StopFlags; } KSPROPERTY_POSITIONS,*PKSPROPERTY_POSITIONS; typedef struct { LONGLONG Earliest; LONGLONG Latest; } KSPROPERTY_MEDIAAVAILABLE,*PKSPROPERTY_MEDIAAVAILABLE; typedef struct { KSPROPERTY Property; GUID SourceFormat; GUID TargetFormat; LONGLONG Time; } KSP_TIMEFORMAT,*PKSP_TIMEFORMAT; #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_CAPABILITIES, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KS_SEEKING_CAPABILITIES), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_FORMATS, \ (Handler), \ sizeof(KSPROPERTY), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_TIMEFORMAT, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(GUID), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_POSITION, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_STOPPOSITION, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_POSITIONS, \ NULL, \ sizeof(KSPROPERTY), \ sizeof(KSPROPERTY_POSITIONS), \ (Handler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_DURATION, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_AVAILABLE, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSPROPERTY_MEDIAAVAILABLE), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_PREROLL, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT, \ (Handler), \ sizeof(KSP_TIMEFORMAT), \ sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define STATIC_KSPROPSETID_Topology \ 0x720D4AC0,0x7533,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000",KSPROPSETID_Topology); #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology) typedef enum { KSPROPERTY_TOPOLOGY_CATEGORIES, KSPROPERTY_TOPOLOGY_NODES, KSPROPERTY_TOPOLOGY_CONNECTIONS, KSPROPERTY_TOPOLOGY_NAME } KSPROPERTY_TOPOLOGY; #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_TOPOLOGY_CATEGORIES, \ (Handler), \ sizeof(KSPROPERTY), \ 0, \ NULL, NULL, 0,NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_TOPOLOGY_NODES, \ (Handler), \ sizeof(KSPROPERTY), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_TOPOLOGY_CONNECTIONS, \ (Handler), \ sizeof(KSPROPERTY), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_TOPOLOGY_NAME, \ (Handler), \ sizeof(KSP_NODE), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet,Handler) \ DEFINE_KSPROPERTY_TABLE(TopologySet) { \ DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler), \ DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler), \ DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler), \ DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler) \ } #define STATIC_KSCATEGORY_BRIDGE \ 0x085AFF00,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000",KSCATEGORY_BRIDGE); #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE) #define STATIC_KSCATEGORY_CAPTURE \ 0x65E8773D,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_CAPTURE); #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE) #define STATIC_KSCATEGORY_RENDER \ 0x65E8773E,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196",KSCATEGORY_RENDER); #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER) #define STATIC_KSCATEGORY_MIXER \ 0xAD809C00,0x7B88,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000",KSCATEGORY_MIXER); #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER) #define STATIC_KSCATEGORY_SPLITTER \ 0x0A4252A0,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_SPLITTER); #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER) #define STATIC_KSCATEGORY_DATACOMPRESSOR \ 0x1E84C900,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATACOMPRESSOR); #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR) #define STATIC_KSCATEGORY_DATADECOMPRESSOR \ 0x2721AE20,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATADECOMPRESSOR); #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR) #define STATIC_KSCATEGORY_DATATRANSFORM \ 0x2EB07EA0,0x7E70,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000",KSCATEGORY_DATATRANSFORM); #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM) #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \ 0xCF1DDA2C,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_COMMUNICATIONSTRANSFORM); #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM) #define STATIC_KSCATEGORY_INTERFACETRANSFORM \ 0xCF1DDA2D,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_INTERFACETRANSFORM); #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM) #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \ 0xCF1DDA2E,0x9743,0x11D0,0xA3,0xEE,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196",KSCATEGORY_MEDIUMTRANSFORM); #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM) #define STATIC_KSCATEGORY_FILESYSTEM \ 0x760FED5E,0x9357,0x11D0,0xA3,0xCC,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196",KSCATEGORY_FILESYSTEM); #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM) #define STATIC_KSCATEGORY_CLOCK \ 0x53172480,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSCATEGORY_CLOCK); #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK) #define STATIC_KSCATEGORY_PROXY \ 0x97EBAACA,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_PROXY); #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY) #define STATIC_KSCATEGORY_QUALITY \ 0x97EBAACB,0x95BD,0x11D0,0xA3,0xEA,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196",KSCATEGORY_QUALITY); #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY) typedef struct { ULONG FromNode; ULONG FromNodePin; ULONG ToNode; ULONG ToNodePin; } KSTOPOLOGY_CONNECTION,*PKSTOPOLOGY_CONNECTION; typedef struct { ULONG CategoriesCount; const GUID *Categories; ULONG TopologyNodesCount; const GUID *TopologyNodes; ULONG TopologyConnectionsCount; const KSTOPOLOGY_CONNECTION *TopologyConnections; const GUID *TopologyNodesNames; ULONG Reserved; } KSTOPOLOGY,*PKSTOPOLOGY; #define KSFILTER_NODE ((ULONG)-1) #define KSALL_NODES ((ULONG)-1) typedef struct { ULONG CreateFlags; ULONG Node; } KSNODE_CREATE,*PKSNODE_CREATE; #define STATIC_KSTIME_FORMAT_NONE STATIC_GUID_NULL #define KSTIME_FORMAT_NONE GUID_NULL #define STATIC_KSTIME_FORMAT_FRAME \ 0x7b785570,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FRAME); #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME) #define STATIC_KSTIME_FORMAT_BYTE \ 0x7b785571,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_BYTE); #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE) #define STATIC_KSTIME_FORMAT_SAMPLE \ 0x7b785572,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_SAMPLE); #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE) #define STATIC_KSTIME_FORMAT_FIELD \ 0x7b785573,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_FIELD); #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD) #define STATIC_KSTIME_FORMAT_MEDIA_TIME \ 0x7b785574,0x8c82,0x11cf,0xbc,0x0c,0x00,0xaa,0x00,0xac,0x74,0xf6 DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6",KSTIME_FORMAT_MEDIA_TIME); #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME) typedef KSIDENTIFIER KSPIN_INTERFACE,*PKSPIN_INTERFACE; #define STATIC_KSINTERFACESETID_Standard \ 0x1A8766A0,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000",KSINTERFACESETID_Standard); #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard) typedef enum { KSINTERFACE_STANDARD_STREAMING, KSINTERFACE_STANDARD_LOOPED_STREAMING, KSINTERFACE_STANDARD_CONTROL } KSINTERFACE_STANDARD; #define STATIC_KSINTERFACESETID_FileIo \ 0x8C6F932C,0xE771,0x11D0,0xB8,0xFF,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196",KSINTERFACESETID_FileIo); #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo) typedef enum { KSINTERFACE_FILEIO_STREAMING } KSINTERFACE_FILEIO; #define KSMEDIUM_TYPE_ANYINSTANCE 0 #define STATIC_KSMEDIUMSETID_Standard \ 0x4747B320,0x62CE,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000",KSMEDIUMSETID_Standard); #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard) #define KSMEDIUM_STANDARD_DEVIO KSMEDIUM_TYPE_ANYINSTANCE #define STATIC_KSPROPSETID_Pin \ 0x8C134960,0x51AD,0x11CF,0x87,0x8A,0x94,0xF8,0x01,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000",KSPROPSETID_Pin); #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin) typedef enum { KSPROPERTY_PIN_CINSTANCES, KSPROPERTY_PIN_CTYPES, KSPROPERTY_PIN_DATAFLOW, KSPROPERTY_PIN_DATARANGES, KSPROPERTY_PIN_DATAINTERSECTION, KSPROPERTY_PIN_INTERFACES, KSPROPERTY_PIN_MEDIUMS, KSPROPERTY_PIN_COMMUNICATION, KSPROPERTY_PIN_GLOBALCINSTANCES, KSPROPERTY_PIN_NECESSARYINSTANCES, KSPROPERTY_PIN_PHYSICALCONNECTION, KSPROPERTY_PIN_CATEGORY, KSPROPERTY_PIN_NAME, KSPROPERTY_PIN_CONSTRAINEDDATARANGES, KSPROPERTY_PIN_PROPOSEDATAFORMAT } KSPROPERTY_PIN; typedef struct { KSPROPERTY Property; ULONG PinId; ULONG Reserved; } KSP_PIN,*PKSP_PIN; #define KSINSTANCE_INDETERMINATE ((ULONG)-1) typedef struct { ULONG PossibleCount; ULONG CurrentCount; } KSPIN_CINSTANCES,*PKSPIN_CINSTANCES; typedef enum { KSPIN_DATAFLOW_IN = 1, KSPIN_DATAFLOW_OUT } KSPIN_DATAFLOW,*PKSPIN_DATAFLOW; #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION 0 #define KSDATAFORMAT_TEMPORAL_COMPRESSION (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION) #define KSDATAFORMAT_BIT_ATTRIBUTES 1 #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES) #define KSDATARANGE_BIT_ATTRIBUTES 1 #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES) #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2 #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES) typedef union { __C89_NAMELESS struct { ULONG FormatSize; ULONG Flags; ULONG SampleSize; ULONG Reserved; GUID MajorFormat; GUID SubFormat; GUID Specifier; }; LONGLONG Alignment; } KSDATAFORMAT,*PKSDATAFORMAT,KSDATARANGE,*PKSDATARANGE; #define KSATTRIBUTE_REQUIRED 0x00000001 typedef struct { ULONG Size; ULONG Flags; GUID Attribute; } KSATTRIBUTE,*PKSATTRIBUTE; #if defined(_NTDDK_) typedef struct { ULONG Count; PKSATTRIBUTE *Attributes; } KSATTRIBUTE_LIST,*PKSATTRIBUTE_LIST; #endif /* _NTDDK_ */ typedef enum { KSPIN_COMMUNICATION_NONE, KSPIN_COMMUNICATION_SINK, KSPIN_COMMUNICATION_SOURCE, KSPIN_COMMUNICATION_BOTH, KSPIN_COMMUNICATION_BRIDGE } KSPIN_COMMUNICATION,*PKSPIN_COMMUNICATION; typedef KSIDENTIFIER KSPIN_MEDIUM,*PKSPIN_MEDIUM; typedef struct { KSPIN_INTERFACE Interface; KSPIN_MEDIUM Medium; ULONG PinId; HANDLE PinToHandle; KSPRIORITY Priority; } KSPIN_CONNECT,*PKSPIN_CONNECT; typedef struct { ULONG Size; ULONG Pin; WCHAR SymbolicLinkName[1]; } KSPIN_PHYSICALCONNECTION,*PKSPIN_PHYSICALCONNECTION; #if defined(_NTDDK_) typedef NTSTATUS (*PFNKSINTERSECTHANDLER) ( PIRP Irp, PKSP_PIN Pin, PKSDATARANGE DataRange, PVOID Data); typedef NTSTATUS (*PFNKSINTERSECTHANDLEREX)(PVOID Context, PIRP Irp, PKSP_PIN Pin, PKSDATARANGE DataRange, PKSDATARANGE MatchingDataRange, ULONG DataBufferSize, PVOID Data, PULONG DataSize); #endif /* _NTDDK_ */ #define DEFINE_KSPIN_INTERFACE_TABLE(tablename) \ const KSPIN_INTERFACE tablename[] = #define DEFINE_KSPIN_INTERFACE_ITEM(guid,_interFace) \ { \ STATICGUIDOF(guid), \ (_interFace), \ 0 \ } #define DEFINE_KSPIN_MEDIUM_TABLE(tablename) \ const KSPIN_MEDIUM tablename[] = #define DEFINE_KSPIN_MEDIUM_ITEM(guid,medium) \ DEFINE_KSPIN_INTERFACE_ITEM(guid,medium) #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_CINSTANCES, \ (Handler), \ sizeof(KSP_PIN), \ sizeof(KSPIN_CINSTANCES), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_CTYPES, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(ULONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_DATAFLOW, \ (Handler), \ sizeof(KSP_PIN), \ sizeof(KSPIN_DATAFLOW), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_DATARANGES, \ (Handler), \ sizeof(KSP_PIN), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_DATAINTERSECTION, \ (Handler), \ sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_INTERFACES, \ (Handler), \ sizeof(KSP_PIN), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_MEDIUMS, \ (Handler), \ sizeof(KSP_PIN), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_COMMUNICATION, \ (Handler), \ sizeof(KSP_PIN), \ sizeof(KSPIN_COMMUNICATION), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_GLOBALCINSTANCES, \ (Handler), \ sizeof(KSP_PIN), \ sizeof(KSPIN_CINSTANCES), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_NECESSARYINSTANCES, \ (Handler), \ sizeof(KSP_PIN), \ sizeof(ULONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_PHYSICALCONNECTION, \ (Handler), \ sizeof(KSP_PIN), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_CATEGORY, \ (Handler), \ sizeof(KSP_PIN), \ sizeof(GUID), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_NAME, \ (Handler), \ sizeof(KSP_PIN), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_CONSTRAINEDDATARANGES, \ (Handler), \ sizeof(KSP_PIN), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_PIN_PROPOSEDATAFORMAT, \ NULL, \ sizeof(KSP_PIN), \ sizeof(KSDATAFORMAT), \ (Handler), NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_PINSET(PinSet,PropGeneral,PropInstances,PropIntersection) \ DEFINE_KSPROPERTY_TABLE(PinSet) { \ DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances), \ DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection), \ DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral) \ } #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,PropGeneral,PropInstances,PropIntersection) \ DEFINE_KSPROPERTY_TABLE(PinSet) { \ DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances), \ DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection), \ DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral), \ DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral) \ } #define STATIC_KSNAME_Filter \ 0x9b365890,0x165f,0x11d0,0xa1,0x95,0x00,0x20,0xaf,0xd1,0x56,0xe4 DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4",KSNAME_Filter); #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter) #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}" #define STATIC_KSNAME_Pin \ 0x146F1A80,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000",KSNAME_Pin); #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin) #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}" #define STATIC_KSNAME_Clock \ 0x53172480,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000",KSNAME_Clock); #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock) #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}" #define STATIC_KSNAME_Allocator \ 0x642F5D00,0x4791,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000",KSNAME_Allocator); #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator) #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}" #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}" #define STATIC_KSNAME_TopologyNode \ 0x0621061A,0xEE75,0x11D0,0xB9,0x15,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196",KSNAME_TopologyNode); #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode) #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}" #if defined(_NTDDK_) typedef struct { ULONG InterfacesCount; const KSPIN_INTERFACE *Interfaces; ULONG MediumsCount; const KSPIN_MEDIUM *Mediums; ULONG DataRangesCount; const PKSDATARANGE *DataRanges; KSPIN_DATAFLOW DataFlow; KSPIN_COMMUNICATION Communication; const GUID *Category; const GUID *Name; __C89_NAMELESS union { LONGLONG Reserved; __C89_NAMELESS struct { ULONG ConstrainedDataRangesCount; PKSDATARANGE *ConstrainedDataRanges; }; }; } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR; #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename) \ const KSPIN_DESCRIPTOR tablename[] = #define DEFINE_KSPIN_DESCRIPTOR_ITEM(InterfacesCount,Interfaces,MediumsCount, Mediums,DataRangesCount,DataRanges,DataFlow,Communication)\ { \ InterfacesCount, Interfaces, MediumsCount, Mediums, \ DataRangesCount, DataRanges, DataFlow, Communication, \ NULL, NULL, 0 \ } #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(InterfacesCount,Interfaces,MediumsCount,Mediums,DataRangesCount,DataRanges,DataFlow,Communication,Category,Name)\ { \ InterfacesCount, Interfaces, MediumsCount, Mediums, \ DataRangesCount, DataRanges, DataFlow, Communication, \ Category, Name, 0 \ } #endif /* _NTDDK_ */ #define STATIC_KSDATAFORMAT_TYPE_WILDCARD STATIC_GUID_NULL #define KSDATAFORMAT_TYPE_WILDCARD GUID_NULL #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD STATIC_GUID_NULL #define KSDATAFORMAT_SUBTYPE_WILDCARD GUID_NULL #define STATIC_KSDATAFORMAT_TYPE_STREAM \ 0xE436EB83,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70 DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_TYPE_STREAM); #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM) #define STATIC_KSDATAFORMAT_SUBTYPE_NONE \ 0xE436EB8E,0x524F,0x11CE,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70 DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770",KSDATAFORMAT_SUBTYPE_NONE); #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE) #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD STATIC_GUID_NULL #define KSDATAFORMAT_SPECIFIER_WILDCARD GUID_NULL #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME \ 0xAA797B40,0xE974,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000",KSDATAFORMAT_SPECIFIER_FILENAME); #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME) #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE \ 0x65E8773C,0x8F56,0x11D0,0xA3,0xB9,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196",KSDATAFORMAT_SPECIFIER_FILEHANDLE); #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE) #define STATIC_KSDATAFORMAT_SPECIFIER_NONE \ 0x0F6417D6,0xC318,0x11D0,0xA4,0x3F,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196",KSDATAFORMAT_SPECIFIER_NONE); #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE) #define STATIC_KSPROPSETID_Quality \ 0xD16AD380,0xAC1A,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000",KSPROPSETID_Quality); #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality) typedef enum { KSPROPERTY_QUALITY_REPORT, KSPROPERTY_QUALITY_ERROR } KSPROPERTY_QUALITY; #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_QUALITY_REPORT, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(KSQUALITY), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_QUALITY_ERROR, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(KSERROR), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define STATIC_KSPROPSETID_Connection \ 0x1D58C920,0xAC9B,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000",KSPROPSETID_Connection); #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection) typedef enum { KSPROPERTY_CONNECTION_STATE, KSPROPERTY_CONNECTION_PRIORITY, KSPROPERTY_CONNECTION_DATAFORMAT, KSPROPERTY_CONNECTION_ALLOCATORFRAMING, KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, KSPROPERTY_CONNECTION_ACQUIREORDERING, KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, KSPROPERTY_CONNECTION_STARTAT } KSPROPERTY_CONNECTION; #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_STATE, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(KSSTATE), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_PRIORITY, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(KSPRIORITY), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler,SetHandler)\ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_DATAFORMAT, \ (GetHandler), \ sizeof(KSPROPERTY), \ 0, \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_ALLOCATORFRAMING, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSALLOCATOR_FRAMING), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\ (Handler), \ sizeof(KSPROPERTY), \ 0, \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\ NULL, \ sizeof(KSPROPERTY), \ sizeof(KSDATAFORMAT), \ (Handler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_ACQUIREORDERING, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(int), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CONNECTION_STARTAT, \ NULL, \ sizeof(KSPROPERTY), \ sizeof(KSRELATIVEEVENT), \ (Handler), \ NULL, 0, NULL, NULL, 0) #define STATIC_KSPROPSETID_MemoryTransport \ 0xA3D1C5D,0x5243,0x4819,0x9E,0xD0,0xAE,0xE8,0x4,0x4C,0xEE,0x2B DEFINE_GUIDSTRUCT("0A3D1C5D-5243-4819-9ED0-AEE8044CEE2B", KSPROPSETID_MemoryTransport); #define KSPROPSETID_MemoryTransport DEFINE_GUIDNAMED(KSPROPSETID_MemoryTransport) enum { KSPROPERTY_MEMORY_TRANSPORT = 1 }; #define DEFINE_KSPROPERTY_ITEM_MEMORY_TRANSPORT(SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_MEMORY_TRANSPORT, \ NULL, \ sizeof(KSPROPERTY), \ sizeof(WINBOOL), \ (SetHandler), NULL,0,NULL,NULL,0) #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 0x00000001 #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY 0x00000002 #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY 0x00000004 #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE 0x00000008 #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY 0x80000000 #define KSALLOCATOR_OPTIONF_COMPATIBLE 0x00000001 #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY 0x00000002 #define KSALLOCATOR_OPTIONF_VALID 0x00000003 #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT 0x00000010 #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC 0x00000020 #define KSALLOCATOR_FLAG_CAN_ALLOCATE 0x00000040 #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO 0x00000080 #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY 0x00000100 #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT 0x00000200 #define KSALLOCATOR_FLAG_CYCLE 0x00000400 #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS 0x00000800 #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES 0x00001000 #define KSALLOCATOR_FLAG_ATTENTION_STEPPING 0x00002000 typedef struct { __C89_NAMELESS union { ULONG OptionsFlags; ULONG RequirementsFlags; }; #if defined(_NTDDK_) POOL_TYPE PoolType; #else ULONG PoolType; #endif /* _NTDDK_ */ ULONG Frames; ULONG FrameSize; ULONG FileAlignment; ULONG Reserved; } KSALLOCATOR_FRAMING,*PKSALLOCATOR_FRAMING; #if defined(_NTDDK_) typedef PVOID (*PFNKSDEFAULTALLOCATE)(PVOID Context); typedef VOID (*PFNKSDEFAULTFREE)(PVOID Context, PVOID Buffer); typedef NTSTATUS (*PFNKSINITIALIZEALLOCATOR)(PVOID InitialContext, PKSALLOCATOR_FRAMING AllocatorFraming, PVOID* Context); typedef VOID (*PFNKSDELETEALLOCATOR) (PVOID Context); #endif /* _NTDDK_ */ typedef struct { ULONG MinFrameSize; ULONG MaxFrameSize; ULONG Stepping; } KS_FRAMING_RANGE,*PKS_FRAMING_RANGE; typedef struct { KS_FRAMING_RANGE Range; ULONG InPlaceWeight; ULONG NotInPlaceWeight; } KS_FRAMING_RANGE_WEIGHTED,*PKS_FRAMING_RANGE_WEIGHTED; typedef struct { ULONG RatioNumerator; ULONG RatioDenominator; ULONG RatioConstantMargin; } KS_COMPRESSION,*PKS_COMPRESSION; typedef struct { GUID MemoryType; GUID BusType; ULONG MemoryFlags; ULONG BusFlags; ULONG Flags; ULONG Frames; ULONG FileAlignment; ULONG MemoryTypeWeight; KS_FRAMING_RANGE PhysicalRange; KS_FRAMING_RANGE_WEIGHTED FramingRange; } KS_FRAMING_ITEM,*PKS_FRAMING_ITEM; typedef struct { ULONG CountItems; ULONG PinFlags; KS_COMPRESSION OutputCompression; ULONG PinWeight; KS_FRAMING_ITEM FramingItem[1]; } KSALLOCATOR_FRAMING_EX,*PKSALLOCATOR_FRAMING_EX; #define KSMEMORY_TYPE_WILDCARD GUID_NULL #define STATIC_KSMEMORY_TYPE_WILDCARD STATIC_GUID_NULL #define KSMEMORY_TYPE_DONT_CARE GUID_NULL #define STATIC_KSMEMORY_TYPE_DONT_CARE STATIC_GUID_NULL #define KS_TYPE_DONT_CARE GUID_NULL #define STATIC_KS_TYPE_DONT_CARE STATIC_GUID_NULL #define STATIC_KSMEMORY_TYPE_SYSTEM \ 0x091bb638,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_SYSTEM); #define KSMEMORY_TYPE_SYSTEM DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM) #define STATIC_KSMEMORY_TYPE_USER \ 0x8cb0fc28,0x7893,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802",KSMEMORY_TYPE_USER); #define KSMEMORY_TYPE_USER DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER) #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \ 0xd833f8f8,0x7894,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_PAGED); #define KSMEMORY_TYPE_KERNEL_PAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED) #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \ 0x4a6d5fc4,0x7895,0x11d1,0xb0,0x69,0x00,0xa0,0xc9,0x06,0x28,0x02 DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802",KSMEMORY_TYPE_KERNEL_NONPAGED); #define KSMEMORY_TYPE_KERNEL_NONPAGED DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED) #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \ 0x091bb639,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02 DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802",KSMEMORY_TYPE_DEVICE_UNKNOWN); #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN) #define DECLARE_SIMPLE_FRAMING_EX(FramingExName,MemoryType,Flags,Frames,Alignment,MinFrameSize,MaxFrameSize) \ const KSALLOCATOR_FRAMING_EX FramingExName = \ { \ 1, \ 0, \ { \ 1, \ 1, \ 0 \ }, \ 0, \ { \ { \ MemoryType, \ STATIC_KS_TYPE_DONT_CARE, \ 0, \ 0, \ Flags, \ Frames, \ Alignment, \ 0, \ { \ 0, \ (ULONG)-1, \ 1 \ }, \ { \ { \ MinFrameSize, \ MaxFrameSize, \ 1 \ }, \ 0, \ 0 \ } \ } \ } \ } #define SetDefaultKsCompression(KsCompressionPointer) \ { \ KsCompressionPointer->RatioNumerator = 1; \ KsCompressionPointer->RatioDenominator = 1; \ KsCompressionPointer->RatioConstantMargin = 0; \ } #define SetDontCareKsFramingRange(KsFramingRangePointer) \ { \ KsFramingRangePointer->MinFrameSize = 0; \ KsFramingRangePointer->MaxFrameSize = (ULONG) -1; \ KsFramingRangePointer->Stepping = 1; \ } #define SetKsFramingRange(KsFramingRangePointer,P_MinFrameSize,P_MaxFrameSize) \ { \ KsFramingRangePointer->MinFrameSize = P_MinFrameSize; \ KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize; \ KsFramingRangePointer->Stepping = 1; \ } #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer,P_MinFrameSize,P_MaxFrameSize) \ { \ KS_FRAMING_RANGE *KsFramingRange = \ &KsFramingRangeWeightedPointer->Range; \ SetKsFramingRange(KsFramingRange,P_MinFrameSize,P_MaxFrameSize);\ KsFramingRangeWeightedPointer->InPlaceWeight = 0; \ KsFramingRangeWeightedPointer->NotInPlaceWeight = 0; \ } #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer,P_MemoryType,P_Flags,P_Frames,P_Alignment,P_MinFrameSize,P_MaxFrameSize) \ { \ KS_COMPRESSION *KsCompression = \ &FramingExPointer->OutputCompression; \ KS_FRAMING_RANGE *KsFramingRange = \ &FramingExPointer->FramingItem[0].PhysicalRange;\ KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = \ &FramingExPointer->FramingItem[0].FramingRange; \ FramingExPointer->CountItems = 1; \ FramingExPointer->PinFlags = 0; \ SetDefaultKsCompression(KsCompression); \ FramingExPointer->PinWeight = 0; \ FramingExPointer->FramingItem[0].MemoryType = P_MemoryType; \ FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE; \ FramingExPointer->FramingItem[0].MemoryFlags = 0; \ FramingExPointer->FramingItem[0].BusFlags = 0; \ FramingExPointer->FramingItem[0].Flags = P_Flags; \ FramingExPointer->FramingItem[0].Frames = P_Frames; \ FramingExPointer->FramingItem[0].FileAlignment = P_Alignment; \ FramingExPointer->FramingItem[0].MemoryTypeWeight = 0; \ SetDontCareKsFramingRange(KsFramingRange); \ SetKsFramingRangeWeighted(KsFramingRangeWeighted, \ P_MinFrameSize,P_MaxFrameSize); \ } #define STATIC_KSEVENTSETID_StreamAllocator \ 0x75d95571,0x073c,0x11d0,0xa1,0x61,0x00,0x20,0xaf,0xd1,0x56,0xe4 DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4",KSEVENTSETID_StreamAllocator); #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator) typedef enum { KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, KSEVENT_STREAMALLOCATOR_FREEFRAME } KSEVENT_STREAMALLOCATOR; #define STATIC_KSMETHODSETID_StreamAllocator \ 0xcf6e4341,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4 DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4",KSMETHODSETID_StreamAllocator); #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator) typedef enum { KSMETHOD_STREAMALLOCATOR_ALLOC, KSMETHOD_STREAMALLOCATOR_FREE } KSMETHOD_STREAMALLOCATOR; #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler) \ DEFINE_KSMETHOD_ITEM( \ KSMETHOD_STREAMALLOCATOR_ALLOC, \ KSMETHOD_TYPE_WRITE, \ (Handler), \ sizeof(KSMETHOD), \ sizeof(PVOID), \ NULL) #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler) \ DEFINE_KSMETHOD_ITEM( \ KSMETHOD_STREAMALLOCATOR_FREE, \ KSMETHOD_TYPE_READ, \ (Handler), \ sizeof(KSMETHOD), \ sizeof(PVOID), \ NULL) #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet,MethodAlloc,MethodFree)\ DEFINE_KSMETHOD_TABLE(AllocatorSet) { \ DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc), \ DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree) \ } #define STATIC_KSPROPSETID_StreamAllocator \ 0xcf6e4342,0xec87,0x11cf,0xa1,0x30,0x00,0x20,0xaf,0xd1,0x56,0xe4 DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4",KSPROPSETID_StreamAllocator); #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator) #if defined(_NTDDK_) typedef enum { KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, KSPROPERTY_STREAMALLOCATOR_STATUS } KSPROPERTY_STREAMALLOCATOR; #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAMALLOCATOR_STATUS, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSSTREAMALLOCATOR_STATUS), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet,PropFunctionTable,PropStatus)\ DEFINE_KSPROPERTY_TABLE(AllocatorSet) { \ DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus), \ DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\ } typedef NTSTATUS (*PFNALLOCATOR_ALLOCATEFRAME) (PFILE_OBJECT FileObject, PVOID *Frame); typedef VOID (*PFNALLOCATOR_FREEFRAME) (PFILE_OBJECT FileObject, PVOID Frame); typedef struct { PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; PFNALLOCATOR_FREEFRAME FreeFrame; } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE; #endif /* _NTDDK_ */ typedef struct { KSALLOCATOR_FRAMING Framing; ULONG AllocatedFrames; ULONG Reserved; } KSSTREAMALLOCATOR_STATUS,*PKSSTREAMALLOCATOR_STATUS; typedef struct { KSALLOCATOR_FRAMING_EX Framing; ULONG AllocatedFrames; ULONG Reserved; } KSSTREAMALLOCATOR_STATUS_EX,*PKSSTREAMALLOCATOR_STATUS_EX; #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT 0x00000001 #define KSSTREAM_HEADER_OPTIONSF_PREROLL 0x00000002 #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY 0x00000004 #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED 0x00000008 #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID 0x00000010 #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY 0x00000040 #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE 0x00000080 #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID 0x00000100 #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 0x00000200 #define KSSTREAM_HEADER_OPTIONSF_BUFFEREDTRANSFER 0x00000400 #define KSSTREAM_HEADER_OPTIONSF_VRAM_DATA_TRANSFER 0x00000800 #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA 0x80000000 typedef struct { LONGLONG Time; ULONG Numerator; ULONG Denominator; } KSTIME,*PKSTIME; typedef struct { ULONG Size; ULONG TypeSpecificFlags; KSTIME PresentationTime; LONGLONG Duration; ULONG FrameExtent; ULONG DataUsed; PVOID Data; ULONG OptionsFlags; #ifdef _WIN64 ULONG Reserved; #endif } KSSTREAM_HEADER,*PKSSTREAM_HEADER; #define STATIC_KSPROPSETID_StreamInterface \ 0x1fdd8ee1,0x9cd3,0x11d0,0x82,0xaa,0x00,0x00,0xf8,0x22,0xfe,0x8a DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a",KSPROPSETID_StreamInterface); #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface) typedef enum { KSPROPERTY_STREAMINTERFACE_HEADERSIZE } KSPROPERTY_STREAMINTERFACE; #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(GetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAMINTERFACE_HEADERSIZE, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(ULONG), \ NULL,NULL,0,NULL,NULL,0) #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,HeaderSizeHandler) \ DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) { \ DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE(HeaderSizeHandler)\ } #define STATIC_KSPROPSETID_Stream \ 0x65aaba60,0x98ae,0x11cf,0xa1,0x0d,0x00,0x20,0xaf,0xd1,0x56,0xe4 DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4",KSPROPSETID_Stream); #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) typedef enum { KSPROPERTY_STREAM_ALLOCATOR, KSPROPERTY_STREAM_QUALITY, KSPROPERTY_STREAM_DEGRADATION, KSPROPERTY_STREAM_MASTERCLOCK, KSPROPERTY_STREAM_TIMEFORMAT, KSPROPERTY_STREAM_PRESENTATIONTIME, KSPROPERTY_STREAM_PRESENTATIONEXTENT, KSPROPERTY_STREAM_FRAMETIME, KSPROPERTY_STREAM_RATECAPABILITY, KSPROPERTY_STREAM_RATE, KSPROPERTY_STREAM_PIPE_ID } KSPROPERTY_STREAM; #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_ALLOCATOR, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(HANDLE), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_QUALITY, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSQUALITY_MANAGER), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler,SetHandler)\ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_DEGRADATION, \ (GetHandler), \ sizeof(KSPROPERTY), \ 0, \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler,SetHandler)\ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_MASTERCLOCK, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(HANDLE), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_TIMEFORMAT, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(GUID), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler,SetHandler)\ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_PRESENTATIONTIME, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(KSTIME), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_PRESENTATIONEXTENT, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_FRAMETIME, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSFRAMETIME), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_RATECAPABILITY, \ (Handler), \ sizeof(KSRATE_CAPABILITY), \ sizeof(KSRATE), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_RATE, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(KSRATE), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler,SetHandler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_STREAM_PIPE_ID, \ (GetHandler), \ sizeof(KSPROPERTY), \ sizeof(HANDLE), \ (SetHandler), \ NULL, 0, NULL, NULL, 0) typedef struct { HANDLE QualityManager; PVOID Context; } KSQUALITY_MANAGER,*PKSQUALITY_MANAGER; typedef struct { LONGLONG Duration; ULONG FrameFlags; ULONG Reserved; } KSFRAMETIME,*PKSFRAMETIME; #define KSFRAMETIME_VARIABLESIZE 0x00000001 typedef struct { LONGLONG PresentationStart; LONGLONG Duration; KSPIN_INTERFACE Interface; LONG Rate; ULONG Flags; } KSRATE,*PKSRATE; #define KSRATE_NOPRESENTATIONSTART 0x00000001 #define KSRATE_NOPRESENTATIONDURATION 0x00000002 typedef struct { KSPROPERTY Property; KSRATE Rate; } KSRATE_CAPABILITY,*PKSRATE_CAPABILITY; #define STATIC_KSPROPSETID_Clock \ 0xDF12A4C0,0xAC17,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000",KSPROPSETID_Clock); #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) #define NANOSECONDS 10000000 #define KSCONVERT_PERFORMANCE_TIME(Frequency,PerformanceTime) \ ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS / (Frequency)) << 32) + \ ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart *NANOSECONDS) % (Frequency)) << 32) +\ ((ULONGLONG)(PerformanceTime).LowPart *NANOSECONDS)) / (Frequency))) typedef struct { ULONG CreateFlags; } KSCLOCK_CREATE,*PKSCLOCK_CREATE; typedef struct { LONGLONG Time; LONGLONG SystemTime; } KSCORRELATED_TIME,*PKSCORRELATED_TIME; typedef struct { LONGLONG Granularity; LONGLONG Error; } KSRESOLUTION,*PKSRESOLUTION; typedef enum { KSPROPERTY_CLOCK_TIME, KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_CLOCK_RESOLUTION, KSPROPERTY_CLOCK_STATE, #if defined(_NTDDK_) KSPROPERTY_CLOCK_FUNCTIONTABLE #endif /* _NTDDK_ */ } KSPROPERTY_CLOCK; #if defined(_NTDDK_) typedef LONGLONG (FASTCALL *PFNKSCLOCK_GETTIME)(PFILE_OBJECT FileObject); typedef LONGLONG (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(PFILE_OBJECT FileObject, PLONGLONG SystemTime); typedef struct { PFNKSCLOCK_GETTIME GetTime; PFNKSCLOCK_GETTIME GetPhysicalTime; PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime; PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime; } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; typedef BOOLEAN (*PFNKSSETTIMER)(PVOID Context, PKTIMER Timer, LARGE_INTEGER DueTime, PKDPC Dpc); typedef BOOLEAN (*PFNKSCANCELTIMER) (PVOID Context, PKTIMER Timer); typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)(PVOID Context, PLONGLONG SystemTime); typedef PVOID PKSDEFAULTCLOCK; #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_TIME, \ (Handler), \ sizeof(KSPROPERTY), sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_PHYSICALTIME, \ (Handler), \ sizeof(KSPROPERTY), sizeof(LONGLONG), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_CORRELATEDTIME, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSCORRELATED_TIME), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSCORRELATED_TIME), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_RESOLUTION, \ (Handler), \ sizeof(KSPROPERTY),sizeof(KSRESOLUTION),\ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_STATE, \ (Handler), \ sizeof(KSPROPERTY), sizeof(KSSTATE), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler) \ DEFINE_KSPROPERTY_ITEM( \ KSPROPERTY_CLOCK_FUNCTIONTABLE, \ (Handler), \ sizeof(KSPROPERTY), \ sizeof(KSCLOCK_FUNCTIONTABLE), \ NULL, NULL, 0, NULL, NULL, 0) #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,PropTime,PropPhysicalTime,PropCorrelatedTime,PropCorrelatedPhysicalTime,PropResolution,PropState,PropFunctionTable)\ DEFINE_KSPROPERTY_TABLE(ClockSet) { \ DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime), \ DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime), \ DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution), \ DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState), \ DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable), \ } #endif /* _NTDDK_ */ #define STATIC_KSEVENTSETID_Clock \ 0x364D8E20,0x62C7,0x11CF,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000",KSEVENTSETID_Clock); #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) typedef enum { KSEVENT_CLOCK_INTERVAL_MARK, KSEVENT_CLOCK_POSITION_MARK } KSEVENT_CLOCK_POSITION; #define STATIC_KSEVENTSETID_Connection \ 0x7f4bcbe0,0x9ea5,0x11cf,0xa5,0xd6,0x28,0xdb,0x04,0xc1,0x00,0x00 DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000",KSEVENTSETID_Connection); #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection) typedef enum { KSEVENT_CONNECTION_POSITIONUPDATE, KSEVENT_CONNECTION_DATADISCONTINUITY, KSEVENT_CONNECTION_TIMEDISCONTINUITY, KSEVENT_CONNECTION_PRIORITY, KSEVENT_CONNECTION_ENDOFSTREAM } KSEVENT_CONNECTION; typedef struct { PVOID Context; ULONG Proportion; LONGLONG DeltaTime; } KSQUALITY,*PKSQUALITY; typedef struct { PVOID Context; ULONG Status; } KSERROR,*PKSERROR; typedef KSIDENTIFIER KSDEGRADE,*PKSDEGRADE; #define STATIC_KSDEGRADESETID_Standard \ 0x9F564180,0x704C,0x11D0,0xA5,0xD6,0x28,0xDB,0x04,0xC1,0x00,0x00 DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000",KSDEGRADESETID_Standard); #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard) typedef enum { KSDEGRADE_STANDARD_SAMPLE, KSDEGRADE_STANDARD_QUALITY, KSDEGRADE_STANDARD_COMPUTATION, KSDEGRADE_STANDARD_SKIP } KSDEGRADE_STANDARD; #if defined(_NTDDK_) #define KSPROBE_STREAMREAD 0x00000000 #define KSPROBE_STREAMWRITE 0x00000001 #define KSPROBE_ALLOCATEMDL 0x00000010 #define KSPROBE_PROBEANDLOCK 0x00000020 #define KSPROBE_SYSTEMADDRESS 0x00000040 #define KSPROBE_MODIFY 0x00000200 #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE) #define KSPROBE_ALLOWFORMATCHANGE 0x00000080 #define KSSTREAM_READ KSPROBE_STREAMREAD #define KSSTREAM_WRITE KSPROBE_STREAMWRITE #define KSSTREAM_PAGED_DATA 0x00000000 #define KSSTREAM_NONPAGED_DATA 0x00000100 #define KSSTREAM_SYNCHRONOUS 0x00001000 #define KSSTREAM_FAILUREEXCEPTION 0x00002000 typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(PVOID Context, PIRP Irp); typedef NTSTATUS (*PFNKSHANDLER)(PIRP Irp, PKSIDENTIFIER Request, PVOID Data); typedef BOOLEAN (*PFNKSFASTHANDLER)(PFILE_OBJECT FileObject, PKSIDENTIFIER Request, ULONG RequestLength, PVOID Data, ULONG DataLength, PIO_STATUS_BLOCK IoStatus); typedef NTSTATUS (*PFNKSALLOCATOR) (PIRP Irp, ULONG BufferSize, BOOLEAN InputOperation); typedef struct { KSPROPERTY_MEMBERSHEADER MembersHeader; const VOID *Members; } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; typedef struct { KSIDENTIFIER PropTypeSet; ULONG MembersListCount; const KSPROPERTY_MEMBERSLIST *MembersList; } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; #define DEFINE_KSPROPERTY_TABLE(tablename) \ const KSPROPERTY_ITEM tablename[] = #define DEFINE_KSPROPERTY_ITEM(PropertyId,GetHandler,MinProperty,MinData,SetHandler,Values,RelationsCount,Relations,SupportHandler,SerializedSize)\ { \ PropertyId, (PFNKSHANDLER)GetHandler, \ MinProperty, MinData, \ (PFNKSHANDLER)SetHandler, \ (PKSPROPERTY_VALUES)Values, RelationsCount, \ (PKSPROPERTY)Relations, \ (PFNKSHANDLER)SupportHandler, \ (ULONG)SerializedSize \ } typedef struct { ULONG PropertyId; __C89_NAMELESS union { PFNKSHANDLER GetPropertyHandler; BOOLEAN GetSupported; }; ULONG MinProperty; ULONG MinData; __C89_NAMELESS union { PFNKSHANDLER SetPropertyHandler; BOOLEAN SetSupported; }; const KSPROPERTY_VALUES *Values; ULONG RelationsCount; const KSPROPERTY *Relations; PFNKSHANDLER SupportHandler; ULONG SerializedSize; } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler) \ { \ PropertyId, (PFNKSFASTHANDLER)GetHandler, \ (PFNKSFASTHANDLER)SetHandler, 0 \ } typedef struct { ULONG PropertyId; __C89_NAMELESS union { PFNKSFASTHANDLER GetPropertyHandler; BOOLEAN GetSupported; }; __C89_NAMELESS union { PFNKSFASTHANDLER SetPropertyHandler; BOOLEAN SetSupported; }; ULONG Reserved; } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; #define DEFINE_KSPROPERTY_SET(Set,PropertiesCount,PropertyItem,FastIoCount,FastIoTable)\ { \ Set, \ PropertiesCount, PropertyItem, \ FastIoCount, FastIoTable \ } #define DEFINE_KSPROPERTY_SET_TABLE(tablename) \ const KSPROPERTY_SET tablename[] = typedef struct { const GUID *Set; ULONG PropertiesCount; const KSPROPERTY_ITEM *PropertyItem; ULONG FastIoCount; const KSFASTPROPERTY_ITEM *FastIoTable; } KSPROPERTY_SET, *PKSPROPERTY_SET; #define DEFINE_KSMETHOD_TABLE(tablename) \ const KSMETHOD_ITEM tablename[] = #define DEFINE_KSMETHOD_ITEM(MethodId,Flags,MethodHandler,MinMethod,MinData,SupportHandler)\ { \ MethodId, (PFNKSHANDLER)MethodHandler, \ MinMethod, MinData, \ SupportHandler, Flags \ } typedef struct { ULONG MethodId; __C89_NAMELESS union { PFNKSHANDLER MethodHandler; BOOLEAN MethodSupported; }; ULONG MinMethod; ULONG MinData; PFNKSHANDLER SupportHandler; ULONG Flags; } KSMETHOD_ITEM, *PKSMETHOD_ITEM; #define DEFINE_KSFASTMETHOD_ITEM(MethodId,MethodHandler) \ { \ MethodId, (PFNKSFASTHANDLER)MethodHandler \ } typedef struct { ULONG MethodId; __C89_NAMELESS union { PFNKSFASTHANDLER MethodHandler; BOOLEAN MethodSupported; }; } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; #define DEFINE_KSMETHOD_SET(Set,MethodsCount,MethodItem,FastIoCount,FastIoTable)\ { \ Set, \ MethodsCount, MethodItem, \ FastIoCount, FastIoTable \ } #define DEFINE_KSMETHOD_SET_TABLE(tablename) \ const KSMETHOD_SET tablename[] = typedef struct { const GUID *Set; ULONG MethodsCount; const KSMETHOD_ITEM *MethodItem; ULONG FastIoCount; const KSFASTMETHOD_ITEM *FastIoTable; } KSMETHOD_SET, *PKSMETHOD_SET; typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY; typedef NTSTATUS (*PFNKSADDEVENT)(PIRP Irp, PKSEVENTDATA EventData, struct _KSEVENT_ENTRY* EventEntry); typedef VOID (*PFNKSREMOVEEVENT)(PFILE_OBJECT FileObject, struct _KSEVENT_ENTRY* EventEntry); #define DEFINE_KSEVENT_TABLE(tablename) \ const KSEVENT_ITEM tablename[] = #define DEFINE_KSEVENT_ITEM(EventId,DataInput,ExtraEntryData,AddHandler,RemoveHandler,SupportHandler)\ { \ EventId, DataInput, ExtraEntryData, \ AddHandler, RemoveHandler, SupportHandler \ } typedef struct { ULONG EventId; ULONG DataInput; ULONG ExtraEntryData; PFNKSADDEVENT AddHandler; PFNKSREMOVEEVENT RemoveHandler; PFNKSHANDLER SupportHandler; } KSEVENT_ITEM, *PKSEVENT_ITEM; #define DEFINE_KSEVENT_SET(Set,EventsCount,EventItem) \ { \ Set, EventsCount, EventItem \ } #define DEFINE_KSEVENT_SET_TABLE(tablename) \ const KSEVENT_SET tablename[] = typedef struct { const GUID *Set; ULONG EventsCount; const KSEVENT_ITEM *EventItem; } KSEVENT_SET, *PKSEVENT_SET; typedef struct { KDPC Dpc; ULONG ReferenceCount; KSPIN_LOCK AccessLock; } KSDPC_ITEM, *PKSDPC_ITEM; typedef struct { KSDPC_ITEM DpcItem; LIST_ENTRY BufferList; } KSBUFFER_ITEM, *PKSBUFFER_ITEM; #define KSEVENT_ENTRY_DELETED 1 #define KSEVENT_ENTRY_ONESHOT 2 #define KSEVENT_ENTRY_BUFFERED 4 struct _KSEVENT_ENTRY { LIST_ENTRY ListEntry; PVOID Object; __C89_NAMELESS union { PKSDPC_ITEM DpcItem; PKSBUFFER_ITEM BufferItem; }; PKSEVENTDATA EventData; ULONG NotificationType; const KSEVENT_SET *EventSet; const KSEVENT_ITEM *EventItem; PFILE_OBJECT FileObject; ULONG SemaphoreAdjustment; ULONG Reserved; ULONG Flags; }; typedef enum { KSEVENTS_NONE, KSEVENTS_SPINLOCK, KSEVENTS_MUTEX, KSEVENTS_FMUTEX, KSEVENTS_FMUTEXUNSAFE, KSEVENTS_INTERRUPT, KSEVENTS_ERESOURCE } KSEVENTS_LOCKTYPE; #define KSDISPATCH_FASTIO 0x80000000 typedef struct { PDRIVER_DISPATCH Create; PVOID Context; UNICODE_STRING ObjectClass; PSECURITY_DESCRIPTOR SecurityDescriptor; ULONG Flags; } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; typedef VOID (*PFNKSITEMFREECALLBACK)(PKSOBJECT_CREATE_ITEM CreateItem); #define KSCREATE_ITEM_SECURITYCHANGED 0x00000001 #define KSCREATE_ITEM_WILDCARD 0x00000002 #define KSCREATE_ITEM_NOPARAMETERS 0x00000004 #define KSCREATE_ITEM_FREEONSTOP 0x00000008 #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename ) \ KSOBJECT_CREATE_ITEM tablename[] = #define DEFINE_KSCREATE_ITEM(DispatchCreate,TypeName,Context) \ { \ (DispatchCreate), (PVOID)(Context), \ { \ sizeof(TypeName) - sizeof(UNICODE_NULL),\ sizeof(TypeName), \ (PWCHAR)(TypeName) \ }, \ NULL, 0 \ } #define DEFINE_KSCREATE_ITEMEX(DispatchCreate,TypeName,Context,Flags) \ { \ (DispatchCreate), \ (PVOID)(Context), \ { \ sizeof(TypeName) - sizeof(UNICODE_NULL),\ sizeof(TypeName), \ (PWCHAR)(TypeName) \ }, \ NULL, (Flags) \ } #define DEFINE_KSCREATE_ITEMNULL(DispatchCreate,Context) \ { \ DispatchCreate, Context, \ { \ 0, 0, NULL, \ }, \ NULL, 0 \ } typedef struct { ULONG CreateItemsCount; PKSOBJECT_CREATE_ITEM CreateItemsList; } KSOBJECT_CREATE, *PKSOBJECT_CREATE; typedef struct { PDRIVER_DISPATCH DeviceIoControl; PDRIVER_DISPATCH Read; PDRIVER_DISPATCH Write; PDRIVER_DISPATCH Flush; PDRIVER_DISPATCH Close; PDRIVER_DISPATCH QuerySecurity; PDRIVER_DISPATCH SetSecurity; PFAST_IO_DEVICE_CONTROL FastDeviceIoControl; PFAST_IO_READ FastRead; PFAST_IO_WRITE FastWrite; } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; #define DEFINE_KSDISPATCH_TABLE(tablename,DeviceIoControl,Read,Write,Flush,Close,QuerySecurity,SetSecurity,FastDeviceIoControl,FastRead,FastWrite)\ const KSDISPATCH_TABLE tablename = \ { \ DeviceIoControl, \ Read, \ Write, \ Flush, \ Close, \ QuerySecurity, \ SetSecurity, \ FastDeviceIoControl, \ FastRead, \ FastWrite, \ } #define KSCREATE_ITEM_IRP_STORAGE(Irp) \ (*(PKSOBJECT_CREATE_ITEM *)&(Irp)->Tail.Overlay.DriverContext[0]) #define KSEVENT_SET_IRP_STORAGE(Irp) \ (*(const KSEVENT_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) #define KSEVENT_ITEM_IRP_STORAGE(Irp) \ (*(const KSEVENT_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) #define KSEVENT_ENTRY_IRP_STORAGE(Irp) \ (*(PKSEVENT_ENTRY *)&(Irp)->Tail.Overlay.DriverContext[0]) #define KSMETHOD_SET_IRP_STORAGE(Irp) \ (*(const KSMETHOD_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) #define KSMETHOD_ITEM_IRP_STORAGE(Irp) \ (*(const KSMETHOD_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) #define KSMETHOD_TYPE_IRP_STORAGE(Irp) \ (*(ULONG_PTR *)(&(Irp)->Tail.Overlay.DriverContext[2])) #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) \ (*(PKSPIN_LOCK *)&(Irp)->Tail.Overlay.DriverContext[1]) #define KSPROPERTY_SET_IRP_STORAGE(Irp) \ (*(const KSPROPERTY_SET **)&(Irp)->Tail.Overlay.DriverContext[0]) #define KSPROPERTY_ITEM_IRP_STORAGE(Irp) \ (*(const KSPROPERTY_ITEM **)&(Irp)->Tail.Overlay.DriverContext[3]) #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) \ (*(PKSATTRIBUTE_LIST *)&(Irp)->Tail.Overlay.DriverContext[2]) typedef PVOID KSDEVICE_HEADER, KSOBJECT_HEADER; typedef enum { KsInvokeOnSuccess = 1, KsInvokeOnError = 2, KsInvokeOnCancel = 4 } KSCOMPLETION_INVOCATION; typedef enum { KsListEntryTail, KsListEntryHead } KSLIST_ENTRY_LOCATION; typedef enum { KsAcquireOnly, KsAcquireAndRemove, KsAcquireOnlySingleItem, KsAcquireAndRemoveOnlySingleItem } KSIRP_REMOVAL_OPERATION; typedef enum { KsStackCopyToNewLocation, KsStackReuseCurrentLocation, KsStackUseNewLocation } KSSTACK_USE; typedef enum { KSTARGET_STATE_DISABLED, KSTARGET_STATE_ENABLED } KSTARGET_STATE; typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(PIRP Irp, PVOID Context); typedef VOID (*PFNREFERENCEDEVICEOBJECT)(PVOID Context); typedef VOID (*PFNDEREFERENCEDEVICEOBJECT)(PVOID Context); typedef NTSTATUS (*PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String); #define BUS_INTERFACE_REFERENCE_VERSION 0x100 typedef struct { INTERFACE Interface; PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject; PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject; PFNQUERYREFERENCESTRING QueryReferenceString; } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard typedef NTSTATUS (*PFNQUERYMEDIUMSLIST) (PVOID Context, ULONG *MediumsCount, PKSPIN_MEDIUM *MediumList); typedef struct { INTERFACE Interface; PFNQUERYMEDIUMSLIST QueryMediumsList; } BUS_INTERFACE_MEDIUMS,*PBUS_INTERFACE_MEDIUMS; #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \ 0x4EC35C3E,0x201B,0x11D2,0x87,0x45,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS); #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS) #endif /* _NTDDK_ */ #ifndef PACK_PRAGMAS_NOT_SUPPORTED #include <pshpack1.h> #endif typedef struct { GUID PropertySet; ULONG Count; } KSPROPERTY_SERIALHDR,*PKSPROPERTY_SERIALHDR; #ifndef PACK_PRAGMAS_NOT_SUPPORTED #include <poppack.h> #endif typedef struct { KSIDENTIFIER PropTypeSet; ULONG Id; ULONG PropertyLength; } KSPROPERTY_SERIAL,*PKSPROPERTY_SERIAL; #if defined(_NTDDK_) #define IOCTL_KS_HANDSHAKE \ CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS) typedef struct { GUID ProtocolId; PVOID Argument1; PVOID Argument2; } KSHANDSHAKE, *PKSHANDSHAKE; typedef struct _KSGATE KSGATE, *PKSGATE; struct _KSGATE { LONG Count; PKSGATE NextGate; }; #ifndef _NTOS_ __forceinline void KsGateTurnInputOn (PKSGATE Gate) { while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) { Gate = Gate->NextGate; } } __forceinline void KsGateTurnInputOff (PKSGATE Gate) { while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) { Gate = Gate->NextGate; } } __forceinline BOOLEAN KsGateGetStateUnsafe (PKSGATE Gate) { return (BOOLEAN) (Gate->Count > 0); } __forceinline BOOLEAN KsGateCaptureThreshold (PKSGATE Gate) { BOOLEAN captured; captured = (BOOLEAN) (InterlockedCompareExchange(&Gate->Count, 0, 1) == 1); if (captured) { KsGateTurnInputOff(Gate->NextGate); } return captured; } __forceinline void KsGateInitialize (PKSGATE Gate, LONG InitialCount, PKSGATE NextGate, BOOLEAN StateToPropagate) { Gate->Count = InitialCount; Gate->NextGate = NextGate; if (NextGate) { if (InitialCount > 0) { if (StateToPropagate) KsGateTurnInputOn(NextGate); } else { if (! StateToPropagate) KsGateTurnInputOff(NextGate); } } } __forceinline void KsGateInitializeAnd (PKSGATE AndGate, PKSGATE NextOrGate) { KsGateInitialize(AndGate, 1, NextOrGate, TRUE); } __forceinline void KsGateInitializeOr (PKSGATE OrGate, PKSGATE NextAndGate) { KsGateInitialize(OrGate, 0, NextAndGate, FALSE); } __forceinline void KsGateAddOnInputToAnd (PKSGATE AndGate) { (VOID)AndGate; } __forceinline void KsGateAddOffInputToAnd (PKSGATE AndGate) { KsGateTurnInputOff(AndGate); } __forceinline void KsGateRemoveOnInputFromAnd (PKSGATE AndGate) { (VOID)AndGate; } __forceinline void KsGateRemoveOffInputFromAnd (PKSGATE AndGate) { KsGateTurnInputOn(AndGate); } __forceinline void KsGateAddOnInputToOr (PKSGATE OrGate) { KsGateTurnInputOn(OrGate); } __forceinline void KsGateAddOffInputToOr (PKSGATE OrGate) { (VOID)OrGate; } __forceinline void KsGateRemoveOnInputFromOr (PKSGATE OrGate) { KsGateTurnInputOff(OrGate); } __forceinline void KsGateRemoveOffInputFromOr (PKSGATE OrGate) { (VOID)OrGate; } __forceinline void KsGateTerminateAnd (PKSGATE AndGate) { if (KsGateGetStateUnsafe(AndGate)) { KsGateRemoveOnInputFromOr(AndGate->NextGate); } else { KsGateRemoveOffInputFromOr(AndGate->NextGate); } } __forceinline void KsGateTerminateOr (PKSGATE OrGate) { if (KsGateGetStateUnsafe(OrGate)) { KsGateRemoveOnInputFromAnd(OrGate->NextGate); } else { KsGateRemoveOffInputFromAnd(OrGate->NextGate); } } #endif /* _NTOS_ */ typedef PVOID KSOBJECT_BAG; typedef BOOLEAN (*PFNKSGENERATEEVENTCALLBACK)(PVOID Context, PKSEVENT_ENTRY EventEntry); typedef NTSTATUS (*PFNKSDEVICECREATE)(PKSDEVICE Device); typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(PKSDEVICE Device,PIRP Irp, PCM_RESOURCE_LIST TranslatedResourceList, PCM_RESOURCE_LIST UntranslatedResourceList); typedef NTSTATUS (*PFNKSDEVICE)(PKSDEVICE Device); typedef NTSTATUS (*PFNKSDEVICEIRP)(PKSDEVICE Device,PIRP Irp); typedef void (*PFNKSDEVICEIRPVOID)(PKSDEVICE Device,PIRP Irp); typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(PKSDEVICE Device,PIRP Irp, PDEVICE_CAPABILITIES Capabilities); typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(PKSDEVICE Device,PIRP Irp, DEVICE_POWER_STATE DeviceTo, DEVICE_POWER_STATE DeviceFrom, SYSTEM_POWER_STATE SystemTo, SYSTEM_POWER_STATE SystemFrom, POWER_ACTION Action); typedef void (*PFNKSDEVICESETPOWER)(PKSDEVICE Device,PIRP Irp, DEVICE_POWER_STATE To, DEVICE_POWER_STATE From); typedef NTSTATUS (*PFNKSFILTERFACTORYVOID)(PKSFILTERFACTORY FilterFactory); typedef void (*PFNKSFILTERFACTORYPOWER)(PKSFILTERFACTORY FilterFactory, DEVICE_POWER_STATE State); typedef NTSTATUS (*PFNKSFILTERIRP)(PKSFILTER Filter,PIRP Irp); typedef NTSTATUS (*PFNKSFILTERPROCESS)(PKSFILTER Filter, PKSPROCESSPIN_INDEXENTRY Index); typedef NTSTATUS (*PFNKSFILTERVOID)(PKSFILTER Filter); typedef void (*PFNKSFILTERPOWER)(PKSFILTER Filter,DEVICE_POWER_STATE State); typedef NTSTATUS (*PFNKSPINIRP)(PKSPIN Pin,PIRP Irp); typedef NTSTATUS (*PFNKSPINSETDEVICESTATE)(PKSPIN Pin,KSSTATE ToState, KSSTATE FromState); typedef NTSTATUS (*PFNKSPINSETDATAFORMAT)(PKSPIN Pin,PKSDATAFORMAT OldFormat, PKSMULTIPLE_ITEM OldAttributeList, const KSDATARANGE *DataRange, const KSATTRIBUTE_LIST *AttributeRange); typedef NTSTATUS (*PFNKSPINHANDSHAKE)(PKSPIN Pin,PKSHANDSHAKE In, PKSHANDSHAKE Out); typedef NTSTATUS (*PFNKSPIN)(PKSPIN Pin); typedef void (*PFNKSPINVOID)(PKSPIN Pin); typedef void (*PFNKSPINPOWER)(PKSPIN Pin,DEVICE_POWER_STATE State); typedef BOOLEAN (*PFNKSPINSETTIMER)(PKSPIN Pin,PKTIMER Timer, LARGE_INTEGER DueTime,PKDPC Dpc); typedef BOOLEAN (*PFNKSPINCANCELTIMER)(PKSPIN Pin,PKTIMER Timer); typedef LONGLONG (FASTCALL *PFNKSPINCORRELATEDTIME)(PKSPIN Pin, PLONGLONG SystemTime); typedef void (*PFNKSPINRESOLUTION)(PKSPIN Pin,PKSRESOLUTION Resolution); typedef NTSTATUS (*PFNKSPININITIALIZEALLOCATOR)(PKSPIN Pin, PKSALLOCATOR_FRAMING AllocatorFraming, PVOID *Context); typedef void (*PFNKSSTREAMPOINTER)(PKSSTREAM_POINTER StreamPointer); typedef struct KSAUTOMATION_TABLE_ KSAUTOMATION_TABLE,*PKSAUTOMATION_TABLE; struct KSAUTOMATION_TABLE_ { ULONG PropertySetsCount; ULONG PropertyItemSize; const KSPROPERTY_SET *PropertySets; ULONG MethodSetsCount; ULONG MethodItemSize; const KSMETHOD_SET *MethodSets; ULONG EventSetsCount; ULONG EventItemSize; const KSEVENT_SET *EventSets; #ifndef _WIN64 PVOID Alignment; #endif }; #define DEFINE_KSAUTOMATION_TABLE(table) \ const KSAUTOMATION_TABLE table = #define DEFINE_KSAUTOMATION_PROPERTIES(table) \ SIZEOF_ARRAY(table), \ sizeof(KSPROPERTY_ITEM), \ table #define DEFINE_KSAUTOMATION_METHODS(table) \ SIZEOF_ARRAY(table), \ sizeof(KSMETHOD_ITEM), \ table #define DEFINE_KSAUTOMATION_EVENTS(table) \ SIZEOF_ARRAY(table), \ sizeof(KSEVENT_ITEM), \ table #define DEFINE_KSAUTOMATION_PROPERTIES_NULL \ 0, \ sizeof(KSPROPERTY_ITEM), \ NULL #define DEFINE_KSAUTOMATION_METHODS_NULL \ 0, \ sizeof(KSMETHOD_ITEM), \ NULL #define DEFINE_KSAUTOMATION_EVENTS_NULL \ 0, \ sizeof(KSEVENT_ITEM), \ NULL #define MIN_DEV_VER_FOR_QI (0x100) struct _KSDEVICE_DISPATCH { PFNKSDEVICECREATE Add; PFNKSDEVICEPNPSTART Start; PFNKSDEVICE PostStart; PFNKSDEVICEIRP QueryStop; PFNKSDEVICEIRPVOID CancelStop; PFNKSDEVICEIRPVOID Stop; PFNKSDEVICEIRP QueryRemove; PFNKSDEVICEIRPVOID CancelRemove; PFNKSDEVICEIRPVOID Remove; PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; PFNKSDEVICEIRPVOID SurpriseRemoval; PFNKSDEVICEQUERYPOWER QueryPower; PFNKSDEVICESETPOWER SetPower; PFNKSDEVICEIRP QueryInterface; }; struct _KSFILTER_DISPATCH { PFNKSFILTERIRP Create; PFNKSFILTERIRP Close; PFNKSFILTERPROCESS Process; PFNKSFILTERVOID Reset; }; struct _KSPIN_DISPATCH { PFNKSPINIRP Create; PFNKSPINIRP Close; PFNKSPIN Process; PFNKSPINVOID Reset; PFNKSPINSETDATAFORMAT SetDataFormat; PFNKSPINSETDEVICESTATE SetDeviceState; PFNKSPIN Connect; PFNKSPINVOID Disconnect; const KSCLOCK_DISPATCH *Clock; const KSALLOCATOR_DISPATCH *Allocator; }; struct _KSCLOCK_DISPATCH { PFNKSPINSETTIMER SetTimer; PFNKSPINCANCELTIMER CancelTimer; PFNKSPINCORRELATEDTIME CorrelatedTime; PFNKSPINRESOLUTION Resolution; }; struct _KSALLOCATOR_DISPATCH { PFNKSPININITIALIZEALLOCATOR InitializeAllocator; PFNKSDELETEALLOCATOR DeleteAllocator; PFNKSDEFAULTALLOCATE Allocate; PFNKSDEFAULTFREE Free; }; #define KSDEVICE_DESCRIPTOR_VERSION (0x100) struct _KSDEVICE_DESCRIPTOR { const KSDEVICE_DISPATCH *Dispatch; ULONG FilterDescriptorsCount; const KSFILTER_DESCRIPTOR*const *FilterDescriptors; ULONG Version; }; struct _KSFILTER_DESCRIPTOR { const KSFILTER_DISPATCH *Dispatch; const KSAUTOMATION_TABLE *AutomationTable; ULONG Version; #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1) ULONG Flags; #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001 #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002 #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004 #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008 #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000 const GUID *ReferenceGuid; ULONG PinDescriptorsCount; ULONG PinDescriptorSize; const KSPIN_DESCRIPTOR_EX *PinDescriptors; ULONG CategoriesCount; const GUID *Categories; ULONG NodeDescriptorsCount; ULONG NodeDescriptorSize; const KSNODE_DESCRIPTOR *NodeDescriptors; ULONG ConnectionsCount; const KSTOPOLOGY_CONNECTION *Connections; const KSCOMPONENTID *ComponentId; }; #define DEFINE_KSFILTER_DESCRIPTOR(descriptor) \ const KSFILTER_DESCRIPTOR descriptor = #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table) \ SIZEOF_ARRAY(table), \ sizeof(table[0]), \ table #define DEFINE_KSFILTER_CATEGORIES(table) \ SIZEOF_ARRAY(table), \ table #define DEFINE_KSFILTER_CATEGORY(category) \ 1, \ &(category) #define DEFINE_KSFILTER_CATEGORIES_NULL \ 0, \ NULL #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table) \ SIZEOF_ARRAY(table), \ sizeof(table[0]), \ table #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL \ 0, \ sizeof(KSNODE_DESCRIPTOR), \ NULL #define DEFINE_KSFILTER_CONNECTIONS(table) \ SIZEOF_ARRAY(table), \ table #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS \ 0, \ NULL #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table) \ const KSFILTER_DESCRIPTOR*const table[] = struct _KSPIN_DESCRIPTOR_EX { const KSPIN_DISPATCH *Dispatch; const KSAUTOMATION_TABLE *AutomationTable; KSPIN_DESCRIPTOR PinDescriptor; ULONG Flags; #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008 #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010 #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020 #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040 #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080 #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100 #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200 #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000 #define KSPIN_FLAG_SPLITTER 0x00020000 #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000 #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000 #define KSPIN_FLAG_FIXED_FORMAT 0x00100000 #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000 #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS) #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000 #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000 #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000 #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000 ULONG InstancesPossible; ULONG InstancesNecessary; const KSALLOCATOR_FRAMING_EX *AllocatorFraming; PFNKSINTERSECTHANDLEREX IntersectHandler; }; #define DEFINE_KSPIN_DEFAULT_INTERFACES \ 0, \ NULL #define DEFINE_KSPIN_DEFAULT_MEDIUMS \ 0, \ NULL struct _KSNODE_DESCRIPTOR { const KSAUTOMATION_TABLE *AutomationTable; const GUID *Type; const GUID *Name; #ifndef _WIN64 PVOID Alignment; #endif }; #ifndef _WIN64 #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ { (automation), (type), (name), NULL } #else #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \ { (automation), (type), (name) } #endif struct _KSDEVICE { const KSDEVICE_DESCRIPTOR *Descriptor; KSOBJECT_BAG Bag; PVOID Context; PDEVICE_OBJECT FunctionalDeviceObject; PDEVICE_OBJECT PhysicalDeviceObject; PDEVICE_OBJECT NextDeviceObject; BOOLEAN Started; SYSTEM_POWER_STATE SystemPowerState; DEVICE_POWER_STATE DevicePowerState; }; struct _KSFILTERFACTORY { const KSFILTER_DESCRIPTOR *FilterDescriptor; KSOBJECT_BAG Bag; PVOID Context; }; struct _KSFILTER { const KSFILTER_DESCRIPTOR *Descriptor; KSOBJECT_BAG Bag; PVOID Context; }; struct _KSPIN { const KSPIN_DESCRIPTOR_EX *Descriptor; KSOBJECT_BAG Bag; PVOID Context; ULONG Id; KSPIN_COMMUNICATION Communication; BOOLEAN ConnectionIsExternal; KSPIN_INTERFACE ConnectionInterface; KSPIN_MEDIUM ConnectionMedium; KSPRIORITY ConnectionPriority; PKSDATAFORMAT ConnectionFormat; PKSMULTIPLE_ITEM AttributeList; ULONG StreamHeaderSize; KSPIN_DATAFLOW DataFlow; KSSTATE DeviceState; KSRESET ResetState; KSSTATE ClientState; }; struct _KSMAPPING { PHYSICAL_ADDRESS PhysicalAddress; ULONG ByteCount; ULONG Alignment; }; struct _KSSTREAM_POINTER_OFFSET { #if defined(_NTDDK_) __C89_NAMELESS union { PUCHAR Data; PKSMAPPING Mappings; }; #else PUCHAR Data; #endif /* _NTDDK_ */ #ifndef _WIN64 PVOID Alignment; #endif ULONG Count; ULONG Remaining; }; struct _KSSTREAM_POINTER { PVOID Context; PKSPIN Pin; PKSSTREAM_HEADER StreamHeader; PKSSTREAM_POINTER_OFFSET Offset; KSSTREAM_POINTER_OFFSET OffsetIn; KSSTREAM_POINTER_OFFSET OffsetOut; }; struct _KSPROCESSPIN { PKSPIN Pin; PKSSTREAM_POINTER StreamPointer; PKSPROCESSPIN InPlaceCounterpart; PKSPROCESSPIN DelegateBranch; PKSPROCESSPIN CopySource; PVOID Data; ULONG BytesAvailable; ULONG BytesUsed; ULONG Flags; BOOLEAN Terminate; }; struct _KSPROCESSPIN_INDEXENTRY { PKSPROCESSPIN *Pins; ULONG Count; }; typedef enum { KsObjectTypeDevice, KsObjectTypeFilterFactory, KsObjectTypeFilter, KsObjectTypePin } KSOBJECTTYPE; typedef void (*PFNKSFREE)(PVOID Data); typedef void (*PFNKSPINFRAMERETURN)(PKSPIN Pin,PVOID Data,ULONG Size,PMDL Mdl, PVOID Context,NTSTATUS Status); typedef void (*PFNKSPINIRPCOMPLETION)(PKSPIN Pin,PIRP Irp); #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) #ifndef _IKsControl_ #define _IKsControl_ typedef struct IKsControl *PIKSCONTROL; #ifndef DEFINE_ABSTRACT_UNKNOWN #define DEFINE_ABSTRACT_UNKNOWN() \ STDMETHOD_(NTSTATUS,QueryInterface) (THIS_ \ REFIID InterfaceId, \ PVOID *Interface \ ) PURE; \ STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ STDMETHOD_(ULONG,Release)(THIS) PURE; #endif #undef INTERFACE #define INTERFACE IKsControl DECLARE_INTERFACE_(IKsControl,IUnknown) { DEFINE_ABSTRACT_UNKNOWN() STDMETHOD_(NTSTATUS,KsProperty)(THIS_ PKSPROPERTY Property, ULONG PropertyLength, PVOID PropertyData, ULONG DataLength, ULONG *BytesReturned ) PURE; STDMETHOD_(NTSTATUS,KsMethod) (THIS_ PKSMETHOD Method, ULONG MethodLength, PVOID MethodData, ULONG DataLength, ULONG *BytesReturned ) PURE; STDMETHOD_(NTSTATUS,KsEvent) (THIS_ PKSEVENT Event, ULONG EventLength, PVOID EventData, ULONG DataLength, ULONG *BytesReturned ) PURE; }; typedef struct IKsReferenceClock *PIKSREFERENCECLOCK; #undef INTERFACE #define INTERFACE IKsReferenceClock DECLARE_INTERFACE_(IKsReferenceClock,IUnknown) { DEFINE_ABSTRACT_UNKNOWN() STDMETHOD_(LONGLONG,GetTime) (THIS) PURE; STDMETHOD_(LONGLONG,GetPhysicalTime) (THIS) PURE; STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_ PLONGLONG SystemTime ) PURE; STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_ PLONGLONG SystemTime ) PURE; STDMETHOD_(NTSTATUS,GetResolution) (THIS_ PKSRESOLUTION Resolution ) PURE; STDMETHOD_(NTSTATUS,GetState) (THIS_ PKSSTATE State ) PURE; }; #undef INTERFACE #define INTERFACE IKsDeviceFunctions DECLARE_INTERFACE_(IKsDeviceFunctions,IUnknown) { DEFINE_ABSTRACT_UNKNOWN() STDMETHOD_(NTSTATUS,RegisterAdapterObjectEx) (THIS_ PADAPTER_OBJECT AdapterObject, PDEVICE_DESCRIPTION DeviceDescription, ULONG NumberOfMapRegisters, ULONG MaxMappingsByteCount, ULONG MappingTableStride ) PURE; }; #undef INTERFACE #define STATIC_IID_IKsControl \ 0x28F54685,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96 DEFINE_GUID(IID_IKsControl, 0x28F54685,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96); #define STATIC_IID_IKsFastClock \ 0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e DEFINE_GUID(IID_IKsFastClock, 0xc9902485,0xc180,0x11d2,0x84,0x73,0xd4,0x23,0x94,0x45,0x9e,0x5e); #define STATIC_IID_IKsDeviceFunctions \ 0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd DEFINE_GUID(IID_IKsDeviceFunctions, 0xe234f2e2,0xbd69,0x4f8c,0xb3,0xf2,0x7c,0xd7,0x9e,0xd4,0x66,0xbd); #endif /* _IKsControl_ */ #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ #endif /* _NTDDK_ */ #ifdef __cplusplus extern "C" { #endif #ifdef _KSDDK_ #define KSDDKAPI #else #define KSDDKAPI DECLSPEC_IMPORT #endif #if defined(_NTDDK_) KSDDKAPI NTSTATUS NTAPI KsEnableEvent (PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); KSDDKAPI NTSTATUS NTAPI KsEnableEventWithAllocator (PIRP Irp, ULONG EventSetsCount, const KSEVENT_SET *EventSet, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock, PFNKSALLOCATOR Allocator, ULONG EventItemSize); KSDDKAPI NTSTATUS NTAPI KsDisableEvent (PIRP Irp, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); KSDDKAPI VOID NTAPI KsDiscardEvent (PKSEVENT_ENTRY EventEntry); KSDDKAPI VOID NTAPI KsFreeEventList (PFILE_OBJECT FileObject, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); KSDDKAPI NTSTATUS NTAPI KsGenerateEvent (PKSEVENT_ENTRY EventEntry); KSDDKAPI NTSTATUS NTAPI KsGenerateDataEvent (PKSEVENT_ENTRY EventEntry, ULONG DataSize, PVOID Data); KSDDKAPI VOID NTAPI KsGenerateEventList (GUID *Set, ULONG EventId, PLIST_ENTRY EventsList, KSEVENTS_LOCKTYPE EventsFlags, PVOID EventsLock); KSDDKAPI NTSTATUS NTAPI KsPropertyHandler (PIRP Irp, ULONG PropertySetsCount, const KSPROPERTY_SET *PropertySet); KSDDKAPI NTSTATUS NTAPI KsPropertyHandlerWithAllocator (PIRP Irp, ULONG PropertySetsCount, const KSPROPERTY_SET *PropertySet, PFNKSALLOCATOR Allocator, ULONG PropertyItemSize); KSDDKAPI BOOLEAN NTAPI KsFastPropertyHandler (PFILE_OBJECT FileObject, PKSPROPERTY Property, ULONG PropertyLength, PVOID Data, ULONG DataLength, PIO_STATUS_BLOCK IoStatus, ULONG PropertySetsCount, const KSPROPERTY_SET *PropertySet); KSDDKAPI NTSTATUS NTAPI KsMethodHandler (PIRP Irp, ULONG MethodSetsCount, const KSMETHOD_SET *MethodSet); KSDDKAPI NTSTATUS NTAPI KsMethodHandlerWithAllocator (PIRP Irp, ULONG MethodSetsCount, const KSMETHOD_SET *MethodSet, PFNKSALLOCATOR Allocator, ULONG MethodItemSize); KSDDKAPI BOOLEAN NTAPI KsFastMethodHandler (PFILE_OBJECT FileObject, PKSMETHOD Method, ULONG MethodLength, PVOID Data, ULONG DataLength, PIO_STATUS_BLOCK IoStatus, ULONG MethodSetsCount, const KSMETHOD_SET *MethodSet); KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocator (PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx (PIRP Irp, PVOID InitializeContext, PFNKSDEFAULTALLOCATE DefaultAllocate, PFNKSDEFAULTFREE DefaultFree, PFNKSINITIALIZEALLOCATOR InitializeAllocator, PFNKSDELETEALLOCATOR DeleteAllocator); KSDDKAPI NTSTATUS NTAPI KsCreateAllocator (HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming, PHANDLE AllocatorHandle); KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorCreateRequest (PIRP Irp, PKSALLOCATOR_FRAMING *AllocatorFraming); KSDDKAPI NTSTATUS NTAPI KsValidateAllocatorFramingEx (PKSALLOCATOR_FRAMING_EX Framing, ULONG BufferSize, const KSALLOCATOR_FRAMING_EX *PinFraming); KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock (PKSDEFAULTCLOCK *DefaultClock); KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx (PKSDEFAULTCLOCK *DefaultClock, PVOID Context, PFNKSSETTIMER SetTimer, PFNKSCANCELTIMER CancelTimer, PFNKSCORRELATEDTIME CorrelatedTime, const KSRESOLUTION *Resolution, ULONG Flags); KSDDKAPI VOID NTAPI KsFreeDefaultClock (PKSDEFAULTCLOCK DefaultClock); KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock (PIRP Irp, PKSDEFAULTCLOCK DefaultClock); KSDDKAPI NTSTATUS NTAPI KsCreateClock (HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate, PHANDLE ClockHandle); KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest (PIRP Irp, PKSCLOCK_CREATE *ClockCreate); KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState (PKSDEFAULTCLOCK DefaultClock); KSDDKAPI VOID NTAPI KsSetDefaultClockState(PKSDEFAULTCLOCK DefaultClock, KSSTATE State); KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime (PKSDEFAULTCLOCK DefaultClock); KSDDKAPI VOID NTAPI KsSetDefaultClockTime(PKSDEFAULTCLOCK DefaultClock, LONGLONG Time); KSDDKAPI NTSTATUS NTAPI KsCreatePin (HANDLE FilterHandle, PKSPIN_CONNECT Connect, ACCESS_MASK DesiredAccess, PHANDLE ConnectionHandle); KSDDKAPI NTSTATUS NTAPI KsValidateConnectRequest (PIRP Irp, ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor, PKSPIN_CONNECT *Connect); KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler (PIRP Irp, PKSPROPERTY Property, PVOID Data, ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor); KSDDKAPI NTSTATUS NTAPI KsPinDataIntersection (PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor, PFNKSINTERSECTHANDLER IntersectHandler); KSDDKAPI NTSTATUS NTAPI KsPinDataIntersectionEx (PIRP Irp, PKSP_PIN Pin, PVOID Data, ULONG DescriptorsCount, const KSPIN_DESCRIPTOR *Descriptor, ULONG DescriptorSize, PFNKSINTERSECTHANDLEREX IntersectHandler, PVOID HandlerContext); KSDDKAPI NTSTATUS NTAPI KsHandleSizedListQuery (PIRP Irp, ULONG DataItemsCount, ULONG DataItemSize, const VOID *DataItems); #ifndef MAKEINTRESOURCE #define MAKEINTRESOURCE(r) ((ULONG_PTR) (USHORT) r) #endif #ifndef RT_STRING #define RT_STRING MAKEINTRESOURCE(6) #define RT_RCDATA MAKEINTRESOURCE(10) #endif KSDDKAPI NTSTATUS NTAPI KsLoadResource (PVOID ImageBase, POOL_TYPE PoolType, ULONG_PTR ResourceName, ULONG ResourceType, PVOID *Resource, PULONG ResourceSize); KSDDKAPI NTSTATUS NTAPI KsGetImageNameAndResourceId (HANDLE RegKey, PUNICODE_STRING ImageName, PULONG_PTR ResourceId, PULONG ValueType); KSDDKAPI NTSTATUS NTAPI KsMapModuleName (PDEVICE_OBJECT PhysicalDeviceObject, PUNICODE_STRING ModuleName, PUNICODE_STRING ImageName, PULONG_PTR ResourceId, PULONG ValueType); KSDDKAPI NTSTATUS NTAPI KsReferenceBusObject (KSDEVICE_HEADER Header); KSDDKAPI VOID NTAPI KsDereferenceBusObject (KSDEVICE_HEADER Header); KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity (PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificProperty (PIRP Irp, PFNKSHANDLER Handler); KSDDKAPI NTSTATUS NTAPI KsDispatchSpecificMethod (PIRP Irp, PFNKSHANDLER Handler); KSDDKAPI NTSTATUS NTAPI KsReadFile (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, ULONG Key, KPROCESSOR_MODE RequestorMode); KSDDKAPI NTSTATUS NTAPI KsWriteFile (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, ULONG Key, KPROCESSOR_MODE RequestorMode); KSDDKAPI NTSTATUS NTAPI KsQueryInformationFile (PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass); KSDDKAPI NTSTATUS NTAPI KsSetInformationFile (PFILE_OBJECT FileObject, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass); KSDDKAPI NTSTATUS NTAPI KsStreamIo (PFILE_OBJECT FileObject, PKEVENT Event, PVOID PortContext, PIO_COMPLETION_ROUTINE CompletionRoutine, PVOID CompletionContext, KSCOMPLETION_INVOCATION CompletionInvocationFlags, PIO_STATUS_BLOCK IoStatusBlock, PVOID StreamHeaders, ULONG Length, ULONG Flags, KPROCESSOR_MODE RequestorMode); KSDDKAPI NTSTATUS NTAPI KsProbeStreamIrp(PIRP Irp, ULONG ProbeFlags, ULONG HeaderSize); KSDDKAPI NTSTATUS NTAPI KsAllocateExtraData(PIRP Irp, ULONG ExtraSize, PVOID *ExtraBuffer); KSDDKAPI VOID NTAPI KsNullDriverUnload (PDRIVER_OBJECT DriverObject); KSDDKAPI NTSTATUS NTAPI KsSetMajorFunctionHandler (PDRIVER_OBJECT DriverObject, ULONG MajorFunction); KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest (PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion (PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsDispatchIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI BOOLEAN NTAPI KsDispatchFastIoDeviceControlFailure (PFILE_OBJECT FileObject, BOOLEAN Wait, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength, ULONG IoControlCode, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject); KSDDKAPI BOOLEAN NTAPI KsDispatchFastReadFailure (PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject); #define KsDispatchFastWriteFailure KsDispatchFastReadFailure KSDDKAPI VOID NTAPI KsCancelRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI VOID NTAPI KsCancelIo(PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock); KSDDKAPI VOID NTAPI KsReleaseIrpOnCancelableQueue(PIRP Irp, PDRIVER_CANCEL DriverCancel); KSDDKAPI PIRP NTAPI KsRemoveIrpFromCancelableQueue (PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, KSLIST_ENTRY_LOCATION ListLocation, KSIRP_REMOVAL_OPERATION RemovalOperation); KSDDKAPI NTSTATUS NTAPI KsMoveIrpsOnCancelableQueue (PLIST_ENTRY SourceList, PKSPIN_LOCK SourceLock, PLIST_ENTRY DestinationList, PKSPIN_LOCK DestinationLock, KSLIST_ENTRY_LOCATION ListLocation, PFNKSIRPLISTCALLBACK ListCallback, PVOID Context); KSDDKAPI VOID NTAPI KsRemoveSpecificIrpFromCancelableQueue (PIRP Irp); KSDDKAPI VOID NTAPI KsAddIrpToCancelableQueue (PLIST_ENTRY QueueHead, PKSPIN_LOCK SpinLock, PIRP Irp, KSLIST_ENTRY_LOCATION ListLocation, PDRIVER_CANCEL DriverCancel); KSDDKAPI NTSTATUS NTAPI KsAcquireResetValue(PIRP Irp, KSRESET *ResetValue); KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler (PIRP Irp, PKSPROPERTY Property, PVOID Data, const KSTOPOLOGY *Topology); KSDDKAPI VOID NTAPI KsAcquireDeviceSecurityLock(KSDEVICE_HEADER Header, BOOLEAN Exclusive); KSDDKAPI VOID NTAPI KsReleaseDeviceSecurityLock (KSDEVICE_HEADER Header); KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsDefaultDispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI NTSTATUS NTAPI KsDefaultForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp); KSDDKAPI VOID NTAPI KsSetDevicePnpAndBaseObject (KSDEVICE_HEADER Header, PDEVICE_OBJECT PnpDeviceObject, PDEVICE_OBJECT BaseObject); KSDDKAPI PDEVICE_OBJECT NTAPI KsQueryDevicePnpObject (KSDEVICE_HEADER Header); KSDDKAPI ACCESS_MASK NTAPI KsQueryObjectAccessMask (KSOBJECT_HEADER Header); KSDDKAPI VOID NTAPI KsRecalculateStackDepth (KSDEVICE_HEADER Header, BOOLEAN ReuseStackLocation); KSDDKAPI VOID NTAPI KsSetTargetState (KSOBJECT_HEADER Header, KSTARGET_STATE TargetState); KSDDKAPI VOID NTAPI KsSetTargetDeviceObject (KSOBJECT_HEADER Header, PDEVICE_OBJECT TargetDevice); KSDDKAPI VOID NTAPI KsSetPowerDispatch (KSOBJECT_HEADER Header, PFNKSCONTEXT_DISPATCH PowerDispatch, PVOID PowerContext); KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI KsQueryObjectCreateItem (KSOBJECT_HEADER Header); KSDDKAPI NTSTATUS NTAPI KsAllocateDeviceHeader (KSDEVICE_HEADER *Header, ULONG ItemsCount, PKSOBJECT_CREATE_ITEM ItemsList); KSDDKAPI VOID NTAPI KsFreeDeviceHeader (KSDEVICE_HEADER Header); KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader (KSOBJECT_HEADER *Header, ULONG ItemsCount, PKSOBJECT_CREATE_ITEM ItemsList, PIRP Irp, const KSDISPATCH_TABLE *Table); KSDDKAPI VOID NTAPI KsFreeObjectHeader (KSOBJECT_HEADER Header); KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToDeviceHeader (KSDEVICE_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context, PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor); KSDDKAPI NTSTATUS NTAPI KsAddObjectCreateItemToObjectHeader (KSOBJECT_HEADER Header, PDRIVER_DISPATCH Create, PVOID Context, PWSTR ObjectClass, PSECURITY_DESCRIPTOR SecurityDescriptor); KSDDKAPI NTSTATUS NTAPI KsAllocateObjectCreateItem (KSDEVICE_HEADER Header, PKSOBJECT_CREATE_ITEM CreateItem, BOOLEAN AllocateEntry, PFNKSITEMFREECALLBACK ItemFreeCallback); KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItem (KSDEVICE_HEADER Header, PUNICODE_STRING CreateItem); KSDDKAPI NTSTATUS NTAPI KsFreeObjectCreateItemsByContext (KSDEVICE_HEADER Header, PVOID Context); KSDDKAPI NTSTATUS NTAPI KsCreateDefaultSecurity (PSECURITY_DESCRIPTOR ParentSecurity, PSECURITY_DESCRIPTOR *DefaultSecurity); KSDDKAPI NTSTATUS NTAPI KsForwardIrp (PIRP Irp, PFILE_OBJECT FileObject, BOOLEAN ReuseStackLocation); KSDDKAPI NTSTATUS NTAPI KsForwardAndCatchIrp (PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject, KSSTACK_USE StackUse); KSDDKAPI NTSTATUS NTAPI KsSynchronousIoControlDevice (PFILE_OBJECT FileObject, KPROCESSOR_MODE RequestorMode, ULONG IoControl, PVOID InBuffer, ULONG InSize, PVOID OutBuffer, ULONG OutSize, PULONG BytesReturned); KSDDKAPI NTSTATUS NTAPI KsUnserializeObjectPropertiesFromRegistry (PFILE_OBJECT FileObject, HANDLE ParentKey, PUNICODE_STRING RegistryPath); KSDDKAPI NTSTATUS NTAPI KsCacheMedium (PUNICODE_STRING SymbolicLink, PKSPIN_MEDIUM Medium, ULONG PinDirection); KSDDKAPI NTSTATUS NTAPI KsRegisterWorker (WORK_QUEUE_TYPE WorkQueueType, PKSWORKER *Worker); KSDDKAPI NTSTATUS NTAPI KsRegisterCountedWorker (WORK_QUEUE_TYPE WorkQueueType, PWORK_QUEUE_ITEM CountedWorkItem, PKSWORKER *Worker); KSDDKAPI VOID NTAPI KsUnregisterWorker (PKSWORKER Worker); KSDDKAPI NTSTATUS NTAPI KsQueueWorkItem(PKSWORKER Worker, PWORK_QUEUE_ITEM WorkItem); KSDDKAPI ULONG NTAPI KsIncrementCountedWorker (PKSWORKER Worker); KSDDKAPI ULONG NTAPI KsDecrementCountedWorker (PKSWORKER Worker); KSDDKAPI NTSTATUS NTAPI KsCreateTopologyNode (HANDLE ParentHandle, PKSNODE_CREATE NodeCreate, ACCESS_MASK DesiredAccess, PHANDLE NodeHandle); KSDDKAPI NTSTATUS NTAPI KsValidateTopologyNodeCreateRequest (PIRP Irp, PKSTOPOLOGY Topology, PKSNODE_CREATE *NodeCreate); KSDDKAPI NTSTATUS NTAPI KsMergeAutomationTables (PKSAUTOMATION_TABLE *AutomationTableAB, PKSAUTOMATION_TABLE AutomationTableA, PKSAUTOMATION_TABLE AutomationTableB, KSOBJECT_BAG Bag); KSDDKAPI NTSTATUS NTAPI KsInitializeDriver (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPathName, const KSDEVICE_DESCRIPTOR *Descriptor); KSDDKAPI NTSTATUS NTAPI KsAddDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject); KSDDKAPI NTSTATUS NTAPI KsCreateDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject, const KSDEVICE_DESCRIPTOR *Descriptor, ULONG ExtensionSize, PKSDEVICE *Device); KSDDKAPI NTSTATUS NTAPI KsInitializeDevice (PDEVICE_OBJECT FunctionalDeviceObject, PDEVICE_OBJECT PhysicalDeviceObject, PDEVICE_OBJECT NextDeviceObject, const KSDEVICE_DESCRIPTOR *Descriptor); KSDDKAPI void NTAPI KsTerminateDevice (PDEVICE_OBJECT DeviceObject); KSDDKAPI PKSDEVICE NTAPI KsGetDeviceForDeviceObject (PDEVICE_OBJECT FunctionalDeviceObject); KSDDKAPI void NTAPI KsAcquireDevice (PKSDEVICE Device); KSDDKAPI void NTAPI KsReleaseDevice (PKSDEVICE Device); KSDDKAPI void NTAPI KsDeviceRegisterAdapterObject (PKSDEVICE Device, PADAPTER_OBJECT AdapterObject, ULONG MaxMappingsByteCount, ULONG MappingTableStride); KSDDKAPI ULONG NTAPI KsDeviceGetBusData (PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset, ULONG Length); KSDDKAPI ULONG NTAPI KsDeviceSetBusData (PKSDEVICE Device, ULONG DataType, PVOID Buffer, ULONG Offset, ULONG Length); KSDDKAPI NTSTATUS NTAPI KsCreateFilterFactory (PDEVICE_OBJECT DeviceObject, const KSFILTER_DESCRIPTOR *Descriptor, PWSTR RefString, PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags, PFNKSFILTERFACTORYPOWER SleepCallback, PFNKSFILTERFACTORYPOWER WakeCallback, PKSFILTERFACTORY *FilterFactory); #define KsDeleteFilterFactory(FilterFactory) \ KsFreeObjectCreateItemsByContext( *(KSDEVICE_HEADER *)( \ KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->DeviceExtension),\ FilterFactory) KSDDKAPI NTSTATUS NTAPI KsFilterFactoryUpdateCacheData (PKSFILTERFACTORY FilterFactory, const KSFILTER_DESCRIPTOR *FilterDescriptor); KSDDKAPI NTSTATUS NTAPI KsFilterFactoryAddCreateItem (PKSFILTERFACTORY FilterFactory, PWSTR RefString, PSECURITY_DESCRIPTOR SecurityDescriptor, ULONG CreateItemFlags); KSDDKAPI NTSTATUS NTAPI KsFilterFactorySetDeviceClassesState (PKSFILTERFACTORY FilterFactory, BOOLEAN NewState); KSDDKAPI PUNICODE_STRING NTAPI KsFilterFactoryGetSymbolicLink (PKSFILTERFACTORY FilterFactory); KSDDKAPI void NTAPI KsAddEvent(PVOID Object, PKSEVENT_ENTRY EventEntry); __forceinline void KsFilterAddEvent (PKSFILTER Filter, PKSEVENT_ENTRY EventEntry) { KsAddEvent(Filter, EventEntry); } __forceinline void KsPinAddEvent (PKSPIN Pin, PKSEVENT_ENTRY EventEntry) { KsAddEvent(Pin, EventEntry); } KSDDKAPI NTSTATUS NTAPI KsDefaultAddEventHandler (PIRP Irp, PKSEVENTDATA EventData, PKSEVENT_ENTRY EventEntry); KSDDKAPI void NTAPI KsGenerateEvents (PVOID Object, const GUID *EventSet, ULONG EventId, ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, PVOID CallBackContext); __forceinline void KsFilterGenerateEvents (PKSFILTER Filter, const GUID *EventSet, ULONG EventId, ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, PVOID CallBackContext) { KsGenerateEvents(Filter, EventSet, EventId, DataSize, Data, CallBack, CallBackContext); } __forceinline void KsPinGenerateEvents (PKSPIN Pin, const GUID *EventSet, ULONG EventId, ULONG DataSize, PVOID Data, PFNKSGENERATEEVENTCALLBACK CallBack, PVOID CallBackContext) { KsGenerateEvents(Pin, EventSet, EventId, DataSize, Data, CallBack, CallBackContext); } typedef enum { KSSTREAM_POINTER_STATE_UNLOCKED = 0, KSSTREAM_POINTER_STATE_LOCKED } KSSTREAM_POINTER_STATE; KSDDKAPI NTSTATUS NTAPI KsPinGetAvailableByteCount (PKSPIN Pin, PLONG InputDataBytes, PLONG OutputBufferBytes); KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetLeadingEdgeStreamPointer (PKSPIN Pin, KSSTREAM_POINTER_STATE State); KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetTrailingEdgeStreamPointer (PKSPIN Pin, KSSTREAM_POINTER_STATE State); KSDDKAPI NTSTATUS NTAPI KsStreamPointerSetStatusCode (PKSSTREAM_POINTER StreamPointer, NTSTATUS Status); KSDDKAPI NTSTATUS NTAPI KsStreamPointerLock (PKSSTREAM_POINTER StreamPointer); KSDDKAPI void NTAPI KsStreamPointerUnlock(PKSSTREAM_POINTER StreamPointer, BOOLEAN Eject); KSDDKAPI void NTAPI KsStreamPointerAdvanceOffsetsAndUnlock (PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed, BOOLEAN Eject); KSDDKAPI void NTAPI KsStreamPointerDelete (PKSSTREAM_POINTER StreamPointer); KSDDKAPI NTSTATUS NTAPI KsStreamPointerClone (PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER CancelCallback, ULONG ContextSize, PKSSTREAM_POINTER *CloneStreamPointer); KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvanceOffsets (PKSSTREAM_POINTER StreamPointer, ULONG InUsed, ULONG OutUsed, BOOLEAN Eject); KSDDKAPI NTSTATUS NTAPI KsStreamPointerAdvance (PKSSTREAM_POINTER StreamPointer); KSDDKAPI PMDL NTAPI KsStreamPointerGetMdl (PKSSTREAM_POINTER StreamPointer); KSDDKAPI PIRP NTAPI KsStreamPointerGetIrp (PKSSTREAM_POINTER StreamPointer, PBOOLEAN FirstFrameInIrp, PBOOLEAN LastFrameInIrp); KSDDKAPI void NTAPI KsStreamPointerScheduleTimeout (PKSSTREAM_POINTER StreamPointer, PFNKSSTREAMPOINTER Callback, ULONGLONG Interval); KSDDKAPI void NTAPI KsStreamPointerCancelTimeout (PKSSTREAM_POINTER StreamPointer); KSDDKAPI PKSSTREAM_POINTER NTAPI KsPinGetFirstCloneStreamPointer (PKSPIN Pin); KSDDKAPI PKSSTREAM_POINTER NTAPI KsStreamPointerGetNextClone (PKSSTREAM_POINTER StreamPointer); KSDDKAPI NTSTATUS NTAPI KsPinHandshake(PKSPIN Pin, PKSHANDSHAKE In, PKSHANDSHAKE Out); KSDDKAPI void NTAPI KsCompletePendingRequest (PIRP Irp); KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp (PIRP Irp); KSDDKAPI PVOID NTAPI KsGetObjectFromFileObject (PFILE_OBJECT FileObject); KSDDKAPI KSOBJECTTYPE NTAPI KsGetObjectTypeFromFileObject (PFILE_OBJECT FileObject); __forceinline PKSFILTER KsGetFilterFromFileObject (PFILE_OBJECT FileObject) { return (PKSFILTER) KsGetObjectFromFileObject(FileObject); } __forceinline PKSPIN KsGetPinFromFileObject (PFILE_OBJECT FileObject) { return (PKSPIN) KsGetObjectFromFileObject(FileObject); } KSDDKAPI PKSGATE NTAPI KsFilterGetAndGate (PKSFILTER Filter); KSDDKAPI void NTAPI KsFilterAcquireProcessingMutex (PKSFILTER Filter); KSDDKAPI void NTAPI KsFilterReleaseProcessingMutex (PKSFILTER Filter); KSDDKAPI void NTAPI KsFilterAttemptProcessing(PKSFILTER Filter, BOOLEAN Asynchronous); KSDDKAPI PKSGATE NTAPI KsPinGetAndGate(PKSPIN Pin); KSDDKAPI void NTAPI KsPinAttachAndGate(PKSPIN Pin, PKSGATE AndGate); KSDDKAPI void NTAPI KsPinAttachOrGate (PKSPIN Pin, PKSGATE OrGate); KSDDKAPI void NTAPI KsPinAcquireProcessingMutex (PKSPIN Pin); KSDDKAPI void NTAPI KsPinReleaseProcessingMutex (PKSPIN Pin); KSDDKAPI BOOLEAN NTAPI KsProcessPinUpdate (PKSPROCESSPIN ProcessPin); KSDDKAPI void NTAPI KsPinGetCopyRelationships (PKSPIN Pin, PKSPIN *CopySource, PKSPIN *DelegateBranch); KSDDKAPI void NTAPI KsPinAttemptProcessing(PKSPIN Pin, BOOLEAN Asynchronous); KSDDKAPI PVOID NTAPI KsGetParent (PVOID Object); __forceinline PKSDEVICE KsFilterFactoryGetParentDevice (PKSFILTERFACTORY FilterFactory) { return (PKSDEVICE) KsGetParent((PVOID) FilterFactory); } __forceinline PKSFILTERFACTORY KsFilterGetParentFilterFactory (PKSFILTER Filter) { return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter); } KSDDKAPI PKSFILTER NTAPI KsPinGetParentFilter (PKSPIN Pin); KSDDKAPI PVOID NTAPI KsGetFirstChild (PVOID Object); __forceinline PKSFILTERFACTORY KsDeviceGetFirstChildFilterFactory (PKSDEVICE Device) { return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device); } __forceinline PKSFILTER KsFilterFactoryGetFirstChildFilter (PKSFILTERFACTORY FilterFactory) { return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory); } KSDDKAPI ULONG NTAPI KsFilterGetChildPinCount(PKSFILTER Filter, ULONG PinId); KSDDKAPI PKSPIN NTAPI KsFilterGetFirstChildPin(PKSFILTER Filter, ULONG PinId); KSDDKAPI PVOID NTAPI KsGetNextSibling (PVOID Object); KSDDKAPI PKSPIN NTAPI KsPinGetNextSiblingPin (PKSPIN Pin); __forceinline PKSFILTERFACTORY KsFilterFactoryGetNextSiblingFilterFactory (PKSFILTERFACTORY FilterFactory) { return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory); } __forceinline PKSFILTER KsFilterGetNextSiblingFilter (PKSFILTER Filter) { return (PKSFILTER) KsGetNextSibling((PVOID) Filter); } KSDDKAPI PKSDEVICE NTAPI KsGetDevice (PVOID Object); __forceinline PKSDEVICE KsFilterFactoryGetDevice (PKSFILTERFACTORY FilterFactory) { return KsGetDevice((PVOID) FilterFactory); } __forceinline PKSDEVICE KsFilterGetDevice (PKSFILTER Filter) { return KsGetDevice((PVOID) Filter); } __forceinline PKSDEVICE KsPinGetDevice (PKSPIN Pin) { return KsGetDevice((PVOID) Pin); } KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp (PIRP Irp); KSDDKAPI PKSPIN NTAPI KsGetPinFromIrp (PIRP Irp); KSDDKAPI ULONG NTAPI KsGetNodeIdFromIrp (PIRP Irp); KSDDKAPI void NTAPI KsAcquireControl (PVOID Object); KSDDKAPI void NTAPI KsReleaseControl (PVOID Object); __forceinline void KsFilterAcquireControl (PKSFILTER Filter) { KsAcquireControl((PVOID) Filter); } __forceinline void KsFilterReleaseControl (PKSFILTER Filter) { KsReleaseControl((PVOID) Filter); } __forceinline void KsPinAcquireControl (PKSPIN Pin) { KsAcquireControl((PVOID) Pin); } __forceinline void KsPinReleaseControl (PKSPIN Pin) { KsReleaseControl((PVOID) Pin); } KSDDKAPI NTSTATUS NTAPI KsAddItemToObjectBag (KSOBJECT_BAG ObjectBag, PVOID Item, PFNKSFREE Free); KSDDKAPI ULONG NTAPI KsRemoveItemFromObjectBag (KSOBJECT_BAG ObjectBag, PVOID Item, BOOLEAN Free); #define KsDiscard(Object,Pointer) \ KsRemoveItemFromObjectBag((Object)->Bag, (PVOID)(Pointer), TRUE) KSDDKAPI NTSTATUS NTAPI KsAllocateObjectBag(PKSDEVICE Device, KSOBJECT_BAG *ObjectBag); KSDDKAPI void NTAPI KsFreeObjectBag (KSOBJECT_BAG ObjectBag); KSDDKAPI NTSTATUS NTAPI KsCopyObjectBagItems (KSOBJECT_BAG ObjectBagDestination, KSOBJECT_BAG ObjectBagSource); KSDDKAPI NTSTATUS NTAPI _KsEdit (KSOBJECT_BAG ObjectBag, PVOID *PointerToPointerToItem, ULONG NewSize, ULONG OldSize, ULONG Tag); #define KsEdit(Object, PointerToPointer, Tag) \ _KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), \ sizeof(**(PointerToPointer)), sizeof(**(PointerToPointer)), (Tag)) #define KsEditSized(Object, PointerToPointer, NewSize, OldSize, Tag) \ _KsEdit((Object)->Bag, (PVOID*)(PointerToPointer), (NewSize), (OldSize), (Tag)) KSDDKAPI NTSTATUS NTAPI KsRegisterFilterWithNoKSPins (PDEVICE_OBJECT DeviceObject, const GUID *InterfaceClassGUID, ULONG PinCount, WINBOOL *PinDirection, KSPIN_MEDIUM *MediumList, GUID *CategoryList); KSDDKAPI NTSTATUS NTAPI KsFilterCreatePinFactory (PKSFILTER Filter, const KSPIN_DESCRIPTOR_EX *const PinDescriptor, PULONG PinID); KSDDKAPI NTSTATUS NTAPI KsFilterCreateNode (PKSFILTER Filter, const KSNODE_DESCRIPTOR *const NodeDescriptor, PULONG NodeID); KSDDKAPI NTSTATUS NTAPI KsFilterAddTopologyConnections (PKSFILTER Filter, ULONG NewConnectionsCount, const KSTOPOLOGY_CONNECTION *const NewTopologyConnections); KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedPinInterface (PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface); KSDDKAPI PFILE_OBJECT NTAPI KsPinGetConnectedPinFileObject (PKSPIN Pin); KSDDKAPI PDEVICE_OBJECT NTAPI KsPinGetConnectedPinDeviceObject (PKSPIN Pin); KSDDKAPI NTSTATUS NTAPI KsPinGetConnectedFilterInterface (PKSPIN Pin, const GUID *InterfaceId, PVOID *Interface); #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) KSDDKAPI NTSTATUS NTAPI KsPinGetReferenceClockInterface (PKSPIN Pin, PIKSREFERENCECLOCK *Interface); #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ KSDDKAPI VOID NTAPI KsPinSetPinClockTime(PKSPIN Pin, LONGLONG Time); KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrame (PKSPIN Pin, PVOID Data, ULONG Size, PKSSTREAM_HEADER StreamHeader, PVOID Context); KSDDKAPI NTSTATUS NTAPI KsPinSubmitFrameMdl (PKSPIN Pin, PMDL Mdl, PKSSTREAM_HEADER StreamHeader, PVOID Context); KSDDKAPI void NTAPI KsPinRegisterFrameReturnCallback (PKSPIN Pin, PFNKSPINFRAMERETURN FrameReturn); KSDDKAPI void NTAPI KsPinRegisterIrpCompletionCallback (PKSPIN Pin, PFNKSPINIRPCOMPLETION IrpCompletion); KSDDKAPI void NTAPI KsPinRegisterHandshakeCallback (PKSPIN Pin, PFNKSPINHANDSHAKE Handshake); KSDDKAPI void NTAPI KsFilterRegisterPowerCallbacks (PKSFILTER Filter, PFNKSFILTERPOWER Sleep, PFNKSFILTERPOWER Wake); KSDDKAPI void NTAPI KsPinRegisterPowerCallbacks (PKSPIN Pin, PFNKSPINPOWER Sleep, PFNKSPINPOWER Wake); #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown (PVOID Object, PUNKNOWN ClientUnknown); KSDDKAPI PUNKNOWN NTAPI KsGetOuterUnknown (PVOID Object); __forceinline PUNKNOWN KsDeviceRegisterAggregatedClientUnknown (PKSDEVICE Device, PUNKNOWN ClientUnknown) { return KsRegisterAggregatedClientUnknown((PVOID)Device, ClientUnknown); } __forceinline PUNKNOWN KsDeviceGetOuterUnknown (PKSDEVICE Device) { return KsGetOuterUnknown((PVOID) Device); } __forceinline PUNKNOWN KsFilterFactoryRegisterAggregatedClientUnknown (PKSFILTERFACTORY FilterFactory, PUNKNOWN ClientUnknown) { return KsRegisterAggregatedClientUnknown((PVOID)FilterFactory, ClientUnknown); } __forceinline PUNKNOWN KsFilterFactoryGetOuterUnknown (PKSFILTERFACTORY FilterFactory) { return KsGetOuterUnknown((PVOID)FilterFactory); } __forceinline PUNKNOWN KsFilterRegisterAggregatedClientUnknown (PKSFILTER Filter, PUNKNOWN ClientUnknown) { return KsRegisterAggregatedClientUnknown((PVOID)Filter, ClientUnknown); } __forceinline PUNKNOWN KsFilterGetOuterUnknown (PKSFILTER Filter) { return KsGetOuterUnknown((PVOID)Filter); } __forceinline PUNKNOWN KsPinRegisterAggregatedClientUnknown (PKSPIN Pin, PUNKNOWN ClientUnknown) { return KsRegisterAggregatedClientUnknown((PVOID)Pin, ClientUnknown); } __forceinline PUNKNOWN KsPinGetOuterUnknown (PKSPIN Pin) { return KsGetOuterUnknown((PVOID)Pin); } #endif /* defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__) */ #else /* _NTDDK_ */ #ifndef KS_NO_CREATE_FUNCTIONS KSDDKAPI DWORD WINAPI KsCreateAllocator(HANDLE ConnectionHandle,PKSALLOCATOR_FRAMING AllocatorFraming,PHANDLE AllocatorHandle); KSDDKAPI DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle,PKSCLOCK_CREATE ClockCreate,PHANDLE ClockHandle); KSDDKAPI DWORD WINAPI KsCreatePin(HANDLE FilterHandle,PKSPIN_CONNECT Connect,ACCESS_MASK DesiredAccess,PHANDLE ConnectionHandle); KSDDKAPI DWORD WINAPI KsCreateTopologyNode(HANDLE ParentHandle,PKSNODE_CREATE NodeCreate,ACCESS_MASK DesiredAccess,PHANDLE NodeHandle); #endif #endif /* _NTDDK_ */ #ifdef __cplusplus } #endif #define DENY_USERMODE_ACCESS(pIrp,CompleteRequest) \ if(pIrp->RequestorMode!=KernelMode) { \ pIrp->IoStatus.Information = 0; \ pIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; \ if(CompleteRequest) \ IoCompleteRequest (pIrp,IO_NO_INCREMENT); \ return STATUS_INVALID_DEVICE_REQUEST; \ } #endif /* _KS_ */