[PSDK]
[reactos.git] / reactos / include / psdk / ks.h
index c5c005b..a86d4a8 100644 (file)
@@ -41,7 +41,8 @@ extern "C" {
 #endif
 
 
-
+#define KSFILTER_NODE   ((ULONG)-1)
+#define KSALL_NODES     ((ULONG)-1)
 
 #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
 #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
@@ -81,7 +82,7 @@ typedef PVOID PKSWORKER;
 
 #if defined(__cplusplus) && _MSC_VER >= 1100
     #define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name
-    #define DEFINE_GUIDNAMED(name) __uidof(struct name)
+    #define DEFINE_GUIDNAMED(name) __uuidof(struct name)
 #else
     #define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name)
     #define DEFINE_GUIDNAMED(name) name
@@ -89,11 +90,21 @@ typedef PVOID PKSWORKER;
 
 
 #define STATIC_GUID_NULL \
-0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    0x00000000L, 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 STATIC_KSNAME_Filter\
+    0x9b365890L, 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 STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
+    0xd833f8f8L, 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)
+
 /* ===============================================================
     I/O Control Codes
 */
@@ -249,17 +260,6 @@ typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
 typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
 typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
 
-#if !defined( _MSC_VER ) 
-typedef struct {
-    ULONG   FormatSize;
-    ULONG   Flags;
-    ULONG   SampleSize;
-    ULONG   Reserved;
-    GUID    MajorFormat;
-    GUID    SubFormat;
-    GUID    Specifier;
-} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
-#else
 typedef union {
     struct {
         ULONG   FormatSize;
@@ -272,7 +272,7 @@ typedef union {
     };
     LONGLONG    Alignment;
 } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
-#endif
+
 
 typedef struct
 {
@@ -290,14 +290,13 @@ typedef struct
 #if 0
 #define KSINTERFACESETID_Media
 
-#define KSINTERFACESETID_Standard
 #define KSINTERFACE_STANDARD_STREAMING
 #define KSINTERFACE_STANDARD_LOOPED_STREAMING
 #define KSINTERFACE_STANDARD_CONTROL
 #endif
 
 #define STATIC_KSINTERFACESETID_Standard \
-    0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+    0x1A8766A0L, 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)
 
@@ -314,6 +313,8 @@ DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileI
 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
 
 
+
+
 /* ===============================================================
     Mediums
 */
@@ -326,7 +327,7 @@ typedef enum
 #define KSMEDIUM_TYPE_ANYINSTANCE       0
 
 #define STATIC_KSMEDIUMSETID_Standard \
-    0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+    0x4747B320L, 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)
 
@@ -381,8 +382,75 @@ typedef enum
     KSPROPERTY_CONNECTION_STARTAT
 } KSPROPERTY_CONNECTION;
 
