- Fix bug introduced 18942 revisions ago
[reactos.git] / reactos / include / psdk / ks.h
index 24fba94..4968c17 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
 */
@@ -286,7 +297,7 @@ typedef struct
 #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)
 
@@ -303,6 +314,8 @@ DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileI
 #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
 
 
+
+
 /* ===============================================================
     Mediums
 */
@@ -315,7 +328,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)
 
@@ -370,8 +383,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
 {
@@ -542,8 +622,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
 {
@@ -594,22 +676,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)
 
@@ -1060,7 +1139,7 @@ typedef enum
 {
     KSPIN_DATAFLOW_IN = 1,
     KSPIN_DATAFLOW_OUT
-} KSPIN_DATAFLOW;
+} KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
 
 typedef enum
 {
@@ -1069,7 +1148,7 @@ typedef enum
     KSPIN_COMMUNICATION_SOURCE,
     KSPIN_COMMUNICATION_BOTH,
     KSPIN_COMMUNICATION_BRIDGE
-} KSPIN_COMMUNICATION;
+} KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
 
 typedef enum
 {
@@ -1102,7 +1181,7 @@ typedef enum
 
 #if defined(_NTDDK_)
 /* MOVE ME */
-typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)(
+typedef NTSTATUS (NTAPI *PFNKSCONTEXT_DISPATCH)(
     IN PVOID Context,
     IN PIRP Irp);
 #endif
@@ -1257,20 +1336,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
     );
@@ -1434,7 +1513,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);
@@ -1463,7 +1542,7 @@ typedef struct
 
 typedef
 BOOLEAN
