diff --git a/mingw-w64-headers/include/directmanipulation.h b/mingw-w64-headers/include/directmanipulation.h
new file mode 100644
index 0000000..7c0a5c9
--- /dev/null
+++ b/mingw-w64-headers/include/directmanipulation.h
@@ -0,0 +1,2311 @@
+/*** Autogenerated by WIDL 5.19 from directmanipulation.idl - Do not edit ***/
+
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#endif
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __directmanipulation_h__
+#define __directmanipulation_h__
+
+/* Forward declarations */
+
+#ifndef __IDirectManipulationFrameInfoProvider_FWD_DEFINED__
+#define __IDirectManipulationFrameInfoProvider_FWD_DEFINED__
+typedef interface IDirectManipulationFrameInfoProvider IDirectManipulationFrameInfoProvider;
+#ifdef __cplusplus
+interface IDirectManipulationFrameInfoProvider;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationManager_FWD_DEFINED__
+#define __IDirectManipulationManager_FWD_DEFINED__
+typedef interface IDirectManipulationManager IDirectManipulationManager;
+#ifdef __cplusplus
+interface IDirectManipulationManager;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationContent_FWD_DEFINED__
+#define __IDirectManipulationContent_FWD_DEFINED__
+typedef interface IDirectManipulationContent IDirectManipulationContent;
+#ifdef __cplusplus
+interface IDirectManipulationContent;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationUpdateHandler_FWD_DEFINED__
+#define __IDirectManipulationUpdateHandler_FWD_DEFINED__
+typedef interface IDirectManipulationUpdateHandler IDirectManipulationUpdateHandler;
+#ifdef __cplusplus
+interface IDirectManipulationUpdateHandler;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationUpdateManager_FWD_DEFINED__
+#define __IDirectManipulationUpdateManager_FWD_DEFINED__
+typedef interface IDirectManipulationUpdateManager IDirectManipulationUpdateManager;
+#ifdef __cplusplus
+interface IDirectManipulationUpdateManager;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationCompositor_FWD_DEFINED__
+#define __IDirectManipulationCompositor_FWD_DEFINED__
+typedef interface IDirectManipulationCompositor IDirectManipulationCompositor;
+#ifdef __cplusplus
+interface IDirectManipulationCompositor;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationViewport_FWD_DEFINED__
+#define __IDirectManipulationViewport_FWD_DEFINED__
+typedef interface IDirectManipulationViewport IDirectManipulationViewport;
+#ifdef __cplusplus
+interface IDirectManipulationViewport;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationViewport2_FWD_DEFINED__
+#define __IDirectManipulationViewport2_FWD_DEFINED__
+typedef interface IDirectManipulationViewport2 IDirectManipulationViewport2;
+#ifdef __cplusplus
+interface IDirectManipulationViewport2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationViewportEventHandler_FWD_DEFINED__
+#define __IDirectManipulationViewportEventHandler_FWD_DEFINED__
+typedef interface IDirectManipulationViewportEventHandler IDirectManipulationViewportEventHandler;
+#ifdef __cplusplus
+interface IDirectManipulationViewportEventHandler;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationManager2_FWD_DEFINED__
+#define __IDirectManipulationManager2_FWD_DEFINED__
+typedef interface IDirectManipulationManager2 IDirectManipulationManager2;
+#ifdef __cplusplus
+interface IDirectManipulationManager2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationPrimaryContent_FWD_DEFINED__
+#define __IDirectManipulationPrimaryContent_FWD_DEFINED__
+typedef interface IDirectManipulationPrimaryContent IDirectManipulationPrimaryContent;
+#ifdef __cplusplus
+interface IDirectManipulationPrimaryContent;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IDirectManipulationCompositor2_FWD_DEFINED__
+#define __IDirectManipulationCompositor2_FWD_DEFINED__
+typedef interface IDirectManipulationCompositor2 IDirectManipulationCompositor2;
+#ifdef __cplusplus
+interface IDirectManipulationCompositor2;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __DirectManipulationManager_FWD_DEFINED__
+#define __DirectManipulationManager_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DirectManipulationManager DirectManipulationManager;
+#else
+typedef struct DirectManipulationManager DirectManipulationManager;
+#endif /* defined __cplusplus */
+#endif /* defined __DirectManipulationManager_FWD_DEFINED__ */
+
+#ifndef __DirectManipulationSharedManager_FWD_DEFINED__
+#define __DirectManipulationSharedManager_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DirectManipulationSharedManager DirectManipulationSharedManager;
+#else
+typedef struct DirectManipulationSharedManager DirectManipulationSharedManager;
+#endif /* defined __cplusplus */
+#endif /* defined __DirectManipulationSharedManager_FWD_DEFINED__ */
+
+#ifndef __DCompManipulationCompositor_FWD_DEFINED__
+#define __DCompManipulationCompositor_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DCompManipulationCompositor DCompManipulationCompositor;
+#else
+typedef struct DCompManipulationCompositor DCompManipulationCompositor;
+#endif /* defined __cplusplus */
+#endif /* defined __DCompManipulationCompositor_FWD_DEFINED__ */
+
+#ifndef __DirectManipulationViewport_FWD_DEFINED__
+#define __DirectManipulationViewport_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DirectManipulationViewport DirectManipulationViewport;
+#else
+typedef struct DirectManipulationViewport DirectManipulationViewport;
+#endif /* defined __cplusplus */
+#endif /* defined __DirectManipulationViewport_FWD_DEFINED__ */
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+#include <ocidl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if 0
+typedef void *HWND;
+#endif
+#ifndef __IDirectManipulationViewportEventHandler_FWD_DEFINED__
+#define __IDirectManipulationViewportEventHandler_FWD_DEFINED__
+typedef interface IDirectManipulationViewportEventHandler IDirectManipulationViewportEventHandler;
+#ifdef __cplusplus
+interface IDirectManipulationViewportEventHandler;
+#endif /* __cplusplus */
+#endif
+
+typedef enum DIRECTMANIPULATION_HITTEST_TYPE {
+    DIRECTMANIPULATION_HITTEST_TYPE_ASYNCHRONOUS = 0x0,
+    DIRECTMANIPULATION_HITTEST_TYPE_SYNCHRONOUS = 0x1,
+    DIRECTMANIPULATION_HITTEST_TYPE_AUTO_SYNCHRONOUS = 0x2
+} DIRECTMANIPULATION_HITTEST_TYPE;
+typedef enum DIRECTMANIPULATION_STATUS {
+    DIRECTMANIPULATION_BUILDING = 0,
+    DIRECTMANIPULATION_ENABLED = 1,
+    DIRECTMANIPULATION_DISABLED = 2,
+    DIRECTMANIPULATION_RUNNING = 3,
+    DIRECTMANIPULATION_INERTIA = 4,
+    DIRECTMANIPULATION_READY = 5,
+    DIRECTMANIPULATION_SUSPENDED = 6
+} DIRECTMANIPULATION_STATUS;
+typedef enum DIRECTMANIPULATION_VIEWPORT_OPTIONS {
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DEFAULT = 0x0,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_AUTODISABLE = 0x1,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_MANUALUPDATE = 0x2,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_INPUT = 0x4,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_EXPLICITHITTEST = 0x8,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DISABLEPIXELSNAPPING = 0x10
+} DIRECTMANIPULATION_VIEWPORT_OPTIONS;
+typedef enum DIRECTMANIPULATION_CONFIGURATION {
+    DIRECTMANIPULATION_CONFIGURATION_NONE = 0x0,
+    DIRECTMANIPULATION_CONFIGURATION_INTERACTION = 0x1,
+    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_X = 0x2,
+    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_Y = 0x4,
+    DIRECTMANIPULATION_CONFIGURATION_SCALING = 0x10,
+    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_INERTIA = 0x20,
+    DIRECTMANIPULATION_CONFIGURATION_SCALING_INERTIA = 0x80,
+    DIRECTMANIPULATION_CONFIGURATION_RAILS_X = 0x100,
+    DIRECTMANIPULATION_CONFIGURATION_RAILS_Y = 0x200
+} DIRECTMANIPULATION_CONFIGURATION;
+typedef enum DIRECTMANIPULATION_GESTURE_CONFIGURATION {
+    DIRECTMANIPULATION_GESTURE_NONE = 0x0,
+    DIRECTMANIPULATION_GESTURE_DEFAULT = 0x0,
+    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_VERTICAL = 0x8,
+    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_HORIZONTAL = 0x10,
+    DIRECTMANIPULATION_GESTURE_PINCH_ZOOM = 0x20
+} DIRECTMANIPULATION_GESTURE_CONFIGURATION;
+typedef enum DIRECTMANIPULATION_MOTION_TYPES {
+    DIRECTMANIPULATION_MOTION_NONE = 0x0,
+    DIRECTMANIPULATION_MOTION_TRANSLATEX = 0x1,
+    DIRECTMANIPULATION_MOTION_TRANSLATEY = 0x2,
+    DIRECTMANIPULATION_MOTION_ZOOM = 0x4,
+    DIRECTMANIPULATION_MOTION_CENTERX = 0x10,
+    DIRECTMANIPULATION_MOTION_CENTERY = 0x20,
+    DIRECTMANIPULATION_MOTION_ALL = (((DIRECTMANIPULATION_MOTION_TRANSLATEX | DIRECTMANIPULATION_MOTION_TRANSLATEY) | DIRECTMANIPULATION_MOTION_ZOOM) | DIRECTMANIPULATION_MOTION_CENTERX) | DIRECTMANIPULATION_MOTION_CENTERY
+} DIRECTMANIPULATION_MOTION_TYPES;
+typedef enum DIRECTMANIPULATION_SNAPPOINT_TYPE {
+    DIRECTMANIPULATION_SNAPPOINT_MANDATORY = 0,
+    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL = 1,
+    DIRECTMANIPULATION_SNAPPOINT_MANDATORY_SINGLE = 2,
+    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL_SINGLE = 3
+} DIRECTMANIPULATION_SNAPPOINT_TYPE;
+typedef enum DIRECTMANIPULATION_SNAPPOINT_COORDINATE {
+    DIRECTMANIPULATION_COORDINATE_BOUNDARY = 0x0,
+    DIRECTMANIPULATION_COORDINATE_ORIGIN = 0x1,
+    DIRECTMANIPULATION_COORDINATE_MIRRORED = 0x10
+} DIRECTMANIPULATION_SNAPPOINT_COORDINATE;
+typedef enum DIRECTMANIPULATION_HORIZONTALALIGNMENT {
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_NONE = 0x0,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_LEFT = 0x1,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_CENTER = 0x2,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_RIGHT = 0x4,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_UNLOCKCENTER = 0x8
+} DIRECTMANIPULATION_HORIZONTALALIGNMENT;
+typedef enum DIRECTMANIPULATION_VERTICALALIGNMENT {
+    DIRECTMANIPULATION_VERTICALALIGNMENT_NONE = 0x0,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_TOP = 0x1,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_CENTER = 0x2,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_BOTTOM = 0x4,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_UNLOCKCENTER = 0x8
+} DIRECTMANIPULATION_VERTICALALIGNMENT;
+typedef enum DIRECTMANIPULATION_INPUT_MODE {
+    DIRECTMANIPULATION_INPUT_MODE_AUTOMATIC = 0,
+    DIRECTMANIPULATION_INPUT_MODE_MANUAL = 1
+} DIRECTMANIPULATION_INPUT_MODE;
+/*****************************************************************************
+ * IDirectManipulationFrameInfoProvider interface
+ */
+#ifndef __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__
+#define __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationFrameInfoProvider, 0xfb759dba, 0x6f4c, 0x4c01, 0x87,0x4e, 0x19,0xc8,0xa0,0x59,0x07,0xf9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("fb759dba-6f4c-4c01-874e-19c8a05907f9")
+IDirectManipulationFrameInfoProvider : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetNextFrameInfo(
+        ULONGLONG *time,
+        ULONGLONG *process,
+        ULONGLONG *composition) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationFrameInfoProvider, 0xfb759dba, 0x6f4c, 0x4c01, 0x87,0x4e, 0x19,0xc8,0xa0,0x59,0x07,0xf9)
+#endif
+#else
+typedef struct IDirectManipulationFrameInfoProviderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationFrameInfoProvider *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationFrameInfoProvider *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationFrameInfoProvider *This);
+
+    /*** IDirectManipulationFrameInfoProvider methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetNextFrameInfo)(
+        IDirectManipulationFrameInfoProvider *This,
+        ULONGLONG *time,
+        ULONGLONG *process,
+        ULONGLONG *composition);
+
+    END_INTERFACE
+} IDirectManipulationFrameInfoProviderVtbl;
+
+interface IDirectManipulationFrameInfoProvider {
+    CONST_VTBL IDirectManipulationFrameInfoProviderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationFrameInfoProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationFrameInfoProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationFrameInfoProvider_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationFrameInfoProvider methods ***/
+#define IDirectManipulationFrameInfoProvider_GetNextFrameInfo(This,time,process,composition) (This)->lpVtbl->GetNextFrameInfo(This,time,process,composition)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationFrameInfoProvider_QueryInterface(IDirectManipulationFrameInfoProvider* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationFrameInfoProvider_AddRef(IDirectManipulationFrameInfoProvider* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationFrameInfoProvider_Release(IDirectManipulationFrameInfoProvider* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationFrameInfoProvider methods ***/
+static FORCEINLINE HRESULT IDirectManipulationFrameInfoProvider_GetNextFrameInfo(IDirectManipulationFrameInfoProvider* This,ULONGLONG *time,ULONGLONG *process,ULONGLONG *composition) {
+    return This->lpVtbl->GetNextFrameInfo(This,time,process,composition);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationManager interface
+ */
+#ifndef __IDirectManipulationManager_INTERFACE_DEFINED__
+#define __IDirectManipulationManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationManager, 0xfbf5d3b4, 0x70c7, 0x4163, 0x93,0x22, 0x5a,0x6f,0x66,0x0d,0x6f,0xbc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("fbf5d3b4-70c7-4163-9322-5a6f660d6fbc")
+IDirectManipulationManager : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Activate(
+        HWND window) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Deactivate(
+        HWND window) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterHitTestTarget(
+        HWND window,
+        HWND hittest,
+        DIRECTMANIPULATION_HITTEST_TYPE type) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ProcessInput(
+        const MSG *msg,
+        WINBOOL *handled) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetUpdateManager(
+        REFIID riid,
+        void **obj) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateViewport(
+        IDirectManipulationFrameInfoProvider *frame,
+        HWND window,
+        REFIID riid,
+        void **obj) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateContent(
+        IDirectManipulationFrameInfoProvider *frame,
+        REFCLSID clsid,
+        REFIID riid,
+        void **obj) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationManager, 0xfbf5d3b4, 0x70c7, 0x4163, 0x93,0x22, 0x5a,0x6f,0x66,0x0d,0x6f,0xbc)
+#endif
+#else
+typedef struct IDirectManipulationManagerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationManager *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationManager *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationManager *This);
+
+    /*** IDirectManipulationManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *Activate)(
+        IDirectManipulationManager *This,
+        HWND window);
+
+    HRESULT (STDMETHODCALLTYPE *Deactivate)(
+        IDirectManipulationManager *This,
+        HWND window);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterHitTestTarget)(
+        IDirectManipulationManager *This,
+        HWND window,
+        HWND hittest,
+        DIRECTMANIPULATION_HITTEST_TYPE type);
+
+    HRESULT (STDMETHODCALLTYPE *ProcessInput)(
+        IDirectManipulationManager *This,
+        const MSG *msg,
+        WINBOOL *handled);
+
+    HRESULT (STDMETHODCALLTYPE *GetUpdateManager)(
+        IDirectManipulationManager *This,
+        REFIID riid,
+        void **obj);
+
+    HRESULT (STDMETHODCALLTYPE *CreateViewport)(
+        IDirectManipulationManager *This,
+        IDirectManipulationFrameInfoProvider *frame,
+        HWND window,
+        REFIID riid,
+        void **obj);
+
+    HRESULT (STDMETHODCALLTYPE *CreateContent)(
+        IDirectManipulationManager *This,
+        IDirectManipulationFrameInfoProvider *frame,
+        REFCLSID clsid,
+        REFIID riid,
+        void **obj);
+
+    END_INTERFACE
+} IDirectManipulationManagerVtbl;
+
+interface IDirectManipulationManager {
+    CONST_VTBL IDirectManipulationManagerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationManager methods ***/
+#define IDirectManipulationManager_Activate(This,window) (This)->lpVtbl->Activate(This,window)
+#define IDirectManipulationManager_Deactivate(This,window) (This)->lpVtbl->Deactivate(This,window)
+#define IDirectManipulationManager_RegisterHitTestTarget(This,window,hittest,type) (This)->lpVtbl->RegisterHitTestTarget(This,window,hittest,type)
+#define IDirectManipulationManager_ProcessInput(This,msg,handled) (This)->lpVtbl->ProcessInput(This,msg,handled)
+#define IDirectManipulationManager_GetUpdateManager(This,riid,obj) (This)->lpVtbl->GetUpdateManager(This,riid,obj)
+#define IDirectManipulationManager_CreateViewport(This,frame,window,riid,obj) (This)->lpVtbl->CreateViewport(This,frame,window,riid,obj)
+#define IDirectManipulationManager_CreateContent(This,frame,clsid,riid,obj) (This)->lpVtbl->CreateContent(This,frame,clsid,riid,obj)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationManager_QueryInterface(IDirectManipulationManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationManager_AddRef(IDirectManipulationManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationManager_Release(IDirectManipulationManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationManager methods ***/
+static FORCEINLINE HRESULT IDirectManipulationManager_Activate(IDirectManipulationManager* This,HWND window) {
+    return This->lpVtbl->Activate(This,window);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager_Deactivate(IDirectManipulationManager* This,HWND window) {
+    return This->lpVtbl->Deactivate(This,window);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager_RegisterHitTestTarget(IDirectManipulationManager* This,HWND window,HWND hittest,DIRECTMANIPULATION_HITTEST_TYPE type) {
+    return This->lpVtbl->RegisterHitTestTarget(This,window,hittest,type);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager_ProcessInput(IDirectManipulationManager* This,const MSG *msg,WINBOOL *handled) {
+    return This->lpVtbl->ProcessInput(This,msg,handled);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager_GetUpdateManager(IDirectManipulationManager* This,REFIID riid,void **obj) {
+    return This->lpVtbl->GetUpdateManager(This,riid,obj);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager_CreateViewport(IDirectManipulationManager* This,IDirectManipulationFrameInfoProvider *frame,HWND window,REFIID riid,void **obj) {
+    return This->lpVtbl->CreateViewport(This,frame,window,riid,obj);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager_CreateContent(IDirectManipulationManager* This,IDirectManipulationFrameInfoProvider *frame,REFCLSID clsid,REFIID riid,void **obj) {
+    return This->lpVtbl->CreateContent(This,frame,clsid,riid,obj);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationContent interface
+ */
+#ifndef __IDirectManipulationContent_INTERFACE_DEFINED__
+#define __IDirectManipulationContent_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationContent, 0xb89962cb, 0x3d89, 0x442b, 0xbb,0x58, 0x50,0x98,0xfa,0x0f,0x9f,0x16);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b89962cb-3d89-442b-bb58-5098fa0f9f16")
+IDirectManipulationContent : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetContentRect(
+        RECT *size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetContentRect(
+        const RECT *size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetViewport(
+        REFIID riid,
+        void **object) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTag(
+        REFIID riid,
+        void **object,
+        UINT32 *id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTag(
+        IUnknown *object,
+        UINT32 id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOutputTransform(
+        float *matrix,
+        DWORD count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetContentTransform(
+        float *matrix,
+        DWORD count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SyncContentTransform(
+        const float *matrix,
+        DWORD count) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationContent, 0xb89962cb, 0x3d89, 0x442b, 0xbb,0x58, 0x50,0x98,0xfa,0x0f,0x9f,0x16)
+#endif
+#else
+typedef struct IDirectManipulationContentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationContent *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationContent *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationContent *This);
+
+    /*** IDirectManipulationContent methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetContentRect)(
+        IDirectManipulationContent *This,
+        RECT *size);
+
+    HRESULT (STDMETHODCALLTYPE *SetContentRect)(
+        IDirectManipulationContent *This,
+        const RECT *size);
+
+    HRESULT (STDMETHODCALLTYPE *GetViewport)(
+        IDirectManipulationContent *This,
+        REFIID riid,
+        void **object);
+
+    HRESULT (STDMETHODCALLTYPE *GetTag)(
+        IDirectManipulationContent *This,
+        REFIID riid,
+        void **object,
+        UINT32 *id);
+
+    HRESULT (STDMETHODCALLTYPE *SetTag)(
+        IDirectManipulationContent *This,
+        IUnknown *object,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *GetOutputTransform)(
+        IDirectManipulationContent *This,
+        float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *GetContentTransform)(
+        IDirectManipulationContent *This,
+        float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *SyncContentTransform)(
+        IDirectManipulationContent *This,
+        const float *matrix,
+        DWORD count);
+
+    END_INTERFACE
+} IDirectManipulationContentVtbl;
+
+interface IDirectManipulationContent {
+    CONST_VTBL IDirectManipulationContentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationContent_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationContent_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationContent methods ***/
+#define IDirectManipulationContent_GetContentRect(This,size) (This)->lpVtbl->GetContentRect(This,size)
+#define IDirectManipulationContent_SetContentRect(This,size) (This)->lpVtbl->SetContentRect(This,size)
+#define IDirectManipulationContent_GetViewport(This,riid,object) (This)->lpVtbl->GetViewport(This,riid,object)
+#define IDirectManipulationContent_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
+#define IDirectManipulationContent_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
+#define IDirectManipulationContent_GetOutputTransform(This,matrix,count) (This)->lpVtbl->GetOutputTransform(This,matrix,count)
+#define IDirectManipulationContent_GetContentTransform(This,matrix,count) (This)->lpVtbl->GetContentTransform(This,matrix,count)
+#define IDirectManipulationContent_SyncContentTransform(This,matrix,count) (This)->lpVtbl->SyncContentTransform(This,matrix,count)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationContent_QueryInterface(IDirectManipulationContent* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationContent_AddRef(IDirectManipulationContent* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationContent_Release(IDirectManipulationContent* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationContent methods ***/
+static FORCEINLINE HRESULT IDirectManipulationContent_GetContentRect(IDirectManipulationContent* This,RECT *size) {
+    return This->lpVtbl->GetContentRect(This,size);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_SetContentRect(IDirectManipulationContent* This,const RECT *size) {
+    return This->lpVtbl->SetContentRect(This,size);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_GetViewport(IDirectManipulationContent* This,REFIID riid,void **object) {
+    return This->lpVtbl->GetViewport(This,riid,object);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_GetTag(IDirectManipulationContent* This,REFIID riid,void **object,UINT32 *id) {
+    return This->lpVtbl->GetTag(This,riid,object,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_SetTag(IDirectManipulationContent* This,IUnknown *object,UINT32 id) {
+    return This->lpVtbl->SetTag(This,object,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_GetOutputTransform(IDirectManipulationContent* This,float *matrix,DWORD count) {
+    return This->lpVtbl->GetOutputTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_GetContentTransform(IDirectManipulationContent* This,float *matrix,DWORD count) {
+    return This->lpVtbl->GetContentTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationContent_SyncContentTransform(IDirectManipulationContent* This,const float *matrix,DWORD count) {
+    return This->lpVtbl->SyncContentTransform(This,matrix,count);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationContent_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationUpdateHandler interface
+ */
+#ifndef __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__
+#define __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationUpdateHandler, 0x790b6337, 0x64f8, 0x4ff5, 0xa2,0x69, 0xb3,0x2b,0xc2,0xaf,0x27,0xa7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("790b6337-64f8-4ff5-a269-b32bc2af27a7")
+IDirectManipulationUpdateHandler : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Update(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationUpdateHandler, 0x790b6337, 0x64f8, 0x4ff5, 0xa2,0x69, 0xb3,0x2b,0xc2,0xaf,0x27,0xa7)
+#endif
+#else
+typedef struct IDirectManipulationUpdateHandlerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationUpdateHandler *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationUpdateHandler *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationUpdateHandler *This);
+
+    /*** IDirectManipulationUpdateHandler methods ***/
+    HRESULT (STDMETHODCALLTYPE *Update)(
+        IDirectManipulationUpdateHandler *This);
+
+    END_INTERFACE
+} IDirectManipulationUpdateHandlerVtbl;
+
+interface IDirectManipulationUpdateHandler {
+    CONST_VTBL IDirectManipulationUpdateHandlerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationUpdateHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationUpdateHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationUpdateHandler_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationUpdateHandler methods ***/
+#define IDirectManipulationUpdateHandler_Update(This) (This)->lpVtbl->Update(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationUpdateHandler_QueryInterface(IDirectManipulationUpdateHandler* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationUpdateHandler_AddRef(IDirectManipulationUpdateHandler* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationUpdateHandler_Release(IDirectManipulationUpdateHandler* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationUpdateHandler methods ***/
+static FORCEINLINE HRESULT IDirectManipulationUpdateHandler_Update(IDirectManipulationUpdateHandler* This) {
+    return This->lpVtbl->Update(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationUpdateManager interface
+ */
+#ifndef __IDirectManipulationUpdateManager_INTERFACE_DEFINED__
+#define __IDirectManipulationUpdateManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationUpdateManager, 0xb0ae62fd, 0xbe34, 0x46e7, 0x9c,0xaa, 0xd3,0x61,0xfa,0xcb,0xb9,0xcc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b0ae62fd-be34-46e7-9caa-d361facbb9cc")
+IDirectManipulationUpdateManager : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE RegisterWaitHandleCallback(
+        HANDLE handle,
+        IDirectManipulationUpdateHandler *handler,
+        DWORD *cookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterWaitHandleCallback(
+        DWORD cookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Update(
+        IDirectManipulationFrameInfoProvider *provider) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationUpdateManager, 0xb0ae62fd, 0xbe34, 0x46e7, 0x9c,0xaa, 0xd3,0x61,0xfa,0xcb,0xb9,0xcc)
+#endif
+#else
+typedef struct IDirectManipulationUpdateManagerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationUpdateManager *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationUpdateManager *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationUpdateManager *This);
+
+    /*** IDirectManipulationUpdateManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *RegisterWaitHandleCallback)(
+        IDirectManipulationUpdateManager *This,
+        HANDLE handle,
+        IDirectManipulationUpdateHandler *handler,
+        DWORD *cookie);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterWaitHandleCallback)(
+        IDirectManipulationUpdateManager *This,
+        DWORD cookie);
+
+    HRESULT (STDMETHODCALLTYPE *Update)(
+        IDirectManipulationUpdateManager *This,
+        IDirectManipulationFrameInfoProvider *provider);
+
+    END_INTERFACE
+} IDirectManipulationUpdateManagerVtbl;
+
+interface IDirectManipulationUpdateManager {
+    CONST_VTBL IDirectManipulationUpdateManagerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationUpdateManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationUpdateManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationUpdateManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationUpdateManager methods ***/
+#define IDirectManipulationUpdateManager_RegisterWaitHandleCallback(This,handle,handler,cookie) (This)->lpVtbl->RegisterWaitHandleCallback(This,handle,handler,cookie)
+#define IDirectManipulationUpdateManager_UnregisterWaitHandleCallback(This,cookie) (This)->lpVtbl->UnregisterWaitHandleCallback(This,cookie)
+#define IDirectManipulationUpdateManager_Update(This,provider) (This)->lpVtbl->Update(This,provider)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationUpdateManager_QueryInterface(IDirectManipulationUpdateManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationUpdateManager_AddRef(IDirectManipulationUpdateManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationUpdateManager_Release(IDirectManipulationUpdateManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationUpdateManager methods ***/
+static FORCEINLINE HRESULT IDirectManipulationUpdateManager_RegisterWaitHandleCallback(IDirectManipulationUpdateManager* This,HANDLE handle,IDirectManipulationUpdateHandler *handler,DWORD *cookie) {
+    return This->lpVtbl->RegisterWaitHandleCallback(This,handle,handler,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationUpdateManager_UnregisterWaitHandleCallback(IDirectManipulationUpdateManager* This,DWORD cookie) {
+    return This->lpVtbl->UnregisterWaitHandleCallback(This,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationUpdateManager_Update(IDirectManipulationUpdateManager* This,IDirectManipulationFrameInfoProvider *provider) {
+    return This->lpVtbl->Update(This,provider);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationUpdateManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationCompositor interface
+ */
+#ifndef __IDirectManipulationCompositor_INTERFACE_DEFINED__
+#define __IDirectManipulationCompositor_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationCompositor, 0x537a0825, 0x0387, 0x4efa, 0xb6,0x2f, 0x71,0xeb,0x1f,0x08,0x5a,0x7e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("537a0825-0387-4efa-b62f-71eb1f085a7e")
+IDirectManipulationCompositor : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddContent(
+        IDirectManipulationContent *content,
+        IUnknown *device,
+        IUnknown *parent,
+        IUnknown *child) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveContent(
+        IDirectManipulationContent *content) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetUpdateManager(
+        IDirectManipulationUpdateManager *manager) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Flush(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationCompositor, 0x537a0825, 0x0387, 0x4efa, 0xb6,0x2f, 0x71,0xeb,0x1f,0x08,0x5a,0x7e)
+#endif
+#else
+typedef struct IDirectManipulationCompositorVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationCompositor *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationCompositor *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationCompositor *This);
+
+    /*** IDirectManipulationCompositor methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddContent)(
+        IDirectManipulationCompositor *This,
+        IDirectManipulationContent *content,
+        IUnknown *device,
+        IUnknown *parent,
+        IUnknown *child);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
+        IDirectManipulationCompositor *This,
+        IDirectManipulationContent *content);
+
+    HRESULT (STDMETHODCALLTYPE *SetUpdateManager)(
+        IDirectManipulationCompositor *This,
+        IDirectManipulationUpdateManager *manager);
+
+    HRESULT (STDMETHODCALLTYPE *Flush)(
+        IDirectManipulationCompositor *This);
+
+    END_INTERFACE
+} IDirectManipulationCompositorVtbl;
+
+interface IDirectManipulationCompositor {
+    CONST_VTBL IDirectManipulationCompositorVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationCompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationCompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationCompositor_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationCompositor methods ***/
+#define IDirectManipulationCompositor_AddContent(This,content,device,parent,child) (This)->lpVtbl->AddContent(This,content,device,parent,child)
+#define IDirectManipulationCompositor_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
+#define IDirectManipulationCompositor_SetUpdateManager(This,manager) (This)->lpVtbl->SetUpdateManager(This,manager)
+#define IDirectManipulationCompositor_Flush(This) (This)->lpVtbl->Flush(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationCompositor_QueryInterface(IDirectManipulationCompositor* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationCompositor_AddRef(IDirectManipulationCompositor* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationCompositor_Release(IDirectManipulationCompositor* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationCompositor methods ***/
+static FORCEINLINE HRESULT IDirectManipulationCompositor_AddContent(IDirectManipulationCompositor* This,IDirectManipulationContent *content,IUnknown *device,IUnknown *parent,IUnknown *child) {
+    return This->lpVtbl->AddContent(This,content,device,parent,child);
+}
+static FORCEINLINE HRESULT IDirectManipulationCompositor_RemoveContent(IDirectManipulationCompositor* This,IDirectManipulationContent *content) {
+    return This->lpVtbl->RemoveContent(This,content);
+}
+static FORCEINLINE HRESULT IDirectManipulationCompositor_SetUpdateManager(IDirectManipulationCompositor* This,IDirectManipulationUpdateManager *manager) {
+    return This->lpVtbl->SetUpdateManager(This,manager);
+}
+static FORCEINLINE HRESULT IDirectManipulationCompositor_Flush(IDirectManipulationCompositor* This) {
+    return This->lpVtbl->Flush(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationCompositor_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationViewport interface
+ */
+#ifndef __IDirectManipulationViewport_INTERFACE_DEFINED__
+#define __IDirectManipulationViewport_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationViewport, 0x28b85a3d, 0x60a0, 0x48bd, 0x9b,0xa1, 0x5c,0xe8,0xd9,0xea,0x3a,0x6d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("28b85a3d-60a0-48bd-9ba1-5ce8d9ea3a6d")
+IDirectManipulationViewport : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Enable(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Disable(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetContact(
+        UINT32 id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReleaseContact(
+        UINT32 id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReleaseAllContacts(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStatus(
+        DIRECTMANIPULATION_STATUS *status) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTag(
+        REFIID riid,
+        void **object,
+        UINT32 *id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTag(
+        IUnknown *object,
+        UINT32 id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetViewportRect(
+        RECT *viewport) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetViewportRect(
+        const RECT *viewport) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ZoomToRect(
+        const float left,
+        const float top,
+        const float right,
+        const float bottom,
+        WINBOOL animate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetViewportTransform(
+        const float *matrix,
+        DWORD count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SyncDisplayTransform(
+        const float *matrix,
+        DWORD count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPrimaryContent(
+        REFIID riid,
+        void **object) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddContent(
+        IDirectManipulationContent *content) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveContent(
+        IDirectManipulationContent *content) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetViewportOptions(
+        DIRECTMANIPULATION_VIEWPORT_OPTIONS options) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddConfiguration(
+        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveConfiguration(
+        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ActivateConfiguration(
+        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetManualGesture(
+        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetChaining(
+        DIRECTMANIPULATION_MOTION_TYPES enabledTypes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddEventHandler(
+        HWND window,
+        IDirectManipulationViewportEventHandler *eventHandler,
+        DWORD *cookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveEventHandler(
+        DWORD cookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetInputMode(
+        DIRECTMANIPULATION_INPUT_MODE mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetUpdateMode(
+        DIRECTMANIPULATION_INPUT_MODE mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Stop(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abandon(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationViewport, 0x28b85a3d, 0x60a0, 0x48bd, 0x9b,0xa1, 0x5c,0xe8,0xd9,0xea,0x3a,0x6d)
+#endif
+#else
+typedef struct IDirectManipulationViewportVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationViewport *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationViewport *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationViewport *This);
+
+    /*** IDirectManipulationViewport methods ***/
+    HRESULT (STDMETHODCALLTYPE *Enable)(
+        IDirectManipulationViewport *This);
+
+    HRESULT (STDMETHODCALLTYPE *Disable)(
+        IDirectManipulationViewport *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetContact)(
+        IDirectManipulationViewport *This,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseContact)(
+        IDirectManipulationViewport *This,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseAllContacts)(
+        IDirectManipulationViewport *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatus)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_STATUS *status);
+
+    HRESULT (STDMETHODCALLTYPE *GetTag)(
+        IDirectManipulationViewport *This,
+        REFIID riid,
+        void **object,
+        UINT32 *id);
+
+    HRESULT (STDMETHODCALLTYPE *SetTag)(
+        IDirectManipulationViewport *This,
+        IUnknown *object,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *GetViewportRect)(
+        IDirectManipulationViewport *This,
+        RECT *viewport);
+
+    HRESULT (STDMETHODCALLTYPE *SetViewportRect)(
+        IDirectManipulationViewport *This,
+        const RECT *viewport);
+
+    HRESULT (STDMETHODCALLTYPE *ZoomToRect)(
+        IDirectManipulationViewport *This,
+        const float left,
+        const float top,
+        const float right,
+        const float bottom,
+        WINBOOL animate);
+
+    HRESULT (STDMETHODCALLTYPE *SetViewportTransform)(
+        IDirectManipulationViewport *This,
+        const float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *SyncDisplayTransform)(
+        IDirectManipulationViewport *This,
+        const float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *GetPrimaryContent)(
+        IDirectManipulationViewport *This,
+        REFIID riid,
+        void **object);
+
+    HRESULT (STDMETHODCALLTYPE *AddContent)(
+        IDirectManipulationViewport *This,
+        IDirectManipulationContent *content);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
+        IDirectManipulationViewport *This,
+        IDirectManipulationContent *content);
+
+    HRESULT (STDMETHODCALLTYPE *SetViewportOptions)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_VIEWPORT_OPTIONS options);
+
+    HRESULT (STDMETHODCALLTYPE *AddConfiguration)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveConfiguration)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *ActivateConfiguration)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *SetManualGesture)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *SetChaining)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_MOTION_TYPES enabledTypes);
+
+    HRESULT (STDMETHODCALLTYPE *AddEventHandler)(
+        IDirectManipulationViewport *This,
+        HWND window,
+        IDirectManipulationViewportEventHandler *eventHandler,
+        DWORD *cookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveEventHandler)(
+        IDirectManipulationViewport *This,
+        DWORD cookie);
+
+    HRESULT (STDMETHODCALLTYPE *SetInputMode)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_INPUT_MODE mode);
+
+    HRESULT (STDMETHODCALLTYPE *SetUpdateMode)(
+        IDirectManipulationViewport *This,
+        DIRECTMANIPULATION_INPUT_MODE mode);
+
+    HRESULT (STDMETHODCALLTYPE *Stop)(
+        IDirectManipulationViewport *This);
+
+    HRESULT (STDMETHODCALLTYPE *Abandon)(
+        IDirectManipulationViewport *This);
+
+    END_INTERFACE
+} IDirectManipulationViewportVtbl;
+
+interface IDirectManipulationViewport {
+    CONST_VTBL IDirectManipulationViewportVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationViewport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationViewport_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationViewport_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationViewport methods ***/
+#define IDirectManipulationViewport_Enable(This) (This)->lpVtbl->Enable(This)
+#define IDirectManipulationViewport_Disable(This) (This)->lpVtbl->Disable(This)
+#define IDirectManipulationViewport_SetContact(This,id) (This)->lpVtbl->SetContact(This,id)
+#define IDirectManipulationViewport_ReleaseContact(This,id) (This)->lpVtbl->ReleaseContact(This,id)
+#define IDirectManipulationViewport_ReleaseAllContacts(This) (This)->lpVtbl->ReleaseAllContacts(This)
+#define IDirectManipulationViewport_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
+#define IDirectManipulationViewport_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
+#define IDirectManipulationViewport_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
+#define IDirectManipulationViewport_GetViewportRect(This,viewport) (This)->lpVtbl->GetViewportRect(This,viewport)
+#define IDirectManipulationViewport_SetViewportRect(This,viewport) (This)->lpVtbl->SetViewportRect(This,viewport)
+#define IDirectManipulationViewport_ZoomToRect(This,left,top,right,bottom,animate) (This)->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate)
+#define IDirectManipulationViewport_SetViewportTransform(This,matrix,count) (This)->lpVtbl->SetViewportTransform(This,matrix,count)
+#define IDirectManipulationViewport_SyncDisplayTransform(This,matrix,count) (This)->lpVtbl->SyncDisplayTransform(This,matrix,count)
+#define IDirectManipulationViewport_GetPrimaryContent(This,riid,object) (This)->lpVtbl->GetPrimaryContent(This,riid,object)
+#define IDirectManipulationViewport_AddContent(This,content) (This)->lpVtbl->AddContent(This,content)
+#define IDirectManipulationViewport_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
+#define IDirectManipulationViewport_SetViewportOptions(This,options) (This)->lpVtbl->SetViewportOptions(This,options)
+#define IDirectManipulationViewport_AddConfiguration(This,configuration) (This)->lpVtbl->AddConfiguration(This,configuration)
+#define IDirectManipulationViewport_RemoveConfiguration(This,configuration) (This)->lpVtbl->RemoveConfiguration(This,configuration)
+#define IDirectManipulationViewport_ActivateConfiguration(This,configuration) (This)->lpVtbl->ActivateConfiguration(This,configuration)
+#define IDirectManipulationViewport_SetManualGesture(This,configuration) (This)->lpVtbl->SetManualGesture(This,configuration)
+#define IDirectManipulationViewport_SetChaining(This,enabledTypes) (This)->lpVtbl->SetChaining(This,enabledTypes)
+#define IDirectManipulationViewport_AddEventHandler(This,window,eventHandler,cookie) (This)->lpVtbl->AddEventHandler(This,window,eventHandler,cookie)
+#define IDirectManipulationViewport_RemoveEventHandler(This,cookie) (This)->lpVtbl->RemoveEventHandler(This,cookie)
+#define IDirectManipulationViewport_SetInputMode(This,mode) (This)->lpVtbl->SetInputMode(This,mode)
+#define IDirectManipulationViewport_SetUpdateMode(This,mode) (This)->lpVtbl->SetUpdateMode(This,mode)
+#define IDirectManipulationViewport_Stop(This) (This)->lpVtbl->Stop(This)
+#define IDirectManipulationViewport_Abandon(This) (This)->lpVtbl->Abandon(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewport_QueryInterface(IDirectManipulationViewport* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationViewport_AddRef(IDirectManipulationViewport* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationViewport_Release(IDirectManipulationViewport* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationViewport methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewport_Enable(IDirectManipulationViewport* This) {
+    return This->lpVtbl->Enable(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_Disable(IDirectManipulationViewport* This) {
+    return This->lpVtbl->Disable(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetContact(IDirectManipulationViewport* This,UINT32 id) {
+    return This->lpVtbl->SetContact(This,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_ReleaseContact(IDirectManipulationViewport* This,UINT32 id) {
+    return This->lpVtbl->ReleaseContact(This,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_ReleaseAllContacts(IDirectManipulationViewport* This) {
+    return This->lpVtbl->ReleaseAllContacts(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_GetStatus(IDirectManipulationViewport* This,DIRECTMANIPULATION_STATUS *status) {
+    return This->lpVtbl->GetStatus(This,status);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_GetTag(IDirectManipulationViewport* This,REFIID riid,void **object,UINT32 *id) {
+    return This->lpVtbl->GetTag(This,riid,object,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetTag(IDirectManipulationViewport* This,IUnknown *object,UINT32 id) {
+    return This->lpVtbl->SetTag(This,object,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_GetViewportRect(IDirectManipulationViewport* This,RECT *viewport) {
+    return This->lpVtbl->GetViewportRect(This,viewport);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetViewportRect(IDirectManipulationViewport* This,const RECT *viewport) {
+    return This->lpVtbl->SetViewportRect(This,viewport);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_ZoomToRect(IDirectManipulationViewport* This,const float left,const float top,const float right,const float bottom,WINBOOL animate) {
+    return This->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetViewportTransform(IDirectManipulationViewport* This,const float *matrix,DWORD count) {
+    return This->lpVtbl->SetViewportTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SyncDisplayTransform(IDirectManipulationViewport* This,const float *matrix,DWORD count) {
+    return This->lpVtbl->SyncDisplayTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_GetPrimaryContent(IDirectManipulationViewport* This,REFIID riid,void **object) {
+    return This->lpVtbl->GetPrimaryContent(This,riid,object);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_AddContent(IDirectManipulationViewport* This,IDirectManipulationContent *content) {
+    return This->lpVtbl->AddContent(This,content);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_RemoveContent(IDirectManipulationViewport* This,IDirectManipulationContent *content) {
+    return This->lpVtbl->RemoveContent(This,content);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetViewportOptions(IDirectManipulationViewport* This,DIRECTMANIPULATION_VIEWPORT_OPTIONS options) {
+    return This->lpVtbl->SetViewportOptions(This,options);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_AddConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
+    return This->lpVtbl->AddConfiguration(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_RemoveConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
+    return This->lpVtbl->RemoveConfiguration(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_ActivateConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
+    return This->lpVtbl->ActivateConfiguration(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetManualGesture(IDirectManipulationViewport* This,DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) {
+    return This->lpVtbl->SetManualGesture(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetChaining(IDirectManipulationViewport* This,DIRECTMANIPULATION_MOTION_TYPES enabledTypes) {
+    return This->lpVtbl->SetChaining(This,enabledTypes);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_AddEventHandler(IDirectManipulationViewport* This,HWND window,IDirectManipulationViewportEventHandler *eventHandler,DWORD *cookie) {
+    return This->lpVtbl->AddEventHandler(This,window,eventHandler,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_RemoveEventHandler(IDirectManipulationViewport* This,DWORD cookie) {
+    return This->lpVtbl->RemoveEventHandler(This,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetInputMode(IDirectManipulationViewport* This,DIRECTMANIPULATION_INPUT_MODE mode) {
+    return This->lpVtbl->SetInputMode(This,mode);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_SetUpdateMode(IDirectManipulationViewport* This,DIRECTMANIPULATION_INPUT_MODE mode) {
+    return This->lpVtbl->SetUpdateMode(This,mode);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_Stop(IDirectManipulationViewport* This) {
+    return This->lpVtbl->Stop(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport_Abandon(IDirectManipulationViewport* This) {
+    return This->lpVtbl->Abandon(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationViewport_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationViewport2 interface
+ */
+#ifndef __IDirectManipulationViewport2_INTERFACE_DEFINED__
+#define __IDirectManipulationViewport2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationViewport2, 0x923ccaac, 0x61e1, 0x4385, 0xb7,0x26, 0x01,0x7a,0xf1,0x89,0x88,0x2a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("923ccaac-61e1-4385-b726-017af189882a")
+IDirectManipulationViewport2 : public IDirectManipulationViewport
+{
+    virtual HRESULT STDMETHODCALLTYPE AddBehavior(
+        IUnknown *behavior,
+        DWORD *cookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveBehavior(
+        DWORD cookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveAllBehaviors(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationViewport2, 0x923ccaac, 0x61e1, 0x4385, 0xb7,0x26, 0x01,0x7a,0xf1,0x89,0x88,0x2a)
+#endif
+#else
+typedef struct IDirectManipulationViewport2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationViewport2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationViewport2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationViewport2 *This);
+
+    /*** IDirectManipulationViewport methods ***/
+    HRESULT (STDMETHODCALLTYPE *Enable)(
+        IDirectManipulationViewport2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *Disable)(
+        IDirectManipulationViewport2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetContact)(
+        IDirectManipulationViewport2 *This,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseContact)(
+        IDirectManipulationViewport2 *This,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseAllContacts)(
+        IDirectManipulationViewport2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatus)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_STATUS *status);
+
+    HRESULT (STDMETHODCALLTYPE *GetTag)(
+        IDirectManipulationViewport2 *This,
+        REFIID riid,
+        void **object,
+        UINT32 *id);
+
+    HRESULT (STDMETHODCALLTYPE *SetTag)(
+        IDirectManipulationViewport2 *This,
+        IUnknown *object,
+        UINT32 id);
+
+    HRESULT (STDMETHODCALLTYPE *GetViewportRect)(
+        IDirectManipulationViewport2 *This,
+        RECT *viewport);
+
+    HRESULT (STDMETHODCALLTYPE *SetViewportRect)(
+        IDirectManipulationViewport2 *This,
+        const RECT *viewport);
+
+    HRESULT (STDMETHODCALLTYPE *ZoomToRect)(
+        IDirectManipulationViewport2 *This,
+        const float left,
+        const float top,
+        const float right,
+        const float bottom,
+        WINBOOL animate);
+
+    HRESULT (STDMETHODCALLTYPE *SetViewportTransform)(
+        IDirectManipulationViewport2 *This,
+        const float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *SyncDisplayTransform)(
+        IDirectManipulationViewport2 *This,
+        const float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *GetPrimaryContent)(
+        IDirectManipulationViewport2 *This,
+        REFIID riid,
+        void **object);
+
+    HRESULT (STDMETHODCALLTYPE *AddContent)(
+        IDirectManipulationViewport2 *This,
+        IDirectManipulationContent *content);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
+        IDirectManipulationViewport2 *This,
+        IDirectManipulationContent *content);
+
+    HRESULT (STDMETHODCALLTYPE *SetViewportOptions)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_VIEWPORT_OPTIONS options);
+
+    HRESULT (STDMETHODCALLTYPE *AddConfiguration)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveConfiguration)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *ActivateConfiguration)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *SetManualGesture)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);
+
+    HRESULT (STDMETHODCALLTYPE *SetChaining)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_MOTION_TYPES enabledTypes);
+
+    HRESULT (STDMETHODCALLTYPE *AddEventHandler)(
+        IDirectManipulationViewport2 *This,
+        HWND window,
+        IDirectManipulationViewportEventHandler *eventHandler,
+        DWORD *cookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveEventHandler)(
+        IDirectManipulationViewport2 *This,
+        DWORD cookie);
+
+    HRESULT (STDMETHODCALLTYPE *SetInputMode)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_INPUT_MODE mode);
+
+    HRESULT (STDMETHODCALLTYPE *SetUpdateMode)(
+        IDirectManipulationViewport2 *This,
+        DIRECTMANIPULATION_INPUT_MODE mode);
+
+    HRESULT (STDMETHODCALLTYPE *Stop)(
+        IDirectManipulationViewport2 *This);
+
+    HRESULT (STDMETHODCALLTYPE *Abandon)(
+        IDirectManipulationViewport2 *This);
+
+    /*** IDirectManipulationViewport2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddBehavior)(
+        IDirectManipulationViewport2 *This,
+        IUnknown *behavior,
+        DWORD *cookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveBehavior)(
+        IDirectManipulationViewport2 *This,
+        DWORD cookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveAllBehaviors)(
+        IDirectManipulationViewport2 *This);
+
+    END_INTERFACE
+} IDirectManipulationViewport2Vtbl;
+
+interface IDirectManipulationViewport2 {
+    CONST_VTBL IDirectManipulationViewport2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationViewport2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationViewport2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationViewport2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationViewport methods ***/
+#define IDirectManipulationViewport2_Enable(This) (This)->lpVtbl->Enable(This)
+#define IDirectManipulationViewport2_Disable(This) (This)->lpVtbl->Disable(This)
+#define IDirectManipulationViewport2_SetContact(This,id) (This)->lpVtbl->SetContact(This,id)
+#define IDirectManipulationViewport2_ReleaseContact(This,id) (This)->lpVtbl->ReleaseContact(This,id)
+#define IDirectManipulationViewport2_ReleaseAllContacts(This) (This)->lpVtbl->ReleaseAllContacts(This)
+#define IDirectManipulationViewport2_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
+#define IDirectManipulationViewport2_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
+#define IDirectManipulationViewport2_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
+#define IDirectManipulationViewport2_GetViewportRect(This,viewport) (This)->lpVtbl->GetViewportRect(This,viewport)
+#define IDirectManipulationViewport2_SetViewportRect(This,viewport) (This)->lpVtbl->SetViewportRect(This,viewport)
+#define IDirectManipulationViewport2_ZoomToRect(This,left,top,right,bottom,animate) (This)->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate)
+#define IDirectManipulationViewport2_SetViewportTransform(This,matrix,count) (This)->lpVtbl->SetViewportTransform(This,matrix,count)
+#define IDirectManipulationViewport2_SyncDisplayTransform(This,matrix,count) (This)->lpVtbl->SyncDisplayTransform(This,matrix,count)
+#define IDirectManipulationViewport2_GetPrimaryContent(This,riid,object) (This)->lpVtbl->GetPrimaryContent(This,riid,object)
+#define IDirectManipulationViewport2_AddContent(This,content) (This)->lpVtbl->AddContent(This,content)
+#define IDirectManipulationViewport2_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
+#define IDirectManipulationViewport2_SetViewportOptions(This,options) (This)->lpVtbl->SetViewportOptions(This,options)
+#define IDirectManipulationViewport2_AddConfiguration(This,configuration) (This)->lpVtbl->AddConfiguration(This,configuration)
+#define IDirectManipulationViewport2_RemoveConfiguration(This,configuration) (This)->lpVtbl->RemoveConfiguration(This,configuration)
+#define IDirectManipulationViewport2_ActivateConfiguration(This,configuration) (This)->lpVtbl->ActivateConfiguration(This,configuration)
+#define IDirectManipulationViewport2_SetManualGesture(This,configuration) (This)->lpVtbl->SetManualGesture(This,configuration)
+#define IDirectManipulationViewport2_SetChaining(This,enabledTypes) (This)->lpVtbl->SetChaining(This,enabledTypes)
+#define IDirectManipulationViewport2_AddEventHandler(This,window,eventHandler,cookie) (This)->lpVtbl->AddEventHandler(This,window,eventHandler,cookie)
+#define IDirectManipulationViewport2_RemoveEventHandler(This,cookie) (This)->lpVtbl->RemoveEventHandler(This,cookie)
+#define IDirectManipulationViewport2_SetInputMode(This,mode) (This)->lpVtbl->SetInputMode(This,mode)
+#define IDirectManipulationViewport2_SetUpdateMode(This,mode) (This)->lpVtbl->SetUpdateMode(This,mode)
+#define IDirectManipulationViewport2_Stop(This) (This)->lpVtbl->Stop(This)
+#define IDirectManipulationViewport2_Abandon(This) (This)->lpVtbl->Abandon(This)
+/*** IDirectManipulationViewport2 methods ***/
+#define IDirectManipulationViewport2_AddBehavior(This,behavior,cookie) (This)->lpVtbl->AddBehavior(This,behavior,cookie)
+#define IDirectManipulationViewport2_RemoveBehavior(This,cookie) (This)->lpVtbl->RemoveBehavior(This,cookie)
+#define IDirectManipulationViewport2_RemoveAllBehaviors(This) (This)->lpVtbl->RemoveAllBehaviors(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewport2_QueryInterface(IDirectManipulationViewport2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationViewport2_AddRef(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationViewport2_Release(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationViewport methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewport2_Enable(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->Enable(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_Disable(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->Disable(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetContact(IDirectManipulationViewport2* This,UINT32 id) {
+    return This->lpVtbl->SetContact(This,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_ReleaseContact(IDirectManipulationViewport2* This,UINT32 id) {
+    return This->lpVtbl->ReleaseContact(This,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_ReleaseAllContacts(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->ReleaseAllContacts(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_GetStatus(IDirectManipulationViewport2* This,DIRECTMANIPULATION_STATUS *status) {
+    return This->lpVtbl->GetStatus(This,status);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_GetTag(IDirectManipulationViewport2* This,REFIID riid,void **object,UINT32 *id) {
+    return This->lpVtbl->GetTag(This,riid,object,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetTag(IDirectManipulationViewport2* This,IUnknown *object,UINT32 id) {
+    return This->lpVtbl->SetTag(This,object,id);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_GetViewportRect(IDirectManipulationViewport2* This,RECT *viewport) {
+    return This->lpVtbl->GetViewportRect(This,viewport);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetViewportRect(IDirectManipulationViewport2* This,const RECT *viewport) {
+    return This->lpVtbl->SetViewportRect(This,viewport);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_ZoomToRect(IDirectManipulationViewport2* This,const float left,const float top,const float right,const float bottom,WINBOOL animate) {
+    return This->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetViewportTransform(IDirectManipulationViewport2* This,const float *matrix,DWORD count) {
+    return This->lpVtbl->SetViewportTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SyncDisplayTransform(IDirectManipulationViewport2* This,const float *matrix,DWORD count) {
+    return This->lpVtbl->SyncDisplayTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_GetPrimaryContent(IDirectManipulationViewport2* This,REFIID riid,void **object) {
+    return This->lpVtbl->GetPrimaryContent(This,riid,object);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_AddContent(IDirectManipulationViewport2* This,IDirectManipulationContent *content) {
+    return This->lpVtbl->AddContent(This,content);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveContent(IDirectManipulationViewport2* This,IDirectManipulationContent *content) {
+    return This->lpVtbl->RemoveContent(This,content);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetViewportOptions(IDirectManipulationViewport2* This,DIRECTMANIPULATION_VIEWPORT_OPTIONS options) {
+    return This->lpVtbl->SetViewportOptions(This,options);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_AddConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
+    return This->lpVtbl->AddConfiguration(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
+    return This->lpVtbl->RemoveConfiguration(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_ActivateConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
+    return This->lpVtbl->ActivateConfiguration(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetManualGesture(IDirectManipulationViewport2* This,DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) {
+    return This->lpVtbl->SetManualGesture(This,configuration);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetChaining(IDirectManipulationViewport2* This,DIRECTMANIPULATION_MOTION_TYPES enabledTypes) {
+    return This->lpVtbl->SetChaining(This,enabledTypes);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_AddEventHandler(IDirectManipulationViewport2* This,HWND window,IDirectManipulationViewportEventHandler *eventHandler,DWORD *cookie) {
+    return This->lpVtbl->AddEventHandler(This,window,eventHandler,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveEventHandler(IDirectManipulationViewport2* This,DWORD cookie) {
+    return This->lpVtbl->RemoveEventHandler(This,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetInputMode(IDirectManipulationViewport2* This,DIRECTMANIPULATION_INPUT_MODE mode) {
+    return This->lpVtbl->SetInputMode(This,mode);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_SetUpdateMode(IDirectManipulationViewport2* This,DIRECTMANIPULATION_INPUT_MODE mode) {
+    return This->lpVtbl->SetUpdateMode(This,mode);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_Stop(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->Stop(This);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_Abandon(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->Abandon(This);
+}
+/*** IDirectManipulationViewport2 methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewport2_AddBehavior(IDirectManipulationViewport2* This,IUnknown *behavior,DWORD *cookie) {
+    return This->lpVtbl->AddBehavior(This,behavior,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveBehavior(IDirectManipulationViewport2* This,DWORD cookie) {
+    return This->lpVtbl->RemoveBehavior(This,cookie);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveAllBehaviors(IDirectManipulationViewport2* This) {
+    return This->lpVtbl->RemoveAllBehaviors(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationViewport2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationViewportEventHandler interface
+ */
+#ifndef __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__
+#define __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationViewportEventHandler, 0x952121da, 0xd69f, 0x45f9, 0xb0,0xf9, 0xf2,0x39,0x44,0x32,0x1a,0x6d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("952121da-d69f-45f9-b0f9-f23944321a6d")
+IDirectManipulationViewportEventHandler : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnViewportStatusChanged(
+        IDirectManipulationViewport *viewport,
+        DIRECTMANIPULATION_STATUS current,
+        DIRECTMANIPULATION_STATUS previous) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnViewportUpdated(
+        IDirectManipulationViewport *viewport) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnContentUpdated(
+        IDirectManipulationViewport *viewport,
+        IDirectManipulationContent *content) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationViewportEventHandler, 0x952121da, 0xd69f, 0x45f9, 0xb0,0xf9, 0xf2,0x39,0x44,0x32,0x1a,0x6d)
+#endif
+#else
+typedef struct IDirectManipulationViewportEventHandlerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationViewportEventHandler *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationViewportEventHandler *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationViewportEventHandler *This);
+
+    /*** IDirectManipulationViewportEventHandler methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnViewportStatusChanged)(
+        IDirectManipulationViewportEventHandler *This,
+        IDirectManipulationViewport *viewport,
+        DIRECTMANIPULATION_STATUS current,
+        DIRECTMANIPULATION_STATUS previous);
+
+    HRESULT (STDMETHODCALLTYPE *OnViewportUpdated)(
+        IDirectManipulationViewportEventHandler *This,
+        IDirectManipulationViewport *viewport);
+
+    HRESULT (STDMETHODCALLTYPE *OnContentUpdated)(
+        IDirectManipulationViewportEventHandler *This,
+        IDirectManipulationViewport *viewport,
+        IDirectManipulationContent *content);
+
+    END_INTERFACE
+} IDirectManipulationViewportEventHandlerVtbl;
+
+interface IDirectManipulationViewportEventHandler {
+    CONST_VTBL IDirectManipulationViewportEventHandlerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationViewportEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationViewportEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationViewportEventHandler_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationViewportEventHandler methods ***/
+#define IDirectManipulationViewportEventHandler_OnViewportStatusChanged(This,viewport,current,previous) (This)->lpVtbl->OnViewportStatusChanged(This,viewport,current,previous)
+#define IDirectManipulationViewportEventHandler_OnViewportUpdated(This,viewport) (This)->lpVtbl->OnViewportUpdated(This,viewport)
+#define IDirectManipulationViewportEventHandler_OnContentUpdated(This,viewport,content) (This)->lpVtbl->OnContentUpdated(This,viewport,content)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_QueryInterface(IDirectManipulationViewportEventHandler* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationViewportEventHandler_AddRef(IDirectManipulationViewportEventHandler* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationViewportEventHandler_Release(IDirectManipulationViewportEventHandler* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationViewportEventHandler methods ***/
+static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_OnViewportStatusChanged(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport,DIRECTMANIPULATION_STATUS current,DIRECTMANIPULATION_STATUS previous) {
+    return This->lpVtbl->OnViewportStatusChanged(This,viewport,current,previous);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_OnViewportUpdated(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport) {
+    return This->lpVtbl->OnViewportUpdated(This,viewport);
+}
+static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_OnContentUpdated(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport,IDirectManipulationContent *content) {
+    return This->lpVtbl->OnContentUpdated(This,viewport,content);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationManager2 interface
+ */
+#ifndef __IDirectManipulationManager2_INTERFACE_DEFINED__
+#define __IDirectManipulationManager2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationManager2, 0xfa1005e9, 0x3d16, 0x484c, 0xbf,0xc9, 0x62,0xb6,0x1e,0x56,0xec,0x4e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("fa1005e9-3d16-484c-bfc9-62b61e56ec4e")
+IDirectManipulationManager2 : public IDirectManipulationManager
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateBehavior(
+        REFCLSID clsid,
+        REFIID riid,
+        void **obj) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationManager2, 0xfa1005e9, 0x3d16, 0x484c, 0xbf,0xc9, 0x62,0xb6,0x1e,0x56,0xec,0x4e)
+#endif
+#else
+typedef struct IDirectManipulationManager2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationManager2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationManager2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationManager2 *This);
+
+    /*** IDirectManipulationManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *Activate)(
+        IDirectManipulationManager2 *This,
+        HWND window);
+
+    HRESULT (STDMETHODCALLTYPE *Deactivate)(
+        IDirectManipulationManager2 *This,
+        HWND window);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterHitTestTarget)(
+        IDirectManipulationManager2 *This,
+        HWND window,
+        HWND hittest,
+        DIRECTMANIPULATION_HITTEST_TYPE type);
+
+    HRESULT (STDMETHODCALLTYPE *ProcessInput)(
+        IDirectManipulationManager2 *This,
+        const MSG *msg,
+        WINBOOL *handled);
+
+    HRESULT (STDMETHODCALLTYPE *GetUpdateManager)(
+        IDirectManipulationManager2 *This,
+        REFIID riid,
+        void **obj);
+
+    HRESULT (STDMETHODCALLTYPE *CreateViewport)(
+        IDirectManipulationManager2 *This,
+        IDirectManipulationFrameInfoProvider *frame,
+        HWND window,
+        REFIID riid,
+        void **obj);
+
+    HRESULT (STDMETHODCALLTYPE *CreateContent)(
+        IDirectManipulationManager2 *This,
+        IDirectManipulationFrameInfoProvider *frame,
+        REFCLSID clsid,
+        REFIID riid,
+        void **obj);
+
+    /*** IDirectManipulationManager2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateBehavior)(
+        IDirectManipulationManager2 *This,
+        REFCLSID clsid,
+        REFIID riid,
+        void **obj);
+
+    END_INTERFACE
+} IDirectManipulationManager2Vtbl;
+
+interface IDirectManipulationManager2 {
+    CONST_VTBL IDirectManipulationManager2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationManager2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationManager methods ***/
+#define IDirectManipulationManager2_Activate(This,window) (This)->lpVtbl->Activate(This,window)
+#define IDirectManipulationManager2_Deactivate(This,window) (This)->lpVtbl->Deactivate(This,window)
+#define IDirectManipulationManager2_RegisterHitTestTarget(This,window,hittest,type) (This)->lpVtbl->RegisterHitTestTarget(This,window,hittest,type)
+#define IDirectManipulationManager2_ProcessInput(This,msg,handled) (This)->lpVtbl->ProcessInput(This,msg,handled)
+#define IDirectManipulationManager2_GetUpdateManager(This,riid,obj) (This)->lpVtbl->GetUpdateManager(This,riid,obj)
+#define IDirectManipulationManager2_CreateViewport(This,frame,window,riid,obj) (This)->lpVtbl->CreateViewport(This,frame,window,riid,obj)
+#define IDirectManipulationManager2_CreateContent(This,frame,clsid,riid,obj) (This)->lpVtbl->CreateContent(This,frame,clsid,riid,obj)
+/*** IDirectManipulationManager2 methods ***/
+#define IDirectManipulationManager2_CreateBehavior(This,clsid,riid,obj) (This)->lpVtbl->CreateBehavior(This,clsid,riid,obj)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationManager2_QueryInterface(IDirectManipulationManager2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationManager2_AddRef(IDirectManipulationManager2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationManager2_Release(IDirectManipulationManager2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationManager methods ***/
+static FORCEINLINE HRESULT IDirectManipulationManager2_Activate(IDirectManipulationManager2* This,HWND window) {
+    return This->lpVtbl->Activate(This,window);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager2_Deactivate(IDirectManipulationManager2* This,HWND window) {
+    return This->lpVtbl->Deactivate(This,window);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager2_RegisterHitTestTarget(IDirectManipulationManager2* This,HWND window,HWND hittest,DIRECTMANIPULATION_HITTEST_TYPE type) {
+    return This->lpVtbl->RegisterHitTestTarget(This,window,hittest,type);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager2_ProcessInput(IDirectManipulationManager2* This,const MSG *msg,WINBOOL *handled) {
+    return This->lpVtbl->ProcessInput(This,msg,handled);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager2_GetUpdateManager(IDirectManipulationManager2* This,REFIID riid,void **obj) {
+    return This->lpVtbl->GetUpdateManager(This,riid,obj);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager2_CreateViewport(IDirectManipulationManager2* This,IDirectManipulationFrameInfoProvider *frame,HWND window,REFIID riid,void **obj) {
+    return This->lpVtbl->CreateViewport(This,frame,window,riid,obj);
+}
+static FORCEINLINE HRESULT IDirectManipulationManager2_CreateContent(IDirectManipulationManager2* This,IDirectManipulationFrameInfoProvider *frame,REFCLSID clsid,REFIID riid,void **obj) {
+    return This->lpVtbl->CreateContent(This,frame,clsid,riid,obj);
+}
+/*** IDirectManipulationManager2 methods ***/
+static FORCEINLINE HRESULT IDirectManipulationManager2_CreateBehavior(IDirectManipulationManager2* This,REFCLSID clsid,REFIID riid,void **obj) {
+    return This->lpVtbl->CreateBehavior(This,clsid,riid,obj);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationManager2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationPrimaryContent interface
+ */
+#ifndef __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__
+#define __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationPrimaryContent, 0xc12851e4, 0x1698, 0x4625, 0xb9,0xb1, 0x7c,0xa3,0xec,0x18,0x63,0x0b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c12851e4-1698-4625-b9b1-7ca3ec18630b")
+IDirectManipulationPrimaryContent : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetSnapInterval(
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        float interval,
+        float offset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSnapPoints(
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        const float *points,
+        DWORD count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSnapType(
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        DIRECTMANIPULATION_SNAPPOINT_TYPE type) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSnapCoordinate(
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
+        float origin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetZoomBoundaries(
+        float minimum,
+        float maximum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetHorizontalAlignment(
+        DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetVerticalAlignment(
+        DIRECTMANIPULATION_VERTICALALIGNMENT alignment) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInertiaEndTransform(
+        float *matrix,
+        DWORD count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCenterPoint(
+        float *x,
+        float *y) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationPrimaryContent, 0xc12851e4, 0x1698, 0x4625, 0xb9,0xb1, 0x7c,0xa3,0xec,0x18,0x63,0x0b)
+#endif
+#else
+typedef struct IDirectManipulationPrimaryContentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationPrimaryContent *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationPrimaryContent *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationPrimaryContent *This);
+
+    /*** IDirectManipulationPrimaryContent methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetSnapInterval)(
+        IDirectManipulationPrimaryContent *This,
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        float interval,
+        float offset);
+
+    HRESULT (STDMETHODCALLTYPE *SetSnapPoints)(
+        IDirectManipulationPrimaryContent *This,
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        const float *points,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *SetSnapType)(
+        IDirectManipulationPrimaryContent *This,
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        DIRECTMANIPULATION_SNAPPOINT_TYPE type);
+
+    HRESULT (STDMETHODCALLTYPE *SetSnapCoordinate)(
+        IDirectManipulationPrimaryContent *This,
+        DIRECTMANIPULATION_MOTION_TYPES motion,
+        DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
+        float origin);
+
+    HRESULT (STDMETHODCALLTYPE *SetZoomBoundaries)(
+        IDirectManipulationPrimaryContent *This,
+        float minimum,
+        float maximum);
+
+    HRESULT (STDMETHODCALLTYPE *SetHorizontalAlignment)(
+        IDirectManipulationPrimaryContent *This,
+        DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *SetVerticalAlignment)(
+        IDirectManipulationPrimaryContent *This,
+        DIRECTMANIPULATION_VERTICALALIGNMENT alignment);
+
+    HRESULT (STDMETHODCALLTYPE *GetInertiaEndTransform)(
+        IDirectManipulationPrimaryContent *This,
+        float *matrix,
+        DWORD count);
+
+    HRESULT (STDMETHODCALLTYPE *GetCenterPoint)(
+        IDirectManipulationPrimaryContent *This,
+        float *x,
+        float *y);
+
+    END_INTERFACE
+} IDirectManipulationPrimaryContentVtbl;
+
+interface IDirectManipulationPrimaryContent {
+    CONST_VTBL IDirectManipulationPrimaryContentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationPrimaryContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationPrimaryContent_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationPrimaryContent_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationPrimaryContent methods ***/
+#define IDirectManipulationPrimaryContent_SetSnapInterval(This,motion,interval,offset) (This)->lpVtbl->SetSnapInterval(This,motion,interval,offset)
+#define IDirectManipulationPrimaryContent_SetSnapPoints(This,motion,points,count) (This)->lpVtbl->SetSnapPoints(This,motion,points,count)
+#define IDirectManipulationPrimaryContent_SetSnapType(This,motion,type) (This)->lpVtbl->SetSnapType(This,motion,type)
+#define IDirectManipulationPrimaryContent_SetSnapCoordinate(This,motion,coordinate,origin) (This)->lpVtbl->SetSnapCoordinate(This,motion,coordinate,origin)
+#define IDirectManipulationPrimaryContent_SetZoomBoundaries(This,minimum,maximum) (This)->lpVtbl->SetZoomBoundaries(This,minimum,maximum)
+#define IDirectManipulationPrimaryContent_SetHorizontalAlignment(This,alignment) (This)->lpVtbl->SetHorizontalAlignment(This,alignment)
+#define IDirectManipulationPrimaryContent_SetVerticalAlignment(This,alignment) (This)->lpVtbl->SetVerticalAlignment(This,alignment)
+#define IDirectManipulationPrimaryContent_GetInertiaEndTransform(This,matrix,count) (This)->lpVtbl->GetInertiaEndTransform(This,matrix,count)
+#define IDirectManipulationPrimaryContent_GetCenterPoint(This,x,y) (This)->lpVtbl->GetCenterPoint(This,x,y)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_QueryInterface(IDirectManipulationPrimaryContent* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationPrimaryContent_AddRef(IDirectManipulationPrimaryContent* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationPrimaryContent_Release(IDirectManipulationPrimaryContent* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationPrimaryContent methods ***/
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapInterval(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,float interval,float offset) {
+    return This->lpVtbl->SetSnapInterval(This,motion,interval,offset);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapPoints(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,const float *points,DWORD count) {
+    return This->lpVtbl->SetSnapPoints(This,motion,points,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapType(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,DIRECTMANIPULATION_SNAPPOINT_TYPE type) {
+    return This->lpVtbl->SetSnapType(This,motion,type);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapCoordinate(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,float origin) {
+    return This->lpVtbl->SetSnapCoordinate(This,motion,coordinate,origin);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetZoomBoundaries(IDirectManipulationPrimaryContent* This,float minimum,float maximum) {
+    return This->lpVtbl->SetZoomBoundaries(This,minimum,maximum);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetHorizontalAlignment(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment) {
+    return This->lpVtbl->SetHorizontalAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetVerticalAlignment(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_VERTICALALIGNMENT alignment) {
+    return This->lpVtbl->SetVerticalAlignment(This,alignment);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_GetInertiaEndTransform(IDirectManipulationPrimaryContent* This,float *matrix,DWORD count) {
+    return This->lpVtbl->GetInertiaEndTransform(This,matrix,count);
+}
+static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_GetCenterPoint(IDirectManipulationPrimaryContent* This,float *x,float *y) {
+    return This->lpVtbl->GetCenterPoint(This,x,y);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDirectManipulationCompositor2 interface
+ */
+#ifndef __IDirectManipulationCompositor2_INTERFACE_DEFINED__
+#define __IDirectManipulationCompositor2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDirectManipulationCompositor2, 0xd38c7822, 0xf1cb, 0x43cb, 0xb4,0xb9, 0xac,0x0c,0x76,0x7a,0x41,0x2e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d38c7822-f1cb-43cb-b4b9-ac0c767a412e")
+IDirectManipulationCompositor2 : public IDirectManipulationCompositor
+{
+    virtual HRESULT STDMETHODCALLTYPE AddContentWithCrossProcessChaining(
+        IDirectManipulationPrimaryContent *content,
+        IUnknown *device,
+        IUnknown *parentVisual,
+        IUnknown *childVisual) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDirectManipulationCompositor2, 0xd38c7822, 0xf1cb, 0x43cb, 0xb4,0xb9, 0xac,0x0c,0x76,0x7a,0x41,0x2e)
+#endif
+#else
+typedef struct IDirectManipulationCompositor2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDirectManipulationCompositor2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDirectManipulationCompositor2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDirectManipulationCompositor2 *This);
+
+    /*** IDirectManipulationCompositor methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddContent)(
+        IDirectManipulationCompositor2 *This,
+        IDirectManipulationContent *content,
+        IUnknown *device,
+        IUnknown *parent,
+        IUnknown *child);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
+        IDirectManipulationCompositor2 *This,
+        IDirectManipulationContent *content);
+
+    HRESULT (STDMETHODCALLTYPE *SetUpdateManager)(
+        IDirectManipulationCompositor2 *This,
+        IDirectManipulationUpdateManager *manager);
+
+    HRESULT (STDMETHODCALLTYPE *Flush)(
+        IDirectManipulationCompositor2 *This);
+
+    /*** IDirectManipulationCompositor2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddContentWithCrossProcessChaining)(
+        IDirectManipulationCompositor2 *This,
+        IDirectManipulationPrimaryContent *content,
+        IUnknown *device,
+        IUnknown *parentVisual,
+        IUnknown *childVisual);
+
+    END_INTERFACE
+} IDirectManipulationCompositor2Vtbl;
+
+interface IDirectManipulationCompositor2 {
+    CONST_VTBL IDirectManipulationCompositor2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDirectManipulationCompositor2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDirectManipulationCompositor2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDirectManipulationCompositor2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDirectManipulationCompositor methods ***/
+#define IDirectManipulationCompositor2_AddContent(This,content,device,parent,child) (This)->lpVtbl->AddContent(This,content,device,parent,child)
+#define IDirectManipulationCompositor2_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
+#define IDirectManipulationCompositor2_SetUpdateManager(This,manager) (This)->lpVtbl->SetUpdateManager(This,manager)
+#define IDirectManipulationCompositor2_Flush(This) (This)->lpVtbl->Flush(This)
+/*** IDirectManipulationCompositor2 methods ***/
+#define IDirectManipulationCompositor2_AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual) (This)->lpVtbl->AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDirectManipulationCompositor2_QueryInterface(IDirectManipulationCompositor2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDirectManipulationCompositor2_AddRef(IDirectManipulationCompositor2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDirectManipulationCompositor2_Release(IDirectManipulationCompositor2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDirectManipulationCompositor methods ***/
+static FORCEINLINE HRESULT IDirectManipulationCompositor2_AddContent(IDirectManipulationCompositor2* This,IDirectManipulationContent *content,IUnknown *device,IUnknown *parent,IUnknown *child) {
+    return This->lpVtbl->AddContent(This,content,device,parent,child);
+}
+static FORCEINLINE HRESULT IDirectManipulationCompositor2_RemoveContent(IDirectManipulationCompositor2* This,IDirectManipulationContent *content) {
+    return This->lpVtbl->RemoveContent(This,content);
+}
+static FORCEINLINE HRESULT IDirectManipulationCompositor2_SetUpdateManager(IDirectManipulationCompositor2* This,IDirectManipulationUpdateManager *manager) {
+    return This->lpVtbl->SetUpdateManager(This,manager);
+}
+static FORCEINLINE HRESULT IDirectManipulationCompositor2_Flush(IDirectManipulationCompositor2* This) {
+    return This->lpVtbl->Flush(This);
+}
+/*** IDirectManipulationCompositor2 methods ***/
+static FORCEINLINE HRESULT IDirectManipulationCompositor2_AddContentWithCrossProcessChaining(IDirectManipulationCompositor2* This,IDirectManipulationPrimaryContent *content,IUnknown *device,IUnknown *parentVisual,IUnknown *childVisual) {
+    return This->lpVtbl->AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDirectManipulationCompositor2_INTERFACE_DEFINED__ */
+
+#ifndef __DirectManipulation_LIBRARY_DEFINED__
+#define __DirectManipulation_LIBRARY_DEFINED__
+
+DEFINE_GUID(LIBID_DirectManipulation, 0x9fbedf98, 0xf6d8, 0x4e3b, 0xb4,0x88, 0xfa,0x66,0xdb,0xf5,0xe9,0xf3);
+
+/*****************************************************************************
+ * DirectManipulationManager coclass
+ */
+
+DEFINE_GUID(CLSID_DirectManipulationManager, 0x54e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("54e211b6-3650-4f75-8334-fa359598e1c5") DirectManipulationManager;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DirectManipulationManager, 0x54e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5)
+#endif
+#endif
+
+/*****************************************************************************
+ * DirectManipulationSharedManager coclass
+ */
+
+DEFINE_GUID(CLSID_DirectManipulationSharedManager, 0x99793286, 0x77cc, 0x4b57, 0x96,0xdb, 0x3b,0x35,0x4f,0x6f,0x9f,0xb5);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("99793286-77cc-4b57-96db-3b354f6f9fb5") DirectManipulationSharedManager;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DirectManipulationSharedManager, 0x99793286, 0x77cc, 0x4b57, 0x96,0xdb, 0x3b,0x35,0x4f,0x6f,0x9f,0xb5)
+#endif
+#endif
+
+/*****************************************************************************
+ * DCompManipulationCompositor coclass
+ */
+
+DEFINE_GUID(CLSID_DCompManipulationCompositor, 0x79dea627, 0xa08a, 0x43ac, 0x8e,0xf5, 0x69,0x00,0xb9,0x29,0x91,0x26);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("79dea627-a08a-43ac-8ef5-6900b9299126") DCompManipulationCompositor;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DCompManipulationCompositor, 0x79dea627, 0xa08a, 0x43ac, 0x8e,0xf5, 0x69,0x00,0xb9,0x29,0x91,0x26)
+#endif
+#endif
+
+/*****************************************************************************
+ * DirectManipulationViewport coclass
+ */
+
+DEFINE_GUID(CLSID_DirectManipulationViewport, 0x34e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("34e211b6-3650-4f75-8334-fa359598e1c5") DirectManipulationViewport;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DirectManipulationViewport, 0x34e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5)
+#endif
+#endif
+
+#endif /* __DirectManipulation_LIBRARY_DEFINED__ */
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __directmanipulation_h__ */
diff --git a/mingw-w64-headers/include/directmanipulation.idl b/mingw-w64-headers/include/directmanipulation.idl
new file mode 100644
index 0000000..f8bd55c
--- /dev/null
+++ b/mingw-w64-headers/include/directmanipulation.idl
@@ -0,0 +1,429 @@
+/*
+ * Copyright 2019 Alistair Leslie-Hughes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+cpp_quote("#if 0")
+typedef void* HWND;
+cpp_quote("#endif")
+
+interface IDirectManipulationViewportEventHandler;
+
+typedef enum DIRECTMANIPULATION_HITTEST_TYPE
+{
+    DIRECTMANIPULATION_HITTEST_TYPE_ASYNCHRONOUS     = 0x00000000,
+    DIRECTMANIPULATION_HITTEST_TYPE_SYNCHRONOUS      = 0x00000001,
+    DIRECTMANIPULATION_HITTEST_TYPE_AUTO_SYNCHRONOUS = 0x00000002
+} DIRECTMANIPULATION_HITTEST_TYPE;
+
+typedef enum DIRECTMANIPULATION_STATUS
+{
+    DIRECTMANIPULATION_BUILDING,
+    DIRECTMANIPULATION_ENABLED,
+    DIRECTMANIPULATION_DISABLED,
+    DIRECTMANIPULATION_RUNNING,
+    DIRECTMANIPULATION_INERTIA,
+    DIRECTMANIPULATION_READY,
+    DIRECTMANIPULATION_SUSPENDED
+} DIRECTMANIPULATION_STATUS;
+
+typedef enum DIRECTMANIPULATION_VIEWPORT_OPTIONS
+{
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DEFAULT              = 0x00000000,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_AUTODISABLE          = 0x00000001,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_MANUALUPDATE         = 0x00000002,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_INPUT                = 0x00000004,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_EXPLICITHITTEST      = 0x00000008,
+    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DISABLEPIXELSNAPPING = 0x00000010,
+} DIRECTMANIPULATION_VIEWPORT_OPTIONS;
+
+typedef enum DIRECTMANIPULATION_CONFIGURATION
+{
+    DIRECTMANIPULATION_CONFIGURATION_NONE                = 0x00000000,
+    DIRECTMANIPULATION_CONFIGURATION_INTERACTION         = 0x00000001,
+    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_X       = 0x00000002,
+    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_Y       = 0x00000004,
+    DIRECTMANIPULATION_CONFIGURATION_SCALING             = 0x00000010,
+    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_INERTIA = 0x00000020,
+    DIRECTMANIPULATION_CONFIGURATION_SCALING_INERTIA     = 0x00000080,
+    DIRECTMANIPULATION_CONFIGURATION_RAILS_X             = 0x00000100,
+    DIRECTMANIPULATION_CONFIGURATION_RAILS_Y             = 0x00000200,
+} DIRECTMANIPULATION_CONFIGURATION;
+
+typedef enum DIRECTMANIPULATION_GESTURE_CONFIGURATION
+{
+    DIRECTMANIPULATION_GESTURE_NONE                   = 0x00000000,
+    DIRECTMANIPULATION_GESTURE_DEFAULT                = 0x00000000,
+    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_VERTICAL   = 0x00000008,
+    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_HORIZONTAL = 0x00000010,
+    DIRECTMANIPULATION_GESTURE_PINCH_ZOOM             = 0x00000020,
+} DIRECTMANIPULATION_GESTURE_CONFIGURATION;
+
+typedef enum DIRECTMANIPULATION_MOTION_TYPES
+{
+    DIRECTMANIPULATION_MOTION_NONE       = 0x00000000,
+    DIRECTMANIPULATION_MOTION_TRANSLATEX = 0x00000001,
+    DIRECTMANIPULATION_MOTION_TRANSLATEY = 0x00000002,
+    DIRECTMANIPULATION_MOTION_ZOOM       = 0x00000004,
+    DIRECTMANIPULATION_MOTION_CENTERX    = 0x00000010,
+    DIRECTMANIPULATION_MOTION_CENTERY    = 0x00000020,
+    DIRECTMANIPULATION_MOTION_ALL        = DIRECTMANIPULATION_MOTION_TRANSLATEX | DIRECTMANIPULATION_MOTION_TRANSLATEY |
+                                           DIRECTMANIPULATION_MOTION_ZOOM | DIRECTMANIPULATION_MOTION_CENTERX |
+                                           DIRECTMANIPULATION_MOTION_CENTERY
+} DIRECTMANIPULATION_MOTION_TYPES;
+
+typedef enum DIRECTMANIPULATION_SNAPPOINT_TYPE
+{
+    DIRECTMANIPULATION_SNAPPOINT_MANDATORY,
+    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL,
+    DIRECTMANIPULATION_SNAPPOINT_MANDATORY_SINGLE,
+    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL_SINGLE
+} DIRECTMANIPULATION_SNAPPOINT_TYPE;
+
+typedef enum DIRECTMANIPULATION_SNAPPOINT_COORDINATE
+{
+    DIRECTMANIPULATION_COORDINATE_BOUNDARY  = 0x00000000,
+    DIRECTMANIPULATION_COORDINATE_ORIGIN    = 0x00000001,
+    DIRECTMANIPULATION_COORDINATE_MIRRORED  = 0x00000010
+} DIRECTMANIPULATION_SNAPPOINT_COORDINATE;
+
+typedef enum DIRECTMANIPULATION_HORIZONTALALIGNMENT
+{
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_NONE         = 0x00000000,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_LEFT         = 0x00000001,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_CENTER       = 0x00000002,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_RIGHT        = 0x00000004,
+    DIRECTMANIPULATION_HORIZONTALALIGNMENT_UNLOCKCENTER = 0x00000008
+} DIRECTMANIPULATION_HORIZONTALALIGNMENT;
+
+typedef enum DIRECTMANIPULATION_VERTICALALIGNMENT
+{
+    DIRECTMANIPULATION_VERTICALALIGNMENT_NONE         = 0x00000000,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_TOP          = 0x00000001,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_CENTER       = 0x00000002,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_BOTTOM       = 0x00000004,
+    DIRECTMANIPULATION_VERTICALALIGNMENT_UNLOCKCENTER = 0x00000008
+} DIRECTMANIPULATION_VERTICALALIGNMENT;
+
+typedef enum DIRECTMANIPULATION_INPUT_MODE
+{
+    DIRECTMANIPULATION_INPUT_MODE_AUTOMATIC,
+    DIRECTMANIPULATION_INPUT_MODE_MANUAL
+} DIRECTMANIPULATION_INPUT_MODE;
+
+[
+    local,
+    object,
+    uuid(fb759dba-6f4c-4c01-874e-19c8a05907f9),
+    pointer_default(unique)
+]
+interface IDirectManipulationFrameInfoProvider : IUnknown
+{
+    HRESULT GetNextFrameInfo([out] ULONGLONG *time, [out] ULONGLONG *process, [out] ULONGLONG *composition);
+}
+
+[
+    local,
+    object,
+    uuid(fbf5d3b4-70c7-4163-9322-5a6f660d6fbc),
+    pointer_default(unique)
+]
+interface IDirectManipulationManager : IUnknown
+{
+    HRESULT Activate([in] HWND window);
+
+    HRESULT Deactivate([in] HWND window);
+
+    HRESULT RegisterHitTestTarget([in] HWND window, [in] HWND hittest, [in] DIRECTMANIPULATION_HITTEST_TYPE type);
+
+    HRESULT ProcessInput([in] const MSG *msg, [out, retval] BOOL *handled);
+
+    HRESULT GetUpdateManager([in] REFIID riid, [out, iid_is(riid), retval,] void **obj);
+
+    HRESULT CreateViewport([in] IDirectManipulationFrameInfoProvider *frame, [in] HWND window,
+                           [in] REFIID riid, [out, iid_is(riid), retval] void **obj);
+
+    HRESULT CreateContent([in] IDirectManipulationFrameInfoProvider *frame, [in] REFCLSID clsid,
+                          [in] REFIID riid, [out, iid_is(riid), retval] void **obj);
+}
+
+[
+    local,
+    object,
+    uuid(b89962cb-3d89-442b-bb58-5098fa0f9f16),
+    pointer_default(unique)
+]
+interface IDirectManipulationContent : IUnknown
+{
+    HRESULT GetContentRect([out] RECT *size);
+
+    HRESULT SetContentRect([in] const RECT *size);
+
+    HRESULT GetViewport([in] REFIID riid, [out, iid_is(riid)] void **object);
+
+    HRESULT GetTag([in] REFIID riid, [out, iid_is(riid)] void **object, [out] UINT32 *id);
+
+    HRESULT SetTag([in, unique] IUnknown *object, [in] UINT32 id);
+
+    HRESULT GetOutputTransform([out] float *matrix, [in] DWORD count);
+
+    HRESULT GetContentTransform([out] float *matrix, [in] DWORD count);
+
+    HRESULT SyncContentTransform([in] const float *matrix, [in] DWORD count);
+}
+
+[
+    local,
+    object,
+    uuid(790b6337-64f8-4ff5-a269-b32bc2af27a7),
+    pointer_default(unique)
+]
+interface IDirectManipulationUpdateHandler : IUnknown
+{
+    HRESULT Update();
+}
+
+[
+    local,
+    object,
+    uuid(b0ae62fd-be34-46e7-9caa-d361facbb9cc),
+    pointer_default(unique)
+]
+interface IDirectManipulationUpdateManager : IUnknown
+{
+    HRESULT RegisterWaitHandleCallback([in] HANDLE handle, [in] IDirectManipulationUpdateHandler *handler,
+                                       [out] DWORD *cookie);
+
+    HRESULT UnregisterWaitHandleCallback([in] DWORD cookie);
+
+    HRESULT Update([in] IDirectManipulationFrameInfoProvider *provider);
+}
+
+[
+    local,
+    object,
+    uuid(537a0825-0387-4efa-b62f-71eb1f085a7e),
+    pointer_default(unique)
+]
+interface IDirectManipulationCompositor : IUnknown
+{
+    HRESULT AddContent([in] IDirectManipulationContent *content, [in] IUnknown *device,
+                       [in] IUnknown *parent, [in] IUnknown *child);
+
+    HRESULT RemoveContent([in] IDirectManipulationContent *content);
+
+    HRESULT SetUpdateManager([in] IDirectManipulationUpdateManager *manager);
+
+    HRESULT Flush();
+}
+
+[
+    local,
+    object,
+    uuid(28b85a3d-60a0-48bd-9ba1-5ce8d9ea3a6d),
+    pointer_default(unique)
+]
+interface IDirectManipulationViewport : IUnknown
+{
+    HRESULT Enable();
+
+    HRESULT Disable();
+
+    HRESULT SetContact([in] UINT32 id);
+
+    HRESULT ReleaseContact([in] UINT32 id);
+
+    HRESULT ReleaseAllContacts();
+
+    HRESULT GetStatus([out] DIRECTMANIPULATION_STATUS *status);
+
+    HRESULT GetTag([in] REFIID riid, [out, iid_is(riid)] void **object, [out] UINT32 *id);
+
+    HRESULT SetTag([in, unique] IUnknown *object, [in] UINT32 id);
+
+    HRESULT GetViewportRect([out, retval] RECT *viewport);
+
+    HRESULT SetViewportRect([in] const RECT *viewport);
+
+    HRESULT ZoomToRect([in] const float left, [in] const float top, [in] const float right,
+                        [in] const float bottom, [in] BOOL animate);
+
+    HRESULT SetViewportTransform([in] const float *matrix, [in] DWORD count);
+
+    HRESULT SyncDisplayTransform([in] const float *matrix, [in] DWORD count);
+
+    HRESULT GetPrimaryContent([in] REFIID riid, [out, iid_is(riid)] void **object);
+
+    HRESULT AddContent([in, unique] IDirectManipulationContent *content);
+
+    HRESULT RemoveContent([in, unique] IDirectManipulationContent *content);
+
+    HRESULT SetViewportOptions([in] DIRECTMANIPULATION_VIEWPORT_OPTIONS options);
+
+    HRESULT AddConfiguration([in] DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT RemoveConfiguration([in] DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT ActivateConfiguration([in] DIRECTMANIPULATION_CONFIGURATION configuration);
+
+    HRESULT SetManualGesture([in] DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);
+
+    HRESULT SetChaining([in] DIRECTMANIPULATION_MOTION_TYPES enabledTypes);
+
+    HRESULT AddEventHandler([in] HWND window, [in] IDirectManipulationViewportEventHandler *eventHandler,
+                        [out, retval] DWORD *cookie);
+
+    HRESULT RemoveEventHandler([in] DWORD cookie);
+
+    HRESULT SetInputMode([in] DIRECTMANIPULATION_INPUT_MODE mode);
+
+    HRESULT SetUpdateMode([in] DIRECTMANIPULATION_INPUT_MODE mode);
+
+    HRESULT Stop();
+
+    HRESULT Abandon();
+}
+
+[
+    local,
+    object,
+    uuid(923ccaac-61e1-4385-b726-017af189882a),
+    pointer_default(unique)
+]
+interface IDirectManipulationViewport2 : IDirectManipulationViewport
+{
+    HRESULT AddBehavior([in] IUnknown *behavior, [out, retval] DWORD *cookie);
+
+    HRESULT RemoveBehavior([in] DWORD cookie);
+
+    HRESULT RemoveAllBehaviors();
+}
+
+[
+    local,
+    object,
+    uuid(952121DA-D69F-45F9-B0F9-F23944321A6D),
+    pointer_default(unique)
+]
+interface IDirectManipulationViewportEventHandler : IUnknown
+{
+    HRESULT OnViewportStatusChanged([in] IDirectManipulationViewport *viewport, [in] DIRECTMANIPULATION_STATUS current,
+                                    [in] DIRECTMANIPULATION_STATUS previous);
+
+    HRESULT OnViewportUpdated([in] IDirectManipulationViewport *viewport);
+
+    HRESULT OnContentUpdated([in] IDirectManipulationViewport *viewport, [in] IDirectManipulationContent *content);
+}
+
+[
+    local,
+    object,
+    uuid(fa1005e9-3d16-484c-bfc9-62b61e56ec4e),
+    pointer_default(unique)
+]
+interface IDirectManipulationManager2 : IDirectManipulationManager
+{
+    HRESULT CreateBehavior([in] REFCLSID clsid, [in] REFIID riid, [out, iid_is(riid), retval] void **obj);
+}
+
+[
+    local,
+    object,
+    uuid(c12851e4-1698-4625-b9b1-7ca3ec18630b),
+    pointer_default(unique)
+]
+interface IDirectManipulationPrimaryContent : IUnknown
+{
+    HRESULT SetSnapInterval([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] float interval, [in] float offset);
+
+    HRESULT SetSnapPoints([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] const float *points, [in] DWORD count);
+
+    HRESULT SetSnapType([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] DIRECTMANIPULATION_SNAPPOINT_TYPE type);
+
+    HRESULT SetSnapCoordinate([in] DIRECTMANIPULATION_MOTION_TYPES motion, [in] DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
+                              [in] float origin);
+
+    HRESULT SetZoomBoundaries([in] float minimum, [in] float maximum);
+
+    HRESULT SetHorizontalAlignment([in] DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment);
+
+    HRESULT SetVerticalAlignment([in] DIRECTMANIPULATION_VERTICALALIGNMENT alignment);
+
+    HRESULT GetInertiaEndTransform([out] float *matrix, [in] DWORD count);
+
+    HRESULT GetCenterPoint([out] float *x, [out] float *y);
+}
+
+[
+    local,
+    object,
+    uuid(d38c7822-f1cb-43cb-b4b9-ac0c767a412e),
+    pointer_default(unique)
+]
+interface IDirectManipulationCompositor2 : IDirectManipulationCompositor
+{
+    HRESULT AddContentWithCrossProcessChaining([in] IDirectManipulationPrimaryContent *content, [in] IUnknown *device,
+                                               [in] IUnknown *parentVisual, [in] IUnknown *childVisual);
+}
+
+[
+    uuid(9fbedf98-f6d8-4e3b-b488-fa66dbf5e9f3),
+    version(1.0)
+]
+library DirectManipulation
+{
+    [
+        uuid(54e211b6-3650-4f75-8334-fa359598e1c5)
+    ]
+    coclass DirectManipulationManager
+    {
+        interface IDirectManipulationManager2;
+        [default] interface IDirectManipulationManager;
+    }
+
+    [
+        uuid(99793286-77cc-4b57-96db-3b354f6f9fb5)
+    ]
+    coclass DirectManipulationSharedManager
+    {
+        interface IDirectManipulationManager2;
+        [default] interface IDirectManipulationManager;
+    }
+
+    [
+        uuid(79dea627-a08a-43ac-8ef5-6900b9299126)
+    ]
+    coclass DCompManipulationCompositor
+    {
+        [default] interface IDirectManipulationCompositor;
+        interface IDirectManipulationCompositor2;
+        interface IDirectManipulationFrameInfoProvider;
+    }
+
+    [
+        noncreatable,
+        hidden,
+        uuid(34e211b6-3650-4f75-8334-fa359598e1c5)
+    ]
+    coclass DirectManipulationViewport
+    {
+        interface IDirectManipulationViewport2;
+        [default] interface IDirectManipulationViewport;
+    }
+}
diff --git a/mingw-w64-headers/include/dxva2api.h b/mingw-w64-headers/include/dxva2api.h
index 0f5e003..253a917 100644
--- a/mingw-w64-headers/include/dxva2api.h
+++ b/mingw-w64-headers/include/dxva2api.h
@@ -1348,7 +1348,7 @@
         const DXVA2_VideoProcessBltParams *pBltParams,
         const DXVA2_VideoSample *pSamples,
         UINT NumSamples,
-        HANDLE *pHandleCompleteIDirect3DDeviceManager9) = 0;
+        HANDLE *pHandleComplete) = 0;
 
 };
 #ifdef __CRT_UUID_DECL
@@ -1402,7 +1402,7 @@
         const DXVA2_VideoProcessBltParams *pBltParams,
         const DXVA2_VideoSample *pSamples,
         UINT NumSamples,
-        HANDLE *pHandleCompleteIDirect3DDeviceManager9);
+        HANDLE *pHandleComplete);
 
     END_INTERFACE
 } IDirectXVideoProcessorVtbl;
@@ -1423,7 +1423,7 @@
 #define IDirectXVideoProcessor_GetVideoProcessorCaps(This,pCaps) (This)->lpVtbl->GetVideoProcessorCaps(This,pCaps)
 #define IDirectXVideoProcessor_GetProcAmpRange(This,ProcAmpCap,pRange) (This)->lpVtbl->GetProcAmpRange(This,ProcAmpCap,pRange)
 #define IDirectXVideoProcessor_GetFilterPropertyRange(This,FilterSetting,pRange) (This)->lpVtbl->GetFilterPropertyRange(This,FilterSetting,pRange)
-#define IDirectXVideoProcessor_VideoProcessBlt(This,pRenderTarget,pBltParams,pSamples,NumSamples,pHandleCompleteIDirect3DDeviceManager9) (This)->lpVtbl->VideoProcessBlt(This,pRenderTarget,pBltParams,pSamples,NumSamples,pHandleCompleteIDirect3DDeviceManager9)
+#define IDirectXVideoProcessor_VideoProcessBlt(This,pRenderTarget,pBltParams,pSamples,NumSamples,pHandleComplete) (This)->lpVtbl->VideoProcessBlt(This,pRenderTarget,pBltParams,pSamples,NumSamples,pHandleComplete)
 #else
 /*** IUnknown methods ***/
 static FORCEINLINE HRESULT IDirectXVideoProcessor_QueryInterface(IDirectXVideoProcessor* This,REFIID riid,void **ppvObject) {
@@ -1451,8 +1451,8 @@
 static FORCEINLINE HRESULT IDirectXVideoProcessor_GetFilterPropertyRange(IDirectXVideoProcessor* This,UINT FilterSetting,DXVA2_ValueRange *pRange) {
     return This->lpVtbl->GetFilterPropertyRange(This,FilterSetting,pRange);
 }
-static FORCEINLINE HRESULT IDirectXVideoProcessor_VideoProcessBlt(IDirectXVideoProcessor* This,IDirect3DSurface9 *pRenderTarget,const DXVA2_VideoProcessBltParams *pBltParams,const DXVA2_VideoSample *pSamples,UINT NumSamples,HANDLE *pHandleCompleteIDirect3DDeviceManager9) {
-    return This->lpVtbl->VideoProcessBlt(This,pRenderTarget,pBltParams,pSamples,NumSamples,pHandleCompleteIDirect3DDeviceManager9);
+static FORCEINLINE HRESULT IDirectXVideoProcessor_VideoProcessBlt(IDirectXVideoProcessor* This,IDirect3DSurface9 *pRenderTarget,const DXVA2_VideoProcessBltParams *pBltParams,const DXVA2_VideoSample *pSamples,UINT NumSamples,HANDLE *pHandleComplete) {
+    return This->lpVtbl->VideoProcessBlt(This,pRenderTarget,pBltParams,pSamples,NumSamples,pHandleComplete);
 }
 #endif
 #endif
diff --git a/mingw-w64-headers/include/dxva2api.idl b/mingw-w64-headers/include/dxva2api.idl
index fc77f5c..31cacbd 100644
--- a/mingw-w64-headers/include/dxva2api.idl
+++ b/mingw-w64-headers/include/dxva2api.idl
@@ -777,7 +777,7 @@
         [in] const DXVA2_VideoProcessBltParams* pBltParams,
         [in] const DXVA2_VideoSample* pSamples,
         [in] UINT NumSamples,
-        [out] HANDLE* pHandleCompleteIDirect3DDeviceManager9);
+        [out] HANDLE* pHandleComplete);
 }
 
 /*****************************************************************************
diff --git a/mingw-w64-headers/include/mscat.h b/mingw-w64-headers/include/mscat.h
index 05d8e12..af0201f 100644
--- a/mingw-w64-headers/include/mscat.h
+++ b/mingw-w64-headers/include/mscat.h
@@ -28,6 +28,15 @@
 extern "C" {
 #endif
 
+#define CRYPTCAT_ATTR_NAMEASCII             0x00000001
+#define CRYPTCAT_ATTR_NAMEOBJID             0x00000002
+#define CRYPTCAT_ATTR_DATAASCII             0x00010000
+#define CRYPTCAT_ATTR_DATAOBJID             0x00020000
+#define CRYPTCAT_ATTR_DATAREPLACE           0x00040000
+#define CRYPTCAT_ATTR_NO_AUTO_COMPAT_ENTRY  0x01000000
+#define CRYPTCAT_ATTR_AUTHENTICATED         0x10000000
+#define CRYPTCAT_ATTR_UNAUTHENTICATED       0x20000000
+
 #define CRYPTCAT_OPEN_CREATENEW             0x00000001
 #define CRYPTCAT_OPEN_ALWAYS                0x00000002
 #define CRYPTCAT_OPEN_EXISTING              0x00000004
@@ -131,6 +140,10 @@
 CRYPTCATATTRIBUTE * WINAPI CryptCATGetCatAttrInfo(HANDLE, LPWSTR);
 CRYPTCATMEMBER    * WINAPI CryptCATGetMemberInfo(HANDLE, LPWSTR);
 HANDLE    WINAPI CryptCATOpen(LPWSTR,DWORD,HCRYPTPROV,DWORD,DWORD);
+WINBOOL   WINAPI CryptCATPersistStore(HANDLE catalog);
+CRYPTCATATTRIBUTE * WINAPI CryptCATPutAttrInfo(HANDLE catalog, CRYPTCATMEMBER *member, WCHAR *name, DWORD flags, DWORD size, BYTE *data);
+CRYPTCATATTRIBUTE * WINAPI CryptCATPutCatAttrInfo(HANDLE catalog, WCHAR *name, DWORD flags, DWORD size, BYTE *data);
+CRYPTCATMEMBER    * WINAPI CryptCATPutMemberInfo(HANDLE catalog, WCHAR *filename, WCHAR *member, GUID *subject, DWORD version, DWORD size, BYTE *data);
 
 #ifdef __cplusplus
 }
diff --git a/mingw-w64-headers/include/netlistmgr.h b/mingw-w64-headers/include/netlistmgr.h
index d8e4d2f..7e48afa 100644
--- a/mingw-w64-headers/include/netlistmgr.h
+++ b/mingw-w64-headers/include/netlistmgr.h
@@ -107,6 +107,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef __INetworkEvents_FWD_DEFINED__
+#define __INetworkEvents_FWD_DEFINED__
+typedef interface INetworkEvents INetworkEvents;
+#ifdef __cplusplus
+interface INetworkEvents;
+#endif /* __cplusplus */
+#endif
+
 /* Headers for imported files */
 
 #include <oaidl.h>
@@ -148,6 +156,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef __INetworkConnectionEvents_FWD_DEFINED__
+#define __INetworkConnectionEvents_FWD_DEFINED__
+typedef interface INetworkConnectionEvents INetworkConnectionEvents;
+#ifdef __cplusplus
+interface INetworkConnectionEvents;
+#endif /* __cplusplus */
+#endif
+
 #ifndef __INetworkCostManager_FWD_DEFINED__
 #define __INetworkCostManager_FWD_DEFINED__
 typedef interface INetworkCostManager INetworkCostManager;
@@ -156,6 +172,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef __INetworkEvents_FWD_DEFINED__
+#define __INetworkEvents_FWD_DEFINED__
+typedef interface INetworkEvents INetworkEvents;
+#ifdef __cplusplus
+interface INetworkEvents;
+#endif /* __cplusplus */
+#endif
+
 #ifndef __INetworkListManager_FWD_DEFINED__
 #define __INetworkListManager_FWD_DEFINED__
 typedef interface INetworkListManager INetworkListManager;
@@ -172,6 +196,16 @@
 #endif /* __cplusplus */
 #endif
 
+typedef enum NLM_NETWORK_CLASS {
+    NLM_NETWORK_IDENTIFYING = 0x1,
+    NLM_NETWORK_IDENTIFIED = 0x2,
+    NLM_NETWORK_UNIDENTIFIED = 0x3
+} NLM_NETWORK_CLASS;
+typedef enum NLM_INTERNET_CONNECTIVITY {
+    NLM_INTERNET_CONNECTIVITY_WEBHIJACK = 0x1,
+    NLM_INTERNET_CONNECTIVITY_PROXIED = 0x2,
+    NLM_INTERNET_CONNECTIVITY_CORPORATE = 0x4
+} NLM_INTERNET_CONNECTIVITY;
 typedef enum NLM_CONNECTIVITY {
     NLM_CONNECTIVITY_DISCONNECTED = 0x0,
     NLM_CONNECTIVITY_IPV4_NOTRAFFIC = 0x1,
@@ -1692,6 +1726,127 @@
 
 #endif  /* __INetwork_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * INetworkEvents interface
+ */
+#ifndef __INetworkEvents_INTERFACE_DEFINED__
+#define __INetworkEvents_INTERFACE_DEFINED__
+
+typedef enum NLM_NETWORK_PROPERTY_CHANGE {
+    NLM_NETWORK_PROPERTY_CHANGE_CONNECTION = 0x1,
+    NLM_NETWORK_PROPERTY_CHANGE_DESCRIPTION = 0x2,
+    NLM_NETWORK_PROPERTY_CHANGE_NAME = 0x4,
+    NLM_NETWORK_PROPERTY_CHANGE_ICON = 0x8,
+    NLM_NETWORK_PROPERTY_CHANGE_CATEGORY_VALUE = 0x10
+} NLM_NETWORK_PROPERTY_CHANGE;
+DEFINE_GUID(IID_INetworkEvents, 0xdcb00004, 0x570f, 0x4a9b, 0x8d,0x69, 0x19,0x9f,0xdb,0xa5,0x72,0x3b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("dcb00004-570f-4a9b-8d69-199fdba5723b")
+INetworkEvents : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE NetworkAdded(
+        GUID networkId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NetworkDeleted(
+        GUID networkId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NetworkConnectivityChanged(
+        GUID networkId,
+        NLM_CONNECTIVITY newConnectivity) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NetworkPropertyChanged(
+        GUID networkId,
+        NLM_NETWORK_PROPERTY_CHANGE flags) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(INetworkEvents, 0xdcb00004, 0x570f, 0x4a9b, 0x8d,0x69, 0x19,0x9f,0xdb,0xa5,0x72,0x3b)
+#endif
+#else
+typedef struct INetworkEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        INetworkEvents *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        INetworkEvents *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        INetworkEvents *This);
+
+    /*** INetworkEvents methods ***/
+    HRESULT (STDMETHODCALLTYPE *NetworkAdded)(
+        INetworkEvents *This,
+        GUID networkId);
+
+    HRESULT (STDMETHODCALLTYPE *NetworkDeleted)(
+        INetworkEvents *This,
+        GUID networkId);
+
+    HRESULT (STDMETHODCALLTYPE *NetworkConnectivityChanged)(
+        INetworkEvents *This,
+        GUID networkId,
+        NLM_CONNECTIVITY newConnectivity);
+
+    HRESULT (STDMETHODCALLTYPE *NetworkPropertyChanged)(
+        INetworkEvents *This,
+        GUID networkId,
+        NLM_NETWORK_PROPERTY_CHANGE flags);
+
+    END_INTERFACE
+} INetworkEventsVtbl;
+
+interface INetworkEvents {
+    CONST_VTBL INetworkEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define INetworkEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define INetworkEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define INetworkEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** INetworkEvents methods ***/
+#define INetworkEvents_NetworkAdded(This,networkId) (This)->lpVtbl->NetworkAdded(This,networkId)
+#define INetworkEvents_NetworkDeleted(This,networkId) (This)->lpVtbl->NetworkDeleted(This,networkId)
+#define INetworkEvents_NetworkConnectivityChanged(This,networkId,newConnectivity) (This)->lpVtbl->NetworkConnectivityChanged(This,networkId,newConnectivity)
+#define INetworkEvents_NetworkPropertyChanged(This,networkId,flags) (This)->lpVtbl->NetworkPropertyChanged(This,networkId,flags)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT INetworkEvents_QueryInterface(INetworkEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG INetworkEvents_AddRef(INetworkEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG INetworkEvents_Release(INetworkEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** INetworkEvents methods ***/
+static FORCEINLINE HRESULT INetworkEvents_NetworkAdded(INetworkEvents* This,GUID networkId) {
+    return This->lpVtbl->NetworkAdded(This,networkId);
+}
+static FORCEINLINE HRESULT INetworkEvents_NetworkDeleted(INetworkEvents* This,GUID networkId) {
+    return This->lpVtbl->NetworkDeleted(This,networkId);
+}
+static FORCEINLINE HRESULT INetworkEvents_NetworkConnectivityChanged(INetworkEvents* This,GUID networkId,NLM_CONNECTIVITY newConnectivity) {
+    return This->lpVtbl->NetworkConnectivityChanged(This,networkId,newConnectivity);
+}
+static FORCEINLINE HRESULT INetworkEvents_NetworkPropertyChanged(INetworkEvents* This,GUID networkId,NLM_NETWORK_PROPERTY_CHANGE flags) {
+    return This->lpVtbl->NetworkPropertyChanged(This,networkId,flags);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __INetworkEvents_INTERFACE_DEFINED__ */
+
 /* Begin additional prototypes for all interfaces */
 
 ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
diff --git a/mingw-w64-headers/include/netlistmgr.idl b/mingw-w64-headers/include/netlistmgr.idl
index e098f72..d12b4a5 100644
--- a/mingw-w64-headers/include/netlistmgr.idl
+++ b/mingw-w64-headers/include/netlistmgr.idl
@@ -27,10 +27,26 @@
 interface IEnumNetworkConnections;
 interface INetwork;
 interface INetworkConnection;
+interface INetworkConnectionEvents;
 interface INetworkCostManager;
+interface INetworkEvents;
 interface INetworkListManager;
 interface INetworkListManagerEvents;
 
+typedef [v1_enum] enum NLM_NETWORK_CLASS
+{
+    NLM_NETWORK_IDENTIFYING  = 0x01,
+    NLM_NETWORK_IDENTIFIED   = 0x02,
+    NLM_NETWORK_UNIDENTIFIED = 0x03
+} NLM_NETWORK_CLASS;
+
+typedef [v1_enum] enum NLM_INTERNET_CONNECTIVITY
+{
+    NLM_INTERNET_CONNECTIVITY_WEBHIJACK = 0x01,
+    NLM_INTERNET_CONNECTIVITY_PROXIED   = 0x02,
+    NLM_INTERNET_CONNECTIVITY_CORPORATE = 0x04
+} NLM_INTERNET_CONNECTIVITY;
+
 typedef [v1_enum] enum NLM_CONNECTIVITY
 {
     NLM_CONNECTIVITY_DISCONNECTED      = 0x0000,
@@ -390,3 +406,35 @@
     HRESULT SetCategory(
         [in] NLM_NETWORK_CATEGORY NewCategory);
 }
+
+[
+    object,
+    oleautomation,
+    pointer_default(unique),
+    uuid(dcb00004-570f-4a9b-8d69-199fdba5723b)
+]
+interface INetworkEvents : IUnknown
+{
+    typedef enum NLM_NETWORK_PROPERTY_CHANGE
+    {
+        NLM_NETWORK_PROPERTY_CHANGE_CONNECTION     = 0x01,
+        NLM_NETWORK_PROPERTY_CHANGE_DESCRIPTION    = 0x02,
+        NLM_NETWORK_PROPERTY_CHANGE_NAME           = 0x04,
+        NLM_NETWORK_PROPERTY_CHANGE_ICON           = 0x08,
+        NLM_NETWORK_PROPERTY_CHANGE_CATEGORY_VALUE = 0x10
+    } NLM_NETWORK_PROPERTY_CHANGE;
+
+    HRESULT NetworkAdded (
+        [in] GUID networkId);
+
+    HRESULT NetworkDeleted (
+        [in] GUID networkId);
+
+    HRESULT NetworkConnectivityChanged (
+        [in] GUID networkId,
+        [in] NLM_CONNECTIVITY newConnectivity);
+
+    HRESULT NetworkPropertyChanged(
+        [in] GUID networkId,
+        [in] NLM_NETWORK_PROPERTY_CHANGE flags);
+}
