diff --git a/mingw-w64-headers/include/tsvirtualchannels.h b/mingw-w64-headers/include/tsvirtualchannels.h
new file mode 100644
index 0000000..c8ced97
--- /dev/null
+++ b/mingw-w64-headers/include/tsvirtualchannels.h
@@ -0,0 +1,1060 @@
+/*** Autogenerated by WIDL 6.4 from include/tsvirtualchannels.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 __tsvirtualchannels_h__
+#define __tsvirtualchannels_h__
+
+/* Forward declarations */
+
+#ifndef __IWTSPlugin_FWD_DEFINED__
+#define __IWTSPlugin_FWD_DEFINED__
+typedef interface IWTSPlugin IWTSPlugin;
+#ifdef __cplusplus
+interface IWTSPlugin;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSListener_FWD_DEFINED__
+#define __IWTSListener_FWD_DEFINED__
+typedef interface IWTSListener IWTSListener;
+#ifdef __cplusplus
+interface IWTSListener;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSListenerCallback_FWD_DEFINED__
+#define __IWTSListenerCallback_FWD_DEFINED__
+typedef interface IWTSListenerCallback IWTSListenerCallback;
+#ifdef __cplusplus
+interface IWTSListenerCallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSVirtualChannelCallback_FWD_DEFINED__
+#define __IWTSVirtualChannelCallback_FWD_DEFINED__
+typedef interface IWTSVirtualChannelCallback IWTSVirtualChannelCallback;
+#ifdef __cplusplus
+interface IWTSVirtualChannelCallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSVirtualChannelManager_FWD_DEFINED__
+#define __IWTSVirtualChannelManager_FWD_DEFINED__
+typedef interface IWTSVirtualChannelManager IWTSVirtualChannelManager;
+#ifdef __cplusplus
+interface IWTSVirtualChannelManager;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSVirtualChannel_FWD_DEFINED__
+#define __IWTSVirtualChannel_FWD_DEFINED__
+typedef interface IWTSVirtualChannel IWTSVirtualChannel;
+#ifdef __cplusplus
+interface IWTSVirtualChannel;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSPluginServiceProvider_FWD_DEFINED__
+#define __IWTSPluginServiceProvider_FWD_DEFINED__
+typedef interface IWTSPluginServiceProvider IWTSPluginServiceProvider;
+#ifdef __cplusplus
+interface IWTSPluginServiceProvider;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSBitmapRenderer_FWD_DEFINED__
+#define __IWTSBitmapRenderer_FWD_DEFINED__
+typedef interface IWTSBitmapRenderer IWTSBitmapRenderer;
+#ifdef __cplusplus
+interface IWTSBitmapRenderer;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSBitmapRendererCallback_FWD_DEFINED__
+#define __IWTSBitmapRendererCallback_FWD_DEFINED__
+typedef interface IWTSBitmapRendererCallback IWTSBitmapRendererCallback;
+#ifdef __cplusplus
+interface IWTSBitmapRendererCallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSBitmapRenderService_FWD_DEFINED__
+#define __IWTSBitmapRenderService_FWD_DEFINED__
+typedef interface IWTSBitmapRenderService IWTSBitmapRenderService;
+#ifdef __cplusplus
+interface IWTSBitmapRenderService;
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
+
+#include <unknwn.h>
+#include <oaidl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#ifndef __IWTSPlugin_FWD_DEFINED__
+#define __IWTSPlugin_FWD_DEFINED__
+typedef interface IWTSPlugin IWTSPlugin;
+#ifdef __cplusplus
+interface IWTSPlugin;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSListener_FWD_DEFINED__
+#define __IWTSListener_FWD_DEFINED__
+typedef interface IWTSListener IWTSListener;
+#ifdef __cplusplus
+interface IWTSListener;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSListenerCallback_FWD_DEFINED__
+#define __IWTSListenerCallback_FWD_DEFINED__
+typedef interface IWTSListenerCallback IWTSListenerCallback;
+#ifdef __cplusplus
+interface IWTSListenerCallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSVirtualChannelCallback_FWD_DEFINED__
+#define __IWTSVirtualChannelCallback_FWD_DEFINED__
+typedef interface IWTSVirtualChannelCallback IWTSVirtualChannelCallback;
+#ifdef __cplusplus
+interface IWTSVirtualChannelCallback;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSVirtualChannelManager_FWD_DEFINED__
+#define __IWTSVirtualChannelManager_FWD_DEFINED__
+typedef interface IWTSVirtualChannelManager IWTSVirtualChannelManager;
+#ifdef __cplusplus
+interface IWTSVirtualChannelManager;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IWTSVirtualChannel_FWD_DEFINED__
+#define __IWTSVirtualChannel_FWD_DEFINED__
+typedef interface IWTSVirtualChannel IWTSVirtualChannel;
+#ifdef __cplusplus
+interface IWTSVirtualChannel;
+#endif /* __cplusplus */
+#endif
+
+#define WTS_PROPERTY_DEFAULT_CONFIG L"DefaultConfig"
+#define E_MAPPEDRENDERER_SHUTDOWN HRESULT_FROM_WIN32(ERROR_INVALID_STATE)
+#define E_DUPLICATE_WINDOW_HINT HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)
+/*****************************************************************************
+ * IWTSPlugin interface
+ */
+#ifndef __IWTSPlugin_INTERFACE_DEFINED__
+#define __IWTSPlugin_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSPlugin, 0xa1230201, 0x1439, 0x4e62, 0xa4,0x14, 0x19,0x0d,0x0a,0xc3,0xd4,0x0e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a1230201-1439-4e62-a414-190d0ac3d40e")
+IWTSPlugin : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Initialize(
+        IWTSVirtualChannelManager *pChannelMgr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Connected(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Disconnected(
+        DWORD dwDisconnectCode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Terminated(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSPlugin, 0xa1230201, 0x1439, 0x4e62, 0xa4,0x14, 0x19,0x0d,0x0a,0xc3,0xd4,0x0e)
+#endif
+#else
+typedef struct IWTSPluginVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSPlugin *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSPlugin *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSPlugin *This);
+
+    /*** IWTSPlugin methods ***/
+    HRESULT (STDMETHODCALLTYPE *Initialize)(
+        IWTSPlugin *This,
+        IWTSVirtualChannelManager *pChannelMgr);
+
+    HRESULT (STDMETHODCALLTYPE *Connected)(
+        IWTSPlugin *This);
+
+    HRESULT (STDMETHODCALLTYPE *Disconnected)(
+        IWTSPlugin *This,
+        DWORD dwDisconnectCode);
+
+    HRESULT (STDMETHODCALLTYPE *Terminated)(
+        IWTSPlugin *This);
+
+    END_INTERFACE
+} IWTSPluginVtbl;
+
+interface IWTSPlugin {
+    CONST_VTBL IWTSPluginVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSPlugin_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSPlugin_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSPlugin_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSPlugin methods ***/
+#define IWTSPlugin_Initialize(This,pChannelMgr) (This)->lpVtbl->Initialize(This,pChannelMgr)
+#define IWTSPlugin_Connected(This) (This)->lpVtbl->Connected(This)
+#define IWTSPlugin_Disconnected(This,dwDisconnectCode) (This)->lpVtbl->Disconnected(This,dwDisconnectCode)
+#define IWTSPlugin_Terminated(This) (This)->lpVtbl->Terminated(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSPlugin_QueryInterface(IWTSPlugin* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSPlugin_AddRef(IWTSPlugin* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSPlugin_Release(IWTSPlugin* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSPlugin methods ***/
+static FORCEINLINE HRESULT IWTSPlugin_Initialize(IWTSPlugin* This,IWTSVirtualChannelManager *pChannelMgr) {
+    return This->lpVtbl->Initialize(This,pChannelMgr);
+}
+static FORCEINLINE HRESULT IWTSPlugin_Connected(IWTSPlugin* This) {
+    return This->lpVtbl->Connected(This);
+}
+static FORCEINLINE HRESULT IWTSPlugin_Disconnected(IWTSPlugin* This,DWORD dwDisconnectCode) {
+    return This->lpVtbl->Disconnected(This,dwDisconnectCode);
+}
+static FORCEINLINE HRESULT IWTSPlugin_Terminated(IWTSPlugin* This) {
+    return This->lpVtbl->Terminated(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSPlugin_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWTSListener interface
+ */
+#ifndef __IWTSListener_INTERFACE_DEFINED__
+#define __IWTSListener_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSListener, 0xa1230206, 0x9a39, 0x4d58, 0x86,0x74, 0xcd,0xb4,0xdf,0xf4,0xe7,0x3b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a1230206-9a39-4d58-8674-cdb4dff4e73b")
+IWTSListener : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetConfiguration(
+        IPropertyBag **ppPropertyBag) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSListener, 0xa1230206, 0x9a39, 0x4d58, 0x86,0x74, 0xcd,0xb4,0xdf,0xf4,0xe7,0x3b)
+#endif
+#else
+typedef struct IWTSListenerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSListener *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSListener *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSListener *This);
+
+    /*** IWTSListener methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetConfiguration)(
+        IWTSListener *This,
+        IPropertyBag **ppPropertyBag);
+
+    END_INTERFACE
+} IWTSListenerVtbl;
+
+interface IWTSListener {
+    CONST_VTBL IWTSListenerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSListener_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSListener_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSListener methods ***/
+#define IWTSListener_GetConfiguration(This,ppPropertyBag) (This)->lpVtbl->GetConfiguration(This,ppPropertyBag)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSListener_QueryInterface(IWTSListener* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSListener_AddRef(IWTSListener* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSListener_Release(IWTSListener* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSListener methods ***/
+static FORCEINLINE HRESULT IWTSListener_GetConfiguration(IWTSListener* This,IPropertyBag **ppPropertyBag) {
+    return This->lpVtbl->GetConfiguration(This,ppPropertyBag);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSListener_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWTSListenerCallback interface
+ */
+#ifndef __IWTSListenerCallback_INTERFACE_DEFINED__
+#define __IWTSListenerCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSListenerCallback, 0xa1230203, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a1230203-d6a7-11d8-b9fd-000bdbd1f198")
+IWTSListenerCallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnNewChannelConnection(
+        IWTSVirtualChannel *pChannel,
+        BSTR data,
+        WINBOOL *pbAccept,
+        IWTSVirtualChannelCallback **ppCallback) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSListenerCallback, 0xa1230203, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
+#endif
+#else
+typedef struct IWTSListenerCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSListenerCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSListenerCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSListenerCallback *This);
+
+    /*** IWTSListenerCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnNewChannelConnection)(
+        IWTSListenerCallback *This,
+        IWTSVirtualChannel *pChannel,
+        BSTR data,
+        WINBOOL *pbAccept,
+        IWTSVirtualChannelCallback **ppCallback);
+
+    END_INTERFACE
+} IWTSListenerCallbackVtbl;
+
+interface IWTSListenerCallback {
+    CONST_VTBL IWTSListenerCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSListenerCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSListenerCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSListenerCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSListenerCallback methods ***/
+#define IWTSListenerCallback_OnNewChannelConnection(This,pChannel,data,pbAccept,ppCallback) (This)->lpVtbl->OnNewChannelConnection(This,pChannel,data,pbAccept,ppCallback)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSListenerCallback_QueryInterface(IWTSListenerCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSListenerCallback_AddRef(IWTSListenerCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSListenerCallback_Release(IWTSListenerCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSListenerCallback methods ***/
+static FORCEINLINE HRESULT IWTSListenerCallback_OnNewChannelConnection(IWTSListenerCallback* This,IWTSVirtualChannel *pChannel,BSTR data,WINBOOL *pbAccept,IWTSVirtualChannelCallback **ppCallback) {
+    return This->lpVtbl->OnNewChannelConnection(This,pChannel,data,pbAccept,ppCallback);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSListenerCallback_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWTSVirtualChannelCallback interface
+ */
+#ifndef __IWTSVirtualChannelCallback_INTERFACE_DEFINED__
+#define __IWTSVirtualChannelCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSVirtualChannelCallback, 0xa1230204, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a1230204-d6a7-11d8-b9fd-000bdbd1f198")
+IWTSVirtualChannelCallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnDataReceived(
+        ULONG cbSize,
+        BYTE *pBuffer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnClose(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSVirtualChannelCallback, 0xa1230204, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
+#endif
+#else
+typedef struct IWTSVirtualChannelCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSVirtualChannelCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSVirtualChannelCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSVirtualChannelCallback *This);
+
+    /*** IWTSVirtualChannelCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnDataReceived)(
+        IWTSVirtualChannelCallback *This,
+        ULONG cbSize,
+        BYTE *pBuffer);
+
+    HRESULT (STDMETHODCALLTYPE *OnClose)(
+        IWTSVirtualChannelCallback *This);
+
+    END_INTERFACE
+} IWTSVirtualChannelCallbackVtbl;
+
+interface IWTSVirtualChannelCallback {
+    CONST_VTBL IWTSVirtualChannelCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSVirtualChannelCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSVirtualChannelCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSVirtualChannelCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSVirtualChannelCallback methods ***/
+#define IWTSVirtualChannelCallback_OnDataReceived(This,cbSize,pBuffer) (This)->lpVtbl->OnDataReceived(This,cbSize,pBuffer)
+#define IWTSVirtualChannelCallback_OnClose(This) (This)->lpVtbl->OnClose(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSVirtualChannelCallback_QueryInterface(IWTSVirtualChannelCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSVirtualChannelCallback_AddRef(IWTSVirtualChannelCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSVirtualChannelCallback_Release(IWTSVirtualChannelCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSVirtualChannelCallback methods ***/
+static FORCEINLINE HRESULT IWTSVirtualChannelCallback_OnDataReceived(IWTSVirtualChannelCallback* This,ULONG cbSize,BYTE *pBuffer) {
+    return This->lpVtbl->OnDataReceived(This,cbSize,pBuffer);
+}
+static FORCEINLINE HRESULT IWTSVirtualChannelCallback_OnClose(IWTSVirtualChannelCallback* This) {
+    return This->lpVtbl->OnClose(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSVirtualChannelCallback_INTERFACE_DEFINED__ */
+
+#define TS_VC_LISTENER_STATIC_CHANNEL 0x00000001
+/*****************************************************************************
+ * IWTSVirtualChannelManager interface
+ */
+#ifndef __IWTSVirtualChannelManager_INTERFACE_DEFINED__
+#define __IWTSVirtualChannelManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSVirtualChannelManager, 0xa1230205, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a1230205-d6a7-11d8-b9fd-000bdbd1f198")
+IWTSVirtualChannelManager : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateListener(
+        const char *pszChannelName,
+        ULONG uFlags,
+        IWTSListenerCallback *pListenerCallback,
+        IWTSListener **ppListener) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSVirtualChannelManager, 0xa1230205, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
+#endif
+#else
+typedef struct IWTSVirtualChannelManagerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSVirtualChannelManager *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSVirtualChannelManager *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSVirtualChannelManager *This);
+
+    /*** IWTSVirtualChannelManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateListener)(
+        IWTSVirtualChannelManager *This,
+        const char *pszChannelName,
+        ULONG uFlags,
+        IWTSListenerCallback *pListenerCallback,
+        IWTSListener **ppListener);
+
+    END_INTERFACE
+} IWTSVirtualChannelManagerVtbl;
+
+interface IWTSVirtualChannelManager {
+    CONST_VTBL IWTSVirtualChannelManagerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSVirtualChannelManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSVirtualChannelManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSVirtualChannelManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSVirtualChannelManager methods ***/
+#define IWTSVirtualChannelManager_CreateListener(This,pszChannelName,uFlags,pListenerCallback,ppListener) (This)->lpVtbl->CreateListener(This,pszChannelName,uFlags,pListenerCallback,ppListener)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSVirtualChannelManager_QueryInterface(IWTSVirtualChannelManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSVirtualChannelManager_AddRef(IWTSVirtualChannelManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSVirtualChannelManager_Release(IWTSVirtualChannelManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSVirtualChannelManager methods ***/
+static FORCEINLINE HRESULT IWTSVirtualChannelManager_CreateListener(IWTSVirtualChannelManager* This,const char *pszChannelName,ULONG uFlags,IWTSListenerCallback *pListenerCallback,IWTSListener **ppListener) {
+    return This->lpVtbl->CreateListener(This,pszChannelName,uFlags,pListenerCallback,ppListener);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSVirtualChannelManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWTSVirtualChannel interface
+ */
+#ifndef __IWTSVirtualChannel_INTERFACE_DEFINED__
+#define __IWTSVirtualChannel_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSVirtualChannel, 0xa1230207, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a1230207-d6a7-11d8-b9fd-000bdbd1f198")
+IWTSVirtualChannel : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Write(
+        ULONG cbSize,
+        BYTE *pBuffer,
+        IUnknown *pReserved) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Close(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSVirtualChannel, 0xa1230207, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
+#endif
+#else
+typedef struct IWTSVirtualChannelVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSVirtualChannel *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSVirtualChannel *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSVirtualChannel *This);
+
+    /*** IWTSVirtualChannel methods ***/
+    HRESULT (STDMETHODCALLTYPE *Write)(
+        IWTSVirtualChannel *This,
+        ULONG cbSize,
+        BYTE *pBuffer,
+        IUnknown *pReserved);
+
+    HRESULT (STDMETHODCALLTYPE *Close)(
+        IWTSVirtualChannel *This);
+
+    END_INTERFACE
+} IWTSVirtualChannelVtbl;
+
+interface IWTSVirtualChannel {
+    CONST_VTBL IWTSVirtualChannelVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSVirtualChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSVirtualChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSVirtualChannel_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSVirtualChannel methods ***/
+#define IWTSVirtualChannel_Write(This,cbSize,pBuffer,pReserved) (This)->lpVtbl->Write(This,cbSize,pBuffer,pReserved)
+#define IWTSVirtualChannel_Close(This) (This)->lpVtbl->Close(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSVirtualChannel_QueryInterface(IWTSVirtualChannel* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSVirtualChannel_AddRef(IWTSVirtualChannel* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSVirtualChannel_Release(IWTSVirtualChannel* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSVirtualChannel methods ***/
+static FORCEINLINE HRESULT IWTSVirtualChannel_Write(IWTSVirtualChannel* This,ULONG cbSize,BYTE *pBuffer,IUnknown *pReserved) {
+    return This->lpVtbl->Write(This,cbSize,pBuffer,pReserved);
+}
+static FORCEINLINE HRESULT IWTSVirtualChannel_Close(IWTSVirtualChannel* This) {
+    return This->lpVtbl->Close(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSVirtualChannel_INTERFACE_DEFINED__ */
+
+EXTERN_GUID( RDCLIENT_BITMAP_RENDER_SERVICE, 0xe4cc08cb, 0x942e, 0x4b19, 0x85, 0x4, 0xbd, 0x5a, 0x89, 0xa7, 0x47, 0xf5);
+/*****************************************************************************
+ * IWTSPluginServiceProvider interface
+ */
+#ifndef __IWTSPluginServiceProvider_INTERFACE_DEFINED__
+#define __IWTSPluginServiceProvider_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSPluginServiceProvider, 0xd3e07363, 0x087c, 0x476c, 0x86,0xa7, 0xdb,0xb1,0x5f,0x46,0xdd,0xb4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d3e07363-087c-476c-86a7-dbb15f46ddb4")
+IWTSPluginServiceProvider : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetService(
+        GUID ServiceId,
+        IUnknown **ppunkObject) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSPluginServiceProvider, 0xd3e07363, 0x087c, 0x476c, 0x86,0xa7, 0xdb,0xb1,0x5f,0x46,0xdd,0xb4)
+#endif
+#else
+typedef struct IWTSPluginServiceProviderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSPluginServiceProvider *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSPluginServiceProvider *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSPluginServiceProvider *This);
+
+    /*** IWTSPluginServiceProvider methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetService)(
+        IWTSPluginServiceProvider *This,
+        GUID ServiceId,
+        IUnknown **ppunkObject);
+
+    END_INTERFACE
+} IWTSPluginServiceProviderVtbl;
+
+interface IWTSPluginServiceProvider {
+    CONST_VTBL IWTSPluginServiceProviderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSPluginServiceProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSPluginServiceProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSPluginServiceProvider_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSPluginServiceProvider methods ***/
+#define IWTSPluginServiceProvider_GetService(This,ServiceId,ppunkObject) (This)->lpVtbl->GetService(This,ServiceId,ppunkObject)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSPluginServiceProvider_QueryInterface(IWTSPluginServiceProvider* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSPluginServiceProvider_AddRef(IWTSPluginServiceProvider* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSPluginServiceProvider_Release(IWTSPluginServiceProvider* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSPluginServiceProvider methods ***/
+static FORCEINLINE HRESULT IWTSPluginServiceProvider_GetService(IWTSPluginServiceProvider* This,GUID ServiceId,IUnknown **ppunkObject) {
+    return This->lpVtbl->GetService(This,ServiceId,ppunkObject);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSPluginServiceProvider_INTERFACE_DEFINED__ */
+
+typedef struct __BITMAP_RENDERER_STATISTICS {
+    DWORD dwFramesDelivered;
+    DWORD dwFramesDropped;
+} BITMAP_RENDERER_STATISTICS;
+typedef struct __BITMAP_RENDERER_STATISTICS *PBITMAP_RENDERER_STATISTICS;
+/*****************************************************************************
+ * IWTSBitmapRenderer interface
+ */
+#ifndef __IWTSBitmapRenderer_INTERFACE_DEFINED__
+#define __IWTSBitmapRenderer_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSBitmapRenderer, 0x5b7acc97, 0xf3c9, 0x46f7, 0x8c,0x5b, 0xfa,0x68,0x5d,0x34,0x41,0xb1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5b7acc97-f3c9-46f7-8c5b-fa685d3441b1")
+IWTSBitmapRenderer : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Render(
+        GUID imageFormat,
+        DWORD dwWidth,
+        DWORD dwHeight,
+        LONG cbStride,
+        DWORD cbImageBuffer,
+        BYTE *pImageBuffer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRendererStatistics(
+        BITMAP_RENDERER_STATISTICS *pStatistics) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveMapping(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSBitmapRenderer, 0x5b7acc97, 0xf3c9, 0x46f7, 0x8c,0x5b, 0xfa,0x68,0x5d,0x34,0x41,0xb1)
+#endif
+#else
+typedef struct IWTSBitmapRendererVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSBitmapRenderer *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSBitmapRenderer *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSBitmapRenderer *This);
+
+    /*** IWTSBitmapRenderer methods ***/
+    HRESULT (STDMETHODCALLTYPE *Render)(
+        IWTSBitmapRenderer *This,
+        GUID imageFormat,
+        DWORD dwWidth,
+        DWORD dwHeight,
+        LONG cbStride,
+        DWORD cbImageBuffer,
+        BYTE *pImageBuffer);
+
+    HRESULT (STDMETHODCALLTYPE *GetRendererStatistics)(
+        IWTSBitmapRenderer *This,
+        BITMAP_RENDERER_STATISTICS *pStatistics);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveMapping)(
+        IWTSBitmapRenderer *This);
+
+    END_INTERFACE
+} IWTSBitmapRendererVtbl;
+
+interface IWTSBitmapRenderer {
+    CONST_VTBL IWTSBitmapRendererVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSBitmapRenderer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSBitmapRenderer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSBitmapRenderer_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSBitmapRenderer methods ***/
+#define IWTSBitmapRenderer_Render(This,imageFormat,dwWidth,dwHeight,cbStride,cbImageBuffer,pImageBuffer) (This)->lpVtbl->Render(This,imageFormat,dwWidth,dwHeight,cbStride,cbImageBuffer,pImageBuffer)
+#define IWTSBitmapRenderer_GetRendererStatistics(This,pStatistics) (This)->lpVtbl->GetRendererStatistics(This,pStatistics)
+#define IWTSBitmapRenderer_RemoveMapping(This) (This)->lpVtbl->RemoveMapping(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSBitmapRenderer_QueryInterface(IWTSBitmapRenderer* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSBitmapRenderer_AddRef(IWTSBitmapRenderer* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSBitmapRenderer_Release(IWTSBitmapRenderer* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSBitmapRenderer methods ***/
+static FORCEINLINE HRESULT IWTSBitmapRenderer_Render(IWTSBitmapRenderer* This,GUID imageFormat,DWORD dwWidth,DWORD dwHeight,LONG cbStride,DWORD cbImageBuffer,BYTE *pImageBuffer) {
+    return This->lpVtbl->Render(This,imageFormat,dwWidth,dwHeight,cbStride,cbImageBuffer,pImageBuffer);
+}
+static FORCEINLINE HRESULT IWTSBitmapRenderer_GetRendererStatistics(IWTSBitmapRenderer* This,BITMAP_RENDERER_STATISTICS *pStatistics) {
+    return This->lpVtbl->GetRendererStatistics(This,pStatistics);
+}
+static FORCEINLINE HRESULT IWTSBitmapRenderer_RemoveMapping(IWTSBitmapRenderer* This) {
+    return This->lpVtbl->RemoveMapping(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSBitmapRenderer_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWTSBitmapRendererCallback interface
+ */
+#ifndef __IWTSBitmapRendererCallback_INTERFACE_DEFINED__
+#define __IWTSBitmapRendererCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSBitmapRendererCallback, 0xd782928e, 0xfe4e, 0x4e77, 0xae,0x90, 0x9c,0xd0,0xb3,0xe3,0xb3,0x53);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d782928e-fe4e-4e77-ae90-9cd0b3e3b353")
+IWTSBitmapRendererCallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnTargetSizeChanged(
+        RECT rcNewSize) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSBitmapRendererCallback, 0xd782928e, 0xfe4e, 0x4e77, 0xae,0x90, 0x9c,0xd0,0xb3,0xe3,0xb3,0x53)
+#endif
+#else
+typedef struct IWTSBitmapRendererCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSBitmapRendererCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSBitmapRendererCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSBitmapRendererCallback *This);
+
+    /*** IWTSBitmapRendererCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnTargetSizeChanged)(
+        IWTSBitmapRendererCallback *This,
+        RECT rcNewSize);
+
+    END_INTERFACE
+} IWTSBitmapRendererCallbackVtbl;
+
+interface IWTSBitmapRendererCallback {
+    CONST_VTBL IWTSBitmapRendererCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSBitmapRendererCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSBitmapRendererCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSBitmapRendererCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSBitmapRendererCallback methods ***/
+#define IWTSBitmapRendererCallback_OnTargetSizeChanged(This,rcNewSize) (This)->lpVtbl->OnTargetSizeChanged(This,rcNewSize)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSBitmapRendererCallback_QueryInterface(IWTSBitmapRendererCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSBitmapRendererCallback_AddRef(IWTSBitmapRendererCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSBitmapRendererCallback_Release(IWTSBitmapRendererCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSBitmapRendererCallback methods ***/
+static FORCEINLINE HRESULT IWTSBitmapRendererCallback_OnTargetSizeChanged(IWTSBitmapRendererCallback* This,RECT rcNewSize) {
+    return This->lpVtbl->OnTargetSizeChanged(This,rcNewSize);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSBitmapRendererCallback_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWTSBitmapRenderService interface
+ */
+#ifndef __IWTSBitmapRenderService_INTERFACE_DEFINED__
+#define __IWTSBitmapRenderService_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWTSBitmapRenderService, 0xea326091, 0x05fe, 0x40c1, 0xb4,0x9c, 0x3d,0x2e,0xf4,0x62,0x6a,0x0e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ea326091-05fe-40c1-b49c-3d2ef4626a0e")
+IWTSBitmapRenderService : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetMappedRenderer(
+        UINT64 mappingId,
+        IWTSBitmapRendererCallback *pMappedRendererCallback,
+        IWTSBitmapRenderer **ppMappedRenderer) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWTSBitmapRenderService, 0xea326091, 0x05fe, 0x40c1, 0xb4,0x9c, 0x3d,0x2e,0xf4,0x62,0x6a,0x0e)
+#endif
+#else
+typedef struct IWTSBitmapRenderServiceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWTSBitmapRenderService *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWTSBitmapRenderService *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWTSBitmapRenderService *This);
+
+    /*** IWTSBitmapRenderService methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetMappedRenderer)(
+        IWTSBitmapRenderService *This,
+        UINT64 mappingId,
+        IWTSBitmapRendererCallback *pMappedRendererCallback,
+        IWTSBitmapRenderer **ppMappedRenderer);
+
+    END_INTERFACE
+} IWTSBitmapRenderServiceVtbl;
+
+interface IWTSBitmapRenderService {
+    CONST_VTBL IWTSBitmapRenderServiceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWTSBitmapRenderService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWTSBitmapRenderService_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWTSBitmapRenderService_Release(This) (This)->lpVtbl->Release(This)
+/*** IWTSBitmapRenderService methods ***/
+#define IWTSBitmapRenderService_GetMappedRenderer(This,mappingId,pMappedRendererCallback,ppMappedRenderer) (This)->lpVtbl->GetMappedRenderer(This,mappingId,pMappedRendererCallback,ppMappedRenderer)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWTSBitmapRenderService_QueryInterface(IWTSBitmapRenderService* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWTSBitmapRenderService_AddRef(IWTSBitmapRenderService* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWTSBitmapRenderService_Release(IWTSBitmapRenderService* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWTSBitmapRenderService methods ***/
+static FORCEINLINE HRESULT IWTSBitmapRenderService_GetMappedRenderer(IWTSBitmapRenderService* This,UINT64 mappingId,IWTSBitmapRendererCallback *pMappedRendererCallback,IWTSBitmapRenderer **ppMappedRenderer) {
+    return This->lpVtbl->GetMappedRenderer(This,mappingId,pMappedRendererCallback,ppMappedRenderer);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWTSBitmapRenderService_INTERFACE_DEFINED__ */
+
+#endif /* WINAPI_PARTITION_DESKTOP */
+/* Begin additional prototypes for all interfaces */
+
+ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
+unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
+unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
+void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __tsvirtualchannels_h__ */