-(*PFNKSFASTHANDLER)(
+(NTAPI *PFNKSFASTHANDLER)(
     IN PFILE_OBJECT FileObject,
     IN PKSIDENTIFIER Request,
     IN ULONG RequestLength,
@@ -1536,13 +1615,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
@@ -1629,6 +1722,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;
@@ -1719,6 +1832,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;
@@ -1734,7 +1852,7 @@ typedef struct
     PKSOBJECT_CREATE_ITEM    CreateItemsList;
 } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
 
-typedef VOID (*PFNKSITEMFREECALLBACK)(
+typedef VOID (NTAPI *PFNKSITEMFREECALLBACK)(
     IN  PKSOBJECT_CREATE_ITEM CreateItem);
 
 #endif
@@ -1776,6 +1894,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
 {
@@ -1786,6 +1928,12 @@ typedef struct
     };
 } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
 
+#define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
+{\
+    MethodId, (PFNKSFASTHANDLER)MethodHandler\
+}
+
+       
 typedef struct
 {
     const GUID*             Set;
@@ -1795,6 +1943,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
@@ -1846,14 +2008,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
     );
@@ -1906,28 +2068,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
+(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
-(*PFNKSPINIRP)(
+(NTAPI *PFNKSPINIRP)(
     IN PKSPIN Pin,
     IN PIRP Irp
     );
 
 typedef
 NTSTATUS
-(*PFNKSPIN)(
+(NTAPI *PFNKSPIN)(
     IN PKSPIN Pin
     );
 
 typedef
 void
-(*PFNKSPINVOID)(
+(NTAPI *PFNKSPINVOID)(
     IN PKSPIN Pin
     );
 
 typedef
 void
-(*PFNKSSTREAMPOINTER)(
+(NTAPI *PFNKSSTREAMPOINTER)(
     IN PKSSTREAM_POINTER StreamPointer
     );
 
@@ -1938,7 +2141,7 @@ typedef struct {
 
 typedef
 NTSTATUS
-(*PFNKSPINSETDATAFORMAT)(
+(NTAPI *PFNKSPINSETDATAFORMAT)(
     IN PKSPIN Pin,
     IN PKSDATAFORMAT OldFormat OPTIONAL,
     IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
@@ -1948,7 +2151,7 @@ NTSTATUS
 
 typedef
 NTSTATUS
-(*PFNKSPINSETDEVICESTATE)(
+(NTAPI *PFNKSPINSETDEVICESTATE)(
     IN PKSPIN Pin,
     IN KSSTATE ToState,
     IN KSSTATE FromState
@@ -1973,7 +2176,7 @@ typedef struct
 
 typedef
 BOOLEAN
-(*PFNKSPINSETTIMER)(
+(NTAPI *PFNKSPINSETTIMER)(
     IN PKSPIN Pin,
     IN PKTIMER Timer,
     IN LARGE_INTEGER DueTime,
@@ -1982,7 +2185,7 @@ BOOLEAN
 
 typedef
 BOOLEAN
-(*PFNKSPINCANCELTIMER)(
+(NTAPI *PFNKSPINCANCELTIMER)(
     IN PKSPIN Pin,
     IN PKTIMER Timer
     );
@@ -1996,7 +2199,7 @@ LONGLONG
 
 typedef
 void
-(*PFNKSPINRESOLUTION)(
+(NTAPI *PFNKSPINRESOLUTION)(
     IN PKSPIN Pin,
     OUT PKSRESOLUTION Resolution
     );
@@ -2010,19 +2213,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);
 
@@ -2074,7 +2277,7 @@ typedef struct
 
 typedef
 NTSTATUS
-(*PFNKSINTERSECTHANDLER)(
+(NTAPI *PFNKSINTERSECTHANDLER)(
     IN PIRP Irp,
     IN PKSP_PIN Pin,
     IN PKSDATARANGE DataRange,
@@ -2083,7 +2286,7 @@ NTSTATUS
 
 typedef
 NTSTATUS
-(*PFNKSINTERSECTHANDLEREX)(
+(NTAPI *PFNKSINTERSECTHANDLEREX)(
     IN PVOID Context,
     IN PIRP Irp,
     IN PKSP_PIN Pin,
@@ -2106,28 +2309,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
 {
@@ -2304,7 +2519,7 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
 
 typedef
 void
-(*PFNKSFREE)(
+(NTAPI *PFNKSFREE)(
     IN PVOID Data
     );
 
@@ -2396,18 +2611,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,
@@ -2416,18 +2631,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
 {
@@ -2453,9 +2678,23 @@ 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
@@ -2468,6 +2707,19 @@ struct _KSMAPPING {
 };
 #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
 {
 #if defined(_NTDDK_)
@@ -2509,11 +2761,11 @@ struct _KSPROCESSPIN
     BOOLEAN Terminate;
 };
 
-typedef struct
+struct _KSPROCESSPIN_INDEXENTRY
 {
     PKSPROCESSPIN* Pins;
     ULONG Count;
-} KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
+};
 #endif
 
 /* ===============================================================
@@ -2531,32 +2783,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,
@@ -2565,7 +2817,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,
@@ -2618,15 +2870,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
@@ -2664,11 +2923,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 {
@@ -2677,17 +2940,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);
@@ -2732,13 +3033,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);
 
@@ -2884,6 +3185,7 @@ KsFastPropertyHandler(
 /* ===============================================================
     Event Functions
 */
+
 #if defined(_NTDDK_)
 
 #define KSPROBE_STREAMREAD      0x00000000
@@ -2902,10 +3204,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,
@@ -3022,6 +3343,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
@@ -3036,7 +3368,7 @@ KsHandleSizedListQuery(
     IRP Helper Functions
 */
 
-typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)(
+typedef NTSTATUS (NTAPI *PFNKSIRPLISTCALLBACK)(
     IN  PIRP Irp,
     IN  PVOID Context);
 
@@ -3358,6 +3690,11 @@ KsMapModuleName(
     Misc. Helper Functions
 */
 
+KSDDKAPI PVOID NTAPI
+KsGetNextSibling(
+    IN PVOID Object);
+
+
 KSDDKAPI NTSTATUS NTAPI
 KsCacheMedium(
     IN  PUNICODE_STRING SymbolicLink,
@@ -3438,6 +3775,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
 
 /* ===============================================================
@@ -3447,6 +3812,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
@@ -3457,7 +3833,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);
 
@@ -3505,6 +3893,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
@@ -3512,6 +3908,13 @@ KsAllocateObjectBag(
     IN  PKSDEVICE Device,
     OUT KSOBJECT_BAG* ObjectBag);
 
+KSDDKAPI
+VOID
+NTAPI
+KsFreeObjectBag(
+    IN KSOBJECT_BAG ObjectBag
+    );
+
 KSDDKAPI
 VOID
 NTAPI
@@ -3546,7 +3949,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
@@ -3556,6 +3981,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(                                          \
@@ -3597,9 +4067,9 @@ KsGetOuterUnknown(
     IN PVOID Object
     );
 
-
+static
+__inline
 PUNKNOWN
-NTAPI
 KsDeviceGetOuterUnknown(
     IN  PKSDEVICE Device)
 {
@@ -3613,6 +4083,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
@@ -3635,12 +4177,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);
 
@@ -3650,13 +4202,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
@@ -3670,7 +4223,7 @@ NTSTATUS
 NTAPI
 KsFilterCreateNode(
     IN  PKSFILTER Filter,
-    IN  const KSNODE_DESCRIPTOR* NodeDescriptor,
+    IN  const KSNODE_DESCRIPTOR *const NodeDescriptor,
     OUT PULONG NodeID);
 
 KSDDKAPI
@@ -3678,7 +4231,7 @@ NTSTATUS
 NTAPI
 KsFilterCreatePinFactory(
     IN  PKSFILTER Filter,
-    IN  const KSPIN_DESCRIPTOR_EX* PinDescriptor,
+    IN  const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
     OUT PULONG PinID);
 
 KSDDKAPI