-#define KSEVENTSETID_Connection \
-    0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
+#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)
+
 
 typedef enum
 {
@@ -433,11 +501,12 @@ typedef enum
     Properties/Methods/Events
 */
 
-#define KSPROPSETID_MediaSeeking \
+#define STATIC_KSPROPSETID_MediaSeeking\
     0xEE904F0CL, 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
-{
+typedef enum {
     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
     KSPROPERTY_MEDIASEEKING_FORMATS,
     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
@@ -450,6 +519,126 @@ typedef enum
     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)
 
 /* ===============================================================
     Pin
@@ -553,8 +742,10 @@ typedef enum
     Properties/Methods/Events
 */
 
-#define KSPROPSETID_StreamAllocator \
+#define STATIC_KSPROPSETID_StreamAllocator\
     0xcf6e4342L, 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)
 
 typedef enum
 {
@@ -605,22 +796,19 @@ typedef enum
 DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
 #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
 
-typedef enum
-{
+typedef enum {
     KSPROPERTY_TOPOLOGY_CATEGORIES,
+    KSPROPERTY_TOPOLOGY_NODES,
     KSPROPERTY_TOPOLOGY_CONNECTIONS,
-    KSPROPERTY_TOPOLOGY_NAME,
-    KSPROPERTY_TOPOLOGY_NODES
+    KSPROPERTY_TOPOLOGY_NAME
 } KSPROPERTY_TOPOLOGY;
 
-
-
 /* ===============================================================
     Property Sets for audio drivers - TODO
 */
 
 #define STATIC_KSPROPTYPESETID_General \
-    0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+       0x97E99BA0L, 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)
 
@@ -762,18 +950,6 @@ DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_Genera
 */
 
 
-
-
-/* ===============================================================
-    Event Sets for audio drivers - TODO
-*/
-#define KSEVENTSETID_AudioControlChange
-/*
-    KSEVENT_CONTROL_CHANGE
-*/
-
-
-
 /* ===============================================================
     Node Types
 */
@@ -1071,7 +1247,7 @@ typedef enum
 {
     KSPIN_DATAFLOW_IN = 1,
     KSPIN_DATAFLOW_OUT
-} KSPIN_DATAFLOW;
+} KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
 
 typedef enum
 {
@@ -1080,7 +1256,7 @@ typedef enum
     KSPIN_COMMUNICATION_SOURCE,
     KSPIN_COMMUNICATION_BOTH,
     KSPIN_COMMUNICATION_BRIDGE
-} KSPIN_COMMUNICATION;
+} KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
 
 typedef enum
 {
@@ -1113,7 +1289,7 @@ typedef enum
 
 #if defined(_NTDDK_)
 /* MOVE ME */
-typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(
+typedef NTSTATUS (NTAPI *PFNKSCONTEXT_DISPATCH)(
     IN PVOID Context,
     IN PIRP Irp);
 #endif
@@ -1268,20 +1444,20 @@ typedef struct
 #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
 
 typedef 
-VOID 
-(*PFNREFERENCEDEVICEOBJECT)( 
+VOID
+(NTAPI *PFNREFERENCEDEVICEOBJECT)( 
     IN PVOID Context
     );
     
 typedef 
-VOID 
-(*PFNDEREFERENCEDEVICEOBJECT)( 
+VOID
+(NTAPI *PFNDEREFERENCEDEVICEOBJECT)( 
     IN PVOID Context
     );
     
 typedef
 NTSTATUS
-(*PFNQUERYREFERENCESTRING)( 
+(NTAPI *PFNQUERYREFERENCESTRING)( 
     IN PVOID Context,
     IN OUT PWCHAR *String
     );
@@ -1328,24 +1504,6 @@ typedef struct
 #define KSPROPERTY_MEMBER_VALUES        0x00000003
 #define KSPROPERTY_MEMBER_FLAG_DEFAULT  KSPROPERTY_MEMBER_RANGES
 
-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 struct
-{
-    LONGLONG            Current;
-    LONGLONG            Stop;
-    KS_SEEKING_FLAGS    CurrentFlags;
-    KS_SEEKING_FLAGS    StopFlags;
-} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
-
 typedef struct
 {
     GUID            PropertySet;
@@ -1418,13 +1576,6 @@ typedef struct
     ULONG           Reserved;
 } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
 
-typedef struct
-{
-    LONGLONG    Earliest;
-    LONGLONG    Latest;
-} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
-
-
 typedef struct
 {
     ULONG   MembersFlags;
@@ -1445,7 +1596,7 @@ typedef struct {
 } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
 
 #if defined(_NTDDK_)
-typedef NTSTATUS (*PFNKSHANDLER)(
+typedef NTSTATUS (NTAPI *PFNKSHANDLER)(
     IN  PIRP Irp,
     IN  PKSIDENTIFIER Request,
     IN  OUT PVOID Data);
@@ -1474,7 +1625,7 @@ typedef struct
 
 typedef
 BOOLEAN
-(*PFNKSFASTHANDLER)(
+(NTAPI *PFNKSFASTHANDLER)(
     IN PFILE_OBJECT FileObject,
     IN PKSIDENTIFIER Request,
     IN ULONG RequestLength,
@@ -1547,13 +1698,27 @@ typedef struct
 
 typedef struct
 {
-    ULONG               CountItems;         // count of FramingItem-s below.
+    ULONG               CountItems;
     ULONG               PinFlags;
     KS_COMPRESSION      OutputCompression;
-    ULONG               PinWeight;          // this pin framing's Weight graph-wide
+    ULONG               PinWeight;
     KS_FRAMING_ITEM     FramingItem[1]; 
 } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
 
+#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
 
 /* ===============================================================
     Quality
@@ -1640,6 +1805,26 @@ typedef struct
     };
 } 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
+
+
+#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
 {
     ULONG Size;
@@ -1671,14 +1856,6 @@ typedef struct
     LONGLONG    SystemTime;
 } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
 
-typedef struct
-{
-    KSPROPERTY Property;
-    GUID SourceFormat;
-    GUID TargetFormat;
-    LONGLONG Time;
-} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
-
 typedef struct
 {
     LONGLONG        TimeBase;
@@ -1730,6 +1907,11 @@ typedef struct
     Objects ??? SORT ME!
 */
 
+#define KSCREATE_ITEM_SECURITYCHANGED       0x1
+#define KSCREATE_ITEM_WILDCARD              0x2
+#define KSCREATE_ITEM_NOPARAMETERS          0x4
+#define KSCREATE_ITEM_FREEONSTOP            0x8
+
 typedef struct
 {
     PDRIVER_DISPATCH       Create;
@@ -1745,7 +1927,7 @@ typedef struct
     PKSOBJECT_CREATE_ITEM    CreateItemsList;
 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
 
-typedef VOID (*PFNKSITEMFREECALLBACK)(
+typedef VOID (NTAPI *PFNKSITEMFREECALLBACK)(
     IN  PKSOBJECT_CREATE_ITEM CreateItem);
 
 #endif
@@ -1787,6 +1969,30 @@ typedef struct
     ULONG                   Flags;
 } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
 
+#ifndef _MSC_VER
+
+#define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
+                             MethodHandler,\
+                             MinMethod, MinData, SupportHandler)\
+{\
+    MethodId, {(PFNKSHANDLER)MethodHandler}, MinMethod, MinData,\
+    SupportHandler, Flags\
+}
+
+#else
+
+#define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
+                             MethodHandler,\
+                             MinMethod, MinData, SupportHandler)\
+{\
+    MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
+    SupportHandler, Flags\
+}
+
+
+
+#endif
+
 
 typedef struct
 {
@@ -1797,6 +2003,12 @@ typedef struct
     };
 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
 
+#define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
+{\
+    MethodId, (PFNKSFASTHANDLER)MethodHandler\
+}
+
+       
 typedef struct
 {
     const GUID*             Set;
@@ -1806,6 +2018,20 @@ typedef struct
     const KSFASTMETHOD_ITEM*FastIoTable;
 } KSMETHOD_SET, *PKSMETHOD_SET;
 
+
+#define DEFINE_KSMETHOD_SET(Set,\
+                            MethodsCount,\
+                            MethodItem,\
+                            FastIoCount,\
+                            FastIoTable)\
+{\
+    Set,\
+    MethodsCount,\
+    MethodItem,\
+    FastIoCount,\
+    FastIoTable\
+}
+
 #endif
 /* ===============================================================
     Nodes
@@ -1857,14 +2083,14 @@ typedef struct
     LONGLONG        Interval;
 } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
 
-typedef NTSTATUS (*PFNKSADDEVENT)(
+typedef NTSTATUS (NTAPI *PFNKSADDEVENT)(
     IN  PIRP Irp,
     IN  PKSEVENTDATA EventData,
     IN  struct _KSEVENT_ENTRY* EventEntry);
 
 typedef
 VOID
-(*PFNKSREMOVEEVENT)(
+(NTAPI *PFNKSREMOVEEVENT)(
     IN PFILE_OBJECT FileObject,
     IN struct _KSEVENT_ENTRY* EventEntry
     );
@@ -1917,28 +2143,69 @@ typedef struct _KSSTREAM_POINTER_OFFSET KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POIN
 typedef struct _KSMAPPING KSMAPPING, *PKSMAPPING;
 typedef struct _KSPROCESSPIN KSPROCESSPIN, *PKSPROCESSPIN;
 
+#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
 NTSTATUS
-(*PFNKSPINIRP)(
+(NTAPI *PFNKSPINHANDSHAKE)(
+    IN PKSPIN Pin,
+    IN PKSHANDSHAKE In,
+    IN PKSHANDSHAKE Out
+    );
+
+typedef
+void
+(NTAPI *PFNKSPINPOWER)(
+    IN PKSPIN Pin,
+    IN DEVICE_POWER_STATE State
+    );
+
+typedef
+void
+(NTAPI *PFNKSPINFRAMERETURN)(
+    IN PKSPIN Pin,
+    IN PVOID Data OPTIONAL,
+    IN ULONG Size OPTIONAL,
+    IN PMDL Mdl OPTIONAL,
+    IN PVOID Context OPTIONAL,
+    IN NTSTATUS Status
+    );
+
+typedef
+void
+(NTAPI *PFNKSPINIRPCOMPLETION)(
     IN PKSPIN Pin,
     IN PIRP Irp
     );
 
 typedef
 NTSTATUS
-(*PFNKSPIN)(
+(NTAPI *PFNKSPINIRP)(
+    IN PKSPIN Pin,
+    IN PIRP Irp
+    );
+
+typedef
+NTSTATUS
+(NTAPI *PFNKSPIN)(
     IN PKSPIN Pin
     );
 
 typedef
 void
-(*PFNKSPINVOID)(
+(NTAPI *PFNKSPINVOID)(
     IN PKSPIN Pin
     );
 
 typedef
 void
-(*PFNKSSTREAMPOINTER)(
+(NTAPI *PFNKSSTREAMPOINTER)(
     IN PKSSTREAM_POINTER StreamPointer
     );
 
@@ -1949,7 +2216,7 @@ typedef struct {
 
 typedef
 NTSTATUS
-(*PFNKSPINSETDATAFORMAT)(
+(NTAPI *PFNKSPINSETDATAFORMAT)(
     IN PKSPIN Pin,
     IN PKSDATAFORMAT OldFormat OPTIONAL,
     IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
@@ -1959,7 +2226,7 @@ NTSTATUS
 
 typedef
 NTSTATUS
-(*PFNKSPINSETDEVICESTATE)(
+(NTAPI *PFNKSPINSETDEVICESTATE)(
     IN PKSPIN Pin,
     IN KSSTATE ToState,
     IN KSSTATE FromState
@@ -1984,7 +2251,7 @@ typedef struct
 
 typedef
 BOOLEAN
-(*PFNKSPINSETTIMER)(
+(NTAPI *PFNKSPINSETTIMER)(
     IN PKSPIN Pin,
     IN PKTIMER Timer,
     IN LARGE_INTEGER DueTime,
@@ -1993,7 +2260,7 @@ BOOLEAN
 
 typedef
 BOOLEAN
-(*PFNKSPINCANCELTIMER)(
+(NTAPI *PFNKSPINCANCELTIMER)(
     IN PKSPIN Pin,
     IN PKTIMER Timer
     );
@@ -2007,7 +2274,7 @@ LONGLONG
 
 typedef
 void
-(*PFNKSPINRESOLUTION)(
+(NTAPI *PFNKSPINRESOLUTION)(
     IN PKSPIN Pin,
     OUT PKSRESOLUTION Resolution
     );
@@ -2021,19 +2288,19 @@ struct _KSCLOCK_DISPATCH {
 
 typedef
 NTSTATUS
-(*PFNKSPININITIALIZEALLOCATOR)(
+(NTAPI *PFNKSPININITIALIZEALLOCATOR)(
     IN PKSPIN Pin,
     IN PKSALLOCATOR_FRAMING AllocatorFraming,
     OUT PVOID* Context
     );
 
-typedef PVOID (*PFNKSDELETEALLOCATOR)(
+typedef PVOID (NTAPI *PFNKSDELETEALLOCATOR)(
     IN  PVOID Context);
 
-typedef PVOID (*PFNKSDEFAULTALLOCATE)(
+typedef PVOID (NTAPI *PFNKSDEFAULTALLOCATE)(
     IN  PVOID Context);
 
-typedef PVOID (*PFNKSDEFAULTFREE)(
+typedef PVOID (NTAPI *PFNKSDEFAULTFREE)(
     IN  PVOID Context,
     IN  PVOID Buffer);
 
@@ -2085,7 +2352,7 @@ typedef struct
 
 typedef
 NTSTATUS
-(*PFNKSINTERSECTHANDLER)(
+(NTAPI *PFNKSINTERSECTHANDLER)(
     IN PIRP Irp,
     IN PKSP_PIN Pin,
     IN PKSDATARANGE DataRange,
@@ -2094,7 +2361,7 @@ NTSTATUS
 
 typedef
 NTSTATUS
-(*PFNKSINTERSECTHANDLEREX)(
+(NTAPI *PFNKSINTERSECTHANDLEREX)(
     IN PVOID Context,
     IN PIRP Irp,
     IN PKSP_PIN Pin,
@@ -2117,28 +2384,40 @@ typedef struct
     PFNKSINTERSECTHANDLEREX IntersectHandler;
 } KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
 
-/* TODO */
-#define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING
-#define KSPIN_FLAG_CRITICAL_PROCESSING
-#define KSPIN_FLAG_HYPERCRITICAL_PROCESSING
-#define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING
-#define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING
-#define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL
-#define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING
-#define KSPIN_FLAG_ENFORCE_FIFO
-#define KSPIN_FLAG_GENERATE_MAPPINGS
-#define KSPIN_FLAG_DISTINCT_TRAILING_EDGE
-#define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY
-#define KSPIN_FLAG_SPLITTER
-#define KSPIN_FLAG_USE_STANDARD_TRANSPORT
-#define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT
-#define KSPIN_FLAG_FIXED_FORMAT
-#define KSPIN_FLAG_GENERATE_EOS_EVENTS
-#define KSPIN_FLAG_RENDERER
-#define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING
-#define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE
-#define KSPIN_FLAG_DENY_USERMODE_ACCESS
-#define KSPIN_FLAG_IMPLEMENT_CLOCK
+#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
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+#define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000
+#endif
+
+
+#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
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+#define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000
+#endif
 
 struct _KSPIN
 {
@@ -2315,7 +2594,7 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
 
 typedef
 void
-(*PFNKSFREE)(
+(NTAPI *PFNKSFREE)(
     IN PVOID Data
     );
 
@@ -2407,18 +2686,18 @@ DEFINE_KSPROPERTY_TABLE(TopologySet) {\
 /* TODO */
 typedef void* UNKNOWN;
 
-typedef PVOID (*PFNKSINITIALIZEALLOCATOR)(
+typedef PVOID (NTAPI *PFNKSINITIALIZEALLOCATOR)(
     IN  PVOID InitialContext,
     IN  PKSALLOCATOR_FRAMING AllocatorFraming,
     OUT PVOID* Context);
 
 #if defined(_NTDDK_)
-typedef NTSTATUS (*PFNKSALLOCATOR)(
+typedef NTSTATUS (NTAPI *PFNKSALLOCATOR)(
     IN  PIRP Irp,
     IN  ULONG BufferSize,
     IN  BOOLEAN InputOperation);
 
-typedef NTSTATUS (*PFNKINTERSECTHANDLEREX)(
+typedef NTSTATUS (NTAPI *PFNKINTERSECTHANDLEREX)(
     IN  PVOID Context,
     IN  PIRP Irp,
     IN  PKSP_PIN Pin,
@@ -2427,18 +2706,28 @@ typedef NTSTATUS (*PFNKINTERSECTHANDLEREX)(
     IN  ULONG DataBufferSize,
     OUT PVOID Data OPTIONAL,
     OUT PULONG DataSize);
-#endif
 
-typedef UNKNOWN PFNALLOCATORE_ALLOCATEFRAME;
-typedef UNKNOWN PFNALLOCATOR_FREEFRAME;
 
-/*
-typedef struct
-{
-    PFNALLOCATOR_ALLOCATEFRAME AllocateFrame;
-    PFNALLOCATOR_FREEFRAME FreeFrame;
-}
-*/
+typedef
+NTSTATUS
+(NTAPI *PFNALLOCATOR_ALLOCATEFRAME)(
+    IN PFILE_OBJECT FileObject,
+    PVOID *Frame
+    );
+
+typedef
+VOID
+(NTAPI *PFNALLOCATOR_FREEFRAME)(
+    IN PFILE_OBJECT FileObject,
+    IN PVOID Frame
+    );
+
+typedef struct {
+    PFNALLOCATOR_ALLOCATEFRAME  AllocateFrame;
+    PFNALLOCATOR_FREEFRAME      FreeFrame;
+} KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
+
+#endif
 
 typedef struct
 {
@@ -2464,19 +2753,47 @@ typedef struct
     ULONG DataUsed;
     PVOID Data;
     ULONG OptionsFlags;
+#ifdef _WIN64
+  ULONG  Reserved;
+#endif
 } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
 
-
+#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
 
 /* ===============================================================
     XP / DX8
 */
-
+#if defined(_NTDDK_)
 struct _KSMAPPING {
     PHYSICAL_ADDRESS PhysicalAddress;
     ULONG ByteCount;
     ULONG Alignment;
 };
+#endif
+
+typedef enum {
+    KSSTREAM_POINTER_STATE_UNLOCKED = 0,
+    KSSTREAM_POINTER_STATE_LOCKED
+} KSSTREAM_POINTER_STATE;
+
+typedef struct _KSGATE KSGATE, *PKSGATE;
+typedef struct _KSPROCESSPIN_INDEXENTRY KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
+
+struct _KSGATE {
+    LONG Count;
+    PKSGATE NextGate;
+};
 
 struct _KSSTREAM_POINTER_OFFSET
 {
@@ -2519,11 +2836,11 @@ struct _KSPROCESSPIN
     BOOLEAN Terminate;
 };
 
-typedef struct
+struct _KSPROCESSPIN_INDEXENTRY
 {
     PKSPROCESSPIN* Pins;
     ULONG Count;
-} KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
+};
 #endif
 
 /* ===============================================================
@@ -2541,32 +2858,32 @@ typedef struct _KSNODE_DESCRIPTOR KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
 typedef struct _KSFILTER_DESCRIPTOR KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
 typedef struct _KSDEVICE_DESCRIPTOR KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
 
-typedef NTSTATUS (*PFNKSDEVICECREATE)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICECREATE)(
     IN PKSDEVICE Device);
 
-typedef NTSTATUS (*PFNKSDEVICEPNPSTART)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEPNPSTART)(
     IN PKSDEVICE Device,
     IN PIRP Irp,
     IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
     IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL);
 
-typedef NTSTATUS (*PFNKSDEVICE)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICE)(
     IN PKSDEVICE Device);
 
-typedef NTSTATUS (*PFNKSDEVICEIRP)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEIRP)(
     IN PKSDEVICE Device,
     IN PIRP Irp);
 
-typedef VOID (*PFNKSDEVICEIRPVOID)(
+typedef VOID (NTAPI *PFNKSDEVICEIRPVOID)(
     IN PKSDEVICE Device,
     IN PIRP Irp);
 
-typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYCAPABILITIES)(
     IN PKSDEVICE Device,
     IN PIRP Irp,
     IN OUT PDEVICE_CAPABILITIES Capabilities);
 
-typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(
+typedef NTSTATUS (NTAPI *PFNKSDEVICEQUERYPOWER)(
     IN PKSDEVICE Device,
     IN PIRP Irp,
     IN DEVICE_POWER_STATE DeviceTo,
@@ -2575,7 +2892,7 @@ typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)(
     IN SYSTEM_POWER_STATE SystemFrom,
     IN POWER_ACTION Action);
 
-typedef VOID (*PFNKSDEVICESETPOWER)(
+typedef VOID (NTAPI *PFNKSDEVICESETPOWER)(
     IN PKSDEVICE Device,
     IN PIRP Irp,
     IN DEVICE_POWER_STATE To,
@@ -2628,15 +2945,22 @@ struct _KSFILTER
     PVOID Context;
 };
 
-typedef NTSTATUS (*PFNKSFILTERIRP)(
+typedef
+void
+(NTAPI *PFNKSFILTERPOWER)(
+    IN PKSFILTER Filter,
+    IN DEVICE_POWER_STATE State
+    );
+
+typedef NTSTATUS (NTAPI *PFNKSFILTERIRP)(
     IN PKSFILTER Filter,
     IN PIRP Irp);
 
-typedef NTSTATUS (*PFNKSFILTERPROCESS)(
-    IN PKSFILTER FIlter,
+typedef NTSTATUS (NTAPI *PFNKSFILTERPROCESS)(
+    IN PKSFILTER Filter,
     IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex);
 
-typedef NTSTATUS (*PFNKSFILTERVOID)(
+typedef NTSTATUS (NTAPI *PFNKSFILTERVOID)(
     IN PKSFILTER Filter);
 
 struct _KSFILTER_DISPATCH
@@ -2674,11 +2998,15 @@ struct _KSFILTER_DESCRIPTOR
   const KSCOMPONENTID*  ComponentId;
 };
 
+#define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
+
 struct _KSDEVICE_DESCRIPTOR
 {
-  const KSDEVICE_DISPATCH*  Dispatch;
-  ULONG  FilterDescriptorsCount;
-  const  KSFILTER_DESCRIPTOR*const* FilterDescriptors;
+    const KSDEVICE_DISPATCH*  Dispatch;
+    ULONG  FilterDescriptorsCount;
+    const  KSFILTER_DESCRIPTOR*const* FilterDescriptors;
+    ULONG  Version;
+    ULONG  Flags;
 };
 
 struct _KSFILTERFACTORY {
@@ -2687,17 +3015,55 @@ struct _KSFILTERFACTORY {
     PVOID Context;
 };
 
+#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
+
 #endif
 /* ===============================================================
     Minidriver Callbacks
 */
 #if defined(_NTDDK_)
-typedef NTSTATUS (*KStrMethodHandler)(
+typedef NTSTATUS (NTAPI *KStrMethodHandler)(
     IN  PIRP Irp,
     IN  PKSIDENTIFIER Request,
     IN  OUT PVOID Data);
 
-typedef NTSTATUS (*KStrSupportHandler)(
+typedef NTSTATUS (NTAPI *KStrSupportHandler)(
     IN  PIRP Irp,
     IN  PKSIDENTIFIER Request,
     IN  OUT PVOID Data);
@@ -2742,13 +3108,13 @@ KsValidateAllocatorFramingEx(
     Clock Functions
 */
 #if defined(_NTDDK_)
-typedef BOOLEAN (*PFNKSSETTIMER)(
+typedef BOOLEAN (NTAPI *PFNKSSETTIMER)(
     IN  PVOID Context,
     IN  PKTIMER Timer,
     IN  LARGE_INTEGER DueTime,
     IN  PKDPC Dpc);
 
-typedef BOOLEAN (*PFNKSCANCELTIMER)(
+typedef BOOLEAN (NTAPI *PFNKSCANCELTIMER)(
     IN  PVOID Context,
     IN  PKTIMER Timer);
 
@@ -2894,6 +3260,7 @@ KsFastPropertyHandler(
 /* ===============================================================
     Event Functions
 */
+
 #if defined(_NTDDK_)
 
 #define KSPROBE_STREAMREAD      0x00000000
@@ -2912,10 +3279,29 @@ KsFastPropertyHandler(
 #define KSSTREAM_SYNCHRONOUS    0x00001000
 #define KSSTREAM_FAILUREEXCEPTION 0x00002000
 
+typedef
+BOOLEAN
+(NTAPI *PFNKSGENERATEEVENTCALLBACK)(
+    IN PVOID Context,
+    IN PKSEVENT_ENTRY EventEntry
+    );
+
 KSDDKAPI NTSTATUS NTAPI
 KsGenerateEvent(
     IN  PKSEVENT_ENTRY EntryEvent);
 
+KSDDKAPI void NTAPI
+KsGenerateEvents(
+    IN PVOID Object,
+    IN const GUID* EventSet OPTIONAL,
+    IN ULONG EventId,
+    IN ULONG DataSize,
+    IN PVOID Data OPTIONAL,
+    IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
+    IN PVOID CallBackContext OPTIONAL
+    );
+
+
 KSDDKAPI NTSTATUS NTAPI
 KsEnableEventWithAllocator(
     IN  PIRP Irp,
@@ -3032,6 +3418,17 @@ KsPinDataIntersectionEx(
     IN  PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
     IN  PVOID HandlerContext OPTIONAL);
 
+KSDDKAPI PKSFILTER NTAPI
+KsPinGetParentFilter(
+    IN PKSPIN Pin
+    );
+
+KSDDKAPI PKSPIN NTAPI
+KsPinGetNextSiblingPin(
+    IN PKSPIN Pin
+    );
+
+
 /* Does this belong here? */
 
 KSDDKAPI NTSTATUS NTAPI
@@ -3046,7 +3443,7 @@ KsHandleSizedListQuery(
     IRP Helper Functions
 */
 
-typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(
+typedef NTSTATUS (NTAPI *PFNKSIRPLISTCALLBACK)(
     IN  PIRP Irp,
     IN  PVOID Context);
 
@@ -3368,6 +3765,11 @@ KsMapModuleName(
     Misc. Helper Functions
 */
 
+KSDDKAPI PVOID NTAPI
+KsGetNextSibling(
+    IN PVOID Object);
+
+
 KSDDKAPI NTSTATUS NTAPI
 KsCacheMedium(
     IN  PUNICODE_STRING SymbolicLink,
@@ -3448,6 +3850,34 @@ KsSynchronousIoControlDevice(
     IN  ULONG OUtSize,
     OUT PULONG BytesReturned);
 
+KSDDKAPI
+PKSPIN
+NTAPI
+KsFilterGetFirstChildPin(
+    IN PKSFILTER Filter,
+    IN ULONG PinId
+    );
+
+KSDDKAPI
+PFILE_OBJECT
+NTAPI
+KsPinGetConnectedPinFileObject(
+    IN PKSPIN Pin
+    );
+
+#else
+
+KSDDKAPI
+DWORD
+WINAPI
+KsCreatePin(
+    IN HANDLE FilterHandle,
+    IN PKSPIN_CONNECT Connect,
+    IN ACCESS_MASK DesiredAccess,
+    OUT PHANDLE ConnectionHandle
+    );
+
+
 #endif
 
 /* ===============================================================
@@ -3457,6 +3887,17 @@ KsSynchronousIoControlDevice(
 */
 
 #if defined(_NTDDK_)
+
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsMergeAutomationTables(
+    OUT PKSAUTOMATION_TABLE* AutomationTableAB,
+    IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
+    IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
+    IN KSOBJECT_BAG Bag OPTIONAL
+    );
+
 KSDDKAPI
 NTSTATUS
 NTAPI
@@ -3467,7 +3908,19 @@ KsInitializeDriver(
 
 typedef struct _KSFILTERFACTORY KSFILTERFACTORY, *PKSFILTERFACTORY; //FIXME
 
-typedef void (*PFNKSFILTERFACTORYPOWER)(
+
+
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsInitializeDevice (
+    IN PDEVICE_OBJECT  FunctionalDeviceObject,
+    IN PDEVICE_OBJECT  PhysicalDeviceObject,
+    IN PDEVICE_OBJECT  NextDeviceObject,
+    IN const KSDEVICE_DESCRIPTOR*  Descriptor OPTIONAL);
+
+
+typedef void (NTAPI *PFNKSFILTERFACTORYPOWER)(
     IN  PKSFILTERFACTORY FilterFactory,
     IN  DEVICE_POWER_STATE State);
 
@@ -3515,6 +3968,14 @@ KsAddItemToObjectBag(
     IN  PVOID Item,
     IN  PFNKSFREE Free OPTIONAL);
 
+KSDDKAPI
+ULONG
+NTAPI
+KsRemoveItemFromObjectBag(
+    IN KSOBJECT_BAG ObjectBag,
+    IN PVOID Item,
+    IN BOOLEAN Free);
+
 KSDDKAPI
 NTSTATUS
 NTAPI
@@ -3522,6 +3983,13 @@ KsAllocateObjectBag(
     IN  PKSDEVICE Device,
     OUT KSOBJECT_BAG* ObjectBag);
 
+KSDDKAPI
+VOID
+NTAPI
+KsFreeObjectBag(
+    IN KSOBJECT_BAG ObjectBag
+    );
+
 KSDDKAPI
 VOID
 NTAPI
@@ -3556,7 +4024,29 @@ KsCreateFilterFactory(
     IN  ULONG CreateItemFlags,
     IN  PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
     IN  PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
-    OUT PKSFILTERFACTORY FilterFactory OPTIONAL);
+    OUT PKSFILTERFACTORY *FilterFactory OPTIONAL);
+
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsFilterFactoryUpdateCacheData(
+    IN PKSFILTERFACTORY FilterFactory,
+    IN const KSFILTER_DESCRIPTOR *FilterDescriptor OPTIONAL
+    );
+
+KSDDKAPI
+PKSPIN
+NTAPI
+KsGetPinFromIrp(
+    IN PIRP Irp
+    );
+
+KSDDKAPI
+PKSFILTER
+NTAPI
+KsGetFilterFromIrp(
+    IN PIRP Irp
+    );
 
 KSDDKAPI
 NTSTATUS
@@ -3566,6 +4056,51 @@ KsDefaultAddEventHandler(
     IN  PKSEVENTDATA EventData,
     IN  OUT PKSEVENT_ENTRY EventEntry);
 
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchQuerySecurity(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp
+    );
+
+KSDDKAPI
+NTSTATUS
+NTAPI
+KsDispatchSetSecurity(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp
+    );
+
+KSDDKAPI
+PVOID
+NTAPI
+KsGetParent(
+    IN PVOID Object
+    );
+
+
+static
+PKSFILTERFACTORY
+__inline
+KsFilterGetParentFilterFactory(
+    IN PKSFILTER Filter
+    )
+{
+    return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
+}
+
+static
+PKSDEVICE
+__inline
+KsFilterFactoryGetParentDevice(
+    IN PKSFILTERFACTORY FilterFactory
+    )
+{
+    return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
+}
+
+
 
 #define KsDeleteFilterFactory(FilterFactory)                                           \
             KsFreeObjectCreateItemsByContext(                                          \
@@ -3607,9 +4142,9 @@ KsGetOuterUnknown(
     IN PVOID Object
     );
 
-
+static
+__inline
 PUNKNOWN
-NTAPI
 KsDeviceGetOuterUnknown(
     IN  PKSDEVICE Device)
 {
@@ -3623,6 +4158,78 @@ KsDeviceRegisterAggregatedClientUnknown(
     IN  PKSDEVICE Device,
     IN  PUNKNOWN ClientUnknown);
 
+
+#endif
+
+#if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
+
+typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
+
+#undef INTERFACE
+#define INTERFACE IKsReferenceClock
+DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
+{
+    DEFINE_ABSTRACT_UNKNOWN() // For C
+
+    STDMETHOD_(LONGLONG,GetTime)(THIS
+        ) PURE;
+    STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
+        ) PURE;
+    STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
+        OUT PLONGLONG SystemTime
+        ) PURE;
+    STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
+        OUT PLONGLONG SystemTime
+        ) PURE;
+    STDMETHOD_(NTSTATUS, GetResolution)(THIS_
+        OUT PKSRESOLUTION Resolution
+        ) PURE;
+    STDMETHOD_(NTSTATUS, GetState)(THIS_
+        OUT PKSSTATE State
+        ) PURE;
+};
+
+#undef INTERFACE
+#define INTERFACE IKsControl
+
+DEFINE_GUID(IID_IKsControl, 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
+
+DECLARE_INTERFACE_(IKsControl,IUnknown)
+{
+    STDMETHOD_(NTSTATUS, QueryInterface)( THIS_ 
+        REFIID InterfaceId,
+        PVOID* Interface)PURE;
+
+    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
+
+    STDMETHOD_(ULONG, Release)(THIS) PURE;
+
+    STDMETHOD_(NTSTATUS, KsProperty)(THIS_
+        IN PKSPROPERTY Property,
+        IN ULONG PropertyLength,
+        IN OUT PVOID PropertyData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+        ) PURE;
+    STDMETHOD_(NTSTATUS, KsMethod)(THIS_
+        IN PKSMETHOD Method,
+        IN ULONG MethodLength,
+        IN OUT PVOID MethodData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+        ) PURE;
+    STDMETHOD_(NTSTATUS, KsEvent)(THIS_
+        IN PKSEVENT Event OPTIONAL,
+        IN ULONG EventLength,
+        IN OUT PVOID EventData,
+        IN ULONG DataLength,
+        OUT ULONG* BytesReturned
+        ) PURE;
+};
+
+#undef INTERFACE
+typedef IKsControl* PIKSCONTROL;
+
 #endif
 
 KSDDKAPI
@@ -3645,12 +4252,22 @@ KsDeviceSetBusData(
     IN  ULONG Length);
 
 
+KSDDKAPI
+VOID
+NTAPI
+KsReleaseControl(
+    IN PVOID Object
+    );
+
 #define KsDiscard(object, pointer) \
     KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE)
 
 #define KsFilterAcquireControl(Filter) \
     KsAcquireControl((PVOID) Filter);
 
+#define KsFilterReleaseControl(Filter) \
+    KsReleaseControl((PVOID) Filter);
+
 #define KsFilterAddEvent(Filter, EventEntry) \
     KsAddEvent(Filter,EventEntry);
 
@@ -3660,13 +4277,14 @@ NTAPI
 KsFilterAcquireProcessingMutex(
     IN  PKSFILTER Filter);
 
+
 KSDDKAPI
 NTSTATUS
 NTAPI
 KsFilterAddTopologyConnections(
     IN  PKSFILTER Filter,
     IN  ULONG NewConnectionsCount,
-    IN  const KSTOPOLOGY_CONNECTION* NewTopologyConnections);
+    IN  const KSTOPOLOGY_CONNECTION *const NewTopologyConnections);
 
 KSDDKAPI
 VOID
@@ -3680,7 +4298,7 @@ NTSTATUS
 NTAPI
 KsFilterCreateNode(
     IN  PKSFILTER Filter,
-    IN  const KSNODE_DESCRIPTOR* NodeDescriptor,
+    IN  const KSNODE_DESCRIPTOR *const NodeDescriptor,
     OUT PULONG NodeID);
 
 KSDDKAPI
@@ -3688,7 +4306,7 @@ NTSTATUS
 NTAPI
 KsFilterCreatePinFactory(
     IN  PKSFILTER Filter,
-    IN  const KSPIN_DESCRIPTOR_EX* PinDescriptor,
+    IN  const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
     OUT PULONG PinID);
 
 KSDDKAPI