diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index 2a74658..f0c9d2a 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -119,6 +119,12 @@
   include/wmcontainer.idl \
   include/wmsbuffer.idl \
   include/wmsdkidl.idl \
+  include/wsdattachment.idl \
+  include/wsdbase.idl \
+  include/wsdclient.idl \
+  include/wsddisco.idl \
+  include/wsdhost.idl \
+  include/wsdxml.idl \
   include/wtypesbase.idl \
   include/windows.foundation.idl \
   include/windows.security.cryptography.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index 62b4a5b..76768eb 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -343,6 +343,12 @@
 @HAVE_WIDL_TRUE@  include/wmcontainer.idl \
 @HAVE_WIDL_TRUE@  include/wmsbuffer.idl \
 @HAVE_WIDL_TRUE@  include/wmsdkidl.idl \
+@HAVE_WIDL_TRUE@  include/wsdattachment.idl \
+@HAVE_WIDL_TRUE@  include/wsdbase.idl \
+@HAVE_WIDL_TRUE@  include/wsdclient.idl \
+@HAVE_WIDL_TRUE@  include/wsddisco.idl \
+@HAVE_WIDL_TRUE@  include/wsdhost.idl \
+@HAVE_WIDL_TRUE@  include/wsdxml.idl \
 @HAVE_WIDL_TRUE@  include/wtypesbase.idl \
 @HAVE_WIDL_TRUE@  include/windows.foundation.idl \
 @HAVE_WIDL_TRUE@  include/windows.security.cryptography.idl \
diff --git a/mingw-w64-headers/include/wsdattachment.h b/mingw-w64-headers/include/wsdattachment.h
index d784449..dc324e4 100644
--- a/mingw-w64-headers/include/wsdattachment.h
+++ b/mingw-w64-headers/include/wsdattachment.h
@@ -1,102 +1,374 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#ifndef _INC_WSDATTACHMENT
-#define _INC_WSDATTACHMENT
+/*** Autogenerated by WIDL 1.6 from wsdattachment.idl - Do not edit ***/
 
-#ifndef _INC_WSDAPI
-#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
 #endif
 
-#if (_WIN32_WINNT >= 0x0600)
+#include <rpc.h>
+#include <rpcndr.h>
 
-#undef  INTERFACE
-#define INTERFACE IWSDAttachment
-DECLARE_INTERFACE_(IWSDAttachment,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
 #endif
-    /* IWSDAttachment methods */
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDAttachment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDAttachment_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDAttachment_Release(This) (This)->lpVtbl->Release(This)
-#endif /*COBJMACROS*/
+#ifndef __wsdattachment_h__
+#define __wsdattachment_h__
 
-#undef  INTERFACE
-#define INTERFACE IWSDInboundAttachment
-DECLARE_INTERFACE_(IWSDInboundAttachment,IWSDAttachment) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+/* Forward declarations */
 
-    /* IWSDAttachment methods */
+#ifndef __IWSDAttachment_FWD_DEFINED__
+#define __IWSDAttachment_FWD_DEFINED__
+typedef interface IWSDAttachment IWSDAttachment;
 #endif
-    /* IWSDInboundAttachment methods */
-    STDMETHOD_(HRESULT,Read)(THIS_ BYTE *pBuffer,DWORD dwBytesToRead,LPDWORD pdwNumberofBytesRead) PURE;
-    STDMETHOD_(HRESULT,Close)(THIS) PURE;
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDInboundAttachment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDInboundAttachment_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDInboundAttachment_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDInboundAttachment_Read(This,pBuffer,dwBytesToRead,pdwNumberofBytesRead) (This)->lpVtbl->Read(This,pBuffer,dwBytesToRead,pdwNumberofBytesRead)
-#define IWSDInboundAttachment_Close() (This)->lpVtbl->Close(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDOutboundAttachment
-DECLARE_INTERFACE_(IWSDOutboundAttachment,IWSDAttachment) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDAttachment methods */
+#ifndef __IWSDInboundAttachment_FWD_DEFINED__
+#define __IWSDInboundAttachment_FWD_DEFINED__
+typedef interface IWSDInboundAttachment IWSDInboundAttachment;
 #endif
-    /* IWSDOutboundAttachment methods */
-    STDMETHOD_(HRESULT,Write)(THIS_ const BYTE *pBuffer,DWORD dwBytesToWrite,LPDWORD pdwNumberofBytesWritten) PURE;
-    STDMETHOD_(HRESULT,Close)(THIS) PURE;
-    STDMETHOD_(HRESULT,Abort)(THIS) PURE;
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDOutboundAttachment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDOutboundAttachment_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDOutboundAttachment_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDOutboundAttachment_Write(This,pBuffer,dwBytesToWrite,pdwNumberofBytesWritten) (This)->lpVtbl->Write(This,pBuffer,dwBytesToWrite,pdwNumberofBytesWritten)
-#define IWSDOutboundAttachment_Close() (This)->lpVtbl->Close(This)
-#define IWSDOutboundAttachment_Abort() (This)->lpVtbl->Abort(This)
-#endif /*COBJMACROS*/
+#ifndef __IWSDOutboundAttachment_FWD_DEFINED__
+#define __IWSDOutboundAttachment_FWD_DEFINED__
+typedef interface IWSDOutboundAttachment IWSDOutboundAttachment;
+#endif
+
+/* Headers for imported files */
+
+#include <objidl.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-HRESULT WINAPI WSDCreateOutboundAttachment(
-  IWSDOutboundAttachment **attachmentOut
-);
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef _INC_WSDAPI
+#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+#endif
+
+#ifndef __IWSDAttachment_FWD_DEFINED__
+#define __IWSDAttachment_FWD_DEFINED__
+typedef interface IWSDAttachment IWSDAttachment;
+#endif
+
+#ifndef __IWSDInboundAttachment_FWD_DEFINED__
+#define __IWSDInboundAttachment_FWD_DEFINED__
+typedef interface IWSDInboundAttachment IWSDInboundAttachment;
+#endif
+
+#ifndef __IWSDOutboundAttachment_FWD_DEFINED__
+#define __IWSDOutboundAttachment_FWD_DEFINED__
+typedef interface IWSDOutboundAttachment IWSDOutboundAttachment;
+#endif
+
+
+/*****************************************************************************
+ * IWSDAttachment interface
+ */
+#ifndef __IWSDAttachment_INTERFACE_DEFINED__
+#define __IWSDAttachment_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDAttachment, 0x5d55a616, 0x9df8, 0x4b09, 0xb1,0x56, 0x9b,0xa3,0x51,0xa4,0x8b,0x76);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5d55a616-9df8-4b09-b156-9ba351a48b76")
+IWSDAttachment : public IUnknown
+{
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDAttachment, 0x5d55a616, 0x9df8, 0x4b09, 0xb1,0x56, 0x9b,0xa3,0x51,0xa4,0x8b,0x76)
+#endif
+#else
+typedef struct IWSDAttachmentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDAttachment* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDAttachment* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDAttachment* This);
+
+    END_INTERFACE
+} IWSDAttachmentVtbl;
+interface IWSDAttachment {
+    CONST_VTBL IWSDAttachmentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDAttachment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDAttachment_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDAttachment_Release(This) (This)->lpVtbl->Release(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDAttachment_QueryInterface(IWSDAttachment* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDAttachment_AddRef(IWSDAttachment* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDAttachment_Release(IWSDAttachment* This) {
+    return This->lpVtbl->Release(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWSDAttachment_INTERFACE_DEFINED__ */
+
+
+/*****************************************************************************
+ * IWSDInboundAttachment interface
+ */
+#ifndef __IWSDInboundAttachment_INTERFACE_DEFINED__
+#define __IWSDInboundAttachment_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDInboundAttachment, 0x5bd6ca65, 0x233c, 0x4fb8, 0x9f,0x7a, 0x26,0x41,0x61,0x96,0x55,0xc9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5bd6ca65-233c-4fb8-9f7a-2641619655c9")
+IWSDInboundAttachment : public IWSDAttachment
+{
+    virtual HRESULT STDMETHODCALLTYPE Read(
+        BYTE *pBuffer,
+        DWORD dwBytesToRead,
+        LPDWORD pdwNumberOfBytesRead) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Close(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDInboundAttachment, 0x5bd6ca65, 0x233c, 0x4fb8, 0x9f,0x7a, 0x26,0x41,0x61,0x96,0x55,0xc9)
+#endif
+#else
+typedef struct IWSDInboundAttachmentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDInboundAttachment* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDInboundAttachment* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDInboundAttachment* This);
+
+    /*** IWSDInboundAttachment methods ***/
+    HRESULT (STDMETHODCALLTYPE *Read)(
+        IWSDInboundAttachment* This,
+        BYTE *pBuffer,
+        DWORD dwBytesToRead,
+        LPDWORD pdwNumberOfBytesRead);
+
+    HRESULT (STDMETHODCALLTYPE *Close)(
+        IWSDInboundAttachment* This);
+
+    END_INTERFACE
+} IWSDInboundAttachmentVtbl;
+interface IWSDInboundAttachment {
+    CONST_VTBL IWSDInboundAttachmentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDInboundAttachment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDInboundAttachment_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDInboundAttachment_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDInboundAttachment methods ***/
+#define IWSDInboundAttachment_Read(This,pBuffer,dwBytesToRead,pdwNumberOfBytesRead) (This)->lpVtbl->Read(This,pBuffer,dwBytesToRead,pdwNumberOfBytesRead)
+#define IWSDInboundAttachment_Close(This) (This)->lpVtbl->Close(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDInboundAttachment_QueryInterface(IWSDInboundAttachment* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDInboundAttachment_AddRef(IWSDInboundAttachment* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDInboundAttachment_Release(IWSDInboundAttachment* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDInboundAttachment methods ***/
+static FORCEINLINE HRESULT IWSDInboundAttachment_Read(IWSDInboundAttachment* This,BYTE *pBuffer,DWORD dwBytesToRead,LPDWORD pdwNumberOfBytesRead) {
+    return This->lpVtbl->Read(This,pBuffer,dwBytesToRead,pdwNumberOfBytesRead);
+}
+static FORCEINLINE HRESULT IWSDInboundAttachment_Close(IWSDInboundAttachment* This) {
+    return This->lpVtbl->Close(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDInboundAttachment_Read_Proxy(
+    IWSDInboundAttachment* This,
+    BYTE *pBuffer,
+    DWORD dwBytesToRead,
+    LPDWORD pdwNumberOfBytesRead);
+void __RPC_STUB IWSDInboundAttachment_Read_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDInboundAttachment_Close_Proxy(
+    IWSDInboundAttachment* This);
+void __RPC_STUB IWSDInboundAttachment_Close_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDInboundAttachment_INTERFACE_DEFINED__ */
+
+
+/*****************************************************************************
+ * IWSDOutboundAttachment interface
+ */
+#ifndef __IWSDOutboundAttachment_INTERFACE_DEFINED__
+#define __IWSDOutboundAttachment_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDOutboundAttachment, 0xaa302f8d, 0x5a22, 0x4ba5, 0xb3,0x92, 0xaa,0x84,0x86,0xf4,0xc1,0x5d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("aa302f8d-5a22-4ba5-b392-aa8486f4c15d")
+IWSDOutboundAttachment : public IWSDAttachment
+{
+    virtual HRESULT STDMETHODCALLTYPE Write(
+        const BYTE *pBuffer,
+        DWORD dwBytesToWrite,
+        LPDWORD pdwNumberOfBytesWritten) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Close(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abort(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDOutboundAttachment, 0xaa302f8d, 0x5a22, 0x4ba5, 0xb3,0x92, 0xaa,0x84,0x86,0xf4,0xc1,0x5d)
+#endif
+#else
+typedef struct IWSDOutboundAttachmentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDOutboundAttachment* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDOutboundAttachment* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDOutboundAttachment* This);
+
+    /*** IWSDOutboundAttachment methods ***/
+    HRESULT (STDMETHODCALLTYPE *Write)(
+        IWSDOutboundAttachment* This,
+        const BYTE *pBuffer,
+        DWORD dwBytesToWrite,
+        LPDWORD pdwNumberOfBytesWritten);
+
+    HRESULT (STDMETHODCALLTYPE *Close)(
+        IWSDOutboundAttachment* This);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IWSDOutboundAttachment* This);
+
+    END_INTERFACE
+} IWSDOutboundAttachmentVtbl;
+interface IWSDOutboundAttachment {
+    CONST_VTBL IWSDOutboundAttachmentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDOutboundAttachment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDOutboundAttachment_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDOutboundAttachment_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDOutboundAttachment methods ***/
+#define IWSDOutboundAttachment_Write(This,pBuffer,dwBytesToWrite,pdwNumberOfBytesWritten) (This)->lpVtbl->Write(This,pBuffer,dwBytesToWrite,pdwNumberOfBytesWritten)
+#define IWSDOutboundAttachment_Close(This) (This)->lpVtbl->Close(This)
+#define IWSDOutboundAttachment_Abort(This) (This)->lpVtbl->Abort(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDOutboundAttachment_QueryInterface(IWSDOutboundAttachment* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDOutboundAttachment_AddRef(IWSDOutboundAttachment* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDOutboundAttachment_Release(IWSDOutboundAttachment* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDOutboundAttachment methods ***/
+static FORCEINLINE HRESULT IWSDOutboundAttachment_Write(IWSDOutboundAttachment* This,const BYTE *pBuffer,DWORD dwBytesToWrite,LPDWORD pdwNumberOfBytesWritten) {
+    return This->lpVtbl->Write(This,pBuffer,dwBytesToWrite,pdwNumberOfBytesWritten);
+}
+static FORCEINLINE HRESULT IWSDOutboundAttachment_Close(IWSDOutboundAttachment* This) {
+    return This->lpVtbl->Close(This);
+}
+static FORCEINLINE HRESULT IWSDOutboundAttachment_Abort(IWSDOutboundAttachment* This) {
+    return This->lpVtbl->Abort(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDOutboundAttachment_Write_Proxy(
+    IWSDOutboundAttachment* This,
+    const BYTE *pBuffer,
+    DWORD dwBytesToWrite,
+    LPDWORD pdwNumberOfBytesWritten);
+void __RPC_STUB IWSDOutboundAttachment_Write_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDOutboundAttachment_Close_Proxy(
+    IWSDOutboundAttachment* This);
+void __RPC_STUB IWSDOutboundAttachment_Close_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDOutboundAttachment_Abort_Proxy(
+    IWSDOutboundAttachment* This);
+void __RPC_STUB IWSDOutboundAttachment_Abort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDOutboundAttachment_INTERFACE_DEFINED__ */
+
+
+HRESULT WINAPI WSDCreateOutboundAttachment(IWSDOutboundAttachment **ppAttachment);
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_WSDATTACHMENT*/
+#endif /* __wsdattachment_h__ */
diff --git a/mingw-w64-headers/include/wsdattachment.idl b/mingw-w64-headers/include/wsdattachment.idl
new file mode 100644
index 0000000..9ecae56
--- /dev/null
+++ b/mingw-w64-headers/include/wsdattachment.idl
@@ -0,0 +1,43 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+import "objidl.idl";
+
+cpp_quote("")
+cpp_quote("#ifndef _INC_WSDAPI")
+cpp_quote("#error Please include wsdapi.h instead of this header. This header cannot be used directly.")
+cpp_quote("#endif")
+cpp_quote("")
+
+interface IWSDAttachment;
+interface IWSDInboundAttachment;
+interface IWSDOutboundAttachment;
+
+cpp_quote("")
+[object, uuid (5d55a616-9df8-4b09-b156-9ba351a48b76)]
+interface IWSDAttachment : IUnknown {
+}
+
+cpp_quote("")
+[object, local, uuid (5bd6ca65-233c-4fb8-9f7a-2641619655c9)]
+interface IWSDInboundAttachment : IWSDAttachment {
+  HRESULT Read ([out, size_is (dwBytesToRead), length_is (*pdwNumberOfBytesRead)] BYTE *pBuffer,[in] DWORD dwBytesToRead,[out] LPDWORD pdwNumberOfBytesRead);
+  HRESULT Close ();
+}
+
+cpp_quote("")
+[object, local, uuid (aa302f8d-5a22-4ba5-b392-aa8486f4c15d)]
+interface IWSDOutboundAttachment : IWSDAttachment {
+  HRESULT Write ([in, size_is (dwBytesToWrite)] const BYTE *pBuffer,[in] DWORD dwBytesToWrite,[out] LPDWORD pdwNumberOfBytesWritten);
+  HRESULT Close ();
+  HRESULT Abort ();
+}
+
+cpp_quote("")
+cpp_quote("HRESULT WINAPI WSDCreateOutboundAttachment(IWSDOutboundAttachment **ppAttachment);")
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/wsdbase.h b/mingw-w64-headers/include/wsdbase.h
index f11da46..15c6116 100644
--- a/mingw-w64-headers/include/wsdbase.h
+++ b/mingw-w64-headers/include/wsdbase.h
@@ -1,255 +1,1267 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+/*** Autogenerated by WIDL 1.6 from wsdbase.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __wsdbase_h__
+#define __wsdbase_h__
+
+/* Forward declarations */
+
+#ifndef __IWSDAddress_FWD_DEFINED__
+#define __IWSDAddress_FWD_DEFINED__
+typedef interface IWSDAddress IWSDAddress;
+#endif
+
+#ifndef __IWSDTransportAddress_FWD_DEFINED__
+#define __IWSDTransportAddress_FWD_DEFINED__
+typedef interface IWSDTransportAddress IWSDTransportAddress;
+#endif
+
+#ifndef __IWSDMessageParameters_FWD_DEFINED__
+#define __IWSDMessageParameters_FWD_DEFINED__
+typedef interface IWSDMessageParameters IWSDMessageParameters;
+#endif
+
+#ifndef __IWSDUdpMessageParameters_FWD_DEFINED__
+#define __IWSDUdpMessageParameters_FWD_DEFINED__
+typedef interface IWSDUdpMessageParameters IWSDUdpMessageParameters;
+#endif
+
+#ifndef __IWSDUdpAddress_FWD_DEFINED__
+#define __IWSDUdpAddress_FWD_DEFINED__
+typedef interface IWSDUdpAddress IWSDUdpAddress;
+#endif
+
+#ifndef __IWSDHttpMessageParameters_FWD_DEFINED__
+#define __IWSDHttpMessageParameters_FWD_DEFINED__
+typedef interface IWSDHttpMessageParameters IWSDHttpMessageParameters;
+#endif
+
+#ifndef __IWSDHttpAddress_FWD_DEFINED__
+#define __IWSDHttpAddress_FWD_DEFINED__
+typedef interface IWSDHttpAddress IWSDHttpAddress;
+#endif
+
+#ifndef __IWSDSSLClientCertificate_FWD_DEFINED__
+#define __IWSDSSLClientCertificate_FWD_DEFINED__
+typedef interface IWSDSSLClientCertificate IWSDSSLClientCertificate;
+#endif
+
+#ifndef __IWSDHttpAuthParameters_FWD_DEFINED__
+#define __IWSDHttpAuthParameters_FWD_DEFINED__
+typedef interface IWSDHttpAuthParameters IWSDHttpAuthParameters;
+#endif
+
+#ifndef __IWSDSignatureProperty_FWD_DEFINED__
+#define __IWSDSignatureProperty_FWD_DEFINED__
+typedef interface IWSDSignatureProperty IWSDSignatureProperty;
+#endif
+
+/* Headers for imported files */
+
+#include <objidl.h>
+#include <wincrypt.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef __IWSDAddress_FWD_DEFINED__
+#define __IWSDAddress_FWD_DEFINED__
+typedef interface IWSDAddress IWSDAddress;
+#endif
+
+#ifndef __IWSDMessageParameters_FWD_DEFINED__
+#define __IWSDMessageParameters_FWD_DEFINED__
+typedef interface IWSDMessageParameters IWSDMessageParameters;
+#endif
+
+#ifndef __IWSDUdpAddress_FWD_DEFINED__
+#define __IWSDUdpAddress_FWD_DEFINED__
+typedef interface IWSDUdpAddress IWSDUdpAddress;
+#endif
+
+#ifndef __IWSDUdpMessageParameters_FWD_DEFINED__
+#define __IWSDUdpMessageParameters_FWD_DEFINED__
+typedef interface IWSDUdpMessageParameters IWSDUdpMessageParameters;
+#endif
+
+#ifndef __IWSDHttpAddress_FWD_DEFINED__
+#define __IWSDHttpAddress_FWD_DEFINED__
+typedef interface IWSDHttpAddress IWSDHttpAddress;
+#endif
+
+#ifndef __IWSDHttpMessageParameters_FWD_DEFINED__
+#define __IWSDHttpMessageParameters_FWD_DEFINED__
+typedef interface IWSDHttpMessageParameters IWSDHttpMessageParameters;
+#endif
+
+
+#if WINVER >= 0x601
+typedef enum __WIDL_wsdbase_generated_name_00000005 {
+    WSD_CONFIG_MAX_INBOUND_MESSAGE_SIZE = 1,
+    WSD_CONFIG_MAX_OUTBOUND_MESSAGE_SIZE = 2,
+    WSD_SECURITY_SSL_CERT_FOR_CLIENT_AUTH = 3,
+    WSD_SECURITY_SSL_SERVER_CERT_VALIDATION = 4,
+    WSD_SECURITY_SSL_CLIENT_CERT_VALIDATION = 5,
+    WSD_SECURITY_SSL_NEGOTIATE_CLIENT_CERT = 6,
+    WSD_SECURITY_COMPACTSIG_SIGNING_CERT = 7,
+    WSD_SECURITY_COMPACTSIG_VALIDATION = 8,
+    WSD_CONFIG_HOSTING_ADDRESSES = 9,
+    WSD_CONFIG_DEVICE_ADDRESSES = 10,
+    WSD_SECURITY_REQUIRE_HTTP_CLIENT_AUTH = 11,
+    WSD_SECURITY_REQUIRE_CLIENT_CERT_OR_HTTP_CLIENT_AUTH = 12,
+    WSD_SECURITY_USE_HTTP_CLIENT_AUTH = 13
+} WSD_CONFIG_PARAM_TYPE;
+typedef struct _WSD_CONFIG_PARAM {
+    WSD_CONFIG_PARAM_TYPE configParamType;
+    PVOID pConfigData;
+    DWORD dwConfigDataSize;
+} WSD_CONFIG_PARAM;
+typedef struct _WSD_CONFIG_PARAM *PWSD_CONFIG_PARAM;
+typedef struct _WSD_SECURITY_CERT_VALIDATION_V1 {
+    PCCERT_CONTEXT *certMatchArray;
+    DWORD dwCertMatchArrayCount;
+    HCERTSTORE hCertMatchStore;
+    HCERTSTORE hCertIssuerStore;
+    DWORD dwCertCheckOptions;
+} WSD_SECURITY_CERT_VALIDATION_V1;
+#if _WIN32_WINNT >= 0x602
+typedef struct _WSD_SECURITY_CERT_VALIDATION {
+    PCCERT_CONTEXT *certMatchArray;
+    DWORD dwCertMatchArrayCount;
+    HCERTSTORE hCertMatchStore;
+    HCERTSTORE hCertIssuerStore;
+    DWORD dwCertCheckOptions;
+    LPCWSTR pszCNGHashAlgId;
+    BYTE *pbCertHash;
+    DWORD dwCertHashSize;
+} WSD_SECURITY_CERT_VALIDATION;
+#else
+typedef WSD_SECURITY_CERT_VALIDATION_V1 WSD_SECURITY_CERT_VALIDATION;
+#endif
+
+typedef WSD_SECURITY_CERT_VALIDATION *PWSD_SECURITY_CERT_VALIDATION;
+typedef struct _WSD_SECURITY_SIGNATURE_VALIDATION {
+    PCCERT_CONTEXT *signingCertArray;
+    DWORD dwSigningCertArrayCount;
+    HCERTSTORE hSigningCertStore;
+    DWORD dwFlags;
+} WSD_SECURITY_SIGNATURE_VALIDATION;
+typedef struct _WSD_SECURITY_SIGNATURE_VALIDATION *PWSD_SECURITY_SIGNATURE_VALIDATION;
+typedef DWORD WSD_SECURITY_HTTP_AUTH_SCHEMES;
+typedef DWORD *PWSD_SECURITY_HTTP_AUTH_SCHEMES;
+
+#define WSDAPI_SSL_CERT_APPLY_DEFAULT_CHECKS 0x0
+#define WSDAPI_SSL_CERT_IGNORE_REVOCATION 0x1
+#define WSDAPI_SSL_CERT_IGNORE_EXPIRY 0x2
+#define WSDAPI_SSL_CERT_IGNORE_WRONG_USAGE 0x4
+#define WSDAPI_SSL_CERT_IGNORE_UNKNOWN_CA 0x8
+#define WSDAPI_SSL_CERT_IGNORE_INVALID_CN 0x10
+
+#define WSDAPI_COMPACTSIG_ACCEPT_ALL_MESSAGES 0x1
+
+#define WSD_SECURITY_HTTP_AUTH_SCHEME_NEGOTIATE 0x1
+#define WSD_SECURITY_HTTP_AUTH_SCHEME_NTLM 0x2
+
+typedef struct _WSD_CONFIG_ADDRESSES {
+    IWSDAddress **addresses;
+    DWORD dwAddressCount;
+} WSD_CONFIG_ADDRESSES;
+typedef struct _WSD_CONFIG_ADDRESSES *PWSD_CONFIG_ADDRESSES;
+#endif
+#define WSDAPI_ADDRESSFAMILY_IPV4 1
+#define WSDAPI_ADDRESSFAMILY_IPV6 2
+/*****************************************************************************
+ * IWSDAddress interface
  */
-#ifndef _INC_WSDBASE
-#define _INC_WSDBASE
+#ifndef __IWSDAddress_INTERFACE_DEFINED__
+#define __IWSDAddress_INTERFACE_DEFINED__
 
-#ifndef _INC_WSDAPI
-#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+DEFINE_GUID(IID_IWSDAddress, 0xb9574c6c, 0x12a6, 0x4f74, 0x93,0xa1, 0x33,0x18,0xff,0x60,0x57,0x59);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b9574c6c-12a6-4f74-93a1-3318ff605759")
+IWSDAddress : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Serialize(
+        LPWSTR pszBuffer,
+        DWORD cchLength,
+        WINBOOL fSafe) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Deserialize(
+        LPCWSTR pszBuffer) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDAddress, 0xb9574c6c, 0x12a6, 0x4f74, 0x93,0xa1, 0x33,0x18,0xff,0x60,0x57,0x59)
 #endif
+#else
+typedef struct IWSDAddressVtbl {
+    BEGIN_INTERFACE
 
-#if (_WIN32_WINNT >= 0x0600)
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDAddress* This,
+        REFIID riid,
+        void **ppvObject);
 
-typedef enum _WSDUdpMessageType {
-  ONE_WAY   = 0,
-  TWO_WAY   = 1 
-} WSDUdpMessageType;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDAddress* This);
 
-typedef struct _WSDUpdRetransmitParams {
-  ULONG ulSendDelay;
-  ULONG ulRepeat;
-  ULONG ulRepeatMinDelay;
-  ULONG ulRepeatMaxDelay;
-  ULONG ulRepeatUpperDelay;
-} WSDUdpRetransmitParams, *PWSDUdpRetransmitParams;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDAddress* This);
 
-#undef  INTERFACE
-#define INTERFACE IWSDAddress
-DECLARE_INTERFACE_(IWSDAddress,IUnknown) {
-  BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDAddress methods */
-    STDMETHOD_(HRESULT, Serialize) (THIS_ LPWSTR pszBuffer, DWORD cchLength, WINBOOL fSafe);
-    STDMETHOD_(HRESULT,Deserialize) (THIS_ LPCWSTR pszBuffer);
+    /*** IWSDAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *Serialize)(
+        IWSDAddress* This,
+        LPWSTR pszBuffer,
+        DWORD cchLength,
+        WINBOOL fSafe);
+
+    HRESULT (STDMETHODCALLTYPE *Deserialize)(
+        IWSDAddress* This,
+        LPCWSTR pszBuffer);
 
     END_INTERFACE
+} IWSDAddressVtbl;
+interface IWSDAddress {
+    CONST_VTBL IWSDAddressVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDAddress_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDAddress methods ***/
 #define IWSDAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
 #define IWSDAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDTransportAddress
-DECLARE_INTERFACE_(IWSDTransportAddress,IWSDAddress)
-{
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDAddress methods */
-    STDMETHOD_(HRESULT, Serialize) (THIS_ LPWSTR pszBuffer, DWORD cchLength, WINBOOL fSafe);
-    STDMETHOD_(HRESULT,Deserialize) (THIS_ LPCWSTR pszBuffer);
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDAddress_QueryInterface(IWSDAddress* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDAddress_AddRef(IWSDAddress* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDAddress_Release(IWSDAddress* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDAddress methods ***/
+static FORCEINLINE HRESULT IWSDAddress_Serialize(IWSDAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
+    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
+}
+static FORCEINLINE HRESULT IWSDAddress_Deserialize(IWSDAddress* This,LPCWSTR pszBuffer) {
+    return This->lpVtbl->Deserialize(This,pszBuffer);
+}
 #endif
-    /* IWSDTransportAddress methods */
-    STDMETHOD_(HRESULT,GetPort)(THIS_ WORD *pwPort) PURE;
-    STDMETHOD_(HRESULT,SetPort)(THIS_ WORD wPort) PURE;
-    STDMETHOD_(HRESULT,GetTransportAddress)(THIS_ LPCWSTR *ppszAddress) PURE;
-    STDMETHOD_(HRESULT,GetTransportAddressEx)(THIS_ WINBOOL fSafe,LPCWSTR *ppszAddress) PURE;
-    STDMETHOD_(HRESULT,SetTransportAddress)(THIS_ LPCWSTR pszAddress) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDAddress_Serialize_Proxy(
+    IWSDAddress* This,
+    LPWSTR pszBuffer,
+    DWORD cchLength,
+    WINBOOL fSafe);
+void __RPC_STUB IWSDAddress_Serialize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAddress_Deserialize_Proxy(
+    IWSDAddress* This,
+    LPCWSTR pszBuffer);
+void __RPC_STUB IWSDAddress_Deserialize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDAddress_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDTransportAddress interface
+ */
+#ifndef __IWSDTransportAddress_INTERFACE_DEFINED__
+#define __IWSDTransportAddress_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDTransportAddress, 0x70d23498, 0x4ee6, 0x4340, 0xa3,0xdf, 0xd8,0x45,0xd2,0x23,0x54,0x67);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("70d23498-4ee6-4340-a3df-d845d2235467")
+IWSDTransportAddress : public IWSDAddress
+{
+    virtual HRESULT STDMETHODCALLTYPE GetPort(
+        WORD *pwPort) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetPort(
+        WORD wPort) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTransportAddress(
+        LPCWSTR *ppszAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTransportAddressEx(
+        WINBOOL fSafe,
+        LPCWSTR *ppszAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTransportAddress(
+        LPCWSTR pszAddress) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDTransportAddress, 0x70d23498, 0x4ee6, 0x4340, 0xa3,0xdf, 0xd8,0x45,0xd2,0x23,0x54,0x67)
+#endif
+#else
+typedef struct IWSDTransportAddressVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDTransportAddress* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDTransportAddress* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDTransportAddress* This);
+
+    /*** IWSDAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *Serialize)(
+        IWSDTransportAddress* This,
+        LPWSTR pszBuffer,
+        DWORD cchLength,
+        WINBOOL fSafe);
+
+    HRESULT (STDMETHODCALLTYPE *Deserialize)(
+        IWSDTransportAddress* This,
+        LPCWSTR pszBuffer);
+
+    /*** IWSDTransportAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPort)(
+        IWSDTransportAddress* This,
+        WORD *pwPort);
+
+    HRESULT (STDMETHODCALLTYPE *SetPort)(
+        IWSDTransportAddress* This,
+        WORD wPort);
+
+    HRESULT (STDMETHODCALLTYPE *GetTransportAddress)(
+        IWSDTransportAddress* This,
+        LPCWSTR *ppszAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetTransportAddressEx)(
+        IWSDTransportAddress* This,
+        WINBOOL fSafe,
+        LPCWSTR *ppszAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetTransportAddress)(
+        IWSDTransportAddress* This,
+        LPCWSTR pszAddress);
 
     END_INTERFACE
+} IWSDTransportAddressVtbl;
+interface IWSDTransportAddress {
+    CONST_VTBL IWSDTransportAddressVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDTransportAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDTransportAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDTransportAddress_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDAddress methods ***/
+#define IWSDTransportAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
+#define IWSDTransportAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
+/*** IWSDTransportAddress methods ***/
 #define IWSDTransportAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
 #define IWSDTransportAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
 #define IWSDTransportAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
 #define IWSDTransportAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
 #define IWSDTransportAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDMessageParameters
-DECLARE_INTERFACE_(IWSDMessageParameters,IUnknown) {
-  BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDTransportAddress_QueryInterface(IWSDTransportAddress* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDTransportAddress_AddRef(IWSDTransportAddress* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDTransportAddress_Release(IWSDTransportAddress* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDAddress methods ***/
+static FORCEINLINE HRESULT IWSDTransportAddress_Serialize(IWSDTransportAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
+    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
+}
+static FORCEINLINE HRESULT IWSDTransportAddress_Deserialize(IWSDTransportAddress* This,LPCWSTR pszBuffer) {
+    return This->lpVtbl->Deserialize(This,pszBuffer);
+}
+/*** IWSDTransportAddress methods ***/
+static FORCEINLINE HRESULT IWSDTransportAddress_GetPort(IWSDTransportAddress* This,WORD *pwPort) {
+    return This->lpVtbl->GetPort(This,pwPort);
+}
+static FORCEINLINE HRESULT IWSDTransportAddress_SetPort(IWSDTransportAddress* This,WORD wPort) {
+    return This->lpVtbl->SetPort(This,wPort);
+}
+static FORCEINLINE HRESULT IWSDTransportAddress_GetTransportAddress(IWSDTransportAddress* This,LPCWSTR *ppszAddress) {
+    return This->lpVtbl->GetTransportAddress(This,ppszAddress);
+}
+static FORCEINLINE HRESULT IWSDTransportAddress_GetTransportAddressEx(IWSDTransportAddress* This,WINBOOL fSafe,LPCWSTR *ppszAddress) {
+    return This->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress);
+}
+static FORCEINLINE HRESULT IWSDTransportAddress_SetTransportAddress(IWSDTransportAddress* This,LPCWSTR pszAddress) {
+    return This->lpVtbl->SetTransportAddress(This,pszAddress);
+}
 #endif
-    /* IWSDMessageParameters methods */
-    STDMETHOD_(HRESULT, GetLocalAddress) (THIS_ IWSDAddress **ppAddress);
-    STDMETHOD_(HRESULT, SetLocalAddress) (THIS_ IWSDAddress *pAddress);
-    STDMETHOD_(HRESULT,GetRemoteAddress) (THIS_ IWSDAddress **ppAddress);
-    STDMETHOD_(HRESULT,SetRemoteAddress) (THIS_ IWSDAddress *pAddress);
-    STDMETHOD_(HRESULT,GetLowerParameters) (THIS_ IWSDMessageParameters **ppTxParams);
+#endif
 
-  END_INTERFACE
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDTransportAddress_GetPort_Proxy(
+    IWSDTransportAddress* This,
+    WORD *pwPort);
+void __RPC_STUB IWSDTransportAddress_GetPort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDTransportAddress_SetPort_Proxy(
+    IWSDTransportAddress* This,
+    WORD wPort);
+void __RPC_STUB IWSDTransportAddress_SetPort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDTransportAddress_GetTransportAddress_Proxy(
+    IWSDTransportAddress* This,
+    LPCWSTR *ppszAddress);
+void __RPC_STUB IWSDTransportAddress_GetTransportAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDTransportAddress_GetTransportAddressEx_Proxy(
+    IWSDTransportAddress* This,
+    WINBOOL fSafe,
+    LPCWSTR *ppszAddress);
+void __RPC_STUB IWSDTransportAddress_GetTransportAddressEx_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDTransportAddress_SetTransportAddress_Proxy(
+    IWSDTransportAddress* This,
+    LPCWSTR pszAddress);
+void __RPC_STUB IWSDTransportAddress_SetTransportAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDTransportAddress_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDMessageParameters interface
+ */
+#ifndef __IWSDMessageParameters_INTERFACE_DEFINED__
+#define __IWSDMessageParameters_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDMessageParameters, 0x1fafe8a2, 0xe6fc, 0x4b80, 0xb6,0xcf, 0xb7,0xd4,0x5c,0x41,0x6d,0x7c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1fafe8a2-e6fc-4b80-b6cf-b7d45c416d7c")
+IWSDMessageParameters : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetLocalAddress(
+        IWSDAddress **ppAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLocalAddress(
+        IWSDAddress *pAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRemoteAddress(
+        IWSDAddress **ppAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetRemoteAddress(
+        IWSDAddress *pAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLowerParameters(
+        IWSDMessageParameters **ppTxParams) = 0;
+
 };
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDMessageParameters, 0x1fafe8a2, 0xe6fc, 0x4b80, 0xb6,0xcf, 0xb7,0xd4,0x5c,0x41,0x6d,0x7c)
+#endif
+#else
+typedef struct IWSDMessageParametersVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDMessageParameters* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDMessageParameters* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDMessageParameters* This);
+
+    /*** IWSDMessageParameters methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLocalAddress)(
+        IWSDMessageParameters* This,
+        IWSDAddress **ppAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocalAddress)(
+        IWSDMessageParameters* This,
+        IWSDAddress *pAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetRemoteAddress)(
+        IWSDMessageParameters* This,
+        IWSDAddress **ppAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetRemoteAddress)(
+        IWSDMessageParameters* This,
+        IWSDAddress *pAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetLowerParameters)(
+        IWSDMessageParameters* This,
+        IWSDMessageParameters **ppTxParams);
+
+    END_INTERFACE
+} IWSDMessageParametersVtbl;
+interface IWSDMessageParameters {
+    CONST_VTBL IWSDMessageParametersVtbl* lpVtbl;
+};
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDMessageParameters_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDMessageParameters methods ***/
 #define IWSDMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
 #define IWSDMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
 #define IWSDMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
 #define IWSDMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
 #define IWSDMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDHttpAddress
-DECLARE_INTERFACE_(IWSDHttpAddress,IWSDTransportAddress) {
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDAddress methods */
-    STDMETHOD_(HRESULT, Serialize) (THIS_ LPWSTR pszBuffer, DWORD cchLength, WINBOOL fSafe);
-    STDMETHOD_(HRESULT,Deserialize) (THIS_ LPCWSTR pszBuffer);
-
-    /* IWSDTransportAddress methods */
-    STDMETHOD_(HRESULT,GetPort)(THIS_ WORD *pwPort) PURE;
-    STDMETHOD_(HRESULT,SetPort)(THIS_ WORD wPort) PURE;
-    STDMETHOD_(HRESULT,GetTransportAddress)(THIS_ LPCWSTR *ppszAddress) PURE;
-    STDMETHOD_(HRESULT,GetTransportAddressEx)(THIS_ WINBOOL fSafe,LPCWSTR *ppszAddress) PURE;
-    STDMETHOD_(HRESULT,SetTransportAddress)(THIS_ LPCWSTR pszAddress) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDMessageParameters_QueryInterface(IWSDMessageParameters* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDMessageParameters_AddRef(IWSDMessageParameters* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDMessageParameters_Release(IWSDMessageParameters* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDMessageParameters methods ***/
+static FORCEINLINE HRESULT IWSDMessageParameters_GetLocalAddress(IWSDMessageParameters* This,IWSDAddress **ppAddress) {
+    return This->lpVtbl->GetLocalAddress(This,ppAddress);
+}
+static FORCEINLINE HRESULT IWSDMessageParameters_SetLocalAddress(IWSDMessageParameters* This,IWSDAddress *pAddress) {
+    return This->lpVtbl->SetLocalAddress(This,pAddress);
+}
+static FORCEINLINE HRESULT IWSDMessageParameters_GetRemoteAddress(IWSDMessageParameters* This,IWSDAddress **ppAddress) {
+    return This->lpVtbl->GetRemoteAddress(This,ppAddress);
+}
+static FORCEINLINE HRESULT IWSDMessageParameters_SetRemoteAddress(IWSDMessageParameters* This,IWSDAddress *pAddress) {
+    return This->lpVtbl->SetRemoteAddress(This,pAddress);
+}
+static FORCEINLINE HRESULT IWSDMessageParameters_GetLowerParameters(IWSDMessageParameters* This,IWSDMessageParameters **ppTxParams) {
+    return This->lpVtbl->GetLowerParameters(This,ppTxParams);
+}
 #endif
-    /* IWSDHttpAddress methods */
-    STDMETHOD_(HRESULT,GetSecure)(THIS) PURE;
-    STDMETHOD_(HRESULT,SetSecure)(THIS_ WINBOOL fSecure) PURE;
-    STDMETHOD_(HRESULT,GetPath)(THIS_ LPCWSTR *ppszPath) PURE;
-    STDMETHOD_(HRESULT,SetPath)(THIS_ LPCWSTR pszPath) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDMessageParameters_GetLocalAddress_Proxy(
+    IWSDMessageParameters* This,
+    IWSDAddress **ppAddress);
+void __RPC_STUB IWSDMessageParameters_GetLocalAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDMessageParameters_SetLocalAddress_Proxy(
+    IWSDMessageParameters* This,
+    IWSDAddress *pAddress);
+void __RPC_STUB IWSDMessageParameters_SetLocalAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDMessageParameters_GetRemoteAddress_Proxy(
+    IWSDMessageParameters* This,
+    IWSDAddress **ppAddress);
+void __RPC_STUB IWSDMessageParameters_GetRemoteAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDMessageParameters_SetRemoteAddress_Proxy(
+    IWSDMessageParameters* This,
+    IWSDAddress *pAddress);
+void __RPC_STUB IWSDMessageParameters_SetRemoteAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDMessageParameters_GetLowerParameters_Proxy(
+    IWSDMessageParameters* This,
+    IWSDMessageParameters **ppTxParams);
+void __RPC_STUB IWSDMessageParameters_GetLowerParameters_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDMessageParameters_INTERFACE_DEFINED__ */
+
+HRESULT WINAPI
+WSDCreateUdpMessageParameters(
+IWSDUdpMessageParameters** ppTxParams);
+typedef struct _WSDUdpRetransmitParams {
+    ULONG ulSendDelay;
+    ULONG ulRepeat;
+    ULONG ulRepeatMinDelay;
+    ULONG ulRepeatMaxDelay;
+    ULONG ulRepeatUpperDelay;
+} WSDUdpRetransmitParams;
+/*****************************************************************************
+ * IWSDUdpMessageParameters interface
+ */
+#ifndef __IWSDUdpMessageParameters_INTERFACE_DEFINED__
+#define __IWSDUdpMessageParameters_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDUdpMessageParameters, 0x9934149f, 0x8f0c, 0x447b, 0xaa,0x0b, 0x73,0x12,0x4b,0x0c,0xa7,0xf0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("9934149f-8f0c-447b-aa0b-73124b0ca7f0")
+IWSDUdpMessageParameters : public IWSDMessageParameters
+{
+    virtual HRESULT STDMETHODCALLTYPE SetRetransmitParams(
+        const WSDUdpRetransmitParams *pParams) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRetransmitParams(
+        WSDUdpRetransmitParams *pParams) = 0;
+
 };
-#ifdef COBJMACROS
-#define IWSDHttpAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDHttpAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDHttpAddress_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDHttpAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
-#define IWSDHttpAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
-#define IWSDHttpAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
-#define IWSDHttpAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
-#define IWSDHttpAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
-#define IWSDHttpAddress_GetSecure() (This)->lpVtbl->GetSecure(This)
-#define IWSDHttpAddress_SetSecure(This,fSecure) (This)->lpVtbl->SetSecure(This,fSecure)
-#define IWSDHttpAddress_GetPath(This,ppszPath) (This)->lpVtbl->GetPath(This,ppszPath)
-#define IWSDHttpAddress_SetPath(This,pszPath) (This)->lpVtbl->SetPath(This,pszPath)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDUdpAddress
-DECLARE_INTERFACE_(IWSDUdpAddress,IWSDTransportAddress) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDAddress methods */
-    STDMETHOD_(HRESULT, Serialize) (THIS_ LPWSTR pszBuffer, DWORD cchLength, WINBOOL fSafe);
-    STDMETHOD_(HRESULT,Deserialize) (THIS_ LPCWSTR pszBuffer);
-
-    /* IWSDTransportAddress methods */
-    STDMETHOD_(HRESULT,GetPort)(THIS_ WORD *pwPort) PURE;
-    STDMETHOD_(HRESULT,SetPort)(THIS_ WORD wPort) PURE;
-    STDMETHOD_(HRESULT,GetTransportAddress)(THIS_ LPCWSTR *ppszAddress) PURE;
-    STDMETHOD_(HRESULT,GetTransportAddressEx)(THIS_ WINBOOL fSafe,LPCWSTR *ppszAddress) PURE;
-    STDMETHOD_(HRESULT,SetTransportAddress)(THIS_ LPCWSTR pszAddress) PURE;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDUdpMessageParameters, 0x9934149f, 0x8f0c, 0x447b, 0xaa,0x0b, 0x73,0x12,0x4b,0x0c,0xa7,0xf0)
 #endif
-    /* IWSDUdpAddress methods */
-    STDMETHOD_(HRESULT,SetSockaddr)(THIS_ const SOCKADDR_STORAGE *pSockAddr) PURE;
-    STDMETHOD_(HRESULT *,GetSockaddr)(THIS_ SOCKADDR_STORAGE *pSockAddr) PURE;
-    STDMETHOD_(HRESULT,SetExclusive)(THIS_ WINBOOL fExclusive) PURE;
-    STDMETHOD_(HRESULT,GetExclusive)(THIS) PURE;
-    STDMETHOD_(HRESULT,SetMessageType)(THIS_ WSDUdpMessageType messageType) PURE;
-    STDMETHOD_(HRESULT,GetMessageType)(THIS_ WSDUdpMessageType *pMessageType) PURE;
-    STDMETHOD_(HRESULT,SetTTL)(THIS_ DWORD dwTTL) PURE;
-    STDMETHOD_(HRESULT,GetTTL)(THIS_ DWORD *pdwTTL) PURE;
-    STDMETHOD_(HRESULT,SetAlias)(THIS_ const GUID *pAlias) PURE;
-    STDMETHOD_(HRESULT,GetAlias)(THIS_ GUID *pAlias) PURE;
+#else
+typedef struct IWSDUdpMessageParametersVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDUdpMessageParameters* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDUdpMessageParameters* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDUdpMessageParameters* This);
+
+    /*** IWSDMessageParameters methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLocalAddress)(
+        IWSDUdpMessageParameters* This,
+        IWSDAddress **ppAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocalAddress)(
+        IWSDUdpMessageParameters* This,
+        IWSDAddress *pAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetRemoteAddress)(
+        IWSDUdpMessageParameters* This,
+        IWSDAddress **ppAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetRemoteAddress)(
+        IWSDUdpMessageParameters* This,
+        IWSDAddress *pAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetLowerParameters)(
+        IWSDUdpMessageParameters* This,
+        IWSDMessageParameters **ppTxParams);
+
+    /*** IWSDUdpMessageParameters methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetRetransmitParams)(
+        IWSDUdpMessageParameters* This,
+        const WSDUdpRetransmitParams *pParams);
+
+    HRESULT (STDMETHODCALLTYPE *GetRetransmitParams)(
+        IWSDUdpMessageParameters* This,
+        WSDUdpRetransmitParams *pParams);
 
     END_INTERFACE
+} IWSDUdpMessageParametersVtbl;
+interface IWSDUdpMessageParameters {
+    CONST_VTBL IWSDUdpMessageParametersVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDUdpMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDUdpMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDUdpMessageParameters_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDMessageParameters methods ***/
+#define IWSDUdpMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
+#define IWSDUdpMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
+#define IWSDUdpMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
+#define IWSDUdpMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
+#define IWSDUdpMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
+/*** IWSDUdpMessageParameters methods ***/
+#define IWSDUdpMessageParameters_SetRetransmitParams(This,pParams) (This)->lpVtbl->SetRetransmitParams(This,pParams)
+#define IWSDUdpMessageParameters_GetRetransmitParams(This,pParams) (This)->lpVtbl->GetRetransmitParams(This,pParams)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_QueryInterface(IWSDUdpMessageParameters* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDUdpMessageParameters_AddRef(IWSDUdpMessageParameters* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDUdpMessageParameters_Release(IWSDUdpMessageParameters* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDMessageParameters methods ***/
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetLocalAddress(IWSDUdpMessageParameters* This,IWSDAddress **ppAddress) {
+    return This->lpVtbl->GetLocalAddress(This,ppAddress);
+}
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_SetLocalAddress(IWSDUdpMessageParameters* This,IWSDAddress *pAddress) {
+    return This->lpVtbl->SetLocalAddress(This,pAddress);
+}
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetRemoteAddress(IWSDUdpMessageParameters* This,IWSDAddress **ppAddress) {
+    return This->lpVtbl->GetRemoteAddress(This,ppAddress);
+}
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_SetRemoteAddress(IWSDUdpMessageParameters* This,IWSDAddress *pAddress) {
+    return This->lpVtbl->SetRemoteAddress(This,pAddress);
+}
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetLowerParameters(IWSDUdpMessageParameters* This,IWSDMessageParameters **ppTxParams) {
+    return This->lpVtbl->GetLowerParameters(This,ppTxParams);
+}
+/*** IWSDUdpMessageParameters methods ***/
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_SetRetransmitParams(IWSDUdpMessageParameters* This,const WSDUdpRetransmitParams *pParams) {
+    return This->lpVtbl->SetRetransmitParams(This,pParams);
+}
+static FORCEINLINE HRESULT IWSDUdpMessageParameters_GetRetransmitParams(IWSDUdpMessageParameters* This,WSDUdpRetransmitParams *pParams) {
+    return This->lpVtbl->GetRetransmitParams(This,pParams);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDUdpMessageParameters_SetRetransmitParams_Proxy(
+    IWSDUdpMessageParameters* This,
+    const WSDUdpRetransmitParams *pParams);
+void __RPC_STUB IWSDUdpMessageParameters_SetRetransmitParams_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpMessageParameters_GetRetransmitParams_Proxy(
+    IWSDUdpMessageParameters* This,
+    WSDUdpRetransmitParams *pParams);
+void __RPC_STUB IWSDUdpMessageParameters_GetRetransmitParams_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDUdpMessageParameters_INTERFACE_DEFINED__ */
+
+HRESULT WINAPI
+WSDCreateUdpAddress(
+ IWSDUdpAddress** ppAddress);
+#if 1
+
+#ifndef __CSADDR_DEFINED__
+struct SOCKADDR_STORAGE;
+#endif
+#else
+typedef void SOCKADDR_STORAGE;
+#endif
+typedef enum _WSDUdpMessageType {
+    ONE_WAY = 0,
+    TWO_WAY = 1
+} WSDUdpMessageType;
+/*****************************************************************************
+ * IWSDUdpAddress interface
+ */
+#ifndef __IWSDUdpAddress_INTERFACE_DEFINED__
+#define __IWSDUdpAddress_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDUdpAddress, 0x74d6124a, 0xa441, 0x4f78, 0xa1,0xeb, 0x97,0xa8,0xd1,0x99,0x68,0x93);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("74d6124a-a441-4f78-a1eb-97a8d1996893")
+IWSDUdpAddress : public IWSDTransportAddress
+{
+    virtual HRESULT STDMETHODCALLTYPE SetSockaddr(
+        const SOCKADDR_STORAGE *pSockAddr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSockaddr(
+        SOCKADDR_STORAGE *pSockAddr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetExclusive(
+        WINBOOL fExclusive) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetExclusive(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetMessageType(
+        WSDUdpMessageType messageType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMessageType(
+        WSDUdpMessageType *pMessageType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTTL(
+        DWORD dwTTL) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTTL(
+        DWORD *pdwTTL) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetAlias(
+        const GUID *pAlias) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAlias(
+        GUID *pAlias) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDUdpAddress, 0x74d6124a, 0xa441, 0x4f78, 0xa1,0xeb, 0x97,0xa8,0xd1,0x99,0x68,0x93)
+#endif
+#else
+typedef struct IWSDUdpAddressVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDUdpAddress* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDUdpAddress* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDUdpAddress* This);
+
+    /*** IWSDAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *Serialize)(
+        IWSDUdpAddress* This,
+        LPWSTR pszBuffer,
+        DWORD cchLength,
+        WINBOOL fSafe);
+
+    HRESULT (STDMETHODCALLTYPE *Deserialize)(
+        IWSDUdpAddress* This,
+        LPCWSTR pszBuffer);
+
+    /*** IWSDTransportAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPort)(
+        IWSDUdpAddress* This,
+        WORD *pwPort);
+
+    HRESULT (STDMETHODCALLTYPE *SetPort)(
+        IWSDUdpAddress* This,
+        WORD wPort);
+
+    HRESULT (STDMETHODCALLTYPE *GetTransportAddress)(
+        IWSDUdpAddress* This,
+        LPCWSTR *ppszAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetTransportAddressEx)(
+        IWSDUdpAddress* This,
+        WINBOOL fSafe,
+        LPCWSTR *ppszAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetTransportAddress)(
+        IWSDUdpAddress* This,
+        LPCWSTR pszAddress);
+
+    /*** IWSDUdpAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetSockaddr)(
+        IWSDUdpAddress* This,
+        const SOCKADDR_STORAGE *pSockAddr);
+
+    HRESULT (STDMETHODCALLTYPE *GetSockaddr)(
+        IWSDUdpAddress* This,
+        SOCKADDR_STORAGE *pSockAddr);
+
+    HRESULT (STDMETHODCALLTYPE *SetExclusive)(
+        IWSDUdpAddress* This,
+        WINBOOL fExclusive);
+
+    HRESULT (STDMETHODCALLTYPE *GetExclusive)(
+        IWSDUdpAddress* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetMessageType)(
+        IWSDUdpAddress* This,
+        WSDUdpMessageType messageType);
+
+    HRESULT (STDMETHODCALLTYPE *GetMessageType)(
+        IWSDUdpAddress* This,
+        WSDUdpMessageType *pMessageType);
+
+    HRESULT (STDMETHODCALLTYPE *SetTTL)(
+        IWSDUdpAddress* This,
+        DWORD dwTTL);
+
+    HRESULT (STDMETHODCALLTYPE *GetTTL)(
+        IWSDUdpAddress* This,
+        DWORD *pdwTTL);
+
+    HRESULT (STDMETHODCALLTYPE *SetAlias)(
+        IWSDUdpAddress* This,
+        const GUID *pAlias);
+
+    HRESULT (STDMETHODCALLTYPE *GetAlias)(
+        IWSDUdpAddress* This,
+        GUID *pAlias);
+
+    END_INTERFACE
+} IWSDUdpAddressVtbl;
+interface IWSDUdpAddress {
+    CONST_VTBL IWSDUdpAddressVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDUdpAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDUdpAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDUdpAddress_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDAddress methods ***/
+#define IWSDUdpAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
+#define IWSDUdpAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
+/*** IWSDTransportAddress methods ***/
 #define IWSDUdpAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
 #define IWSDUdpAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
 #define IWSDUdpAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
 #define IWSDUdpAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
 #define IWSDUdpAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
+/*** IWSDUdpAddress methods ***/
 #define IWSDUdpAddress_SetSockaddr(This,pSockAddr) (This)->lpVtbl->SetSockaddr(This,pSockAddr)
 #define IWSDUdpAddress_GetSockaddr(This,pSockAddr) (This)->lpVtbl->GetSockaddr(This,pSockAddr)
 #define IWSDUdpAddress_SetExclusive(This,fExclusive) (This)->lpVtbl->SetExclusive(This,fExclusive)
-#define IWSDUdpAddress_GetExclusive() (This)->lpVtbl->GetExclusive(This)
+#define IWSDUdpAddress_GetExclusive(This) (This)->lpVtbl->GetExclusive(This)
 #define IWSDUdpAddress_SetMessageType(This,messageType) (This)->lpVtbl->SetMessageType(This,messageType)
 #define IWSDUdpAddress_GetMessageType(This,pMessageType) (This)->lpVtbl->GetMessageType(This,pMessageType)
 #define IWSDUdpAddress_SetTTL(This,dwTTL) (This)->lpVtbl->SetTTL(This,dwTTL)
 #define IWSDUdpAddress_GetTTL(This,pdwTTL) (This)->lpVtbl->GetTTL(This,pdwTTL)
 #define IWSDUdpAddress_SetAlias(This,pAlias) (This)->lpVtbl->SetAlias(This,pAlias)
 #define IWSDUdpAddress_GetAlias(This,pAlias) (This)->lpVtbl->GetAlias(This,pAlias)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDHttpMessageParameters
-DECLARE_INTERFACE_(IWSDHttpMessageParameters,IWSDMessageParameters) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDServiceMessaging methods */
-    STDMETHOD_(HRESULT,GetLocalAddress)(THIS_ IWSDAddress **ppAddress) PURE;
-    STDMETHOD_(HRESULT,SetLocalAddress)(THIS_ IWSDAddress *pAddress) PURE;
-    STDMETHOD_(HRESULT,GetRemoteAddress)(THIS_ IWSDAddress **ppAddress) PURE;
-    STDMETHOD_(HRESULT,SetRemoteAddress)(THIS_ IWSDAddress *pAddress) PURE;
-    STDMETHOD_(HRESULT,GetLowerParameters)(THIS_ IWSDMessageParameters **ppTxParams) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDUdpAddress_QueryInterface(IWSDUdpAddress* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDUdpAddress_AddRef(IWSDUdpAddress* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDUdpAddress_Release(IWSDUdpAddress* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDAddress methods ***/
+static FORCEINLINE HRESULT IWSDUdpAddress_Serialize(IWSDUdpAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
+    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_Deserialize(IWSDUdpAddress* This,LPCWSTR pszBuffer) {
+    return This->lpVtbl->Deserialize(This,pszBuffer);
+}
+/*** IWSDTransportAddress methods ***/
+static FORCEINLINE HRESULT IWSDUdpAddress_GetPort(IWSDUdpAddress* This,WORD *pwPort) {
+    return This->lpVtbl->GetPort(This,pwPort);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_SetPort(IWSDUdpAddress* This,WORD wPort) {
+    return This->lpVtbl->SetPort(This,wPort);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetTransportAddress(IWSDUdpAddress* This,LPCWSTR *ppszAddress) {
+    return This->lpVtbl->GetTransportAddress(This,ppszAddress);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetTransportAddressEx(IWSDUdpAddress* This,WINBOOL fSafe,LPCWSTR *ppszAddress) {
+    return This->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_SetTransportAddress(IWSDUdpAddress* This,LPCWSTR pszAddress) {
+    return This->lpVtbl->SetTransportAddress(This,pszAddress);
+}
+/*** IWSDUdpAddress methods ***/
+static FORCEINLINE HRESULT IWSDUdpAddress_SetSockaddr(IWSDUdpAddress* This,const SOCKADDR_STORAGE *pSockAddr) {
+    return This->lpVtbl->SetSockaddr(This,pSockAddr);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetSockaddr(IWSDUdpAddress* This,SOCKADDR_STORAGE *pSockAddr) {
+    return This->lpVtbl->GetSockaddr(This,pSockAddr);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_SetExclusive(IWSDUdpAddress* This,WINBOOL fExclusive) {
+    return This->lpVtbl->SetExclusive(This,fExclusive);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetExclusive(IWSDUdpAddress* This) {
+    return This->lpVtbl->GetExclusive(This);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_SetMessageType(IWSDUdpAddress* This,WSDUdpMessageType messageType) {
+    return This->lpVtbl->SetMessageType(This,messageType);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetMessageType(IWSDUdpAddress* This,WSDUdpMessageType *pMessageType) {
+    return This->lpVtbl->GetMessageType(This,pMessageType);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_SetTTL(IWSDUdpAddress* This,DWORD dwTTL) {
+    return This->lpVtbl->SetTTL(This,dwTTL);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetTTL(IWSDUdpAddress* This,DWORD *pdwTTL) {
+    return This->lpVtbl->GetTTL(This,pdwTTL);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_SetAlias(IWSDUdpAddress* This,const GUID *pAlias) {
+    return This->lpVtbl->SetAlias(This,pAlias);
+}
+static FORCEINLINE HRESULT IWSDUdpAddress_GetAlias(IWSDUdpAddress* This,GUID *pAlias) {
+    return This->lpVtbl->GetAlias(This,pAlias);
+}
 #endif
-    /* IWSDHttpMessageParameters methods */
-    STDMETHOD_(HRESULT,SetInboundHttpHeaders)(THIS_ LPCWSTR pszHeaders) PURE;
-    STDMETHOD_(HRESULT,GetInboundHttpHeaders)(THIS_ LPCWSTR *ppszHeaders) PURE;
-    STDMETHOD_(HRESULT,SetOutboundHttpHeaders)(THIS_ LPCWSTR pszHeaders) PURE;
-    STDMETHOD_(HRESULT,GetOutboundHttpHeaders)(THIS_ LPCWSTR *ppszHeaders) PURE;
-    STDMETHOD_(HRESULT,SetID)(THIS_ LPCWSTR pszId) PURE;
-    STDMETHOD_(HRESULT,GetID)(THIS_ LPCWSTR *ppszId) PURE;
-    STDMETHOD_(HRESULT,SetContext)(THIS_ IUnknown *pContext) PURE;
-    STDMETHOD_(HRESULT,GetContext)(THIS_ IUnknown **ppContext) PURE;
-    STDMETHOD_(HRESULT,Clear)(THIS) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetSockaddr_Proxy(
+    IWSDUdpAddress* This,
+    const SOCKADDR_STORAGE *pSockAddr);
+void __RPC_STUB IWSDUdpAddress_SetSockaddr_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetSockaddr_Proxy(
+    IWSDUdpAddress* This,
+    SOCKADDR_STORAGE *pSockAddr);
+void __RPC_STUB IWSDUdpAddress_GetSockaddr_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetExclusive_Proxy(
+    IWSDUdpAddress* This,
+    WINBOOL fExclusive);
+void __RPC_STUB IWSDUdpAddress_SetExclusive_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetExclusive_Proxy(
+    IWSDUdpAddress* This);
+void __RPC_STUB IWSDUdpAddress_GetExclusive_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetMessageType_Proxy(
+    IWSDUdpAddress* This,
+    WSDUdpMessageType messageType);
+void __RPC_STUB IWSDUdpAddress_SetMessageType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetMessageType_Proxy(
+    IWSDUdpAddress* This,
+    WSDUdpMessageType *pMessageType);
+void __RPC_STUB IWSDUdpAddress_GetMessageType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetTTL_Proxy(
+    IWSDUdpAddress* This,
+    DWORD dwTTL);
+void __RPC_STUB IWSDUdpAddress_SetTTL_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetTTL_Proxy(
+    IWSDUdpAddress* This,
+    DWORD *pdwTTL);
+void __RPC_STUB IWSDUdpAddress_GetTTL_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_SetAlias_Proxy(
+    IWSDUdpAddress* This,
+    const GUID *pAlias);
+void __RPC_STUB IWSDUdpAddress_SetAlias_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDUdpAddress_GetAlias_Proxy(
+    IWSDUdpAddress* This,
+    GUID *pAlias);
+void __RPC_STUB IWSDUdpAddress_GetAlias_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDUdpAddress_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDHttpMessageParameters interface
+ */
+#ifndef __IWSDHttpMessageParameters_INTERFACE_DEFINED__
+#define __IWSDHttpMessageParameters_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDHttpMessageParameters, 0x540bd122, 0x5c83, 0x4dec, 0xb3,0x96, 0xea,0x62,0xa2,0x69,0x7f,0xdf);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("540bd122-5c83-4dec-b396-ea62a2697fdf")
+IWSDHttpMessageParameters : public IWSDMessageParameters
+{
+    virtual HRESULT STDMETHODCALLTYPE SetInboundHttpHeaders(
+        LPCWSTR pszHeaders) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInboundHttpHeaders(
+        LPCWSTR *ppszHeaders) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOutboundHttpHeaders(
+        LPCWSTR pszHeaders) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOutboundHttpHeaders(
+        LPCWSTR *ppszHeaders) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetID(
+        LPCWSTR pszId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetID(
+        LPCWSTR *ppszId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetContext(
+        IUnknown *pContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetContext(
+        IUnknown **ppContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clear(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDHttpMessageParameters, 0x540bd122, 0x5c83, 0x4dec, 0xb3,0x96, 0xea,0x62,0xa2,0x69,0x7f,0xdf)
+#endif
+#else
+typedef struct IWSDHttpMessageParametersVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDHttpMessageParameters* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDHttpMessageParameters* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDHttpMessageParameters* This);
+
+    /*** IWSDMessageParameters methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLocalAddress)(
+        IWSDHttpMessageParameters* This,
+        IWSDAddress **ppAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetLocalAddress)(
+        IWSDHttpMessageParameters* This,
+        IWSDAddress *pAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetRemoteAddress)(
+        IWSDHttpMessageParameters* This,
+        IWSDAddress **ppAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetRemoteAddress)(
+        IWSDHttpMessageParameters* This,
+        IWSDAddress *pAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetLowerParameters)(
+        IWSDHttpMessageParameters* This,
+        IWSDMessageParameters **ppTxParams);
+
+    /*** IWSDHttpMessageParameters methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetInboundHttpHeaders)(
+        IWSDHttpMessageParameters* This,
+        LPCWSTR pszHeaders);
+
+    HRESULT (STDMETHODCALLTYPE *GetInboundHttpHeaders)(
+        IWSDHttpMessageParameters* This,
+        LPCWSTR *ppszHeaders);
+
+    HRESULT (STDMETHODCALLTYPE *SetOutboundHttpHeaders)(
+        IWSDHttpMessageParameters* This,
+        LPCWSTR pszHeaders);
+
+    HRESULT (STDMETHODCALLTYPE *GetOutboundHttpHeaders)(
+        IWSDHttpMessageParameters* This,
+        LPCWSTR *ppszHeaders);
+
+    HRESULT (STDMETHODCALLTYPE *SetID)(
+        IWSDHttpMessageParameters* This,
+        LPCWSTR pszId);
+
+    HRESULT (STDMETHODCALLTYPE *GetID)(
+        IWSDHttpMessageParameters* This,
+        LPCWSTR *ppszId);
+
+    HRESULT (STDMETHODCALLTYPE *SetContext)(
+        IWSDHttpMessageParameters* This,
+        IUnknown *pContext);
+
+    HRESULT (STDMETHODCALLTYPE *GetContext)(
+        IWSDHttpMessageParameters* This,
+        IUnknown **ppContext);
+
+    HRESULT (STDMETHODCALLTYPE *Clear)(
+        IWSDHttpMessageParameters* This);
 
     END_INTERFACE
+} IWSDHttpMessageParametersVtbl;
+interface IWSDHttpMessageParameters {
+    CONST_VTBL IWSDHttpMessageParametersVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDHttpMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDHttpMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDHttpMessageParameters_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDMessageParameters methods ***/
 #define IWSDHttpMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
 #define IWSDHttpMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
 #define IWSDHttpMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
 #define IWSDHttpMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
 #define IWSDHttpMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
+/*** IWSDHttpMessageParameters methods ***/
 #define IWSDHttpMessageParameters_SetInboundHttpHeaders(This,pszHeaders) (This)->lpVtbl->SetInboundHttpHeaders(This,pszHeaders)
 #define IWSDHttpMessageParameters_GetInboundHttpHeaders(This,ppszHeaders) (This)->lpVtbl->GetInboundHttpHeaders(This,ppszHeaders)
 #define IWSDHttpMessageParameters_SetOutboundHttpHeaders(This,pszHeaders) (This)->lpVtbl->SetOutboundHttpHeaders(This,pszHeaders)
@@ -258,57 +1270,732 @@
 #define IWSDHttpMessageParameters_GetID(This,ppszId) (This)->lpVtbl->GetID(This,ppszId)
 #define IWSDHttpMessageParameters_SetContext(This,pContext) (This)->lpVtbl->SetContext(This,pContext)
 #define IWSDHttpMessageParameters_GetContext(This,ppContext) (This)->lpVtbl->GetContext(This,ppContext)
-#define IWSDHttpMessageParameters_Clear() (This)->lpVtbl->Clear(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDUdpMessageParameters
-DECLARE_INTERFACE_(IWSDUdpMessageParameters,IWSDMessageParameters) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDServiceMessaging methods */
-    STDMETHOD_(HRESULT,GetLocalAddress)(THIS_ IWSDAddress **ppAddress) PURE;
-    STDMETHOD_(HRESULT,SetLocalAddress)(THIS_ IWSDAddress *pAddress) PURE;
-    STDMETHOD_(HRESULT,GetRemoteAddress)(THIS_ IWSDAddress **ppAddress) PURE;
-    STDMETHOD_(HRESULT,SetRemoteAddress)(THIS_ IWSDAddress *pAddress) PURE;
-    STDMETHOD_(HRESULT,GetLowerParameters)(THIS_ IWSDMessageParameters **ppTxParams) PURE;
+#define IWSDHttpMessageParameters_Clear(This) (This)->lpVtbl->Clear(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_QueryInterface(IWSDHttpMessageParameters* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDHttpMessageParameters_AddRef(IWSDHttpMessageParameters* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDHttpMessageParameters_Release(IWSDHttpMessageParameters* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDMessageParameters methods ***/
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetLocalAddress(IWSDHttpMessageParameters* This,IWSDAddress **ppAddress) {
+    return This->lpVtbl->GetLocalAddress(This,ppAddress);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetLocalAddress(IWSDHttpMessageParameters* This,IWSDAddress *pAddress) {
+    return This->lpVtbl->SetLocalAddress(This,pAddress);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetRemoteAddress(IWSDHttpMessageParameters* This,IWSDAddress **ppAddress) {
+    return This->lpVtbl->GetRemoteAddress(This,ppAddress);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetRemoteAddress(IWSDHttpMessageParameters* This,IWSDAddress *pAddress) {
+    return This->lpVtbl->SetRemoteAddress(This,pAddress);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetLowerParameters(IWSDHttpMessageParameters* This,IWSDMessageParameters **ppTxParams) {
+    return This->lpVtbl->GetLowerParameters(This,ppTxParams);
+}
+/*** IWSDHttpMessageParameters methods ***/
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetInboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR pszHeaders) {
+    return This->lpVtbl->SetInboundHttpHeaders(This,pszHeaders);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetInboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR *ppszHeaders) {
+    return This->lpVtbl->GetInboundHttpHeaders(This,ppszHeaders);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetOutboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR pszHeaders) {
+    return This->lpVtbl->SetOutboundHttpHeaders(This,pszHeaders);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetOutboundHttpHeaders(IWSDHttpMessageParameters* This,LPCWSTR *ppszHeaders) {
+    return This->lpVtbl->GetOutboundHttpHeaders(This,ppszHeaders);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetID(IWSDHttpMessageParameters* This,LPCWSTR pszId) {
+    return This->lpVtbl->SetID(This,pszId);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetID(IWSDHttpMessageParameters* This,LPCWSTR *ppszId) {
+    return This->lpVtbl->GetID(This,ppszId);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_SetContext(IWSDHttpMessageParameters* This,IUnknown *pContext) {
+    return This->lpVtbl->SetContext(This,pContext);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_GetContext(IWSDHttpMessageParameters* This,IUnknown **ppContext) {
+    return This->lpVtbl->GetContext(This,ppContext);
+}
+static FORCEINLINE HRESULT IWSDHttpMessageParameters_Clear(IWSDHttpMessageParameters* This) {
+    return This->lpVtbl->Clear(This);
+}
 #endif
-    /* IWSDUdpMessageParameters methods */
-    STDMETHOD_(HRESULT,SetRetransmitParams)(THIS_ const WSDUdpRetransmitParams *pParams) PURE;
-    STDMETHOD_(HRESULT,GetRetransmitParams)(THIS_ WSDUdpRetransmitParams *pParams) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetInboundHttpHeaders_Proxy(
+    IWSDHttpMessageParameters* This,
+    LPCWSTR pszHeaders);
+void __RPC_STUB IWSDHttpMessageParameters_SetInboundHttpHeaders_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetInboundHttpHeaders_Proxy(
+    IWSDHttpMessageParameters* This,
+    LPCWSTR *ppszHeaders);
+void __RPC_STUB IWSDHttpMessageParameters_GetInboundHttpHeaders_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetOutboundHttpHeaders_Proxy(
+    IWSDHttpMessageParameters* This,
+    LPCWSTR pszHeaders);
+void __RPC_STUB IWSDHttpMessageParameters_SetOutboundHttpHeaders_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetOutboundHttpHeaders_Proxy(
+    IWSDHttpMessageParameters* This,
+    LPCWSTR *ppszHeaders);
+void __RPC_STUB IWSDHttpMessageParameters_GetOutboundHttpHeaders_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetID_Proxy(
+    IWSDHttpMessageParameters* This,
+    LPCWSTR pszId);
+void __RPC_STUB IWSDHttpMessageParameters_SetID_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetID_Proxy(
+    IWSDHttpMessageParameters* This,
+    LPCWSTR *ppszId);
+void __RPC_STUB IWSDHttpMessageParameters_GetID_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_SetContext_Proxy(
+    IWSDHttpMessageParameters* This,
+    IUnknown *pContext);
+void __RPC_STUB IWSDHttpMessageParameters_SetContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_GetContext_Proxy(
+    IWSDHttpMessageParameters* This,
+    IUnknown **ppContext);
+void __RPC_STUB IWSDHttpMessageParameters_GetContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpMessageParameters_Clear_Proxy(
+    IWSDHttpMessageParameters* This);
+void __RPC_STUB IWSDHttpMessageParameters_Clear_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDHttpMessageParameters_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDHttpAddress interface
+ */
+#ifndef __IWSDHttpAddress_INTERFACE_DEFINED__
+#define __IWSDHttpAddress_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDHttpAddress, 0xd09ac7bd, 0x2a3e, 0x4b85, 0x86,0x05, 0x27,0x37,0xff,0x3e,0x4e,0xa0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d09ac7bd-2a3e-4b85-8605-2737ff3e4ea0")
+IWSDHttpAddress : public IWSDTransportAddress
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSecure(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSecure(
+        WINBOOL fSecure) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPath(
+        LPCWSTR *ppszPath) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetPath(
+        LPCWSTR pszPath) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDHttpAddress, 0xd09ac7bd, 0x2a3e, 0x4b85, 0x86,0x05, 0x27,0x37,0xff,0x3e,0x4e,0xa0)
+#endif
+#else
+typedef struct IWSDHttpAddressVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDHttpAddress* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDHttpAddress* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDHttpAddress* This);
+
+    /*** IWSDAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *Serialize)(
+        IWSDHttpAddress* This,
+        LPWSTR pszBuffer,
+        DWORD cchLength,
+        WINBOOL fSafe);
+
+    HRESULT (STDMETHODCALLTYPE *Deserialize)(
+        IWSDHttpAddress* This,
+        LPCWSTR pszBuffer);
+
+    /*** IWSDTransportAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPort)(
+        IWSDHttpAddress* This,
+        WORD *pwPort);
+
+    HRESULT (STDMETHODCALLTYPE *SetPort)(
+        IWSDHttpAddress* This,
+        WORD wPort);
+
+    HRESULT (STDMETHODCALLTYPE *GetTransportAddress)(
+        IWSDHttpAddress* This,
+        LPCWSTR *ppszAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetTransportAddressEx)(
+        IWSDHttpAddress* This,
+        WINBOOL fSafe,
+        LPCWSTR *ppszAddress);
+
+    HRESULT (STDMETHODCALLTYPE *SetTransportAddress)(
+        IWSDHttpAddress* This,
+        LPCWSTR pszAddress);
+
+    /*** IWSDHttpAddress methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSecure)(
+        IWSDHttpAddress* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetSecure)(
+        IWSDHttpAddress* This,
+        WINBOOL fSecure);
+
+    HRESULT (STDMETHODCALLTYPE *GetPath)(
+        IWSDHttpAddress* This,
+        LPCWSTR *ppszPath);
+
+    HRESULT (STDMETHODCALLTYPE *SetPath)(
+        IWSDHttpAddress* This,
+        LPCWSTR pszPath);
 
     END_INTERFACE
+} IWSDHttpAddressVtbl;
+interface IWSDHttpAddress {
+    CONST_VTBL IWSDHttpAddressVtbl* lpVtbl;
 };
-#ifdef COBJMACROS
-#define IWSDUdpMessageParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDUdpMessageParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDUdpMessageParameters_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDUdpMessageParameters_GetLocalAddress(This,ppAddress) (This)->lpVtbl->GetLocalAddress(This,ppAddress)
-#define IWSDUdpMessageParameters_SetLocalAddress(This,pAddress) (This)->lpVtbl->SetLocalAddress(This,pAddress)
-#define IWSDUdpMessageParameters_GetRemoteAddress(This,ppAddress) (This)->lpVtbl->GetRemoteAddress(This,ppAddress)
-#define IWSDUdpMessageParameters_SetRemoteAddress(This,pAddress) (This)->lpVtbl->SetRemoteAddress(This,pAddress)
-#define IWSDUdpMessageParameters_GetLowerParameters(This,ppTxParams) (This)->lpVtbl->GetLowerParameters(This,ppTxParams)
-#define IWSDUdpMessageParameters_SetRetransmitParams(This,pParams) (This)->lpVtbl->SetRetransmitParams(This,pParams)
-#define IWSDUdpMessageParameters_GetRetransmitParams(This,pParams) (This)->lpVtbl->GetRetransmitParams(This,pParams)
-#endif /*COBJMACROS*/
 
-#ifdef __cplusplus
-extern "C" {
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDHttpAddress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDHttpAddress_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDHttpAddress_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDAddress methods ***/
+#define IWSDHttpAddress_Serialize(This,pszBuffer,cchLength,fSafe) (This)->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe)
+#define IWSDHttpAddress_Deserialize(This,pszBuffer) (This)->lpVtbl->Deserialize(This,pszBuffer)
+/*** IWSDTransportAddress methods ***/
+#define IWSDHttpAddress_GetPort(This,pwPort) (This)->lpVtbl->GetPort(This,pwPort)
+#define IWSDHttpAddress_SetPort(This,wPort) (This)->lpVtbl->SetPort(This,wPort)
+#define IWSDHttpAddress_GetTransportAddress(This,ppszAddress) (This)->lpVtbl->GetTransportAddress(This,ppszAddress)
+#define IWSDHttpAddress_GetTransportAddressEx(This,fSafe,ppszAddress) (This)->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress)
+#define IWSDHttpAddress_SetTransportAddress(This,pszAddress) (This)->lpVtbl->SetTransportAddress(This,pszAddress)
+/*** IWSDHttpAddress methods ***/
+#define IWSDHttpAddress_GetSecure(This) (This)->lpVtbl->GetSecure(This)
+#define IWSDHttpAddress_SetSecure(This,fSecure) (This)->lpVtbl->SetSecure(This,fSecure)
+#define IWSDHttpAddress_GetPath(This,ppszPath) (This)->lpVtbl->GetPath(This,ppszPath)
+#define IWSDHttpAddress_SetPath(This,pszPath) (This)->lpVtbl->SetPath(This,pszPath)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDHttpAddress_QueryInterface(IWSDHttpAddress* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDHttpAddress_AddRef(IWSDHttpAddress* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDHttpAddress_Release(IWSDHttpAddress* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDAddress methods ***/
+static FORCEINLINE HRESULT IWSDHttpAddress_Serialize(IWSDHttpAddress* This,LPWSTR pszBuffer,DWORD cchLength,WINBOOL fSafe) {
+    return This->lpVtbl->Serialize(This,pszBuffer,cchLength,fSafe);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_Deserialize(IWSDHttpAddress* This,LPCWSTR pszBuffer) {
+    return This->lpVtbl->Deserialize(This,pszBuffer);
+}
+/*** IWSDTransportAddress methods ***/
+static FORCEINLINE HRESULT IWSDHttpAddress_GetPort(IWSDHttpAddress* This,WORD *pwPort) {
+    return This->lpVtbl->GetPort(This,pwPort);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_SetPort(IWSDHttpAddress* This,WORD wPort) {
+    return This->lpVtbl->SetPort(This,wPort);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_GetTransportAddress(IWSDHttpAddress* This,LPCWSTR *ppszAddress) {
+    return This->lpVtbl->GetTransportAddress(This,ppszAddress);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_GetTransportAddressEx(IWSDHttpAddress* This,WINBOOL fSafe,LPCWSTR *ppszAddress) {
+    return This->lpVtbl->GetTransportAddressEx(This,fSafe,ppszAddress);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_SetTransportAddress(IWSDHttpAddress* This,LPCWSTR pszAddress) {
+    return This->lpVtbl->SetTransportAddress(This,pszAddress);
+}
+/*** IWSDHttpAddress methods ***/
+static FORCEINLINE HRESULT IWSDHttpAddress_GetSecure(IWSDHttpAddress* This) {
+    return This->lpVtbl->GetSecure(This);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_SetSecure(IWSDHttpAddress* This,WINBOOL fSecure) {
+    return This->lpVtbl->SetSecure(This,fSecure);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_GetPath(IWSDHttpAddress* This,LPCWSTR *ppszPath) {
+    return This->lpVtbl->GetPath(This,ppszPath);
+}
+static FORCEINLINE HRESULT IWSDHttpAddress_SetPath(IWSDHttpAddress* This,LPCWSTR pszPath) {
+    return This->lpVtbl->SetPath(This,pszPath);
+}
+#endif
 #endif
 
-HRESULT WINAPI WSDCreateHttpAddress(IWSDHttpAddress **ppAddress);
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDHttpAddress_GetSecure_Proxy(
+    IWSDHttpAddress* This);
+void __RPC_STUB IWSDHttpAddress_GetSecure_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpAddress_SetSecure_Proxy(
+    IWSDHttpAddress* This,
+    WINBOOL fSecure);
+void __RPC_STUB IWSDHttpAddress_SetSecure_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpAddress_GetPath_Proxy(
+    IWSDHttpAddress* This,
+    LPCWSTR *ppszPath);
+void __RPC_STUB IWSDHttpAddress_GetPath_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpAddress_SetPath_Proxy(
+    IWSDHttpAddress* This,
+    LPCWSTR pszPath);
+void __RPC_STUB IWSDHttpAddress_SetPath_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDHttpAddress_INTERFACE_DEFINED__ */
+
+#if WINVER >= 0x601
+/*****************************************************************************
+ * IWSDSSLClientCertificate interface
+ */
+#ifndef __IWSDSSLClientCertificate_INTERFACE_DEFINED__
+#define __IWSDSSLClientCertificate_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDSSLClientCertificate, 0xde105e87, 0xa0da, 0x418e, 0x98,0xad, 0x27,0xb9,0xee,0xd8,0x7b,0xdc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("de105e87-a0da-418e-98ad-27b9eed87bdc")
+IWSDSSLClientCertificate : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetClientCertificate(
+        PCCERT_CONTEXT *ppCertContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMappedAccessToken(
+        HANDLE *phToken) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDSSLClientCertificate, 0xde105e87, 0xa0da, 0x418e, 0x98,0xad, 0x27,0xb9,0xee,0xd8,0x7b,0xdc)
+#endif
+#else
+typedef struct IWSDSSLClientCertificateVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDSSLClientCertificate* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDSSLClientCertificate* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDSSLClientCertificate* This);
+
+    /*** IWSDSSLClientCertificate methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetClientCertificate)(
+        IWSDSSLClientCertificate* This,
+        PCCERT_CONTEXT *ppCertContext);
+
+    HRESULT (STDMETHODCALLTYPE *GetMappedAccessToken)(
+        IWSDSSLClientCertificate* This,
+        HANDLE *phToken);
+
+    END_INTERFACE
+} IWSDSSLClientCertificateVtbl;
+interface IWSDSSLClientCertificate {
+    CONST_VTBL IWSDSSLClientCertificateVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDSSLClientCertificate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDSSLClientCertificate_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDSSLClientCertificate_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDSSLClientCertificate methods ***/
+#define IWSDSSLClientCertificate_GetClientCertificate(This,ppCertContext) (This)->lpVtbl->GetClientCertificate(This,ppCertContext)
+#define IWSDSSLClientCertificate_GetMappedAccessToken(This,phToken) (This)->lpVtbl->GetMappedAccessToken(This,phToken)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDSSLClientCertificate_QueryInterface(IWSDSSLClientCertificate* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDSSLClientCertificate_AddRef(IWSDSSLClientCertificate* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDSSLClientCertificate_Release(IWSDSSLClientCertificate* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDSSLClientCertificate methods ***/
+static FORCEINLINE HRESULT IWSDSSLClientCertificate_GetClientCertificate(IWSDSSLClientCertificate* This,PCCERT_CONTEXT *ppCertContext) {
+    return This->lpVtbl->GetClientCertificate(This,ppCertContext);
+}
+static FORCEINLINE HRESULT IWSDSSLClientCertificate_GetMappedAccessToken(IWSDSSLClientCertificate* This,HANDLE *phToken) {
+    return This->lpVtbl->GetMappedAccessToken(This,phToken);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDSSLClientCertificate_GetClientCertificate_Proxy(
+    IWSDSSLClientCertificate* This,
+    PCCERT_CONTEXT *ppCertContext);
+void __RPC_STUB IWSDSSLClientCertificate_GetClientCertificate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDSSLClientCertificate_GetMappedAccessToken_Proxy(
+    IWSDSSLClientCertificate* This,
+    HANDLE *phToken);
+void __RPC_STUB IWSDSSLClientCertificate_GetMappedAccessToken_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDSSLClientCertificate_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDHttpAuthParameters interface
+ */
+#ifndef __IWSDHttpAuthParameters_INTERFACE_DEFINED__
+#define __IWSDHttpAuthParameters_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDHttpAuthParameters, 0x0b476df0, 0x8dac, 0x480d, 0xb0,0x5c, 0x99,0x78,0x1a,0x58,0x84,0xaa);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("0b476df0-8dac-480d-b05c-99781a5884aa")
+IWSDHttpAuthParameters : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetClientAccessToken(
+        HANDLE *phToken) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAuthType(
+        PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDHttpAuthParameters, 0x0b476df0, 0x8dac, 0x480d, 0xb0,0x5c, 0x99,0x78,0x1a,0x58,0x84,0xaa)
+#endif
+#else
+typedef struct IWSDHttpAuthParametersVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDHttpAuthParameters* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDHttpAuthParameters* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDHttpAuthParameters* This);
+
+    /*** IWSDHttpAuthParameters methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetClientAccessToken)(
+        IWSDHttpAuthParameters* This,
+        HANDLE *phToken);
+
+    HRESULT (STDMETHODCALLTYPE *GetAuthType)(
+        IWSDHttpAuthParameters* This,
+        PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType);
+
+    END_INTERFACE
+} IWSDHttpAuthParametersVtbl;
+interface IWSDHttpAuthParameters {
+    CONST_VTBL IWSDHttpAuthParametersVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDHttpAuthParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDHttpAuthParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDHttpAuthParameters_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDHttpAuthParameters methods ***/
+#define IWSDHttpAuthParameters_GetClientAccessToken(This,phToken) (This)->lpVtbl->GetClientAccessToken(This,phToken)
+#define IWSDHttpAuthParameters_GetAuthType(This,pAuthType) (This)->lpVtbl->GetAuthType(This,pAuthType)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDHttpAuthParameters_QueryInterface(IWSDHttpAuthParameters* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDHttpAuthParameters_AddRef(IWSDHttpAuthParameters* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDHttpAuthParameters_Release(IWSDHttpAuthParameters* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDHttpAuthParameters methods ***/
+static FORCEINLINE HRESULT IWSDHttpAuthParameters_GetClientAccessToken(IWSDHttpAuthParameters* This,HANDLE *phToken) {
+    return This->lpVtbl->GetClientAccessToken(This,phToken);
+}
+static FORCEINLINE HRESULT IWSDHttpAuthParameters_GetAuthType(IWSDHttpAuthParameters* This,PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType) {
+    return This->lpVtbl->GetAuthType(This,pAuthType);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDHttpAuthParameters_GetClientAccessToken_Proxy(
+    IWSDHttpAuthParameters* This,
+    HANDLE *phToken);
+void __RPC_STUB IWSDHttpAuthParameters_GetClientAccessToken_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDHttpAuthParameters_GetAuthType_Proxy(
+    IWSDHttpAuthParameters* This,
+    PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType);
+void __RPC_STUB IWSDHttpAuthParameters_GetAuthType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDHttpAuthParameters_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDSignatureProperty interface
+ */
+#ifndef __IWSDSignatureProperty_INTERFACE_DEFINED__
+#define __IWSDSignatureProperty_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDSignatureProperty, 0x03ce20aa, 0x71c4, 0x45e2, 0xb3,0x2e, 0x37,0x66,0xc6,0x1c,0x79,0x0f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("03ce20aa-71c4-45e2-b32e-3766c61c790f")
+IWSDSignatureProperty : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE IsMessageSigned(
+        WINBOOL *pbSigned) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsMessageSignatureTrusted(
+        WINBOOL *pbSignatureTrusted) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetKeyInfo(
+        BYTE *pbKeyInfo,
+        DWORD *pdwKeyInfoSize) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSignature(
+        BYTE *pbSignature,
+        DWORD *pdwSignatureSize) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSignedInfoHash(
+        BYTE *pbSignedInfoHash,
+        DWORD *pdwHashSize) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDSignatureProperty, 0x03ce20aa, 0x71c4, 0x45e2, 0xb3,0x2e, 0x37,0x66,0xc6,0x1c,0x79,0x0f)
+#endif
+#else
+typedef struct IWSDSignaturePropertyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDSignatureProperty* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDSignatureProperty* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDSignatureProperty* This);
+
+    /*** IWSDSignatureProperty methods ***/
+    HRESULT (STDMETHODCALLTYPE *IsMessageSigned)(
+        IWSDSignatureProperty* This,
+        WINBOOL *pbSigned);
+
+    HRESULT (STDMETHODCALLTYPE *IsMessageSignatureTrusted)(
+        IWSDSignatureProperty* This,
+        WINBOOL *pbSignatureTrusted);
+
+    HRESULT (STDMETHODCALLTYPE *GetKeyInfo)(
+        IWSDSignatureProperty* This,
+        BYTE *pbKeyInfo,
+        DWORD *pdwKeyInfoSize);
+
+    HRESULT (STDMETHODCALLTYPE *GetSignature)(
+        IWSDSignatureProperty* This,
+        BYTE *pbSignature,
+        DWORD *pdwSignatureSize);
+
+    HRESULT (STDMETHODCALLTYPE *GetSignedInfoHash)(
+        IWSDSignatureProperty* This,
+        BYTE *pbSignedInfoHash,
+        DWORD *pdwHashSize);
+
+    END_INTERFACE
+} IWSDSignaturePropertyVtbl;
+interface IWSDSignatureProperty {
+    CONST_VTBL IWSDSignaturePropertyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDSignatureProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDSignatureProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDSignatureProperty_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDSignatureProperty methods ***/
+#define IWSDSignatureProperty_IsMessageSigned(This,pbSigned) (This)->lpVtbl->IsMessageSigned(This,pbSigned)
+#define IWSDSignatureProperty_IsMessageSignatureTrusted(This,pbSignatureTrusted) (This)->lpVtbl->IsMessageSignatureTrusted(This,pbSignatureTrusted)
+#define IWSDSignatureProperty_GetKeyInfo(This,pbKeyInfo,pdwKeyInfoSize) (This)->lpVtbl->GetKeyInfo(This,pbKeyInfo,pdwKeyInfoSize)
+#define IWSDSignatureProperty_GetSignature(This,pbSignature,pdwSignatureSize) (This)->lpVtbl->GetSignature(This,pbSignature,pdwSignatureSize)
+#define IWSDSignatureProperty_GetSignedInfoHash(This,pbSignedInfoHash,pdwHashSize) (This)->lpVtbl->GetSignedInfoHash(This,pbSignedInfoHash,pdwHashSize)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDSignatureProperty_QueryInterface(IWSDSignatureProperty* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDSignatureProperty_AddRef(IWSDSignatureProperty* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDSignatureProperty_Release(IWSDSignatureProperty* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDSignatureProperty methods ***/
+static FORCEINLINE HRESULT IWSDSignatureProperty_IsMessageSigned(IWSDSignatureProperty* This,WINBOOL *pbSigned) {
+    return This->lpVtbl->IsMessageSigned(This,pbSigned);
+}
+static FORCEINLINE HRESULT IWSDSignatureProperty_IsMessageSignatureTrusted(IWSDSignatureProperty* This,WINBOOL *pbSignatureTrusted) {
+    return This->lpVtbl->IsMessageSignatureTrusted(This,pbSignatureTrusted);
+}
+static FORCEINLINE HRESULT IWSDSignatureProperty_GetKeyInfo(IWSDSignatureProperty* This,BYTE *pbKeyInfo,DWORD *pdwKeyInfoSize) {
+    return This->lpVtbl->GetKeyInfo(This,pbKeyInfo,pdwKeyInfoSize);
+}
+static FORCEINLINE HRESULT IWSDSignatureProperty_GetSignature(IWSDSignatureProperty* This,BYTE *pbSignature,DWORD *pdwSignatureSize) {
+    return This->lpVtbl->GetSignature(This,pbSignature,pdwSignatureSize);
+}
+static FORCEINLINE HRESULT IWSDSignatureProperty_GetSignedInfoHash(IWSDSignatureProperty* This,BYTE *pbSignedInfoHash,DWORD *pdwHashSize) {
+    return This->lpVtbl->GetSignedInfoHash(This,pbSignedInfoHash,pdwHashSize);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_IsMessageSigned_Proxy(
+    IWSDSignatureProperty* This,
+    WINBOOL *pbSigned);
+void __RPC_STUB IWSDSignatureProperty_IsMessageSigned_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_IsMessageSignatureTrusted_Proxy(
+    IWSDSignatureProperty* This,
+    WINBOOL *pbSignatureTrusted);
+void __RPC_STUB IWSDSignatureProperty_IsMessageSignatureTrusted_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_GetKeyInfo_Proxy(
+    IWSDSignatureProperty* This,
+    BYTE *pbKeyInfo,
+    DWORD *pdwKeyInfoSize);
+void __RPC_STUB IWSDSignatureProperty_GetKeyInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_GetSignature_Proxy(
+    IWSDSignatureProperty* This,
+    BYTE *pbSignature,
+    DWORD *pdwSignatureSize);
+void __RPC_STUB IWSDSignatureProperty_GetSignature_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDSignatureProperty_GetSignedInfoHash_Proxy(
+    IWSDSignatureProperty* This,
+    BYTE *pbSignedInfoHash,
+    DWORD *pdwHashSize);
+void __RPC_STUB IWSDSignatureProperty_GetSignedInfoHash_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDSignatureProperty_INTERFACE_DEFINED__ */
+
+#endif
+HRESULT WINAPI WSDCreateHttpAddress(IWSDHttpAddress **ppAdress);
 HRESULT WINAPI WSDCreateHttpMessageParameters(IWSDHttpMessageParameters **ppTxParams);
-HRESULT WINAPI WSDCreateUdpAddress(IWSDUdpAddress **ppAddress);
-HRESULT WINAPI WSDCreateUdpMessageParameters(IWSDUdpMessageParameters **ppTxParams);
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_WSDBASE*/
+#endif /* __wsdbase_h__ */
diff --git a/mingw-w64-headers/include/wsdbase.idl b/mingw-w64-headers/include/wsdbase.idl
new file mode 100644
index 0000000..720b855
--- /dev/null
+++ b/mingw-w64-headers/include/wsdbase.idl
@@ -0,0 +1,225 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+import "objidl.idl";
+import "wincrypt.idl";
+
+cpp_quote("")
+interface IWSDAddress;
+interface IWSDMessageParameters;
+interface IWSDUdpAddress;
+interface IWSDUdpMessageParameters;
+interface IWSDHttpAddress;
+interface IWSDHttpMessageParameters;
+
+cpp_quote("")
+cpp_quote("#if WINVER >= 0x601")
+typedef enum {
+  WSD_CONFIG_MAX_INBOUND_MESSAGE_SIZE = 1,
+  WSD_CONFIG_MAX_OUTBOUND_MESSAGE_SIZE = 2,
+  WSD_SECURITY_SSL_CERT_FOR_CLIENT_AUTH = 3,
+  WSD_SECURITY_SSL_SERVER_CERT_VALIDATION = 4,
+  WSD_SECURITY_SSL_CLIENT_CERT_VALIDATION = 5,
+  WSD_SECURITY_SSL_NEGOTIATE_CLIENT_CERT = 6,
+  WSD_SECURITY_COMPACTSIG_SIGNING_CERT = 7,
+  WSD_SECURITY_COMPACTSIG_VALIDATION = 8,
+  WSD_CONFIG_HOSTING_ADDRESSES = 9,
+  WSD_CONFIG_DEVICE_ADDRESSES = 10,
+  WSD_SECURITY_REQUIRE_HTTP_CLIENT_AUTH = 11,
+  WSD_SECURITY_REQUIRE_CLIENT_CERT_OR_HTTP_CLIENT_AUTH = 12,
+  WSD_SECURITY_USE_HTTP_CLIENT_AUTH = 13
+} WSD_CONFIG_PARAM_TYPE;
+
+typedef struct _WSD_CONFIG_PARAM {
+  WSD_CONFIG_PARAM_TYPE configParamType;
+  PVOID pConfigData;
+  DWORD dwConfigDataSize;
+} WSD_CONFIG_PARAM,*PWSD_CONFIG_PARAM;
+
+typedef struct _WSD_SECURITY_CERT_VALIDATION_V1 {
+  PCCERT_CONTEXT *certMatchArray;
+  DWORD dwCertMatchArrayCount;
+  HCERTSTORE hCertMatchStore;
+  HCERTSTORE hCertIssuerStore;
+  DWORD dwCertCheckOptions;
+} WSD_SECURITY_CERT_VALIDATION_V1;
+
+cpp_quote("#if _WIN32_WINNT >= 0x602")
+typedef struct _WSD_SECURITY_CERT_VALIDATION {
+  PCCERT_CONTEXT *certMatchArray;
+  DWORD dwCertMatchArrayCount;
+  HCERTSTORE hCertMatchStore;
+  HCERTSTORE hCertIssuerStore;
+  DWORD dwCertCheckOptions;
+  LPCWSTR pszCNGHashAlgId;
+  BYTE *pbCertHash;
+  DWORD dwCertHashSize;
+} WSD_SECURITY_CERT_VALIDATION;
+cpp_quote("#else")
+cpp_quote("typedef WSD_SECURITY_CERT_VALIDATION_V1 WSD_SECURITY_CERT_VALIDATION;")
+cpp_quote("#endif")
+
+cpp_quote("")
+typedef WSD_SECURITY_CERT_VALIDATION *PWSD_SECURITY_CERT_VALIDATION;
+
+typedef struct _WSD_SECURITY_SIGNATURE_VALIDATION {
+  PCCERT_CONTEXT *signingCertArray;
+  DWORD dwSigningCertArrayCount;
+  HCERTSTORE hSigningCertStore;
+  DWORD dwFlags;
+} WSD_SECURITY_SIGNATURE_VALIDATION,*PWSD_SECURITY_SIGNATURE_VALIDATION;
+
+typedef DWORD WSD_SECURITY_HTTP_AUTH_SCHEMES,*PWSD_SECURITY_HTTP_AUTH_SCHEMES;
+
+cpp_quote("")
+cpp_quote("#define WSDAPI_SSL_CERT_APPLY_DEFAULT_CHECKS 0x0")
+cpp_quote("#define WSDAPI_SSL_CERT_IGNORE_REVOCATION 0x1")
+cpp_quote("#define WSDAPI_SSL_CERT_IGNORE_EXPIRY 0x2")
+cpp_quote("#define WSDAPI_SSL_CERT_IGNORE_WRONG_USAGE 0x4")
+cpp_quote("#define WSDAPI_SSL_CERT_IGNORE_UNKNOWN_CA 0x8")
+cpp_quote("#define WSDAPI_SSL_CERT_IGNORE_INVALID_CN 0x10")
+cpp_quote("")
+cpp_quote("#define WSDAPI_COMPACTSIG_ACCEPT_ALL_MESSAGES 0x1")
+cpp_quote("")
+cpp_quote("#define WSD_SECURITY_HTTP_AUTH_SCHEME_NEGOTIATE 0x1")
+cpp_quote("#define WSD_SECURITY_HTTP_AUTH_SCHEME_NTLM 0x2")
+cpp_quote("")
+
+typedef struct _WSD_CONFIG_ADDRESSES {
+  IWSDAddress **addresses;
+  DWORD dwAddressCount;
+} WSD_CONFIG_ADDRESSES,*PWSD_CONFIG_ADDRESSES;
+cpp_quote("#endif")
+
+cpp_quote("#define WSDAPI_ADDRESSFAMILY_IPV4 1")
+cpp_quote("#define WSDAPI_ADDRESSFAMILY_IPV6 2")
+
+[object, uuid (b9574c6c-12a6-4f74-93a1-3318ff605759), local]
+interface IWSDAddress : IUnknown {
+  HRESULT Serialize ([out, size_is (cchLength)] LPWSTR pszBuffer,[in] DWORD cchLength,[in] BOOL fSafe);
+  HRESULT Deserialize ([in] LPCWSTR pszBuffer);
+}
+
+[object, uuid (70d23498-4ee6-4340-a3df-d845d2235467), local]
+interface IWSDTransportAddress : IWSDAddress {
+  HRESULT GetPort ([out] WORD *pwPort);
+  HRESULT SetPort ([in] WORD wPort);
+  HRESULT GetTransportAddress ([out] LPCWSTR *ppszAddress);
+  HRESULT GetTransportAddressEx ([in] BOOL fSafe,[out] LPCWSTR *ppszAddress);
+  HRESULT SetTransportAddress ([in] LPCWSTR pszAddress);
+}
+
+[object, uuid (1fafe8a2-e6fc-4b80-b6cf-b7d45c416d7c)]
+interface IWSDMessageParameters : IUnknown {
+  HRESULT GetLocalAddress ([out] IWSDAddress **ppAddress);
+  HRESULT SetLocalAddress ([in] IWSDAddress *pAddress);
+  HRESULT GetRemoteAddress ([out] IWSDAddress **ppAddress);
+  HRESULT SetRemoteAddress ([in] IWSDAddress *pAddress);
+  HRESULT GetLowerParameters ([out] IWSDMessageParameters **ppTxParams);
+}
+
+cpp_quote("HRESULT WINAPI")
+cpp_quote("WSDCreateUdpMessageParameters(")
+cpp_quote("IWSDUdpMessageParameters** ppTxParams);")
+
+typedef struct _WSDUdpRetransmitParams {
+  ULONG ulSendDelay;
+  ULONG ulRepeat;
+  ULONG ulRepeatMinDelay;
+  ULONG ulRepeatMaxDelay;
+  ULONG ulRepeatUpperDelay;
+} WSDUdpRetransmitParams;
+
+[object, uuid (9934149f-8f0c-447b-aa0b-73124b0ca7f0)]
+interface IWSDUdpMessageParameters : IWSDMessageParameters {
+  HRESULT SetRetransmitParams ([in] const WSDUdpRetransmitParams *pParams);
+  HRESULT GetRetransmitParams ([out] WSDUdpRetransmitParams *pParams);
+}
+
+cpp_quote("HRESULT WINAPI")
+cpp_quote("WSDCreateUdpAddress(")
+cpp_quote(" IWSDUdpAddress** ppAddress);")
+
+#ifndef SOCKADDR_STORAGE
+cpp_quote("#if 1")
+cpp_quote("")
+cpp_quote("#ifndef __CSADDR_DEFINED__")
+cpp_quote("struct SOCKADDR_STORAGE;")
+cpp_quote("#endif")
+cpp_quote("#else")
+typedef void SOCKADDR_STORAGE;
+cpp_quote("#endif")
+#endif
+
+typedef enum _WSDUdpMessageType {
+  ONE_WAY,
+  TWO_WAY
+} WSDUdpMessageType;
+
+[object, local, uuid (74d6124a-a441-4f78-a1eb-97a8d1996893)]
+interface IWSDUdpAddress : IWSDTransportAddress {
+  HRESULT SetSockaddr ([in] const SOCKADDR_STORAGE *pSockAddr);
+  HRESULT GetSockaddr ([out] SOCKADDR_STORAGE *pSockAddr);
+  HRESULT SetExclusive ([in] BOOL fExclusive);
+  HRESULT GetExclusive ();
+  HRESULT SetMessageType ([in] WSDUdpMessageType messageType);
+  HRESULT GetMessageType ([out] WSDUdpMessageType *pMessageType);
+  HRESULT SetTTL ([in] DWORD dwTTL);
+  HRESULT GetTTL ([out] DWORD *pdwTTL);
+  HRESULT SetAlias ([in] const GUID *pAlias);
+  HRESULT GetAlias ([out] GUID *pAlias);
+}
+
+[object, local, uuid (540bd122-5c83-4dec-b396-ea62a2697fdf)]
+interface IWSDHttpMessageParameters : IWSDMessageParameters {
+  HRESULT SetInboundHttpHeaders ([in] LPCWSTR pszHeaders);
+  HRESULT GetInboundHttpHeaders ([out] LPCWSTR *ppszHeaders);
+  HRESULT SetOutboundHttpHeaders ([in] LPCWSTR pszHeaders);
+  HRESULT GetOutboundHttpHeaders ([out] LPCWSTR *ppszHeaders);
+  HRESULT SetID ([in] LPCWSTR pszId);
+  HRESULT GetID ([out] LPCWSTR *ppszId);
+  HRESULT SetContext ([in] IUnknown *pContext);
+  HRESULT GetContext ([out] IUnknown **ppContext);
+  HRESULT Clear ();
+}
+
+[object, local, uuid (d09ac7bd-2a3e-4b85-8605-2737ff3e4ea0)]
+interface IWSDHttpAddress : IWSDTransportAddress {
+  HRESULT GetSecure ();
+  HRESULT SetSecure ([in] BOOL fSecure);
+  HRESULT GetPath ([out] LPCWSTR *ppszPath);
+  HRESULT SetPath ([in] LPCWSTR pszPath);
+}
+
+cpp_quote("#if WINVER >= 0x601")
+[object, local, uuid (de105e87-a0da-418e-98ad-27b9eed87bdc)]
+interface IWSDSSLClientCertificate : IUnknown {
+  HRESULT GetClientCertificate ([in, out] PCCERT_CONTEXT *ppCertContext);
+  HRESULT GetMappedAccessToken ([in, out] HANDLE *phToken);
+}
+
+[object, local, uuid (0b476df0-8dac-480d-b05c-99781a5884aa)]
+interface IWSDHttpAuthParameters: IUnknown {
+  HRESULT GetClientAccessToken ([out] HANDLE *phToken);
+  HRESULT GetAuthType ([out] PWSD_SECURITY_HTTP_AUTH_SCHEMES pAuthType);
+}
+
+[object, local, uuid (03ce20aa-71c4-45e2-b32e-3766c61c790f), pointer_default (unique), restricted]
+interface IWSDSignatureProperty : IUnknown {
+  HRESULT IsMessageSigned ([out] BOOL *pbSigned);
+  HRESULT IsMessageSignatureTrusted ([out] BOOL *pbSignatureTrusted);
+  HRESULT GetKeyInfo ([out, size_is (*pdwKeyInfoSize)] BYTE *pbKeyInfo,[in, out] DWORD *pdwKeyInfoSize);
+  HRESULT GetSignature ([out, size_is (*pdwSignatureSize)] BYTE *pbSignature,[in, out] DWORD *pdwSignatureSize);
+  HRESULT GetSignedInfoHash ([out, size_is (*pdwHashSize)] BYTE *pbSignedInfoHash,[in, out] DWORD *pdwHashSize);
+}
+cpp_quote("#endif")
+
+cpp_quote("HRESULT WINAPI WSDCreateHttpAddress(IWSDHttpAddress **ppAdress);")
+cpp_quote("HRESULT WINAPI WSDCreateHttpMessageParameters(IWSDHttpMessageParameters **ppTxParams);")
+
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/wsdclient.h b/mingw-w64-headers/include/wsdclient.h
index 7603291..d19d53d 100644
--- a/mingw-w64-headers/include/wsdclient.h
+++ b/mingw-w64-headers/include/wsdclient.h
@@ -1,128 +1,967 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+/*** Autogenerated by WIDL 1.6 from wsdclient.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __wsdclient_h__
+#define __wsdclient_h__
+
+/* Forward declarations */
+
+#ifndef __IWSDAsyncResult_FWD_DEFINED__
+#define __IWSDAsyncResult_FWD_DEFINED__
+typedef interface IWSDAsyncResult IWSDAsyncResult;
+#endif
+
+#ifndef __IWSDAsyncCallback_FWD_DEFINED__
+#define __IWSDAsyncCallback_FWD_DEFINED__
+typedef interface IWSDAsyncCallback IWSDAsyncCallback;
+#endif
+
+#ifndef __IWSDMetadataExchange_FWD_DEFINED__
+#define __IWSDMetadataExchange_FWD_DEFINED__
+typedef interface IWSDMetadataExchange IWSDMetadataExchange;
+#endif
+
+#ifndef __IWSDEventingStatus_FWD_DEFINED__
+#define __IWSDEventingStatus_FWD_DEFINED__
+typedef interface IWSDEventingStatus IWSDEventingStatus;
+#endif
+
+#ifndef __IWSDEndpointProxy_FWD_DEFINED__
+#define __IWSDEndpointProxy_FWD_DEFINED__
+typedef interface IWSDEndpointProxy IWSDEndpointProxy;
+#endif
+
+#ifndef __IWSDDeviceProxy_FWD_DEFINED__
+#define __IWSDDeviceProxy_FWD_DEFINED__
+typedef interface IWSDDeviceProxy IWSDDeviceProxy;
+#endif
+
+#ifndef __IWSDServiceProxy_FWD_DEFINED__
+#define __IWSDServiceProxy_FWD_DEFINED__
+typedef interface IWSDServiceProxy IWSDServiceProxy;
+#endif
+
+#ifndef __IWSDServiceProxyEventing_FWD_DEFINED__
+#define __IWSDServiceProxyEventing_FWD_DEFINED__
+typedef interface IWSDServiceProxyEventing IWSDServiceProxyEventing;
+#endif
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+#include <ocidl.h>
+#include <wsdxmldom.h>
+#include <wsdtypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef __IWSDAddress_FWD_DEFINED__
+#define __IWSDAddress_FWD_DEFINED__
+typedef interface IWSDAddress IWSDAddress;
+#endif
+
+#ifndef __IWSDXMLContext_FWD_DEFINED__
+#define __IWSDXMLContext_FWD_DEFINED__
+typedef interface IWSDXMLContext IWSDXMLContext;
+#endif
+
+#ifndef __IWSDiscoveredService_FWD_DEFINED__
+#define __IWSDiscoveredService_FWD_DEFINED__
+typedef interface IWSDiscoveredService IWSDiscoveredService;
+#endif
+
+#ifndef __IWSDDeviceProxy_FWD_DEFINED__
+#define __IWSDDeviceProxy_FWD_DEFINED__
+typedef interface IWSDDeviceProxy IWSDDeviceProxy;
+#endif
+
+#ifndef __IWSDServiceProxy_FWD_DEFINED__
+#define __IWSDServiceProxy_FWD_DEFINED__
+typedef interface IWSDServiceProxy IWSDServiceProxy;
+#endif
+
+#ifndef __IWSDEndpointProxy_FWD_DEFINED__
+#define __IWSDEndpointProxy_FWD_DEFINED__
+typedef interface IWSDEndpointProxy IWSDEndpointProxy;
+#endif
+
+#ifndef __IWSDAsyncResult_FWD_DEFINED__
+#define __IWSDAsyncResult_FWD_DEFINED__
+typedef interface IWSDAsyncResult IWSDAsyncResult;
+#endif
+
+#ifndef __IWSDAsyncCallback_FWD_DEFINED__
+#define __IWSDAsyncCallback_FWD_DEFINED__
+typedef interface IWSDAsyncCallback IWSDAsyncCallback;
+#endif
+
+#ifndef __IWSDMetadataExchange_FWD_DEFINED__
+#define __IWSDMetadataExchange_FWD_DEFINED__
+typedef interface IWSDMetadataExchange IWSDMetadataExchange;
+#endif
+
+#ifndef __IWSDEventingStatus_FWD_DEFINED__
+#define __IWSDEventingStatus_FWD_DEFINED__
+typedef interface IWSDEventingStatus IWSDEventingStatus;
+#endif
+
+/*****************************************************************************
+ * IWSDAsyncResult interface
  */
-#ifndef _INC_WSDCLIENT
-#define _INC_WSDCLIENT
+#ifndef __IWSDAsyncResult_INTERFACE_DEFINED__
+#define __IWSDAsyncResult_INTERFACE_DEFINED__
 
-#ifndef _INC_WSDAPI
-#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+DEFINE_GUID(IID_IWSDAsyncResult, 0x11a9852a, 0x8dd8, 0x423e, 0xb5,0x37, 0x93,0x56,0xdb,0x4f,0xbf,0xb8);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("11a9852a-8dd8-423e-b537-9356db4fbfb8")
+IWSDAsyncResult : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetCallback(
+        IWSDAsyncCallback *pCallback,
+        IUnknown *pAsyncState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetWaitHandle(
+        HANDLE hWaitHandle) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HasCompleted(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAsyncState(
+        IUnknown **ppAsyncState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abort(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetEvent(
+        WSD_EVENT *pEvent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetEndpointProxy(
+        IWSDEndpointProxy **ppEndpoint) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDAsyncResult, 0x11a9852a, 0x8dd8, 0x423e, 0xb5,0x37, 0x93,0x56,0xdb,0x4f,0xbf,0xb8)
 #endif
-
-#if (_WIN32_WINNT >= 0x0600)
-
-#undef  INTERFACE
-#define INTERFACE IWSDEventingStatus
-DECLARE_INTERFACE_(IWSDEventingStatus,IUnknown) {
+#else
+typedef struct IWSDAsyncResultVtbl {
     BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDEventingStatus methods */
-    STDMETHOD(SubscriptionRenewed)(THIS_ LPCWSTR pszSubscriptionAction) PURE;
-    STDMETHOD(SubscriptionRenewalFailed)(THIS_ LPCWSTR pszSubscriptionAction,HRESULT hr) PURE;
-    STDMETHOD(SubscriptionEnded)(THIS_ LPCWSTR pszSubscriptionAction) PURE;
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDAsyncResult* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDAsyncResult* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDAsyncResult* This);
+
+    /*** IWSDAsyncResult methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetCallback)(
+        IWSDAsyncResult* This,
+        IWSDAsyncCallback *pCallback,
+        IUnknown *pAsyncState);
+
+    HRESULT (STDMETHODCALLTYPE *SetWaitHandle)(
+        IWSDAsyncResult* This,
+        HANDLE hWaitHandle);
+
+    HRESULT (STDMETHODCALLTYPE *HasCompleted)(
+        IWSDAsyncResult* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetAsyncState)(
+        IWSDAsyncResult* This,
+        IUnknown **ppAsyncState);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IWSDAsyncResult* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetEvent)(
+        IWSDAsyncResult* This,
+        WSD_EVENT *pEvent);
+
+    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
+        IWSDAsyncResult* This,
+        IWSDEndpointProxy **ppEndpoint);
 
     END_INTERFACE
+} IWSDAsyncResultVtbl;
+interface IWSDAsyncResult {
+    CONST_VTBL IWSDAsyncResultVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IWSDEventingStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDEventingStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDEventingStatus_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDEventingStatus_SubscriptionRenewed(This,pszSubscriptionAction) (This)->lpVtbl->SubscriptionRenewed(This,pszSubscriptionAction)
-#define IWSDEventingStatus_SubscriptionRenewalFailed(This,pszSubscriptionAction,hr) (This)->lpVtbl->SubscriptionRenewalFailed(This,pszSubscriptionAction,hr)
-#define IWSDEventingStatus_SubscriptionEnded(This,pszSubscriptionAction) (This)->lpVtbl->SubscriptionEnded(This,pszSubscriptionAction)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDAsyncCallback
-DECLARE_INTERFACE_(IWSDAsyncCallback,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDAsyncCallback methods */
-    STDMETHOD_(HRESULT,AsyncOperationComplete)(THIS_ IWSDAsyncResult *pAsyncResult,IUnknown *pAsyncState) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDAsyncCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDAsyncCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDAsyncCallback_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDAsyncCallback_AsyncOperationComplete(This,pAsyncResult,pAsyncState) (This)->lpVtbl->AsyncOperationComplete(This,pAsyncResult,pAsyncState)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDAsyncResult
-DECLARE_INTERFACE_(IWSDAsyncResult,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDAsyncResult methods */
-    STDMETHOD_(HRESULT,SetCallback)(THIS_ IWSDAsyncCallback *pCallback,IUnknown *pAsyncState) PURE;
-    STDMETHOD_(HRESULT,SetWaitHandle)(THIS_ HANDLE hWaitHandle) PURE;
-    STDMETHOD_(HRESULT,HasCompleted)(THIS) PURE;
-    STDMETHOD_(HRESULT,GetAsyncState)(THIS_ IUnknown **ppAsyncState) PURE;
-    STDMETHOD_(HRESULT,Abort)(THIS) PURE;
-    STDMETHOD_(HRESULT,GetEvent)(THIS_ WSD_EVENT *pEvent) PURE;
-    STDMETHOD_(HRESULT,GetEndpointProxy)(THIS_ IWSDEndpointProxy **ppEndpoint) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDAsyncResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDAsyncResult_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDAsyncResult_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDAsyncResult methods ***/
 #define IWSDAsyncResult_SetCallback(This,pCallback,pAsyncState) (This)->lpVtbl->SetCallback(This,pCallback,pAsyncState)
 #define IWSDAsyncResult_SetWaitHandle(This,hWaitHandle) (This)->lpVtbl->SetWaitHandle(This,hWaitHandle)
-#define IWSDAsyncResult_HasCompleted() (This)->lpVtbl->HasCompleted(This)
+#define IWSDAsyncResult_HasCompleted(This) (This)->lpVtbl->HasCompleted(This)
 #define IWSDAsyncResult_GetAsyncState(This,ppAsyncState) (This)->lpVtbl->GetAsyncState(This,ppAsyncState)
-#define IWSDAsyncResult_Abort() (This)->lpVtbl->Abort(This)
+#define IWSDAsyncResult_Abort(This) (This)->lpVtbl->Abort(This)
 #define IWSDAsyncResult_GetEvent(This,pEvent) (This)->lpVtbl->GetEvent(This,pEvent)
 #define IWSDAsyncResult_GetEndpointProxy(This,ppEndpoint) (This)->lpVtbl->GetEndpointProxy(This,ppEndpoint)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDDeviceProxy
-DECLARE_INTERFACE_(IWSDDeviceProxy,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDAsyncResult_QueryInterface(IWSDAsyncResult* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDAsyncResult_AddRef(IWSDAsyncResult* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDAsyncResult_Release(IWSDAsyncResult* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDAsyncResult methods ***/
+static FORCEINLINE HRESULT IWSDAsyncResult_SetCallback(IWSDAsyncResult* This,IWSDAsyncCallback *pCallback,IUnknown *pAsyncState) {
+    return This->lpVtbl->SetCallback(This,pCallback,pAsyncState);
+}
+static FORCEINLINE HRESULT IWSDAsyncResult_SetWaitHandle(IWSDAsyncResult* This,HANDLE hWaitHandle) {
+    return This->lpVtbl->SetWaitHandle(This,hWaitHandle);
+}
+static FORCEINLINE HRESULT IWSDAsyncResult_HasCompleted(IWSDAsyncResult* This) {
+    return This->lpVtbl->HasCompleted(This);
+}
+static FORCEINLINE HRESULT IWSDAsyncResult_GetAsyncState(IWSDAsyncResult* This,IUnknown **ppAsyncState) {
+    return This->lpVtbl->GetAsyncState(This,ppAsyncState);
+}
+static FORCEINLINE HRESULT IWSDAsyncResult_Abort(IWSDAsyncResult* This) {
+    return This->lpVtbl->Abort(This);
+}
+static FORCEINLINE HRESULT IWSDAsyncResult_GetEvent(IWSDAsyncResult* This,WSD_EVENT *pEvent) {
+    return This->lpVtbl->GetEvent(This,pEvent);
+}
+static FORCEINLINE HRESULT IWSDAsyncResult_GetEndpointProxy(IWSDAsyncResult* This,IWSDEndpointProxy **ppEndpoint) {
+    return This->lpVtbl->GetEndpointProxy(This,ppEndpoint);
+}
 #endif
-    /* IWSDDeviceProxy methods */
-    STDMETHOD_(HRESULT,Init)(THIS_ LPCWSTR pszDeviceId,IWSDAddress *pDeviceAddress,LPCWSTR pszLocalId,IWSDDeviceProxy *pSponsor) PURE;
-    STDMETHOD_(HRESULT,BeginGetMetadata)(THIS_ IWSDAsyncResult **ppResult) PURE;
-    STDMETHOD_(HRESULT,EndGetMetadata)(THIS_ IWSDAsyncResult *pResult) PURE;
-    STDMETHOD_(HRESULT,GetHostMetadata)(THIS_ WSD_HOST_METADATA **ppHostMetadata) PURE;
-    STDMETHOD_(HRESULT,GetThisModelMetadata)(THIS_ WSD_THIS_MODEL_METADATA **ppManufacturerMetadata) PURE;
-    STDMETHOD_(HRESULT,GetThisDeviceMetadata)(THIS_ WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata) PURE;
-    STDMETHOD_(HRESULT,GetAllMetadata)(THIS_ WSD_METADATA_SECTION_LIST **ppMetadata) PURE;
-    STDMETHOD_(HRESULT,GetServiceProxyById)(THIS_ LPCWSTR pszServiceId,IWSDServiceProxy **ppServiceProxy) PURE;
-    STDMETHOD_(HRESULT,GetServiceProxyByType)(THIS_ const WSDXML_NAME *pType,IWSDServiceProxy **ppServiceProxy) PURE;
-    STDMETHOD_(HRESULT,GetEndpointProxy)(THIS_ IWSDEndpointProxy **ppProxy) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_SetCallback_Proxy(
+    IWSDAsyncResult* This,
+    IWSDAsyncCallback *pCallback,
+    IUnknown *pAsyncState);
+void __RPC_STUB IWSDAsyncResult_SetCallback_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_SetWaitHandle_Proxy(
+    IWSDAsyncResult* This,
+    HANDLE hWaitHandle);
+void __RPC_STUB IWSDAsyncResult_SetWaitHandle_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_HasCompleted_Proxy(
+    IWSDAsyncResult* This);
+void __RPC_STUB IWSDAsyncResult_HasCompleted_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_GetAsyncState_Proxy(
+    IWSDAsyncResult* This,
+    IUnknown **ppAsyncState);
+void __RPC_STUB IWSDAsyncResult_GetAsyncState_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_Abort_Proxy(
+    IWSDAsyncResult* This);
+void __RPC_STUB IWSDAsyncResult_Abort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_GetEvent_Proxy(
+    IWSDAsyncResult* This,
+    WSD_EVENT *pEvent);
+void __RPC_STUB IWSDAsyncResult_GetEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDAsyncResult_GetEndpointProxy_Proxy(
+    IWSDAsyncResult* This,
+    IWSDEndpointProxy **ppEndpoint);
+void __RPC_STUB IWSDAsyncResult_GetEndpointProxy_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDAsyncResult_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDAsyncCallback interface
+ */
+#ifndef __IWSDAsyncCallback_INTERFACE_DEFINED__
+#define __IWSDAsyncCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDAsyncCallback, 0xa63e109d, 0xce72, 0x49e2, 0xba,0x98, 0xe8,0x45,0xf5,0xee,0x16,0x66);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a63e109d-ce72-49e2-ba98-e845f5ee1666")
+IWSDAsyncCallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AsyncOperationComplete(
+        IWSDAsyncResult *pAsyncResult,
+        IUnknown *pAsyncState) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDAsyncCallback, 0xa63e109d, 0xce72, 0x49e2, 0xba,0x98, 0xe8,0x45,0xf5,0xee,0x16,0x66)
+#endif
+#else
+typedef struct IWSDAsyncCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDAsyncCallback* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDAsyncCallback* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDAsyncCallback* This);
+
+    /*** IWSDAsyncCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *AsyncOperationComplete)(
+        IWSDAsyncCallback* This,
+        IWSDAsyncResult *pAsyncResult,
+        IUnknown *pAsyncState);
 
     END_INTERFACE
+} IWSDAsyncCallbackVtbl;
+interface IWSDAsyncCallback {
+    CONST_VTBL IWSDAsyncCallbackVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDAsyncCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDAsyncCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDAsyncCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDAsyncCallback methods ***/
+#define IWSDAsyncCallback_AsyncOperationComplete(This,pAsyncResult,pAsyncState) (This)->lpVtbl->AsyncOperationComplete(This,pAsyncResult,pAsyncState)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDAsyncCallback_QueryInterface(IWSDAsyncCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDAsyncCallback_AddRef(IWSDAsyncCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDAsyncCallback_Release(IWSDAsyncCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDAsyncCallback methods ***/
+static FORCEINLINE HRESULT IWSDAsyncCallback_AsyncOperationComplete(IWSDAsyncCallback* This,IWSDAsyncResult *pAsyncResult,IUnknown *pAsyncState) {
+    return This->lpVtbl->AsyncOperationComplete(This,pAsyncResult,pAsyncState);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDAsyncCallback_AsyncOperationComplete_Proxy(
+    IWSDAsyncCallback* This,
+    IWSDAsyncResult *pAsyncResult,
+    IUnknown *pAsyncState);
+void __RPC_STUB IWSDAsyncCallback_AsyncOperationComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDAsyncCallback_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDMetadataExchange interface
+ */
+#ifndef __IWSDMetadataExchange_INTERFACE_DEFINED__
+#define __IWSDMetadataExchange_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDMetadataExchange, 0x06996d57, 0x1d67, 0x4928, 0x93,0x07, 0x3d,0x78,0x33,0xfd,0xb8,0x46);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("06996d57-1d67-4928-9307-3d7833fdb846")
+IWSDMetadataExchange : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetMetadata(
+        WSD_METADATA_SECTION_LIST **MetadataOut) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDMetadataExchange, 0x06996d57, 0x1d67, 0x4928, 0x93,0x07, 0x3d,0x78,0x33,0xfd,0xb8,0x46)
+#endif
+#else
+typedef struct IWSDMetadataExchangeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDMetadataExchange* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDMetadataExchange* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDMetadataExchange* This);
+
+    /*** IWSDMetadataExchange methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
+        IWSDMetadataExchange* This,
+        WSD_METADATA_SECTION_LIST **MetadataOut);
+
+    END_INTERFACE
+} IWSDMetadataExchangeVtbl;
+interface IWSDMetadataExchange {
+    CONST_VTBL IWSDMetadataExchangeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDMetadataExchange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDMetadataExchange_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDMetadataExchange_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDMetadataExchange methods ***/
+#define IWSDMetadataExchange_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDMetadataExchange_QueryInterface(IWSDMetadataExchange* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDMetadataExchange_AddRef(IWSDMetadataExchange* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDMetadataExchange_Release(IWSDMetadataExchange* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDMetadataExchange methods ***/
+static FORCEINLINE HRESULT IWSDMetadataExchange_GetMetadata(IWSDMetadataExchange* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
+    return This->lpVtbl->GetMetadata(This,MetadataOut);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDMetadataExchange_GetMetadata_Proxy(
+    IWSDMetadataExchange* This,
+    WSD_METADATA_SECTION_LIST **MetadataOut);
+void __RPC_STUB IWSDMetadataExchange_GetMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDMetadataExchange_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDEventingStatus interface
+ */
+#ifndef __IWSDEventingStatus_INTERFACE_DEFINED__
+#define __IWSDEventingStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDEventingStatus, 0x49b17f52, 0x637a, 0x407a, 0xae,0x99, 0xfb,0xe8,0x2a,0x4d,0x38,0xc0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("49b17f52-637a-407a-ae99-fbe82a4d38c0")
+IWSDEventingStatus : public IUnknown
+{
+    virtual void STDMETHODCALLTYPE SubscriptionRenewed(
+        LPCWSTR pszSubscriptionAction) = 0;
+
+    virtual void STDMETHODCALLTYPE SubscriptionRenewalFailed(
+        LPCWSTR pszSubscriptionAction,
+        HRESULT hr) = 0;
+
+    virtual void STDMETHODCALLTYPE SubscriptionEnded(
+        LPCWSTR pszSubscriptionAction) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDEventingStatus, 0x49b17f52, 0x637a, 0x407a, 0xae,0x99, 0xfb,0xe8,0x2a,0x4d,0x38,0xc0)
+#endif
+#else
+typedef struct IWSDEventingStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDEventingStatus* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDEventingStatus* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDEventingStatus* This);
+
+    /*** IWSDEventingStatus methods ***/
+    void (STDMETHODCALLTYPE *SubscriptionRenewed)(
+        IWSDEventingStatus* This,
+        LPCWSTR pszSubscriptionAction);
+
+    void (STDMETHODCALLTYPE *SubscriptionRenewalFailed)(
+        IWSDEventingStatus* This,
+        LPCWSTR pszSubscriptionAction,
+        HRESULT hr);
+
+    void (STDMETHODCALLTYPE *SubscriptionEnded)(
+        IWSDEventingStatus* This,
+        LPCWSTR pszSubscriptionAction);
+
+    END_INTERFACE
+} IWSDEventingStatusVtbl;
+interface IWSDEventingStatus {
+    CONST_VTBL IWSDEventingStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDEventingStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDEventingStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDEventingStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDEventingStatus methods ***/
+#define IWSDEventingStatus_SubscriptionRenewed(This,pszSubscriptionAction) (This)->lpVtbl->SubscriptionRenewed(This,pszSubscriptionAction)
+#define IWSDEventingStatus_SubscriptionRenewalFailed(This,pszSubscriptionAction,hr) (This)->lpVtbl->SubscriptionRenewalFailed(This,pszSubscriptionAction,hr)
+#define IWSDEventingStatus_SubscriptionEnded(This,pszSubscriptionAction) (This)->lpVtbl->SubscriptionEnded(This,pszSubscriptionAction)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDEventingStatus_QueryInterface(IWSDEventingStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDEventingStatus_AddRef(IWSDEventingStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDEventingStatus_Release(IWSDEventingStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDEventingStatus methods ***/
+static FORCEINLINE void IWSDEventingStatus_SubscriptionRenewed(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction) {
+    This->lpVtbl->SubscriptionRenewed(This,pszSubscriptionAction);
+}
+static FORCEINLINE void IWSDEventingStatus_SubscriptionRenewalFailed(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction,HRESULT hr) {
+    This->lpVtbl->SubscriptionRenewalFailed(This,pszSubscriptionAction,hr);
+}
+static FORCEINLINE void IWSDEventingStatus_SubscriptionEnded(IWSDEventingStatus* This,LPCWSTR pszSubscriptionAction) {
+    This->lpVtbl->SubscriptionEnded(This,pszSubscriptionAction);
+}
+#endif
+#endif
+
+#endif
+
+void STDMETHODCALLTYPE IWSDEventingStatus_SubscriptionRenewed_Proxy(
+    IWSDEventingStatus* This,
+    LPCWSTR pszSubscriptionAction);
+void __RPC_STUB IWSDEventingStatus_SubscriptionRenewed_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+void STDMETHODCALLTYPE IWSDEventingStatus_SubscriptionRenewalFailed_Proxy(
+    IWSDEventingStatus* This,
+    LPCWSTR pszSubscriptionAction,
+    HRESULT hr);
+void __RPC_STUB IWSDEventingStatus_SubscriptionRenewalFailed_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+void STDMETHODCALLTYPE IWSDEventingStatus_SubscriptionEnded_Proxy(
+    IWSDEventingStatus* This,
+    LPCWSTR pszSubscriptionAction);
+void __RPC_STUB IWSDEventingStatus_SubscriptionEnded_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDEventingStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDEndpointProxy interface
+ */
+#ifndef __IWSDEndpointProxy_INTERFACE_DEFINED__
+#define __IWSDEndpointProxy_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDEndpointProxy, 0x1860d430, 0xb24c, 0x4975, 0x9f,0x90, 0xdb,0xb3,0x9b,0xaa,0x24,0xec);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1860d430-b24c-4975-9f90-dbb39baa24ec")
+IWSDEndpointProxy : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SendOneWayRequest(
+        const void *pBody,
+        const WSD_OPERATION *pOperation) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SendTwoWayRequest(
+        const void *pBody,
+        const WSD_OPERATION *pOperation,
+        const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SendTwoWayRequestAsync(
+        const void *pBody,
+        const WSD_OPERATION *pOperation,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pCallback,
+        IWSDAsyncResult **pResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AbortAsyncOperation(
+        IWSDAsyncResult *pAsyncResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ProcessFault(
+        const WSD_SOAP_FAULT *pFault) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetErrorInfo(
+        LPCWSTR *ppszErrorInfo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFaultInfo(
+        WSD_SOAP_FAULT **ppFault) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDEndpointProxy, 0x1860d430, 0xb24c, 0x4975, 0x9f,0x90, 0xdb,0xb3,0x9b,0xaa,0x24,0xec)
+#endif
+#else
+typedef struct IWSDEndpointProxyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDEndpointProxy* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDEndpointProxy* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDEndpointProxy* This);
+
+    /*** IWSDEndpointProxy methods ***/
+    HRESULT (STDMETHODCALLTYPE *SendOneWayRequest)(
+        IWSDEndpointProxy* This,
+        const void *pBody,
+        const WSD_OPERATION *pOperation);
+
+    HRESULT (STDMETHODCALLTYPE *SendTwoWayRequest)(
+        IWSDEndpointProxy* This,
+        const void *pBody,
+        const WSD_OPERATION *pOperation,
+        const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext);
+
+    HRESULT (STDMETHODCALLTYPE *SendTwoWayRequestAsync)(
+        IWSDEndpointProxy* This,
+        const void *pBody,
+        const WSD_OPERATION *pOperation,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pCallback,
+        IWSDAsyncResult **pResult);
+
+    HRESULT (STDMETHODCALLTYPE *AbortAsyncOperation)(
+        IWSDEndpointProxy* This,
+        IWSDAsyncResult *pAsyncResult);
+
+    HRESULT (STDMETHODCALLTYPE *ProcessFault)(
+        IWSDEndpointProxy* This,
+        const WSD_SOAP_FAULT *pFault);
+
+    HRESULT (STDMETHODCALLTYPE *GetErrorInfo)(
+        IWSDEndpointProxy* This,
+        LPCWSTR *ppszErrorInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetFaultInfo)(
+        IWSDEndpointProxy* This,
+        WSD_SOAP_FAULT **ppFault);
+
+    END_INTERFACE
+} IWSDEndpointProxyVtbl;
+interface IWSDEndpointProxy {
+    CONST_VTBL IWSDEndpointProxyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDEndpointProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDEndpointProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDEndpointProxy_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDEndpointProxy methods ***/
+#define IWSDEndpointProxy_SendOneWayRequest(This,pBody,pOperation) (This)->lpVtbl->SendOneWayRequest(This,pBody,pOperation)
+#define IWSDEndpointProxy_SendTwoWayRequest(This,pBody,pOperation,pResponseContext) (This)->lpVtbl->SendTwoWayRequest(This,pBody,pOperation,pResponseContext)
+#define IWSDEndpointProxy_SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult) (This)->lpVtbl->SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult)
+#define IWSDEndpointProxy_AbortAsyncOperation(This,pAsyncResult) (This)->lpVtbl->AbortAsyncOperation(This,pAsyncResult)
+#define IWSDEndpointProxy_ProcessFault(This,pFault) (This)->lpVtbl->ProcessFault(This,pFault)
+#define IWSDEndpointProxy_GetErrorInfo(This,ppszErrorInfo) (This)->lpVtbl->GetErrorInfo(This,ppszErrorInfo)
+#define IWSDEndpointProxy_GetFaultInfo(This,ppFault) (This)->lpVtbl->GetFaultInfo(This,ppFault)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDEndpointProxy_QueryInterface(IWSDEndpointProxy* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDEndpointProxy_AddRef(IWSDEndpointProxy* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDEndpointProxy_Release(IWSDEndpointProxy* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDEndpointProxy methods ***/
+static FORCEINLINE HRESULT IWSDEndpointProxy_SendOneWayRequest(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation) {
+    return This->lpVtbl->SendOneWayRequest(This,pBody,pOperation);
+}
+static FORCEINLINE HRESULT IWSDEndpointProxy_SendTwoWayRequest(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation,const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext) {
+    return This->lpVtbl->SendTwoWayRequest(This,pBody,pOperation,pResponseContext);
+}
+static FORCEINLINE HRESULT IWSDEndpointProxy_SendTwoWayRequestAsync(IWSDEndpointProxy* This,const void *pBody,const WSD_OPERATION *pOperation,IUnknown *pAsyncState,IWSDAsyncCallback *pCallback,IWSDAsyncResult **pResult) {
+    return This->lpVtbl->SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult);
+}
+static FORCEINLINE HRESULT IWSDEndpointProxy_AbortAsyncOperation(IWSDEndpointProxy* This,IWSDAsyncResult *pAsyncResult) {
+    return This->lpVtbl->AbortAsyncOperation(This,pAsyncResult);
+}
+static FORCEINLINE HRESULT IWSDEndpointProxy_ProcessFault(IWSDEndpointProxy* This,const WSD_SOAP_FAULT *pFault) {
+    return This->lpVtbl->ProcessFault(This,pFault);
+}
+static FORCEINLINE HRESULT IWSDEndpointProxy_GetErrorInfo(IWSDEndpointProxy* This,LPCWSTR *ppszErrorInfo) {
+    return This->lpVtbl->GetErrorInfo(This,ppszErrorInfo);
+}
+static FORCEINLINE HRESULT IWSDEndpointProxy_GetFaultInfo(IWSDEndpointProxy* This,WSD_SOAP_FAULT **ppFault) {
+    return This->lpVtbl->GetFaultInfo(This,ppFault);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_SendOneWayRequest_Proxy(
+    IWSDEndpointProxy* This,
+    const void *pBody,
+    const WSD_OPERATION *pOperation);
+void __RPC_STUB IWSDEndpointProxy_SendOneWayRequest_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_SendTwoWayRequest_Proxy(
+    IWSDEndpointProxy* This,
+    const void *pBody,
+    const WSD_OPERATION *pOperation,
+    const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext);
+void __RPC_STUB IWSDEndpointProxy_SendTwoWayRequest_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_SendTwoWayRequestAsync_Proxy(
+    IWSDEndpointProxy* This,
+    const void *pBody,
+    const WSD_OPERATION *pOperation,
+    IUnknown *pAsyncState,
+    IWSDAsyncCallback *pCallback,
+    IWSDAsyncResult **pResult);
+void __RPC_STUB IWSDEndpointProxy_SendTwoWayRequestAsync_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_AbortAsyncOperation_Proxy(
+    IWSDEndpointProxy* This,
+    IWSDAsyncResult *pAsyncResult);
+void __RPC_STUB IWSDEndpointProxy_AbortAsyncOperation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_ProcessFault_Proxy(
+    IWSDEndpointProxy* This,
+    const WSD_SOAP_FAULT *pFault);
+void __RPC_STUB IWSDEndpointProxy_ProcessFault_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_GetErrorInfo_Proxy(
+    IWSDEndpointProxy* This,
+    LPCWSTR *ppszErrorInfo);
+void __RPC_STUB IWSDEndpointProxy_GetErrorInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDEndpointProxy_GetFaultInfo_Proxy(
+    IWSDEndpointProxy* This,
+    WSD_SOAP_FAULT **ppFault);
+void __RPC_STUB IWSDEndpointProxy_GetFaultInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDEndpointProxy_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDDeviceProxy interface
+ */
+#ifndef __IWSDDeviceProxy_INTERFACE_DEFINED__
+#define __IWSDDeviceProxy_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDDeviceProxy, 0xeee0c031, 0xc578, 0x4c0e, 0x9a,0x3b, 0x97,0x3c,0x35,0xf4,0x09,0xdb);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("eee0c031-c578-4c0e-9a3b-973c35f409db")
+IWSDDeviceProxy : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Init(
+        LPCWSTR pszDeviceId,
+        IWSDAddress *pDeviceAddress,
+        LPCWSTR pszLocalId,
+        IWSDXMLContext *pContext,
+        IWSDDeviceProxy *pSponsor) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginGetMetadata(
+        IWSDAsyncResult **ppResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndGetMetadata(
+        IWSDAsyncResult *pResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetHostMetadata(
+        WSD_HOST_METADATA **ppHostMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetThisModelMetadata(
+        WSD_THIS_MODEL_METADATA **ppManufacturerMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetThisDeviceMetadata(
+        WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAllMetadata(
+        WSD_METADATA_SECTION_LIST **ppMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetServiceProxyById(
+        LPCWSTR pszServiceId,
+        IWSDServiceProxy **ppServiceProxy) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetServiceProxyByType(
+        const WSDXML_NAME *pType,
+        IWSDServiceProxy **ppServiceProxy) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetEndpointProxy(
+        IWSDEndpointProxy **ppProxy) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDDeviceProxy, 0xeee0c031, 0xc578, 0x4c0e, 0x9a,0x3b, 0x97,0x3c,0x35,0xf4,0x09,0xdb)
+#endif
+#else
+typedef struct IWSDDeviceProxyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDDeviceProxy* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDDeviceProxy* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDDeviceProxy* This);
+
+    /*** IWSDDeviceProxy methods ***/
+    HRESULT (STDMETHODCALLTYPE *Init)(
+        IWSDDeviceProxy* This,
+        LPCWSTR pszDeviceId,
+        IWSDAddress *pDeviceAddress,
+        LPCWSTR pszLocalId,
+        IWSDXMLContext *pContext,
+        IWSDDeviceProxy *pSponsor);
+
+    HRESULT (STDMETHODCALLTYPE *BeginGetMetadata)(
+        IWSDDeviceProxy* This,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndGetMetadata)(
+        IWSDDeviceProxy* This,
+        IWSDAsyncResult *pResult);
+
+    HRESULT (STDMETHODCALLTYPE *GetHostMetadata)(
+        IWSDDeviceProxy* This,
+        WSD_HOST_METADATA **ppHostMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *GetThisModelMetadata)(
+        IWSDDeviceProxy* This,
+        WSD_THIS_MODEL_METADATA **ppManufacturerMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *GetThisDeviceMetadata)(
+        IWSDDeviceProxy* This,
+        WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *GetAllMetadata)(
+        IWSDDeviceProxy* This,
+        WSD_METADATA_SECTION_LIST **ppMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *GetServiceProxyById)(
+        IWSDDeviceProxy* This,
+        LPCWSTR pszServiceId,
+        IWSDServiceProxy **ppServiceProxy);
+
+    HRESULT (STDMETHODCALLTYPE *GetServiceProxyByType)(
+        IWSDDeviceProxy* This,
+        const WSDXML_NAME *pType,
+        IWSDServiceProxy **ppServiceProxy);
+
+    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
+        IWSDDeviceProxy* This,
+        IWSDEndpointProxy **ppProxy);
+
+    END_INTERFACE
+} IWSDDeviceProxyVtbl;
+interface IWSDDeviceProxy {
+    CONST_VTBL IWSDDeviceProxyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDDeviceProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDDeviceProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDDeviceProxy_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDDeviceProxy_Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pSponsor) (This)->lpVtbl->Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pSponsor)
+/*** IWSDDeviceProxy methods ***/
+#define IWSDDeviceProxy_Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pContext,pSponsor) (This)->lpVtbl->Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pContext,pSponsor)
 #define IWSDDeviceProxy_BeginGetMetadata(This,ppResult) (This)->lpVtbl->BeginGetMetadata(This,ppResult)
 #define IWSDDeviceProxy_EndGetMetadata(This,pResult) (This)->lpVtbl->EndGetMetadata(This,pResult)
 #define IWSDDeviceProxy_GetHostMetadata(This,ppHostMetadata) (This)->lpVtbl->GetHostMetadata(This,ppHostMetadata)
@@ -132,58 +971,251 @@
 #define IWSDDeviceProxy_GetServiceProxyById(This,pszServiceId,ppServiceProxy) (This)->lpVtbl->GetServiceProxyById(This,pszServiceId,ppServiceProxy)
 #define IWSDDeviceProxy_GetServiceProxyByType(This,pType,ppServiceProxy) (This)->lpVtbl->GetServiceProxyByType(This,pType,ppServiceProxy)
 #define IWSDDeviceProxy_GetEndpointProxy(This,ppProxy) (This)->lpVtbl->GetEndpointProxy(This,ppProxy)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDMetadataExchange
-DECLARE_INTERFACE_(IWSDMetadataExchange,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDDeviceProxy_QueryInterface(IWSDDeviceProxy* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDDeviceProxy_AddRef(IWSDDeviceProxy* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDDeviceProxy_Release(IWSDDeviceProxy* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDDeviceProxy methods ***/
+static FORCEINLINE HRESULT IWSDDeviceProxy_Init(IWSDDeviceProxy* This,LPCWSTR pszDeviceId,IWSDAddress *pDeviceAddress,LPCWSTR pszLocalId,IWSDXMLContext *pContext,IWSDDeviceProxy *pSponsor) {
+    return This->lpVtbl->Init(This,pszDeviceId,pDeviceAddress,pszLocalId,pContext,pSponsor);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_BeginGetMetadata(IWSDDeviceProxy* This,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginGetMetadata(This,ppResult);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_EndGetMetadata(IWSDDeviceProxy* This,IWSDAsyncResult *pResult) {
+    return This->lpVtbl->EndGetMetadata(This,pResult);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetHostMetadata(IWSDDeviceProxy* This,WSD_HOST_METADATA **ppHostMetadata) {
+    return This->lpVtbl->GetHostMetadata(This,ppHostMetadata);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetThisModelMetadata(IWSDDeviceProxy* This,WSD_THIS_MODEL_METADATA **ppManufacturerMetadata) {
+    return This->lpVtbl->GetThisModelMetadata(This,ppManufacturerMetadata);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetThisDeviceMetadata(IWSDDeviceProxy* This,WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata) {
+    return This->lpVtbl->GetThisDeviceMetadata(This,ppThisDeviceMetadata);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetAllMetadata(IWSDDeviceProxy* This,WSD_METADATA_SECTION_LIST **ppMetadata) {
+    return This->lpVtbl->GetAllMetadata(This,ppMetadata);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetServiceProxyById(IWSDDeviceProxy* This,LPCWSTR pszServiceId,IWSDServiceProxy **ppServiceProxy) {
+    return This->lpVtbl->GetServiceProxyById(This,pszServiceId,ppServiceProxy);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetServiceProxyByType(IWSDDeviceProxy* This,const WSDXML_NAME *pType,IWSDServiceProxy **ppServiceProxy) {
+    return This->lpVtbl->GetServiceProxyByType(This,pType,ppServiceProxy);
+}
+static FORCEINLINE HRESULT IWSDDeviceProxy_GetEndpointProxy(IWSDDeviceProxy* This,IWSDEndpointProxy **ppProxy) {
+    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
+}
 #endif
-    /* IWSDMetadataExchange methods */
-    STDMETHOD_(HRESULT,GetMetadata)(THIS_ WSD_METADATA_SECTION_LIST **MetadataOut) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_Init_Proxy(
+    IWSDDeviceProxy* This,
+    LPCWSTR pszDeviceId,
+    IWSDAddress *pDeviceAddress,
+    LPCWSTR pszLocalId,
+    IWSDXMLContext *pContext,
+    IWSDDeviceProxy *pSponsor);
+void __RPC_STUB IWSDDeviceProxy_Init_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_BeginGetMetadata_Proxy(
+    IWSDDeviceProxy* This,
+    IWSDAsyncResult **ppResult);
+void __RPC_STUB IWSDDeviceProxy_BeginGetMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_EndGetMetadata_Proxy(
+    IWSDDeviceProxy* This,
+    IWSDAsyncResult *pResult);
+void __RPC_STUB IWSDDeviceProxy_EndGetMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetHostMetadata_Proxy(
+    IWSDDeviceProxy* This,
+    WSD_HOST_METADATA **ppHostMetadata);
+void __RPC_STUB IWSDDeviceProxy_GetHostMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetThisModelMetadata_Proxy(
+    IWSDDeviceProxy* This,
+    WSD_THIS_MODEL_METADATA **ppManufacturerMetadata);
+void __RPC_STUB IWSDDeviceProxy_GetThisModelMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetThisDeviceMetadata_Proxy(
+    IWSDDeviceProxy* This,
+    WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata);
+void __RPC_STUB IWSDDeviceProxy_GetThisDeviceMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetAllMetadata_Proxy(
+    IWSDDeviceProxy* This,
+    WSD_METADATA_SECTION_LIST **ppMetadata);
+void __RPC_STUB IWSDDeviceProxy_GetAllMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetServiceProxyById_Proxy(
+    IWSDDeviceProxy* This,
+    LPCWSTR pszServiceId,
+    IWSDServiceProxy **ppServiceProxy);
+void __RPC_STUB IWSDDeviceProxy_GetServiceProxyById_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetServiceProxyByType_Proxy(
+    IWSDDeviceProxy* This,
+    const WSDXML_NAME *pType,
+    IWSDServiceProxy **ppServiceProxy);
+void __RPC_STUB IWSDDeviceProxy_GetServiceProxyByType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceProxy_GetEndpointProxy_Proxy(
+    IWSDDeviceProxy* This,
+    IWSDEndpointProxy **ppProxy);
+void __RPC_STUB IWSDDeviceProxy_GetEndpointProxy_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDDeviceProxy_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDServiceProxy interface
+ */
+#ifndef __IWSDServiceProxy_INTERFACE_DEFINED__
+#define __IWSDServiceProxy_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDServiceProxy, 0xd4c7fb9c, 0x03ab, 0x4175, 0x9d,0x67, 0x09,0x4f,0xaf,0xeb,0xf4,0x87);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d4c7fb9c-03ab-4175-9d67-094fafebf487")
+IWSDServiceProxy : public IWSDMetadataExchange
+{
+    virtual HRESULT STDMETHODCALLTYPE BeginGetMetadata(
+        IWSDAsyncResult **ppResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndGetMetadata(
+        IWSDAsyncResult *pResult,
+        WSD_METADATA_SECTION_LIST **ppMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetServiceMetadata(
+        WSD_SERVICE_METADATA **ppServiceMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SubscribeToOperation(
+        const WSD_OPERATION *pOperation,
+        IUnknown *pUnknown,
+        const WSDXML_ELEMENT *pAny,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnsubscribeToOperation(
+        const WSD_OPERATION *pOperation) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetEventingStatusCallback(
+        IWSDEventingStatus *pStatus) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetEndpointProxy(
+        IWSDEndpointProxy **ppProxy) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDServiceProxy, 0xd4c7fb9c, 0x03ab, 0x4175, 0x9d,0x67, 0x09,0x4f,0xaf,0xeb,0xf4,0x87)
+#endif
+#else
+typedef struct IWSDServiceProxyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDServiceProxy* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDServiceProxy* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDServiceProxy* This);
+
+    /*** IWSDMetadataExchange methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
+        IWSDServiceProxy* This,
+        WSD_METADATA_SECTION_LIST **MetadataOut);
+
+    /*** IWSDServiceProxy methods ***/
+    HRESULT (STDMETHODCALLTYPE *BeginGetMetadata)(
+        IWSDServiceProxy* This,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndGetMetadata)(
+        IWSDServiceProxy* This,
+        IWSDAsyncResult *pResult,
+        WSD_METADATA_SECTION_LIST **ppMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *GetServiceMetadata)(
+        IWSDServiceProxy* This,
+        WSD_SERVICE_METADATA **ppServiceMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *SubscribeToOperation)(
+        IWSDServiceProxy* This,
+        const WSD_OPERATION *pOperation,
+        IUnknown *pUnknown,
+        const WSDXML_ELEMENT *pAny,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *UnsubscribeToOperation)(
+        IWSDServiceProxy* This,
+        const WSD_OPERATION *pOperation);
+
+    HRESULT (STDMETHODCALLTYPE *SetEventingStatusCallback)(
+        IWSDServiceProxy* This,
+        IWSDEventingStatus *pStatus);
+
+    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
+        IWSDServiceProxy* This,
+        IWSDEndpointProxy **ppProxy);
 
     END_INTERFACE
+} IWSDServiceProxyVtbl;
+interface IWSDServiceProxy {
+    CONST_VTBL IWSDServiceProxyVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IWSDMetadataExchange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDMetadataExchange_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDMetadataExchange_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDMetadataExchange_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDServiceProxy
-DECLARE_INTERFACE_(IWSDServiceProxy,IWSDMetadataExchange) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IWSDMetadataExchange methods */
-    STDMETHOD_(HRESULT,GetMetadata)(THIS_ WSD_METADATA_SECTION_LIST **MetadataOut) PURE;
-#endif
-    /* IWSDServiceProxy methods */
-    STDMETHOD_(HRESULT,BeginGetMetadata)(THIS_ IWSDAsyncResult **ppResult) PURE;
-    STDMETHOD_(HRESULT,EndGetMetadata)(THIS_ IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) PURE;
-    STDMETHOD_(HRESULT,GetServiceMetadata)(THIS_ WSD_SERVICE_METADATA **ppServiceMetadata) PURE;
-    STDMETHOD_(HRESULT,SubscribeToOperation)(THIS_ const WSD_OPERATION *pOperation,IUnknown *pUnknown,const WSDXML_ELEMENT *pAny,WSDXML_ELEMENT **ppAny) PURE;
-    STDMETHOD_(HRESULT,UnsubscribeToOperation)(THIS_ const WSD_OPERATION *pOperation) PURE;
-    STDMETHOD_(HRESULT,SetEventingStatusCallback)(THIS_ IWSDEventingStatus *pStatus) PURE;
-    STDMETHOD_(HRESULT,GetEndpointProxy)(THIS_ IWSDEndpointProxy **ppProxy) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDServiceProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDServiceProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDServiceProxy_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDMetadataExchange methods ***/
+#define IWSDServiceProxy_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
+/*** IWSDServiceProxy methods ***/
 #define IWSDServiceProxy_BeginGetMetadata(This,ppResult) (This)->lpVtbl->BeginGetMetadata(This,ppResult)
 #define IWSDServiceProxy_EndGetMetadata(This,pResult,ppMetadata) (This)->lpVtbl->EndGetMetadata(This,pResult,ppMetadata)
 #define IWSDServiceProxy_GetServiceMetadata(This,ppServiceMetadata) (This)->lpVtbl->GetServiceMetadata(This,ppServiceMetadata)
@@ -191,51 +1223,655 @@
 #define IWSDServiceProxy_UnsubscribeToOperation(This,pOperation) (This)->lpVtbl->UnsubscribeToOperation(This,pOperation)
 #define IWSDServiceProxy_SetEventingStatusCallback(This,pStatus) (This)->lpVtbl->SetEventingStatusCallback(This,pStatus)
 #define IWSDServiceProxy_GetEndpointProxy(This,ppProxy) (This)->lpVtbl->GetEndpointProxy(This,ppProxy)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDEndpointProxy
-DECLARE_INTERFACE_(IWSDEndpointProxy,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxy_QueryInterface(IWSDServiceProxy* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDServiceProxy_AddRef(IWSDServiceProxy* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDServiceProxy_Release(IWSDServiceProxy* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDMetadataExchange methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxy_GetMetadata(IWSDServiceProxy* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
+    return This->lpVtbl->GetMetadata(This,MetadataOut);
+}
+/*** IWSDServiceProxy methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxy_BeginGetMetadata(IWSDServiceProxy* This,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginGetMetadata(This,ppResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxy_EndGetMetadata(IWSDServiceProxy* This,IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) {
+    return This->lpVtbl->EndGetMetadata(This,pResult,ppMetadata);
+}
+static FORCEINLINE HRESULT IWSDServiceProxy_GetServiceMetadata(IWSDServiceProxy* This,WSD_SERVICE_METADATA **ppServiceMetadata) {
+    return This->lpVtbl->GetServiceMetadata(This,ppServiceMetadata);
+}
+static FORCEINLINE HRESULT IWSDServiceProxy_SubscribeToOperation(IWSDServiceProxy* This,const WSD_OPERATION *pOperation,IUnknown *pUnknown,const WSDXML_ELEMENT *pAny,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxy_UnsubscribeToOperation(IWSDServiceProxy* This,const WSD_OPERATION *pOperation) {
+    return This->lpVtbl->UnsubscribeToOperation(This,pOperation);
+}
+static FORCEINLINE HRESULT IWSDServiceProxy_SetEventingStatusCallback(IWSDServiceProxy* This,IWSDEventingStatus *pStatus) {
+    return This->lpVtbl->SetEventingStatusCallback(This,pStatus);
+}
+static FORCEINLINE HRESULT IWSDServiceProxy_GetEndpointProxy(IWSDServiceProxy* This,IWSDEndpointProxy **ppProxy) {
+    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
+}
 #endif
-    /* IWSDEndpointProxy methods */
-    STDMETHOD_(HRESULT,SendOneWayRequest)(THIS_ const void *pBody,const WSD_OPERATION *pOperation) PURE;
-    STDMETHOD_(HRESULT,SendTwoWayRequest)(THIS_ const void *pBody,const WSD_OPERATION *pOperation,WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext) PURE;
-    STDMETHOD_(HRESULT,SendTwoWayRequestAsync)(THIS_ const void *pBody,const WSD_OPERATION *pOperation,IUnknown *pAsyncState,IWSDAsyncCallback *pCallback,IWSDAsyncResult **pResult) PURE;
-    STDMETHOD_(HRESULT,AbortAsyncOperation)(THIS_ IWSDAsyncResult *pAsyncResult) PURE;
-    STDMETHOD_(HRESULT,ProcessFault)(THIS_ const WSD_SOAP_FAULT *pFault) PURE;
-    STDMETHOD_(HRESULT,GetErrorInfo)(THIS_ const LPCWSTR *ppszErrorInfo) PURE;
-    STDMETHOD_(HRESULT,GetFaultInfo)(THIS_ WSD_SOAP_FAULT **ppFault) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_BeginGetMetadata_Proxy(
+    IWSDServiceProxy* This,
+    IWSDAsyncResult **ppResult);
+void __RPC_STUB IWSDServiceProxy_BeginGetMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_EndGetMetadata_Proxy(
+    IWSDServiceProxy* This,
+    IWSDAsyncResult *pResult,
+    WSD_METADATA_SECTION_LIST **ppMetadata);
+void __RPC_STUB IWSDServiceProxy_EndGetMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_GetServiceMetadata_Proxy(
+    IWSDServiceProxy* This,
+    WSD_SERVICE_METADATA **ppServiceMetadata);
+void __RPC_STUB IWSDServiceProxy_GetServiceMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_SubscribeToOperation_Proxy(
+    IWSDServiceProxy* This,
+    const WSD_OPERATION *pOperation,
+    IUnknown *pUnknown,
+    const WSDXML_ELEMENT *pAny,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxy_SubscribeToOperation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_UnsubscribeToOperation_Proxy(
+    IWSDServiceProxy* This,
+    const WSD_OPERATION *pOperation);
+void __RPC_STUB IWSDServiceProxy_UnsubscribeToOperation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_SetEventingStatusCallback_Proxy(
+    IWSDServiceProxy* This,
+    IWSDEventingStatus *pStatus);
+void __RPC_STUB IWSDServiceProxy_SetEventingStatusCallback_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxy_GetEndpointProxy_Proxy(
+    IWSDServiceProxy* This,
+    IWSDEndpointProxy **ppProxy);
+void __RPC_STUB IWSDServiceProxy_GetEndpointProxy_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDServiceProxy_INTERFACE_DEFINED__ */
+
+#if WINVER >= 0x601
+/*****************************************************************************
+ * IWSDServiceProxyEventing interface
+ */
+#ifndef __IWSDServiceProxyEventing_INTERFACE_DEFINED__
+#define __IWSDServiceProxyEventing_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDServiceProxyEventing, 0xf9279d6d, 0x1012, 0x4a94, 0xb8,0xcc, 0xfd,0x35,0xd2,0x20,0x2b,0xfe);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f9279d6d-1012-4a94-b8cc-fd35d2202bfe")
+IWSDServiceProxyEventing : public IWSDServiceProxy
+{
+    virtual HRESULT STDMETHODCALLTYPE SubscribeToMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IUnknown *pUnknown,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginSubscribeToMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IUnknown *pUnknown,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndSubscribeToMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnsubscribeToMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginUnsubscribeToMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndUnsubscribeToMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RenewMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginRenewMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndRenewMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStatusForMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginGetStatusForMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndGetStatusForMultipleOperations(
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDServiceProxyEventing, 0xf9279d6d, 0x1012, 0x4a94, 0xb8,0xcc, 0xfd,0x35,0xd2,0x20,0x2b,0xfe)
+#endif
+#else
+typedef struct IWSDServiceProxyEventingVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDServiceProxyEventing* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDServiceProxyEventing* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDServiceProxyEventing* This);
+
+    /*** IWSDMetadataExchange methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
+        IWSDServiceProxyEventing* This,
+        WSD_METADATA_SECTION_LIST **MetadataOut);
+
+    /*** IWSDServiceProxy methods ***/
+    HRESULT (STDMETHODCALLTYPE *BeginGetMetadata)(
+        IWSDServiceProxyEventing* This,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndGetMetadata)(
+        IWSDServiceProxyEventing* This,
+        IWSDAsyncResult *pResult,
+        WSD_METADATA_SECTION_LIST **ppMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *GetServiceMetadata)(
+        IWSDServiceProxyEventing* This,
+        WSD_SERVICE_METADATA **ppServiceMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *SubscribeToOperation)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperation,
+        IUnknown *pUnknown,
+        const WSDXML_ELEMENT *pAny,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *UnsubscribeToOperation)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperation);
+
+    HRESULT (STDMETHODCALLTYPE *SetEventingStatusCallback)(
+        IWSDServiceProxyEventing* This,
+        IWSDEventingStatus *pStatus);
+
+    HRESULT (STDMETHODCALLTYPE *GetEndpointProxy)(
+        IWSDServiceProxyEventing* This,
+        IWSDEndpointProxy **ppProxy);
+
+    /*** IWSDServiceProxyEventing methods ***/
+    HRESULT (STDMETHODCALLTYPE *SubscribeToMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IUnknown *pUnknown,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *BeginSubscribeToMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IUnknown *pUnknown,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndSubscribeToMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *UnsubscribeToMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny);
+
+    HRESULT (STDMETHODCALLTYPE *BeginUnsubscribeToMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndUnsubscribeToMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult);
+
+    HRESULT (STDMETHODCALLTYPE *RenewMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *BeginRenewMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSD_EVENTING_EXPIRES *pExpires,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndRenewMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatusForMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny);
+
+    HRESULT (STDMETHODCALLTYPE *BeginGetStatusForMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pAsyncState,
+        IWSDAsyncCallback *pAsyncCallback,
+        IWSDAsyncResult **ppResult);
+
+    HRESULT (STDMETHODCALLTYPE *EndGetStatusForMultipleOperations)(
+        IWSDServiceProxyEventing* This,
+        const WSD_OPERATION *pOperations,
+        DWORD dwOperationCount,
+        IWSDAsyncResult *pResult,
+        WSD_EVENTING_EXPIRES **ppExpires,
+        WSDXML_ELEMENT **ppAny);
 
     END_INTERFACE
+} IWSDServiceProxyEventingVtbl;
+interface IWSDServiceProxyEventing {
+    CONST_VTBL IWSDServiceProxyEventingVtbl* lpVtbl;
 };
-#ifdef COBJMACROS
-#define IWSDEndpointProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDEndpointProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDEndpointProxy_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDEndpointProxy_SendOneWayRequest(This,pBody,pOperation) (This)->lpVtbl->SendOneWayRequest(This,pBody,pOperation)
-#define IWSDEndpointProxy_SendTwoWayRequest(This,pBody,pOperation,pResponseContext) (This)->lpVtbl->SendTwoWayRequest(This,pBody,pOperation,pResponseContext)
-#define IWSDEndpointProxy_SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult) (This)->lpVtbl->SendTwoWayRequestAsync(This,pBody,pOperation,pAsyncState,pCallback,pResult)
-#define IWSDEndpointProxy_AbortAsyncOperation(This,pAsyncResult) (This)->lpVtbl->AbortAsyncOperation(This,pAsyncResult)
-#define IWSDEndpointProxy_ProcessFault(This,pFault) (This)->lpVtbl->ProcessFault(This,pFault)
-#define IWSDEndpointProxy_GetErrorInfo(This,ppszErrorInfo) (This)->lpVtbl->GetErrorInfo(This,ppszErrorInfo)
-#define IWSDEndpointProxy_GetFaultInfo(This,ppFault) (This)->lpVtbl->GetFaultInfo(This,ppFault)
-#endif /*COBJMACROS*/
 
-#ifdef __cplusplus
-extern "C" {
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDServiceProxyEventing_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDServiceProxyEventing_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDServiceProxyEventing_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDMetadataExchange methods ***/
+#define IWSDServiceProxyEventing_GetMetadata(This,MetadataOut) (This)->lpVtbl->GetMetadata(This,MetadataOut)
+/*** IWSDServiceProxy methods ***/
+#define IWSDServiceProxyEventing_BeginGetMetadata(This,ppResult) (This)->lpVtbl->BeginGetMetadata(This,ppResult)
+#define IWSDServiceProxyEventing_EndGetMetadata(This,pResult,ppMetadata) (This)->lpVtbl->EndGetMetadata(This,pResult,ppMetadata)
+#define IWSDServiceProxyEventing_GetServiceMetadata(This,ppServiceMetadata) (This)->lpVtbl->GetServiceMetadata(This,ppServiceMetadata)
+#define IWSDServiceProxyEventing_SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny) (This)->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny)
+#define IWSDServiceProxyEventing_UnsubscribeToOperation(This,pOperation) (This)->lpVtbl->UnsubscribeToOperation(This,pOperation)
+#define IWSDServiceProxyEventing_SetEventingStatusCallback(This,pStatus) (This)->lpVtbl->SetEventingStatusCallback(This,pStatus)
+#define IWSDServiceProxyEventing_GetEndpointProxy(This,ppProxy) (This)->lpVtbl->GetEndpointProxy(This,ppProxy)
+/*** IWSDServiceProxyEventing methods ***/
+#define IWSDServiceProxyEventing_SubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,ppExpires,ppAny) (This)->lpVtbl->SubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,ppExpires,ppAny)
+#define IWSDServiceProxyEventing_BeginSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult)
+#define IWSDServiceProxyEventing_EndSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny) (This)->lpVtbl->EndSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny)
+#define IWSDServiceProxyEventing_UnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny) (This)->lpVtbl->UnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny)
+#define IWSDServiceProxyEventing_BeginUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult)
+#define IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult) (This)->lpVtbl->EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult)
+#define IWSDServiceProxyEventing_RenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,ppExpires,ppAny) (This)->lpVtbl->RenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,ppExpires,ppAny)
+#define IWSDServiceProxyEventing_BeginRenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginRenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult)
+#define IWSDServiceProxyEventing_EndRenewMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny) (This)->lpVtbl->EndRenewMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny)
+#define IWSDServiceProxyEventing_GetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,ppExpires,ppAny) (This)->lpVtbl->GetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,ppExpires,ppAny)
+#define IWSDServiceProxyEventing_BeginGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult) (This)->lpVtbl->BeginGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult)
+#define IWSDServiceProxyEventing_EndGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny) (This)->lpVtbl->EndGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_QueryInterface(IWSDServiceProxyEventing* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDServiceProxyEventing_AddRef(IWSDServiceProxyEventing* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDServiceProxyEventing_Release(IWSDServiceProxyEventing* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDMetadataExchange methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_GetMetadata(IWSDServiceProxyEventing* This,WSD_METADATA_SECTION_LIST **MetadataOut) {
+    return This->lpVtbl->GetMetadata(This,MetadataOut);
+}
+/*** IWSDServiceProxy methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_BeginGetMetadata(IWSDServiceProxyEventing* This,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginGetMetadata(This,ppResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_EndGetMetadata(IWSDServiceProxyEventing* This,IWSDAsyncResult *pResult,WSD_METADATA_SECTION_LIST **ppMetadata) {
+    return This->lpVtbl->EndGetMetadata(This,pResult,ppMetadata);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_GetServiceMetadata(IWSDServiceProxyEventing* This,WSD_SERVICE_METADATA **ppServiceMetadata) {
+    return This->lpVtbl->GetServiceMetadata(This,ppServiceMetadata);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_SubscribeToOperation(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperation,IUnknown *pUnknown,const WSDXML_ELEMENT *pAny,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->SubscribeToOperation(This,pOperation,pUnknown,pAny,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_UnsubscribeToOperation(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperation) {
+    return This->lpVtbl->UnsubscribeToOperation(This,pOperation);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_SetEventingStatusCallback(IWSDServiceProxyEventing* This,IWSDEventingStatus *pStatus) {
+    return This->lpVtbl->SetEventingStatusCallback(This,pStatus);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_GetEndpointProxy(IWSDServiceProxyEventing* This,IWSDEndpointProxy **ppProxy) {
+    return This->lpVtbl->GetEndpointProxy(This,ppProxy);
+}
+/*** IWSDServiceProxyEventing methods ***/
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_SubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IUnknown *pUnknown,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->SubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,ppExpires,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_BeginSubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IUnknown *pUnknown,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pUnknown,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_EndSubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->EndSubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_UnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny) {
+    return This->lpVtbl->UnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_BeginUnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult) {
+    return This->lpVtbl->EndUnsubscribeToMultipleOperations(This,pOperations,dwOperationCount,pResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_RenewMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->RenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,ppExpires,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_BeginRenewMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSD_EVENTING_EXPIRES *pExpires,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginRenewMultipleOperations(This,pOperations,dwOperationCount,pExpires,pAny,pAsyncState,pAsyncCallback,ppResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_EndRenewMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->EndRenewMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_GetStatusForMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->GetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,ppExpires,ppAny);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_BeginGetStatusForMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,const WSDXML_ELEMENT *pAny,IUnknown *pAsyncState,IWSDAsyncCallback *pAsyncCallback,IWSDAsyncResult **ppResult) {
+    return This->lpVtbl->BeginGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pAny,pAsyncState,pAsyncCallback,ppResult);
+}
+static FORCEINLINE HRESULT IWSDServiceProxyEventing_EndGetStatusForMultipleOperations(IWSDServiceProxyEventing* This,const WSD_OPERATION *pOperations,DWORD dwOperationCount,IWSDAsyncResult *pResult,WSD_EVENTING_EXPIRES **ppExpires,WSDXML_ELEMENT **ppAny) {
+    return This->lpVtbl->EndGetStatusForMultipleOperations(This,pOperations,dwOperationCount,pResult,ppExpires,ppAny);
+}
+#endif
 #endif
 
-HRESULT WINAPI WSDCreateDeviceProxy(const WCHAR *pszDeviceId, const WCHAR *pszLocalId, IWSDXMLContext *pContext,IWSDDeviceProxy **ppDeviceProxy);
-HRESULT WINAPI WSDCreateDeviceProxyAdvanced(const WCHAR *pszDeviceId, IWSDAddress *pDeviceAddress, const WCHAR *pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_SubscribeToMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    IUnknown *pUnknown,
+    const WSD_EVENTING_EXPIRES *pExpires,
+    const WSDXML_ELEMENT *pAny,
+    WSD_EVENTING_EXPIRES **ppExpires,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxyEventing_SubscribeToMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_BeginSubscribeToMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    IUnknown *pUnknown,
+    const WSD_EVENTING_EXPIRES *pExpires,
+    const WSDXML_ELEMENT *pAny,
+    IUnknown *pAsyncState,
+    IWSDAsyncCallback *pAsyncCallback,
+    IWSDAsyncResult **ppResult);
+void __RPC_STUB IWSDServiceProxyEventing_BeginSubscribeToMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_EndSubscribeToMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    IWSDAsyncResult *pResult,
+    WSD_EVENTING_EXPIRES **ppExpires,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxyEventing_EndSubscribeToMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_UnsubscribeToMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    const WSDXML_ELEMENT *pAny);
+void __RPC_STUB IWSDServiceProxyEventing_UnsubscribeToMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_BeginUnsubscribeToMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    const WSDXML_ELEMENT *pAny,
+    IUnknown *pAsyncState,
+    IWSDAsyncCallback *pAsyncCallback,
+    IWSDAsyncResult **ppResult);
+void __RPC_STUB IWSDServiceProxyEventing_BeginUnsubscribeToMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    IWSDAsyncResult *pResult);
+void __RPC_STUB IWSDServiceProxyEventing_EndUnsubscribeToMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_RenewMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    const WSD_EVENTING_EXPIRES *pExpires,
+    const WSDXML_ELEMENT *pAny,
+    WSD_EVENTING_EXPIRES **ppExpires,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxyEventing_RenewMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_BeginRenewMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    const WSD_EVENTING_EXPIRES *pExpires,
+    const WSDXML_ELEMENT *pAny,
+    IUnknown *pAsyncState,
+    IWSDAsyncCallback *pAsyncCallback,
+    IWSDAsyncResult **ppResult);
+void __RPC_STUB IWSDServiceProxyEventing_BeginRenewMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_EndRenewMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    IWSDAsyncResult *pResult,
+    WSD_EVENTING_EXPIRES **ppExpires,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxyEventing_EndRenewMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_GetStatusForMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    const WSDXML_ELEMENT *pAny,
+    WSD_EVENTING_EXPIRES **ppExpires,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxyEventing_GetStatusForMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_BeginGetStatusForMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    const WSDXML_ELEMENT *pAny,
+    IUnknown *pAsyncState,
+    IWSDAsyncCallback *pAsyncCallback,
+    IWSDAsyncResult **ppResult);
+void __RPC_STUB IWSDServiceProxyEventing_BeginGetStatusForMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceProxyEventing_EndGetStatusForMultipleOperations_Proxy(
+    IWSDServiceProxyEventing* This,
+    const WSD_OPERATION *pOperations,
+    DWORD dwOperationCount,
+    IWSDAsyncResult *pResult,
+    WSD_EVENTING_EXPIRES **ppExpires,
+    WSDXML_ELEMENT **ppAny);
+void __RPC_STUB IWSDServiceProxyEventing_EndGetStatusForMultipleOperations_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDServiceProxyEventing_INTERFACE_DEFINED__ */
+
+#endif
+HRESULT WINAPI WSDCreateDeviceProxy(LPCWSTR pszDeviceId, LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);
+HRESULT WINAPI WSDCreateDeviceProxyAdvanced(LPCWSTR pszDeviceId, IWSDAddress* pDeviceAddress, LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);
+#if WINVER >= 0x601
+HRESULT WINAPI WSDCreateDeviceProxy2(LPCWSTR pszDeviceId, LPCWSTR pszLocalId, IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDDeviceProxy **ppDeviceProxy);
+#endif
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_WSDCLIENT*/
+
+#endif /* __wsdclient_h__ */
diff --git a/mingw-w64-headers/include/wsdclient.idl b/mingw-w64-headers/include/wsdclient.idl
new file mode 100644
index 0000000..e97191c
--- /dev/null
+++ b/mingw-w64-headers/include/wsdclient.idl
@@ -0,0 +1,114 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+import "oaidl.idl";
+import "ocidl.idl";
+import "wsdxmldom.h";
+import "wsdtypes.h";
+
+cpp_quote("")
+interface IWSDAddress;
+interface IWSDXMLContext;
+interface IWSDiscoveredService;
+interface IWSDDeviceProxy;
+interface IWSDServiceProxy;
+interface IWSDEndpointProxy;
+interface IWSDAsyncResult;
+interface IWSDAsyncCallback;
+interface IWSDMetadataExchange;
+interface IWSDEventingStatus;
+
+[object, local, restricted, uuid (11a9852a-8dd8-423e-b537-9356db4fbfb8), pointer_default (unique)]
+interface IWSDAsyncResult : IUnknown {
+  HRESULT SetCallback ([in] IWSDAsyncCallback *pCallback,[in] IUnknown *pAsyncState);
+  HRESULT SetWaitHandle ([in] HANDLE hWaitHandle);
+  HRESULT HasCompleted ();
+  HRESULT GetAsyncState ([out] IUnknown **ppAsyncState);
+  HRESULT Abort ();
+  HRESULT GetEvent ([out] WSD_EVENT *pEvent);
+  HRESULT GetEndpointProxy ([out] IWSDEndpointProxy **ppEndpoint);
+};
+
+[object, local, restricted, uuid (a63e109d-ce72-49e2-ba98-e845f5ee1666), pointer_default (unique)]
+interface IWSDAsyncCallback : IUnknown {
+  HRESULT AsyncOperationComplete ([in] IWSDAsyncResult *pAsyncResult,[in] IUnknown *pAsyncState);
+};
+
+[object, local, restricted, uuid (06996d57-1d67-4928-9307-3d7833fdb846), pointer_default (unique)]
+interface IWSDMetadataExchange : IUnknown {
+  HRESULT GetMetadata ([out] WSD_METADATA_SECTION_LIST **MetadataOut);
+};
+
+[object, local, restricted, uuid (49b17f52-637a-407a-ae99-fbe82a4d38c0), pointer_default (unique)]
+interface IWSDEventingStatus : IUnknown {
+  void SubscriptionRenewed ([in] LPCWSTR pszSubscriptionAction);
+  void SubscriptionRenewalFailed ([in] LPCWSTR pszSubscriptionAction,[in] HRESULT hr);
+  void SubscriptionEnded ([in] LPCWSTR pszSubscriptionAction);
+};
+
+[object, local, restricted, uuid (1860d430-b24c-4975-9f90-dbb39baa24ec), pointer_default (unique)]
+interface IWSDEndpointProxy : IUnknown {
+  HRESULT SendOneWayRequest ([in] const void *pBody,[in] const WSD_OPERATION *pOperation);
+  HRESULT SendTwoWayRequest ([in] const void *pBody,[in] const WSD_OPERATION *pOperation,[in, optional] const WSD_SYNCHRONOUS_RESPONSE_CONTEXT *pResponseContext);
+  HRESULT SendTwoWayRequestAsync ([in] const void *pBody,[in] const WSD_OPERATION *pOperation,[in] IUnknown *pAsyncState,[in] IWSDAsyncCallback *pCallback,[out] IWSDAsyncResult **pResult);
+  HRESULT AbortAsyncOperation ([in] IWSDAsyncResult *pAsyncResult);
+  HRESULT ProcessFault ([in] const WSD_SOAP_FAULT *pFault);
+  HRESULT GetErrorInfo ([out] LPCWSTR *ppszErrorInfo);
+  HRESULT GetFaultInfo ([out] WSD_SOAP_FAULT **ppFault);
+};
+
+[object, local, restricted, uuid (eee0c031-c578-4c0e-9a3b-973c35f409db), pointer_default (unique)]
+interface IWSDDeviceProxy : IUnknown {
+  HRESULT Init ([in] LPCWSTR pszDeviceId,[in] IWSDAddress *pDeviceAddress,[in] LPCWSTR pszLocalId,[in, optional] IWSDXMLContext *pContext,[in, optional] IWSDDeviceProxy *pSponsor);
+  HRESULT BeginGetMetadata ([out] IWSDAsyncResult **ppResult);
+  HRESULT EndGetMetadata ([in] IWSDAsyncResult *pResult);
+  HRESULT GetHostMetadata ([out] WSD_HOST_METADATA **ppHostMetadata);
+  HRESULT GetThisModelMetadata ([out] WSD_THIS_MODEL_METADATA **ppManufacturerMetadata);
+  HRESULT GetThisDeviceMetadata ([out] WSD_THIS_DEVICE_METADATA **ppThisDeviceMetadata);
+  HRESULT GetAllMetadata ([out] WSD_METADATA_SECTION_LIST **ppMetadata);
+  HRESULT GetServiceProxyById ([in] LPCWSTR pszServiceId,[out] IWSDServiceProxy **ppServiceProxy);
+  HRESULT GetServiceProxyByType ([in] const WSDXML_NAME *pType,[out] IWSDServiceProxy **ppServiceProxy);
+  HRESULT GetEndpointProxy ([out] IWSDEndpointProxy **ppProxy);
+};
+
+[object, local, restricted, uuid (d4c7fb9c-03ab-4175-9d67-094fafebf487), pointer_default (unique)]
+interface IWSDServiceProxy : IWSDMetadataExchange {
+  HRESULT BeginGetMetadata ([out] IWSDAsyncResult **ppResult);
+  HRESULT EndGetMetadata ([in] IWSDAsyncResult *pResult,[out] WSD_METADATA_SECTION_LIST **ppMetadata);
+  HRESULT GetServiceMetadata ([out] WSD_SERVICE_METADATA **ppServiceMetadata);
+  HRESULT SubscribeToOperation ([in] const WSD_OPERATION *pOperation,[in] IUnknown *pUnknown,[in] const WSDXML_ELEMENT *pAny,[out] WSDXML_ELEMENT **ppAny);
+  HRESULT UnsubscribeToOperation ([in] const WSD_OPERATION *pOperation);
+  HRESULT SetEventingStatusCallback ([in, optional] IWSDEventingStatus *pStatus);
+  HRESULT GetEndpointProxy ([out] IWSDEndpointProxy **ppProxy);
+};
+
+cpp_quote("#if WINVER >= 0x601")
+[object, local, restricted, uuid (f9279d6d-1012-4a94-b8cc-fd35d2202bfe), pointer_default (unique)]
+interface IWSDServiceProxyEventing : IWSDServiceProxy {
+  HRESULT SubscribeToMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] IUnknown *pUnknown,[in] const WSD_EVENTING_EXPIRES *pExpires,[in] const WSDXML_ELEMENT *pAny,[out] WSD_EVENTING_EXPIRES **ppExpires,[out] WSDXML_ELEMENT **ppAny);
+  HRESULT BeginSubscribeToMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] IUnknown *pUnknown,[in] const WSD_EVENTING_EXPIRES *pExpires,[in] const WSDXML_ELEMENT *pAny,[in] IUnknown *pAsyncState,[in] IWSDAsyncCallback *pAsyncCallback,[out] IWSDAsyncResult **ppResult);
+  HRESULT EndSubscribeToMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] IWSDAsyncResult *pResult,[out] WSD_EVENTING_EXPIRES **ppExpires,[out] WSDXML_ELEMENT **ppAny);
+  HRESULT UnsubscribeToMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] const WSDXML_ELEMENT *pAny);
+  HRESULT BeginUnsubscribeToMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] const WSDXML_ELEMENT *pAny,[in] IUnknown *pAsyncState,[in] IWSDAsyncCallback *pAsyncCallback,[out] IWSDAsyncResult **ppResult);
+  HRESULT EndUnsubscribeToMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] IWSDAsyncResult *pResult);
+  HRESULT RenewMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] const WSD_EVENTING_EXPIRES *pExpires,[in] const WSDXML_ELEMENT *pAny,[out] WSD_EVENTING_EXPIRES **ppExpires,[out] WSDXML_ELEMENT **ppAny);
+  HRESULT BeginRenewMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] const WSD_EVENTING_EXPIRES *pExpires,[in] const WSDXML_ELEMENT *pAny,[in] IUnknown *pAsyncState,[in] IWSDAsyncCallback *pAsyncCallback,[out] IWSDAsyncResult **ppResult);
+  HRESULT EndRenewMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] IWSDAsyncResult *pResult,[out] WSD_EVENTING_EXPIRES **ppExpires,[out] WSDXML_ELEMENT **ppAny);
+  HRESULT GetStatusForMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] const WSDXML_ELEMENT *pAny,[out] WSD_EVENTING_EXPIRES **ppExpires,[out] WSDXML_ELEMENT **ppAny);
+  HRESULT BeginGetStatusForMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] const WSDXML_ELEMENT *pAny,[in] IUnknown *pAsyncState,[in] IWSDAsyncCallback *pAsyncCallback,[out] IWSDAsyncResult **ppResult);
+  HRESULT EndGetStatusForMultipleOperations ([in] const WSD_OPERATION *pOperations,[in] DWORD dwOperationCount,[in] IWSDAsyncResult *pResult,[out] WSD_EVENTING_EXPIRES **ppExpires,[out] WSDXML_ELEMENT **ppAny);
+};
+cpp_quote("#endif")
+
+cpp_quote("HRESULT WINAPI WSDCreateDeviceProxy(LPCWSTR pszDeviceId, LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);")
+cpp_quote("HRESULT WINAPI WSDCreateDeviceProxyAdvanced(LPCWSTR pszDeviceId, IWSDAddress* pDeviceAddress, LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceProxy **ppDeviceProxy);")
+cpp_quote("#if WINVER >= 0x601")
+cpp_quote("HRESULT WINAPI WSDCreateDeviceProxy2(LPCWSTR pszDeviceId, LPCWSTR pszLocalId, IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDDeviceProxy **ppDeviceProxy);")
+cpp_quote("#endif")
+
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/wsddisco.h b/mingw-w64-headers/include/wsddisco.h
index c693419..fa5f8e0 100644
--- a/mingw-w64-headers/include/wsddisco.h
+++ b/mingw-w64-headers/include/wsddisco.h
@@ -1,95 +1,690 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+/*** Autogenerated by WIDL 1.6 from wsddisco.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __wsddisco_h__
+#define __wsddisco_h__
+
+/* Forward declarations */
+
+#ifndef __IWSDScopeMatchingRule_FWD_DEFINED__
+#define __IWSDScopeMatchingRule_FWD_DEFINED__
+typedef interface IWSDScopeMatchingRule IWSDScopeMatchingRule;
+#endif
+
+#ifndef __IWSDiscoveryProviderNotify_FWD_DEFINED__
+#define __IWSDiscoveryProviderNotify_FWD_DEFINED__
+typedef interface IWSDiscoveryProviderNotify IWSDiscoveryProviderNotify;
+#endif
+
+#ifndef __IWSDiscoveryProvider_FWD_DEFINED__
+#define __IWSDiscoveryProvider_FWD_DEFINED__
+typedef interface IWSDiscoveryProvider IWSDiscoveryProvider;
+#endif
+
+#ifndef __IWSDiscoveredService_FWD_DEFINED__
+#define __IWSDiscoveredService_FWD_DEFINED__
+typedef interface IWSDiscoveredService IWSDiscoveredService;
+#endif
+
+#ifndef __IWSDiscoveryPublisherNotify_FWD_DEFINED__
+#define __IWSDiscoveryPublisherNotify_FWD_DEFINED__
+typedef interface IWSDiscoveryPublisherNotify IWSDiscoveryPublisherNotify;
+#endif
+
+#ifndef __IWSDiscoveryPublisher_FWD_DEFINED__
+#define __IWSDiscoveryPublisher_FWD_DEFINED__
+typedef interface IWSDiscoveryPublisher IWSDiscoveryPublisher;
+#endif
+
+/* Headers for imported files */
+
+#include <objidl.h>
+#include <wsdxmldom.h>
+#include <wsdtypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef __IWSDXMLContext_FWD_DEFINED__
+#define __IWSDXMLContext_FWD_DEFINED__
+typedef interface IWSDXMLContext IWSDXMLContext;
+#endif
+
+#ifndef __IWSDiscoveryProvider_FWD_DEFINED__
+#define __IWSDiscoveryProvider_FWD_DEFINED__
+typedef interface IWSDiscoveryProvider IWSDiscoveryProvider;
+#endif
+
+#ifndef __IWSDiscoveryProviderNotify_FWD_DEFINED__
+#define __IWSDiscoveryProviderNotify_FWD_DEFINED__
+typedef interface IWSDiscoveryProviderNotify IWSDiscoveryProviderNotify;
+#endif
+
+#ifndef __IWSDiscoveredService_FWD_DEFINED__
+#define __IWSDiscoveredService_FWD_DEFINED__
+typedef interface IWSDiscoveredService IWSDiscoveredService;
+#endif
+
+#ifndef __IWSDiscoveryPublisher_FWD_DEFINED__
+#define __IWSDiscoveryPublisher_FWD_DEFINED__
+typedef interface IWSDiscoveryPublisher IWSDiscoveryPublisher;
+#endif
+
+#ifndef __IWSDiscoveryPublisherNotify_FWD_DEFINED__
+#define __IWSDiscoveryPublisherNotify_FWD_DEFINED__
+typedef interface IWSDiscoveryPublisherNotify IWSDiscoveryPublisherNotify;
+#endif
+
+#ifndef __IWSDScopeMatchingRule_FWD_DEFINED__
+#define __IWSDScopeMatchingRule_FWD_DEFINED__
+typedef interface IWSDScopeMatchingRule IWSDScopeMatchingRule;
+#endif
+
+/*****************************************************************************
+ * IWSDScopeMatchingRule interface
  */
-#ifndef _INC_WSDDISCO
-#define _INC_WSDDISCO
+#ifndef __IWSDScopeMatchingRule_INTERFACE_DEFINED__
+#define __IWSDScopeMatchingRule_INTERFACE_DEFINED__
 
-#ifndef _INC_WSDAPI
-#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+DEFINE_GUID(IID_IWSDScopeMatchingRule, 0xfcafe424, 0xfef5, 0x481a, 0xbd,0x9f, 0x33,0xce,0x05,0x74,0x25,0x6f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("fcafe424-fef5-481a-bd9f-33ce0574256f")
+IWSDScopeMatchingRule : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetScopeRule(
+        LPCWSTR *ppszScopeMatchingRule) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE MatchScopes(
+        LPCWSTR pszScope1,
+        LPCWSTR pszScope2,
+        WINBOOL *pfMatch) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDScopeMatchingRule, 0xfcafe424, 0xfef5, 0x481a, 0xbd,0x9f, 0x33,0xce,0x05,0x74,0x25,0x6f)
 #endif
-
-#if (_WIN32_WINNT >= 0x0600)
-
-#undef  INTERFACE
-#define INTERFACE IWSDScopeMatchingRule
-DECLARE_INTERFACE_(IWSDScopeMatchingRule,IUnknown) {
+#else
+typedef struct IWSDScopeMatchingRuleVtbl {
     BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDScopeMatchingRule methods */
-    STDMETHOD_(HRESULT,GetScopeRule)(THIS_ LPCWSTR *ppszScopeMatchingRule) PURE;
-    STDMETHOD_(HRESULT,MatchScopes)(THIS_ LPCWSTR pszScope1,LPCWSTR pszScope2,BOOL *pfMatch) PURE;
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDScopeMatchingRule* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDScopeMatchingRule* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDScopeMatchingRule* This);
+
+    /*** IWSDScopeMatchingRule methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetScopeRule)(
+        IWSDScopeMatchingRule* This,
+        LPCWSTR *ppszScopeMatchingRule);
+
+    HRESULT (STDMETHODCALLTYPE *MatchScopes)(
+        IWSDScopeMatchingRule* This,
+        LPCWSTR pszScope1,
+        LPCWSTR pszScope2,
+        WINBOOL *pfMatch);
 
     END_INTERFACE
+} IWSDScopeMatchingRuleVtbl;
+interface IWSDScopeMatchingRule {
+    CONST_VTBL IWSDScopeMatchingRuleVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDScopeMatchingRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDScopeMatchingRule_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDScopeMatchingRule_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDScopeMatchingRule methods ***/
 #define IWSDScopeMatchingRule_GetScopeRule(This,ppszScopeMatchingRule) (This)->lpVtbl->GetScopeRule(This,ppszScopeMatchingRule)
 #define IWSDScopeMatchingRule_MatchScopes(This,pszScope1,pszScope2,pfMatch) (This)->lpVtbl->MatchScopes(This,pszScope1,pszScope2,pfMatch)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDiscoveryPublisherNotify
-DECLARE_INTERFACE_(IWSDiscoveryPublisherNotify,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDScopeMatchingRule_QueryInterface(IWSDScopeMatchingRule* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDScopeMatchingRule_AddRef(IWSDScopeMatchingRule* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDScopeMatchingRule_Release(IWSDScopeMatchingRule* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDScopeMatchingRule methods ***/
+static FORCEINLINE HRESULT IWSDScopeMatchingRule_GetScopeRule(IWSDScopeMatchingRule* This,LPCWSTR *ppszScopeMatchingRule) {
+    return This->lpVtbl->GetScopeRule(This,ppszScopeMatchingRule);
+}
+static FORCEINLINE HRESULT IWSDScopeMatchingRule_MatchScopes(IWSDScopeMatchingRule* This,LPCWSTR pszScope1,LPCWSTR pszScope2,WINBOOL *pfMatch) {
+    return This->lpVtbl->MatchScopes(This,pszScope1,pszScope2,pfMatch);
+}
 #endif
-    /* IWSDiscoveryPublisherNotify methods */
-    STDMETHOD_(HRESULT,ProbeHandler)(THIS_ const WSD_SOAP_MESSAGE *pSoap,IWSDMessageParameters *pMessageParameters) PURE;
-    STDMETHOD_(HRESULT,ResolveHandler)(THIS_ const WSD_SOAP_MESSAGE *pSoap,IWSDMessageParameters *pMessageParameters) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDScopeMatchingRule_GetScopeRule_Proxy(
+    IWSDScopeMatchingRule* This,
+    LPCWSTR *ppszScopeMatchingRule);
+void __RPC_STUB IWSDScopeMatchingRule_GetScopeRule_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDScopeMatchingRule_MatchScopes_Proxy(
+    IWSDScopeMatchingRule* This,
+    LPCWSTR pszScope1,
+    LPCWSTR pszScope2,
+    WINBOOL *pfMatch);
+void __RPC_STUB IWSDScopeMatchingRule_MatchScopes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDScopeMatchingRule_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDiscoveryProviderNotify interface
+ */
+#ifndef __IWSDiscoveryProviderNotify_INTERFACE_DEFINED__
+#define __IWSDiscoveryProviderNotify_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDiscoveryProviderNotify, 0x73ee3ced, 0xb6e6, 0x4329, 0xa5,0x46, 0x3e,0x8a,0xd4,0x65,0x63,0xd2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("73ee3ced-b6e6-4329-a546-3e8ad46563d2")
+IWSDiscoveryProviderNotify : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Add(
+        IWSDiscoveredService *pService) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Remove(
+        IWSDiscoveredService *pService) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SearchFailed(
+        HRESULT hr,
+        LPCWSTR pszTag) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SearchComplete(
+        LPCWSTR pszTag) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDiscoveryProviderNotify, 0x73ee3ced, 0xb6e6, 0x4329, 0xa5,0x46, 0x3e,0x8a,0xd4,0x65,0x63,0xd2)
+#endif
+#else
+typedef struct IWSDiscoveryProviderNotifyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDiscoveryProviderNotify* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDiscoveryProviderNotify* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDiscoveryProviderNotify* This);
+
+    /*** IWSDiscoveryProviderNotify methods ***/
+    HRESULT (STDMETHODCALLTYPE *Add)(
+        IWSDiscoveryProviderNotify* This,
+        IWSDiscoveredService *pService);
+
+    HRESULT (STDMETHODCALLTYPE *Remove)(
+        IWSDiscoveryProviderNotify* This,
+        IWSDiscoveredService *pService);
+
+    HRESULT (STDMETHODCALLTYPE *SearchFailed)(
+        IWSDiscoveryProviderNotify* This,
+        HRESULT hr,
+        LPCWSTR pszTag);
+
+    HRESULT (STDMETHODCALLTYPE *SearchComplete)(
+        IWSDiscoveryProviderNotify* This,
+        LPCWSTR pszTag);
 
     END_INTERFACE
+} IWSDiscoveryProviderNotifyVtbl;
+interface IWSDiscoveryProviderNotify {
+    CONST_VTBL IWSDiscoveryProviderNotifyVtbl* lpVtbl;
 };
-#ifdef COBJMACROS
-#define IWSDiscoveryPublisherNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDiscoveryPublisherNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDiscoveryPublisherNotify_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDiscoveryPublisherNotify_ProbeHandler(This,pSoap,pMessageParameters) (This)->lpVtbl->ProbeHandler(This,pSoap,pMessageParameters)
-#define IWSDiscoveryPublisherNotify_ResolveHandler(This,pSoap,pMessageParameters) (This)->lpVtbl->ResolveHandler(This,pSoap,pMessageParameters)
-#endif /*COBJMACROS*/
 
-#undef  INTERFACE
-#define INTERFACE IWSDiscoveredService
-DECLARE_INTERFACE_(IWSDiscoveredService,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDiscoveryProviderNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDiscoveryProviderNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDiscoveryProviderNotify_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDiscoveryProviderNotify methods ***/
+#define IWSDiscoveryProviderNotify_Add(This,pService) (This)->lpVtbl->Add(This,pService)
+#define IWSDiscoveryProviderNotify_Remove(This,pService) (This)->lpVtbl->Remove(This,pService)
+#define IWSDiscoveryProviderNotify_SearchFailed(This,hr,pszTag) (This)->lpVtbl->SearchFailed(This,hr,pszTag)
+#define IWSDiscoveryProviderNotify_SearchComplete(This,pszTag) (This)->lpVtbl->SearchComplete(This,pszTag)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryProviderNotify_QueryInterface(IWSDiscoveryProviderNotify* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDiscoveryProviderNotify_AddRef(IWSDiscoveryProviderNotify* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDiscoveryProviderNotify_Release(IWSDiscoveryProviderNotify* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDiscoveryProviderNotify methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryProviderNotify_Add(IWSDiscoveryProviderNotify* This,IWSDiscoveredService *pService) {
+    return This->lpVtbl->Add(This,pService);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProviderNotify_Remove(IWSDiscoveryProviderNotify* This,IWSDiscoveredService *pService) {
+    return This->lpVtbl->Remove(This,pService);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProviderNotify_SearchFailed(IWSDiscoveryProviderNotify* This,HRESULT hr,LPCWSTR pszTag) {
+    return This->lpVtbl->SearchFailed(This,hr,pszTag);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProviderNotify_SearchComplete(IWSDiscoveryProviderNotify* This,LPCWSTR pszTag) {
+    return This->lpVtbl->SearchComplete(This,pszTag);
+}
 #endif
-    /* IWSDiscoveryProviderNotify methods */
-    STDMETHOD_(HRESULT *,GetEndpointReference)(THIS_ WSD_ENDPOINT_REFERENCE **ppEndPointReference) PURE;
-    STDMETHOD_(HRESULT,GetTypes)(THIS_ WSD_NAME_LIST **ppTypesList) PURE;
-    STDMETHOD_(HRESULT,GetScopes)(THIS_ WSD_URI_LIST **ppScopesList) PURE;
-    STDMETHOD_(HRESULT,GetXAddrs)(THIS_ WSD_URI_LIST **ppXAddrsList) PURE;
-    STDMETHOD_(HRESULT,GetMetadataVersion)(THIS_ ULONGLONG *pullMetadataVersion) PURE;
-    STDMETHOD_(HRESULT,GetExtendedDiscoXML)(THIS_ WSDXML_ELEMENT **ppHeaderAny,WSDXML_ELEMENT **ppBodyAny) PURE;
-    STDMETHOD_(HRESULT,GetProbeResolveTag)(THIS_ LPCWSTR *ppszTag) PURE;
-    STDMETHOD_(HRESULT,GetRemoteTransportAddress)(THIS_ LPCWSTR *ppszRemoteTransportAddress) PURE;
-    STDMETHOD_(HRESULT,GetLocalTransportAddress)(THIS_ LPCWSTR *ppszLocalTransportAddress) PURE;
-    STDMETHOD_(HRESULT,GetLocalInterfaceGUID)(THIS_ GUID *pGuid) PURE;
-    STDMETHOD_(HRESULT *,GetInstanceId)(THIS_ ULONGLONG *pullInstanceId) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProviderNotify_Add_Proxy(
+    IWSDiscoveryProviderNotify* This,
+    IWSDiscoveredService *pService);
+void __RPC_STUB IWSDiscoveryProviderNotify_Add_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProviderNotify_Remove_Proxy(
+    IWSDiscoveryProviderNotify* This,
+    IWSDiscoveredService *pService);
+void __RPC_STUB IWSDiscoveryProviderNotify_Remove_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProviderNotify_SearchFailed_Proxy(
+    IWSDiscoveryProviderNotify* This,
+    HRESULT hr,
+    LPCWSTR pszTag);
+void __RPC_STUB IWSDiscoveryProviderNotify_SearchFailed_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProviderNotify_SearchComplete_Proxy(
+    IWSDiscoveryProviderNotify* This,
+    LPCWSTR pszTag);
+void __RPC_STUB IWSDiscoveryProviderNotify_SearchComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDiscoveryProviderNotify_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDiscoveryProvider interface
+ */
+#ifndef __IWSDiscoveryProvider_INTERFACE_DEFINED__
+#define __IWSDiscoveryProvider_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDiscoveryProvider, 0x8ffc8e55, 0xf0eb, 0x480f, 0x88,0xb7, 0xb4,0x35,0xdd,0x28,0x1d,0x45);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8ffc8e55-f0eb-480f-88b7-b435dd281d45")
+IWSDiscoveryProvider : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetAddressFamily(
+        DWORD dwAddressFamily) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Attach(
+        IWSDiscoveryProviderNotify *pSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Detach(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SearchById(
+        LPCWSTR pszId,
+        LPCWSTR pszTag) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SearchByAddress(
+        LPCWSTR pszAddress,
+        LPCWSTR pszTag) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SearchByType(
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        LPCWSTR pszMatchBy,
+        LPCWSTR pszTag) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetXMLContext(
+        IWSDXMLContext **ppContext) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDiscoveryProvider, 0x8ffc8e55, 0xf0eb, 0x480f, 0x88,0xb7, 0xb4,0x35,0xdd,0x28,0x1d,0x45)
+#endif
+#else
+typedef struct IWSDiscoveryProviderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDiscoveryProvider* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDiscoveryProvider* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDiscoveryProvider* This);
+
+    /*** IWSDiscoveryProvider methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetAddressFamily)(
+        IWSDiscoveryProvider* This,
+        DWORD dwAddressFamily);
+
+    HRESULT (STDMETHODCALLTYPE *Attach)(
+        IWSDiscoveryProvider* This,
+        IWSDiscoveryProviderNotify *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *Detach)(
+        IWSDiscoveryProvider* This);
+
+    HRESULT (STDMETHODCALLTYPE *SearchById)(
+        IWSDiscoveryProvider* This,
+        LPCWSTR pszId,
+        LPCWSTR pszTag);
+
+    HRESULT (STDMETHODCALLTYPE *SearchByAddress)(
+        IWSDiscoveryProvider* This,
+        LPCWSTR pszAddress,
+        LPCWSTR pszTag);
+
+    HRESULT (STDMETHODCALLTYPE *SearchByType)(
+        IWSDiscoveryProvider* This,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        LPCWSTR pszMatchBy,
+        LPCWSTR pszTag);
+
+    HRESULT (STDMETHODCALLTYPE *GetXMLContext)(
+        IWSDiscoveryProvider* This,
+        IWSDXMLContext **ppContext);
 
     END_INTERFACE
+} IWSDiscoveryProviderVtbl;
+interface IWSDiscoveryProvider {
+    CONST_VTBL IWSDiscoveryProviderVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDiscoveryProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDiscoveryProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDiscoveryProvider_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDiscoveryProvider methods ***/
+#define IWSDiscoveryProvider_SetAddressFamily(This,dwAddressFamily) (This)->lpVtbl->SetAddressFamily(This,dwAddressFamily)
+#define IWSDiscoveryProvider_Attach(This,pSink) (This)->lpVtbl->Attach(This,pSink)
+#define IWSDiscoveryProvider_Detach(This) (This)->lpVtbl->Detach(This)
+#define IWSDiscoveryProvider_SearchById(This,pszId,pszTag) (This)->lpVtbl->SearchById(This,pszId,pszTag)
+#define IWSDiscoveryProvider_SearchByAddress(This,pszAddress,pszTag) (This)->lpVtbl->SearchByAddress(This,pszAddress,pszTag)
+#define IWSDiscoveryProvider_SearchByType(This,pTypesList,pScopesList,pszMatchBy,pszTag) (This)->lpVtbl->SearchByType(This,pTypesList,pScopesList,pszMatchBy,pszTag)
+#define IWSDiscoveryProvider_GetXMLContext(This,ppContext) (This)->lpVtbl->GetXMLContext(This,ppContext)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryProvider_QueryInterface(IWSDiscoveryProvider* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDiscoveryProvider_AddRef(IWSDiscoveryProvider* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDiscoveryProvider_Release(IWSDiscoveryProvider* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDiscoveryProvider methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryProvider_SetAddressFamily(IWSDiscoveryProvider* This,DWORD dwAddressFamily) {
+    return This->lpVtbl->SetAddressFamily(This,dwAddressFamily);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProvider_Attach(IWSDiscoveryProvider* This,IWSDiscoveryProviderNotify *pSink) {
+    return This->lpVtbl->Attach(This,pSink);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProvider_Detach(IWSDiscoveryProvider* This) {
+    return This->lpVtbl->Detach(This);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProvider_SearchById(IWSDiscoveryProvider* This,LPCWSTR pszId,LPCWSTR pszTag) {
+    return This->lpVtbl->SearchById(This,pszId,pszTag);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProvider_SearchByAddress(IWSDiscoveryProvider* This,LPCWSTR pszAddress,LPCWSTR pszTag) {
+    return This->lpVtbl->SearchByAddress(This,pszAddress,pszTag);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProvider_SearchByType(IWSDiscoveryProvider* This,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,LPCWSTR pszMatchBy,LPCWSTR pszTag) {
+    return This->lpVtbl->SearchByType(This,pTypesList,pScopesList,pszMatchBy,pszTag);
+}
+static FORCEINLINE HRESULT IWSDiscoveryProvider_GetXMLContext(IWSDiscoveryProvider* This,IWSDXMLContext **ppContext) {
+    return This->lpVtbl->GetXMLContext(This,ppContext);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_SetAddressFamily_Proxy(
+    IWSDiscoveryProvider* This,
+    DWORD dwAddressFamily);
+void __RPC_STUB IWSDiscoveryProvider_SetAddressFamily_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_Attach_Proxy(
+    IWSDiscoveryProvider* This,
+    IWSDiscoveryProviderNotify *pSink);
+void __RPC_STUB IWSDiscoveryProvider_Attach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_Detach_Proxy(
+    IWSDiscoveryProvider* This);
+void __RPC_STUB IWSDiscoveryProvider_Detach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_SearchById_Proxy(
+    IWSDiscoveryProvider* This,
+    LPCWSTR pszId,
+    LPCWSTR pszTag);
+void __RPC_STUB IWSDiscoveryProvider_SearchById_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_SearchByAddress_Proxy(
+    IWSDiscoveryProvider* This,
+    LPCWSTR pszAddress,
+    LPCWSTR pszTag);
+void __RPC_STUB IWSDiscoveryProvider_SearchByAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_SearchByType_Proxy(
+    IWSDiscoveryProvider* This,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    LPCWSTR pszMatchBy,
+    LPCWSTR pszTag);
+void __RPC_STUB IWSDiscoveryProvider_SearchByType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryProvider_GetXMLContext_Proxy(
+    IWSDiscoveryProvider* This,
+    IWSDXMLContext **ppContext);
+void __RPC_STUB IWSDiscoveryProvider_GetXMLContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDiscoveryProvider_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDiscoveredService interface
+ */
+#ifndef __IWSDiscoveredService_INTERFACE_DEFINED__
+#define __IWSDiscoveredService_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDiscoveredService, 0x4bad8a3b, 0xb374, 0x4420, 0x96,0x32, 0xaa,0xc9,0x45,0xb3,0x74,0xaa);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("4bad8a3b-b374-4420-9632-aac945b374aa")
+IWSDiscoveredService : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetEndpointReference(
+        WSD_ENDPOINT_REFERENCE **ppEndpointReference) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTypes(
+        WSD_NAME_LIST **ppTypesList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScopes(
+        WSD_URI_LIST **ppScopesList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetXAddrs(
+        WSD_URI_LIST **ppXAddrsList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMetadataVersion(
+        ULONGLONG *pullMetadataVersion) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetExtendedDiscoXML(
+        WSDXML_ELEMENT **ppHeaderAny,
+        WSDXML_ELEMENT **ppBodyAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetProbeResolveTag(
+        LPCWSTR *ppszTag) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRemoteTransportAddress(
+        LPCWSTR *ppszRemoteTransportAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocalTransportAddress(
+        LPCWSTR *ppszLocalTransportAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLocalInterfaceGUID(
+        GUID *pGuid) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInstanceId(
+        ULONGLONG *pullInstanceId) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDiscoveredService, 0x4bad8a3b, 0xb374, 0x4420, 0x96,0x32, 0xaa,0xc9,0x45,0xb3,0x74,0xaa)
+#endif
+#else
+typedef struct IWSDiscoveredServiceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDiscoveredService* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDiscoveredService* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDiscoveredService* This);
+
+    /*** IWSDiscoveredService methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEndpointReference)(
+        IWSDiscoveredService* This,
+        WSD_ENDPOINT_REFERENCE **ppEndpointReference);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypes)(
+        IWSDiscoveredService* This,
+        WSD_NAME_LIST **ppTypesList);
+
+    HRESULT (STDMETHODCALLTYPE *GetScopes)(
+        IWSDiscoveredService* This,
+        WSD_URI_LIST **ppScopesList);
+
+    HRESULT (STDMETHODCALLTYPE *GetXAddrs)(
+        IWSDiscoveredService* This,
+        WSD_URI_LIST **ppXAddrsList);
+
+    HRESULT (STDMETHODCALLTYPE *GetMetadataVersion)(
+        IWSDiscoveredService* This,
+        ULONGLONG *pullMetadataVersion);
+
+    HRESULT (STDMETHODCALLTYPE *GetExtendedDiscoXML)(
+        IWSDiscoveredService* This,
+        WSDXML_ELEMENT **ppHeaderAny,
+        WSDXML_ELEMENT **ppBodyAny);
+
+    HRESULT (STDMETHODCALLTYPE *GetProbeResolveTag)(
+        IWSDiscoveredService* This,
+        LPCWSTR *ppszTag);
+
+    HRESULT (STDMETHODCALLTYPE *GetRemoteTransportAddress)(
+        IWSDiscoveredService* This,
+        LPCWSTR *ppszRemoteTransportAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocalTransportAddress)(
+        IWSDiscoveredService* This,
+        LPCWSTR *ppszLocalTransportAddress);
+
+    HRESULT (STDMETHODCALLTYPE *GetLocalInterfaceGUID)(
+        IWSDiscoveredService* This,
+        GUID *pGuid);
+
+    HRESULT (STDMETHODCALLTYPE *GetInstanceId)(
+        IWSDiscoveredService* This,
+        ULONGLONG *pullInstanceId);
+
+    END_INTERFACE
+} IWSDiscoveredServiceVtbl;
+interface IWSDiscoveredService {
+    CONST_VTBL IWSDiscoveredServiceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDiscoveredService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDiscoveredService_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDiscoveredService_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDiscoveredService_GetEndpointReference(This,ppEndPointReference) (This)->lpVtbl->GetEndpointReference(This,ppEndPointReference)
+/*** IWSDiscoveredService methods ***/
+#define IWSDiscoveredService_GetEndpointReference(This,ppEndpointReference) (This)->lpVtbl->GetEndpointReference(This,ppEndpointReference)
 #define IWSDiscoveredService_GetTypes(This,ppTypesList) (This)->lpVtbl->GetTypes(This,ppTypesList)
 #define IWSDiscoveredService_GetScopes(This,ppScopesList) (This)->lpVtbl->GetScopes(This,ppScopesList)
 #define IWSDiscoveredService_GetXAddrs(This,ppXAddrsList) (This)->lpVtbl->GetXAddrs(This,ppXAddrsList)
@@ -100,132 +695,790 @@
 #define IWSDiscoveredService_GetLocalTransportAddress(This,ppszLocalTransportAddress) (This)->lpVtbl->GetLocalTransportAddress(This,ppszLocalTransportAddress)
 #define IWSDiscoveredService_GetLocalInterfaceGUID(This,pGuid) (This)->lpVtbl->GetLocalInterfaceGUID(This,pGuid)
 #define IWSDiscoveredService_GetInstanceId(This,pullInstanceId) (This)->lpVtbl->GetInstanceId(This,pullInstanceId)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDiscoveryProviderNotify
-DECLARE_INTERFACE_(IWSDiscoveryProviderNotify,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDiscoveredService_QueryInterface(IWSDiscoveredService* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDiscoveredService_AddRef(IWSDiscoveredService* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDiscoveredService_Release(IWSDiscoveredService* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDiscoveredService methods ***/
+static FORCEINLINE HRESULT IWSDiscoveredService_GetEndpointReference(IWSDiscoveredService* This,WSD_ENDPOINT_REFERENCE **ppEndpointReference) {
+    return This->lpVtbl->GetEndpointReference(This,ppEndpointReference);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetTypes(IWSDiscoveredService* This,WSD_NAME_LIST **ppTypesList) {
+    return This->lpVtbl->GetTypes(This,ppTypesList);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetScopes(IWSDiscoveredService* This,WSD_URI_LIST **ppScopesList) {
+    return This->lpVtbl->GetScopes(This,ppScopesList);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetXAddrs(IWSDiscoveredService* This,WSD_URI_LIST **ppXAddrsList) {
+    return This->lpVtbl->GetXAddrs(This,ppXAddrsList);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetMetadataVersion(IWSDiscoveredService* This,ULONGLONG *pullMetadataVersion) {
+    return This->lpVtbl->GetMetadataVersion(This,pullMetadataVersion);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetExtendedDiscoXML(IWSDiscoveredService* This,WSDXML_ELEMENT **ppHeaderAny,WSDXML_ELEMENT **ppBodyAny) {
+    return This->lpVtbl->GetExtendedDiscoXML(This,ppHeaderAny,ppBodyAny);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetProbeResolveTag(IWSDiscoveredService* This,LPCWSTR *ppszTag) {
+    return This->lpVtbl->GetProbeResolveTag(This,ppszTag);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetRemoteTransportAddress(IWSDiscoveredService* This,LPCWSTR *ppszRemoteTransportAddress) {
+    return This->lpVtbl->GetRemoteTransportAddress(This,ppszRemoteTransportAddress);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetLocalTransportAddress(IWSDiscoveredService* This,LPCWSTR *ppszLocalTransportAddress) {
+    return This->lpVtbl->GetLocalTransportAddress(This,ppszLocalTransportAddress);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetLocalInterfaceGUID(IWSDiscoveredService* This,GUID *pGuid) {
+    return This->lpVtbl->GetLocalInterfaceGUID(This,pGuid);
+}
+static FORCEINLINE HRESULT IWSDiscoveredService_GetInstanceId(IWSDiscoveredService* This,ULONGLONG *pullInstanceId) {
+    return This->lpVtbl->GetInstanceId(This,pullInstanceId);
+}
 #endif
-    /* IWSDiscoveryProviderNotify methods */
-    STDMETHOD_(HRESULT,Add)(THIS_ IWSDiscoveredService *pService) PURE;
-    STDMETHOD_(HRESULT,Remove)(THIS_ IWSDiscoveredService *pService) PURE;
-    STDMETHOD_(HRESULT,SearchFailed)(THIS_ HRESULT hr,LPCWSTR pszTag) PURE;
-    STDMETHOD_(HRESULT,SearchComplete)(THIS_ LPCWSTR pszTag) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetEndpointReference_Proxy(
+    IWSDiscoveredService* This,
+    WSD_ENDPOINT_REFERENCE **ppEndpointReference);
+void __RPC_STUB IWSDiscoveredService_GetEndpointReference_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetTypes_Proxy(
+    IWSDiscoveredService* This,
+    WSD_NAME_LIST **ppTypesList);
+void __RPC_STUB IWSDiscoveredService_GetTypes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetScopes_Proxy(
+    IWSDiscoveredService* This,
+    WSD_URI_LIST **ppScopesList);
+void __RPC_STUB IWSDiscoveredService_GetScopes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetXAddrs_Proxy(
+    IWSDiscoveredService* This,
+    WSD_URI_LIST **ppXAddrsList);
+void __RPC_STUB IWSDiscoveredService_GetXAddrs_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetMetadataVersion_Proxy(
+    IWSDiscoveredService* This,
+    ULONGLONG *pullMetadataVersion);
+void __RPC_STUB IWSDiscoveredService_GetMetadataVersion_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetExtendedDiscoXML_Proxy(
+    IWSDiscoveredService* This,
+    WSDXML_ELEMENT **ppHeaderAny,
+    WSDXML_ELEMENT **ppBodyAny);
+void __RPC_STUB IWSDiscoveredService_GetExtendedDiscoXML_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetProbeResolveTag_Proxy(
+    IWSDiscoveredService* This,
+    LPCWSTR *ppszTag);
+void __RPC_STUB IWSDiscoveredService_GetProbeResolveTag_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetRemoteTransportAddress_Proxy(
+    IWSDiscoveredService* This,
+    LPCWSTR *ppszRemoteTransportAddress);
+void __RPC_STUB IWSDiscoveredService_GetRemoteTransportAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetLocalTransportAddress_Proxy(
+    IWSDiscoveredService* This,
+    LPCWSTR *ppszLocalTransportAddress);
+void __RPC_STUB IWSDiscoveredService_GetLocalTransportAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetLocalInterfaceGUID_Proxy(
+    IWSDiscoveredService* This,
+    GUID *pGuid);
+void __RPC_STUB IWSDiscoveredService_GetLocalInterfaceGUID_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveredService_GetInstanceId_Proxy(
+    IWSDiscoveredService* This,
+    ULONGLONG *pullInstanceId);
+void __RPC_STUB IWSDiscoveredService_GetInstanceId_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDiscoveredService_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDiscoveryPublisherNotify interface
+ */
+#ifndef __IWSDiscoveryPublisherNotify_INTERFACE_DEFINED__
+#define __IWSDiscoveryPublisherNotify_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDiscoveryPublisherNotify, 0xe67651b0, 0x337a, 0x4b3c, 0x97,0x58, 0x73,0x33,0x88,0x56,0x82,0x51);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("e67651b0-337a-4b3c-9758-733388568251")
+IWSDiscoveryPublisherNotify : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE ProbeHandler(
+        const WSD_SOAP_MESSAGE *pSoap,
+        IWSDMessageParameters *pMessageParameters) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ResolveHandler(
+        const WSD_SOAP_MESSAGE *pSoap,
+        IWSDMessageParameters *pMessageParameters) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDiscoveryPublisherNotify, 0xe67651b0, 0x337a, 0x4b3c, 0x97,0x58, 0x73,0x33,0x88,0x56,0x82,0x51)
+#endif
+#else
+typedef struct IWSDiscoveryPublisherNotifyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDiscoveryPublisherNotify* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDiscoveryPublisherNotify* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDiscoveryPublisherNotify* This);
+
+    /*** IWSDiscoveryPublisherNotify methods ***/
+    HRESULT (STDMETHODCALLTYPE *ProbeHandler)(
+        IWSDiscoveryPublisherNotify* This,
+        const WSD_SOAP_MESSAGE *pSoap,
+        IWSDMessageParameters *pMessageParameters);
+
+    HRESULT (STDMETHODCALLTYPE *ResolveHandler)(
+        IWSDiscoveryPublisherNotify* This,
+        const WSD_SOAP_MESSAGE *pSoap,
+        IWSDMessageParameters *pMessageParameters);
 
     END_INTERFACE
+} IWSDiscoveryPublisherNotifyVtbl;
+interface IWSDiscoveryPublisherNotify {
+    CONST_VTBL IWSDiscoveryPublisherNotifyVtbl* lpVtbl;
 };
-#ifdef COBJMACROS
-#define IWSDiscoveryProviderNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDiscoveryProviderNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDiscoveryProviderNotify_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDiscoveryProviderNotify_Add(This,pService) (This)->lpVtbl->Add(This,pService)
-#define IWSDiscoveryProviderNotify_Remove(This,pService) (This)->lpVtbl->Remove(This,pService)
-#define IWSDiscoveryProviderNotify_SearchFailed(This,hr,pszTag) (This)->lpVtbl->SearchFailed(This,hr,pszTag)
-#define IWSDiscoveryProviderNotify_SearchComplete(This,pszTag) (This)->lpVtbl->SearchComplete(This,pszTag)
-#endif /*COBJMACROS*/
 
-#undef  INTERFACE
-#define INTERFACE IWSDiscoveryProvider
-DECLARE_INTERFACE_(IWSDiscoveryProvider,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDiscoveryPublisherNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDiscoveryPublisherNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDiscoveryPublisherNotify_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDiscoveryPublisherNotify methods ***/
+#define IWSDiscoveryPublisherNotify_ProbeHandler(This,pSoap,pMessageParameters) (This)->lpVtbl->ProbeHandler(This,pSoap,pMessageParameters)
+#define IWSDiscoveryPublisherNotify_ResolveHandler(This,pSoap,pMessageParameters) (This)->lpVtbl->ResolveHandler(This,pSoap,pMessageParameters)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryPublisherNotify_QueryInterface(IWSDiscoveryPublisherNotify* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDiscoveryPublisherNotify_AddRef(IWSDiscoveryPublisherNotify* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDiscoveryPublisherNotify_Release(IWSDiscoveryPublisherNotify* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDiscoveryPublisherNotify methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryPublisherNotify_ProbeHandler(IWSDiscoveryPublisherNotify* This,const WSD_SOAP_MESSAGE *pSoap,IWSDMessageParameters *pMessageParameters) {
+    return This->lpVtbl->ProbeHandler(This,pSoap,pMessageParameters);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisherNotify_ResolveHandler(IWSDiscoveryPublisherNotify* This,const WSD_SOAP_MESSAGE *pSoap,IWSDMessageParameters *pMessageParameters) {
+    return This->lpVtbl->ResolveHandler(This,pSoap,pMessageParameters);
+}
 #endif
-    /* IWSDiscoveryProvider methods */
-    STDMETHOD_(HRESULT,SetAddressFamily)(THIS_ DWORD dwAddressFamily) PURE;
-    STDMETHOD_(HRESULT,Attach)(THIS_ IWSDiscoveryProviderNotify *pSink) PURE;
-    STDMETHOD_(HRESULT,Detach)(THIS) PURE;
-    STDMETHOD_(HRESULT,SearchById)(THIS_ LPCWSTR pszId,LPCWSTR pszTag) PURE;
-    STDMETHOD_(HRESULT,SearchByAddress)(THIS_ LPCWSTR pszAddress,LPCWSTR pszTag) PURE;
-    STDMETHOD_(HRESULT,SearchByType)(THIS_ LPCWSTR pszTag) PURE;
-    STDMETHOD_(HRESULT,GetXMLContext)(THIS_ IWSDXMLContext **ppContext) PURE;
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisherNotify_ProbeHandler_Proxy(
+    IWSDiscoveryPublisherNotify* This,
+    const WSD_SOAP_MESSAGE *pSoap,
+    IWSDMessageParameters *pMessageParameters);
+void __RPC_STUB IWSDiscoveryPublisherNotify_ProbeHandler_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisherNotify_ResolveHandler_Proxy(
+    IWSDiscoveryPublisherNotify* This,
+    const WSD_SOAP_MESSAGE *pSoap,
+    IWSDMessageParameters *pMessageParameters);
+void __RPC_STUB IWSDiscoveryPublisherNotify_ResolveHandler_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDiscoveryPublisherNotify_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDiscoveryPublisher interface
+ */
+#ifndef __IWSDiscoveryPublisher_INTERFACE_DEFINED__
+#define __IWSDiscoveryPublisher_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDiscoveryPublisher, 0xae01e1a8, 0x3ff9, 0x4148, 0x81,0x16, 0x05,0x7c,0xc6,0x16,0xfe,0x13);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ae01e1a8-3ff9-4148-8116-057cc616fe13")
+IWSDiscoveryPublisher : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetAddressFamily(
+        DWORD dwAddressFamily) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterNotificationSink(
+        IWSDiscoveryPublisherNotify *pSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnRegisterNotificationSink(
+        IWSDiscoveryPublisherNotify *pSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Publish(
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnPublish(
+        LPCWSTR pszId,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSDXML_ELEMENT *pAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE MatchProbe(
+        const WSD_SOAP_MESSAGE *pProbeMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE MatchResolve(
+        const WSD_SOAP_MESSAGE *pResolveMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE PublishEx(
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList,
+        const WSDXML_ELEMENT *pHeaderAny,
+        const WSDXML_ELEMENT *pReferenceParameterAny,
+        const WSDXML_ELEMENT *pPolicyAny,
+        const WSDXML_ELEMENT *pEndpointReferenceAny,
+        const WSDXML_ELEMENT *pAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE MatchProbeEx(
+        const WSD_SOAP_MESSAGE *pProbeMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList,
+        const WSDXML_ELEMENT *pHeaderAny,
+        const WSDXML_ELEMENT *pReferenceParameterAny,
+        const WSDXML_ELEMENT *pPolicyAny,
+        const WSDXML_ELEMENT *pEndpointReferenceAny,
+        const WSDXML_ELEMENT *pAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE MatchResolveEx(
+        const WSD_SOAP_MESSAGE *pResolveMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList,
+        const WSDXML_ELEMENT *pHeaderAny,
+        const WSDXML_ELEMENT *pReferenceParameterAny,
+        const WSDXML_ELEMENT *pPolicyAny,
+        const WSDXML_ELEMENT *pEndpointReferenceAny,
+        const WSDXML_ELEMENT *pAny) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterScopeMatchingRule(
+        IWSDScopeMatchingRule *pScopeMatchingRule) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnRegisterScopeMatchingRule(
+        IWSDScopeMatchingRule *pScopeMatchingRule) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetXMLContext(
+        IWSDXMLContext **ppContext) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDiscoveryPublisher, 0xae01e1a8, 0x3ff9, 0x4148, 0x81,0x16, 0x05,0x7c,0xc6,0x16,0xfe,0x13)
+#endif
+#else
+typedef struct IWSDiscoveryPublisherVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDiscoveryPublisher* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDiscoveryPublisher* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDiscoveryPublisher* This);
+
+    /*** IWSDiscoveryPublisher methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetAddressFamily)(
+        IWSDiscoveryPublisher* This,
+        DWORD dwAddressFamily);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterNotificationSink)(
+        IWSDiscoveryPublisher* This,
+        IWSDiscoveryPublisherNotify *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *UnRegisterNotificationSink)(
+        IWSDiscoveryPublisher* This,
+        IWSDiscoveryPublisherNotify *pSink);
+
+    HRESULT (STDMETHODCALLTYPE *Publish)(
+        IWSDiscoveryPublisher* This,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList);
+
+    HRESULT (STDMETHODCALLTYPE *UnPublish)(
+        IWSDiscoveryPublisher* This,
+        LPCWSTR pszId,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSDXML_ELEMENT *pAny);
+
+    HRESULT (STDMETHODCALLTYPE *MatchProbe)(
+        IWSDiscoveryPublisher* This,
+        const WSD_SOAP_MESSAGE *pProbeMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList);
+
+    HRESULT (STDMETHODCALLTYPE *MatchResolve)(
+        IWSDiscoveryPublisher* This,
+        const WSD_SOAP_MESSAGE *pResolveMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList);
+
+    HRESULT (STDMETHODCALLTYPE *PublishEx)(
+        IWSDiscoveryPublisher* This,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList,
+        const WSDXML_ELEMENT *pHeaderAny,
+        const WSDXML_ELEMENT *pReferenceParameterAny,
+        const WSDXML_ELEMENT *pPolicyAny,
+        const WSDXML_ELEMENT *pEndpointReferenceAny,
+        const WSDXML_ELEMENT *pAny);
+
+    HRESULT (STDMETHODCALLTYPE *MatchProbeEx)(
+        IWSDiscoveryPublisher* This,
+        const WSD_SOAP_MESSAGE *pProbeMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList,
+        const WSDXML_ELEMENT *pHeaderAny,
+        const WSDXML_ELEMENT *pReferenceParameterAny,
+        const WSDXML_ELEMENT *pPolicyAny,
+        const WSDXML_ELEMENT *pEndpointReferenceAny,
+        const WSDXML_ELEMENT *pAny);
+
+    HRESULT (STDMETHODCALLTYPE *MatchResolveEx)(
+        IWSDiscoveryPublisher* This,
+        const WSD_SOAP_MESSAGE *pResolveMessage,
+        IWSDMessageParameters *pMessageParameters,
+        LPCWSTR pszId,
+        ULONGLONG ullMetadataVersion,
+        ULONGLONG ullInstanceId,
+        ULONGLONG ullMessageNumber,
+        LPCWSTR pszSessionId,
+        const WSD_NAME_LIST *pTypesList,
+        const WSD_URI_LIST *pScopesList,
+        const WSD_URI_LIST *pXAddrsList,
+        const WSDXML_ELEMENT *pHeaderAny,
+        const WSDXML_ELEMENT *pReferenceParameterAny,
+        const WSDXML_ELEMENT *pPolicyAny,
+        const WSDXML_ELEMENT *pEndpointReferenceAny,
+        const WSDXML_ELEMENT *pAny);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterScopeMatchingRule)(
+        IWSDiscoveryPublisher* This,
+        IWSDScopeMatchingRule *pScopeMatchingRule);
+
+    HRESULT (STDMETHODCALLTYPE *UnRegisterScopeMatchingRule)(
+        IWSDiscoveryPublisher* This,
+        IWSDScopeMatchingRule *pScopeMatchingRule);
+
+    HRESULT (STDMETHODCALLTYPE *GetXMLContext)(
+        IWSDiscoveryPublisher* This,
+        IWSDXMLContext **ppContext);
 
     END_INTERFACE
+} IWSDiscoveryPublisherVtbl;
+interface IWSDiscoveryPublisher {
+    CONST_VTBL IWSDiscoveryPublisherVtbl* lpVtbl;
 };
-#ifdef COBJMACROS
-#define IWSDiscoveryProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDiscoveryProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDiscoveryProvider_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDiscoveryProvider_SetAddressFamily(This,dwAddressFamily) (This)->lpVtbl->SetAddressFamily(This,dwAddressFamily)
-#define IWSDiscoveryProvider_Attach(This,pSink) (This)->lpVtbl->Attach(This,pSink)
-#define IWSDiscoveryProvider_Detach() (This)->lpVtbl->Detach(This)
-#define IWSDiscoveryProvider_SearchById(This,pszId,pszTag) (This)->lpVtbl->SearchById(This,pszId,pszTag)
-#define IWSDiscoveryProvider_SearchByAddress(This,pszAddress,pszTag) (This)->lpVtbl->SearchByAddress(This,pszAddress,pszTag)
-#define IWSDiscoveryProvider_SearchByType(This,pszTag) (This)->lpVtbl->SearchByType(This,pszTag)
-#define IWSDiscoveryProvider_GetXMLContext(This,ppContext) (This)->lpVtbl->GetXMLContext(This,ppContext)
-#endif /*COBJMACROS*/
 
-#undef  INTERFACE
-#define INTERFACE IWSDiscoveryPublisher
-DECLARE_INTERFACE_(IWSDiscoveryPublisher,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDiscoveryPublisher methods */
-    STDMETHOD_(HRESULT,SetAddressFamily)(THIS_ DWORD dwAddressFamily) PURE;
-    STDMETHOD_(HRESULT,RegisterNotificationSink)(THIS_ IWSDiscoveryPublisherNotify *pSink) PURE;
-    STDMETHOD_(HRESULT,UnRegisterNotificationSink)(THIS_ IWSDiscoveryPublisherNotify *pSink) PURE;
-    STDMETHOD_(HRESULT,Publish)(THIS_ LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSD_URI_LIST *pXAddrsList) PURE;
-    STDMETHOD_(HRESULT,UnPublish)(THIS_ LPCWSTR pszDeviceId,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSDXML_ELEMENT *pAny) PURE;
-    STDMETHOD_(HRESULT,MatchProbe)(THIS_ const WSD_SOAP_MESSAGE *pProbeMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSD_URI_LIST *pXAddrsList) PURE;
-    STDMETHOD_(HRESULT,MatchResolve)(THIS_ const WSD_SOAP_MESSAGE *pResolveMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSD_URI_LIST *pXAddrsList) PURE;
-    STDMETHOD_(HRESULT,PublishEx)(THIS_ LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSDXML_ELEMENT *pAny) PURE;
-    STDMETHOD_(HRESULT,MatchProbeEx)(THIS_ const WSD_SOAP_MESSAGE *pProbeMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSDXML_ELEMENT *pAny) PURE;
-    STDMETHOD_(HRESULT,MatchResolveEx)(THIS_ const WSD_SOAP_MESSAGE *pResolveMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,const WSDXML_ELEMENT *pAny) PURE;
-    STDMETHOD_(HRESULT,RegisterScopeMatchingRule)(THIS_ IWSDScopeMatchingRule *pScopeMatchingRule) PURE;
-    STDMETHOD_(HRESULT,UnRegisterScopeMatchingRule)(THIS_ IWSDScopeMatchingRule *pScopeMatchingRule) PURE;
-    STDMETHOD_(HRESULT,GetXMLContext)(THIS_ IWSDXMLContext **ppContext) PURE;
-
-    END_INTERFACE
-};
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDiscoveryPublisher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDiscoveryPublisher_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDiscoveryPublisher_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDiscoveryPublisher methods ***/
 #define IWSDiscoveryPublisher_SetAddressFamily(This,dwAddressFamily) (This)->lpVtbl->SetAddressFamily(This,dwAddressFamily)
 #define IWSDiscoveryPublisher_RegisterNotificationSink(This,pSink) (This)->lpVtbl->RegisterNotificationSink(This,pSink)
 #define IWSDiscoveryPublisher_UnRegisterNotificationSink(This,pSink) (This)->lpVtbl->UnRegisterNotificationSink(This,pSink)
-#define IWSDiscoveryPublisher_Publish(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pXAddrsList) (This)->lpVtbl->Publish(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pXAddrsList)
-#define IWSDiscoveryPublisher_UnPublish(This,pszDeviceId,ullInstanceId,ullMessageNumber,pAny) (This)->lpVtbl->UnPublish(This,pszDeviceId,ullInstanceId,ullMessageNumber,pAny)
-#define IWSDiscoveryPublisher_MatchProbe(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pXAddrsList) (This)->lpVtbl->MatchProbe(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pXAddrsList)
-#define IWSDiscoveryPublisher_MatchResolve(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pXAddrsList) (This)->lpVtbl->MatchResolve(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pXAddrsList)
-#define IWSDiscoveryPublisher_PublishEx(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pAny) (This)->lpVtbl->PublishEx(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pAny)
-#define IWSDiscoveryPublisher_MatchProbeEx(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pAny) (This)->lpVtbl->MatchProbeEx(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pAny)
-#define IWSDiscoveryPublisher_MatchResolveEx(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pAny) (This)->lpVtbl->MatchResolveEx(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pAny)
+#define IWSDiscoveryPublisher_Publish(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList) (This)->lpVtbl->Publish(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList)
+#define IWSDiscoveryPublisher_UnPublish(This,pszId,ullInstanceId,ullMessageNumber,pszSessionId,pAny) (This)->lpVtbl->UnPublish(This,pszId,ullInstanceId,ullMessageNumber,pszSessionId,pAny)
+#define IWSDiscoveryPublisher_MatchProbe(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList) (This)->lpVtbl->MatchProbe(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList)
+#define IWSDiscoveryPublisher_MatchResolve(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList) (This)->lpVtbl->MatchResolve(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList)
+#define IWSDiscoveryPublisher_PublishEx(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny) (This)->lpVtbl->PublishEx(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny)
+#define IWSDiscoveryPublisher_MatchProbeEx(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny) (This)->lpVtbl->MatchProbeEx(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny)
+#define IWSDiscoveryPublisher_MatchResolveEx(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny) (This)->lpVtbl->MatchResolveEx(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny)
 #define IWSDiscoveryPublisher_RegisterScopeMatchingRule(This,pScopeMatchingRule) (This)->lpVtbl->RegisterScopeMatchingRule(This,pScopeMatchingRule)
 #define IWSDiscoveryPublisher_UnRegisterScopeMatchingRule(This,pScopeMatchingRule) (This)->lpVtbl->UnRegisterScopeMatchingRule(This,pScopeMatchingRule)
 #define IWSDiscoveryPublisher_GetXMLContext(This,ppContext) (This)->lpVtbl->GetXMLContext(This,ppContext)
-#endif /*COBJMACROS*/
-
-#ifdef __cplusplus
-extern "C" {
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_QueryInterface(IWSDiscoveryPublisher* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDiscoveryPublisher_AddRef(IWSDiscoveryPublisher* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDiscoveryPublisher_Release(IWSDiscoveryPublisher* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDiscoveryPublisher methods ***/
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_SetAddressFamily(IWSDiscoveryPublisher* This,DWORD dwAddressFamily) {
+    return This->lpVtbl->SetAddressFamily(This,dwAddressFamily);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_RegisterNotificationSink(IWSDiscoveryPublisher* This,IWSDiscoveryPublisherNotify *pSink) {
+    return This->lpVtbl->RegisterNotificationSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_UnRegisterNotificationSink(IWSDiscoveryPublisher* This,IWSDiscoveryPublisherNotify *pSink) {
+    return This->lpVtbl->UnRegisterNotificationSink(This,pSink);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_Publish(IWSDiscoveryPublisher* This,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,const WSD_URI_LIST *pXAddrsList) {
+    return This->lpVtbl->Publish(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_UnPublish(IWSDiscoveryPublisher* This,LPCWSTR pszId,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSDXML_ELEMENT *pAny) {
+    return This->lpVtbl->UnPublish(This,pszId,ullInstanceId,ullMessageNumber,pszSessionId,pAny);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_MatchProbe(IWSDiscoveryPublisher* This,const WSD_SOAP_MESSAGE *pProbeMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,const WSD_URI_LIST *pXAddrsList) {
+    return This->lpVtbl->MatchProbe(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_MatchResolve(IWSDiscoveryPublisher* This,const WSD_SOAP_MESSAGE *pResolveMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,const WSD_URI_LIST *pXAddrsList) {
+    return This->lpVtbl->MatchResolve(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_PublishEx(IWSDiscoveryPublisher* This,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,const WSD_URI_LIST *pXAddrsList,const WSDXML_ELEMENT *pHeaderAny,const WSDXML_ELEMENT *pReferenceParameterAny,const WSDXML_ELEMENT *pPolicyAny,const WSDXML_ELEMENT *pEndpointReferenceAny,const WSDXML_ELEMENT *pAny) {
+    return This->lpVtbl->PublishEx(This,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_MatchProbeEx(IWSDiscoveryPublisher* This,const WSD_SOAP_MESSAGE *pProbeMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,const WSD_URI_LIST *pXAddrsList,const WSDXML_ELEMENT *pHeaderAny,const WSDXML_ELEMENT *pReferenceParameterAny,const WSDXML_ELEMENT *pPolicyAny,const WSDXML_ELEMENT *pEndpointReferenceAny,const WSDXML_ELEMENT *pAny) {
+    return This->lpVtbl->MatchProbeEx(This,pProbeMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_MatchResolveEx(IWSDiscoveryPublisher* This,const WSD_SOAP_MESSAGE *pResolveMessage,IWSDMessageParameters *pMessageParameters,LPCWSTR pszId,ULONGLONG ullMetadataVersion,ULONGLONG ullInstanceId,ULONGLONG ullMessageNumber,LPCWSTR pszSessionId,const WSD_NAME_LIST *pTypesList,const WSD_URI_LIST *pScopesList,const WSD_URI_LIST *pXAddrsList,const WSDXML_ELEMENT *pHeaderAny,const WSDXML_ELEMENT *pReferenceParameterAny,const WSDXML_ELEMENT *pPolicyAny,const WSDXML_ELEMENT *pEndpointReferenceAny,const WSDXML_ELEMENT *pAny) {
+    return This->lpVtbl->MatchResolveEx(This,pResolveMessage,pMessageParameters,pszId,ullMetadataVersion,ullInstanceId,ullMessageNumber,pszSessionId,pTypesList,pScopesList,pXAddrsList,pHeaderAny,pReferenceParameterAny,pPolicyAny,pEndpointReferenceAny,pAny);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_RegisterScopeMatchingRule(IWSDiscoveryPublisher* This,IWSDScopeMatchingRule *pScopeMatchingRule) {
+    return This->lpVtbl->RegisterScopeMatchingRule(This,pScopeMatchingRule);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_UnRegisterScopeMatchingRule(IWSDiscoveryPublisher* This,IWSDScopeMatchingRule *pScopeMatchingRule) {
+    return This->lpVtbl->UnRegisterScopeMatchingRule(This,pScopeMatchingRule);
+}
+static FORCEINLINE HRESULT IWSDiscoveryPublisher_GetXMLContext(IWSDiscoveryPublisher* This,IWSDXMLContext **ppContext) {
+    return This->lpVtbl->GetXMLContext(This,ppContext);
+}
+#endif
 #endif
 
-HRESULT WINAPI WSDCreateDiscoveryProvider(
-  IWSDXMLContext *pContext,
-  IWSDiscoveryProvider **ppProvider
-);
+#endif
 
-HRESULT WINAPI WSDCreateDiscoveryPublisher(
-  IWSDXMLContext *pContext,
-  IWSDiscoveryPublisher **ppPublisher
-);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_SetAddressFamily_Proxy(
+    IWSDiscoveryPublisher* This,
+    DWORD dwAddressFamily);
+void __RPC_STUB IWSDiscoveryPublisher_SetAddressFamily_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_RegisterNotificationSink_Proxy(
+    IWSDiscoveryPublisher* This,
+    IWSDiscoveryPublisherNotify *pSink);
+void __RPC_STUB IWSDiscoveryPublisher_RegisterNotificationSink_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_UnRegisterNotificationSink_Proxy(
+    IWSDiscoveryPublisher* This,
+    IWSDiscoveryPublisherNotify *pSink);
+void __RPC_STUB IWSDiscoveryPublisher_UnRegisterNotificationSink_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_Publish_Proxy(
+    IWSDiscoveryPublisher* This,
+    LPCWSTR pszId,
+    ULONGLONG ullMetadataVersion,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    const WSD_URI_LIST *pXAddrsList);
+void __RPC_STUB IWSDiscoveryPublisher_Publish_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_UnPublish_Proxy(
+    IWSDiscoveryPublisher* This,
+    LPCWSTR pszId,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSDXML_ELEMENT *pAny);
+void __RPC_STUB IWSDiscoveryPublisher_UnPublish_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_MatchProbe_Proxy(
+    IWSDiscoveryPublisher* This,
+    const WSD_SOAP_MESSAGE *pProbeMessage,
+    IWSDMessageParameters *pMessageParameters,
+    LPCWSTR pszId,
+    ULONGLONG ullMetadataVersion,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    const WSD_URI_LIST *pXAddrsList);
+void __RPC_STUB IWSDiscoveryPublisher_MatchProbe_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_MatchResolve_Proxy(
+    IWSDiscoveryPublisher* This,
+    const WSD_SOAP_MESSAGE *pResolveMessage,
+    IWSDMessageParameters *pMessageParameters,
+    LPCWSTR pszId,
+    ULONGLONG ullMetadataVersion,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    const WSD_URI_LIST *pXAddrsList);
+void __RPC_STUB IWSDiscoveryPublisher_MatchResolve_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_PublishEx_Proxy(
+    IWSDiscoveryPublisher* This,
+    LPCWSTR pszId,
+    ULONGLONG ullMetadataVersion,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    const WSD_URI_LIST *pXAddrsList,
+    const WSDXML_ELEMENT *pHeaderAny,
+    const WSDXML_ELEMENT *pReferenceParameterAny,
+    const WSDXML_ELEMENT *pPolicyAny,
+    const WSDXML_ELEMENT *pEndpointReferenceAny,
+    const WSDXML_ELEMENT *pAny);
+void __RPC_STUB IWSDiscoveryPublisher_PublishEx_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_MatchProbeEx_Proxy(
+    IWSDiscoveryPublisher* This,
+    const WSD_SOAP_MESSAGE *pProbeMessage,
+    IWSDMessageParameters *pMessageParameters,
+    LPCWSTR pszId,
+    ULONGLONG ullMetadataVersion,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    const WSD_URI_LIST *pXAddrsList,
+    const WSDXML_ELEMENT *pHeaderAny,
+    const WSDXML_ELEMENT *pReferenceParameterAny,
+    const WSDXML_ELEMENT *pPolicyAny,
+    const WSDXML_ELEMENT *pEndpointReferenceAny,
+    const WSDXML_ELEMENT *pAny);
+void __RPC_STUB IWSDiscoveryPublisher_MatchProbeEx_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_MatchResolveEx_Proxy(
+    IWSDiscoveryPublisher* This,
+    const WSD_SOAP_MESSAGE *pResolveMessage,
+    IWSDMessageParameters *pMessageParameters,
+    LPCWSTR pszId,
+    ULONGLONG ullMetadataVersion,
+    ULONGLONG ullInstanceId,
+    ULONGLONG ullMessageNumber,
+    LPCWSTR pszSessionId,
+    const WSD_NAME_LIST *pTypesList,
+    const WSD_URI_LIST *pScopesList,
+    const WSD_URI_LIST *pXAddrsList,
+    const WSDXML_ELEMENT *pHeaderAny,
+    const WSDXML_ELEMENT *pReferenceParameterAny,
+    const WSDXML_ELEMENT *pPolicyAny,
+    const WSDXML_ELEMENT *pEndpointReferenceAny,
+    const WSDXML_ELEMENT *pAny);
+void __RPC_STUB IWSDiscoveryPublisher_MatchResolveEx_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_RegisterScopeMatchingRule_Proxy(
+    IWSDiscoveryPublisher* This,
+    IWSDScopeMatchingRule *pScopeMatchingRule);
+void __RPC_STUB IWSDiscoveryPublisher_RegisterScopeMatchingRule_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_UnRegisterScopeMatchingRule_Proxy(
+    IWSDiscoveryPublisher* This,
+    IWSDScopeMatchingRule *pScopeMatchingRule);
+void __RPC_STUB IWSDiscoveryPublisher_UnRegisterScopeMatchingRule_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDiscoveryPublisher_GetXMLContext_Proxy(
+    IWSDiscoveryPublisher* This,
+    IWSDXMLContext **ppContext);
+void __RPC_STUB IWSDiscoveryPublisher_GetXMLContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDiscoveryPublisher_INTERFACE_DEFINED__ */
+
+HRESULT WINAPI WSDCreateDiscoveryProvider(IWSDXMLContext *pContext, IWSDiscoveryProvider **ppProvider);
+HRESULT WINAPI WSDCreateDiscoveryPublisher(IWSDXMLContext* pContext, IWSDiscoveryPublisher **ppPublisher);
+#if WINVER >= 0x601
+HRESULT WINAPI WSDCreateDiscoveryProvider2(IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDiscoveryProvider **ppProvider);
+HRESULT WINAPI WSDCreateDiscoveryPublisher2(IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDiscoveryPublisher **ppPublisher);
+#endif
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_WSDDISCO*/
+
+#endif /* __wsddisco_h__ */
diff --git a/mingw-w64-headers/include/wsddisco.idl b/mingw-w64-headers/include/wsddisco.idl
new file mode 100644
index 0000000..20bf4cb
--- /dev/null
+++ b/mingw-w64-headers/include/wsddisco.idl
@@ -0,0 +1,93 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+import "objidl.idl";
+import "wsdxmldom.h";
+import "wsdtypes.h";
+
+cpp_quote("")
+interface IWSDXMLContext;
+interface IWSDiscoveryProvider;
+interface IWSDiscoveryProviderNotify;
+interface IWSDiscoveredService;
+interface IWSDiscoveryPublisher;
+interface IWSDiscoveryPublisherNotify;
+interface IWSDScopeMatchingRule;
+
+[object, local, restricted, uuid (fcafe424-fef5-481a-bd9f-33ce0574256f), pointer_default (unique)]
+interface IWSDScopeMatchingRule : IUnknown {
+  HRESULT GetScopeRule ([out] LPCWSTR *ppszScopeMatchingRule);
+  HRESULT MatchScopes ([in] LPCWSTR pszScope1,[in] LPCWSTR pszScope2,[out] BOOL *pfMatch);
+}
+
+[object, local, restricted, uuid (73ee3ced-b6e6-4329-a546-3e8ad46563d2), pointer_default (unique)]
+interface IWSDiscoveryProviderNotify : IUnknown {
+  HRESULT Add ([in] IWSDiscoveredService *pService);
+  HRESULT Remove ([in] IWSDiscoveredService *pService);
+  HRESULT SearchFailed ([in] HRESULT hr,[in, optional] LPCWSTR pszTag);
+  HRESULT SearchComplete ([in, optional] LPCWSTR pszTag);
+}
+
+[object, local, restricted, uuid (8ffc8e55-F0EB-480f-88b7-B435DD281D45), pointer_default (unique)]
+interface IWSDiscoveryProvider : IUnknown {
+  HRESULT SetAddressFamily ([in] DWORD dwAddressFamily);
+  HRESULT Attach ([in] IWSDiscoveryProviderNotify *pSink);
+  HRESULT Detach ();
+  HRESULT SearchById ([in] LPCWSTR pszId,[in, optional] LPCWSTR pszTag);
+  HRESULT SearchByAddress ([in] LPCWSTR pszAddress,[in, optional] LPCWSTR pszTag);
+  HRESULT SearchByType ([in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] LPCWSTR pszMatchBy,[in, optional] LPCWSTR pszTag);
+  HRESULT GetXMLContext ([out] IWSDXMLContext **ppContext);
+}
+
+[object, local, restricted, uuid (4bad8a3b-B374-4420-9632-AAC945B374AA), pointer_default (unique)]
+interface IWSDiscoveredService : IUnknown {
+  HRESULT GetEndpointReference ([out] WSD_ENDPOINT_REFERENCE **ppEndpointReference);
+  HRESULT GetTypes ([out] WSD_NAME_LIST **ppTypesList);
+  HRESULT GetScopes ([out] WSD_URI_LIST **ppScopesList);
+  HRESULT GetXAddrs ([out] WSD_URI_LIST **ppXAddrsList);
+  HRESULT GetMetadataVersion ([out] ULONGLONG *pullMetadataVersion);
+  HRESULT GetExtendedDiscoXML ([out] WSDXML_ELEMENT **ppHeaderAny,[out] WSDXML_ELEMENT **ppBodyAny);
+  HRESULT GetProbeResolveTag ([out] LPCWSTR *ppszTag);
+  HRESULT GetRemoteTransportAddress ([out] LPCWSTR *ppszRemoteTransportAddress);
+  HRESULT GetLocalTransportAddress ([out] LPCWSTR *ppszLocalTransportAddress);
+  HRESULT GetLocalInterfaceGUID ([out] GUID *pGuid);
+  HRESULT GetInstanceId ([out] ULONGLONG *pullInstanceId);
+}
+
+[object, local, restricted, uuid (e67651b0-337a-4b3c-9758-733388568251), pointer_default (unique)]
+interface IWSDiscoveryPublisherNotify : IUnknown {
+  HRESULT ProbeHandler ([in] const WSD_SOAP_MESSAGE *pSoap,[in] IWSDMessageParameters *pMessageParameters);
+  HRESULT ResolveHandler ([in] const WSD_SOAP_MESSAGE *pSoap,[in] IWSDMessageParameters *pMessageParameters);
+}
+
+[object, local, restricted, uuid (AE01E1A8-3ff9-4148-8116-057cc616fe13), pointer_default (unique)]
+interface IWSDiscoveryPublisher : IUnknown {
+  HRESULT SetAddressFamily ([in] DWORD dwAddressFamily);
+  HRESULT RegisterNotificationSink ([in] IWSDiscoveryPublisherNotify *pSink);
+  HRESULT UnRegisterNotificationSink ([in] IWSDiscoveryPublisherNotify *pSink);
+  HRESULT Publish ([in] LPCWSTR pszId,[in] ULONGLONG ullMetadataVersion,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] const WSD_URI_LIST *pXAddrsList);
+  HRESULT UnPublish ([in] LPCWSTR pszId,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSDXML_ELEMENT *pAny);
+  HRESULT MatchProbe ([in] const WSD_SOAP_MESSAGE *pProbeMessage,[in] IWSDMessageParameters *pMessageParameters,[in] LPCWSTR pszId,[in] ULONGLONG ullMetadataVersion,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] const WSD_URI_LIST *pXAddrsList);
+  HRESULT MatchResolve ([in] const WSD_SOAP_MESSAGE *pResolveMessage,[in] IWSDMessageParameters *pMessageParameters,[in] LPCWSTR pszId,[in] ULONGLONG ullMetadataVersion,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] const WSD_URI_LIST *pXAddrsList);
+  HRESULT PublishEx ([in] LPCWSTR pszId,[in] ULONGLONG ullMetadataVersion,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] const WSD_URI_LIST *pXAddrsList,[in, optional] const WSDXML_ELEMENT *pHeaderAny,[in, optional] const WSDXML_ELEMENT *pReferenceParameterAny,[in, optional] const WSDXML_ELEMENT *pPolicyAny,[in, optional] const WSDXML_ELEMENT *pEndpointReferenceAny,[in, optional] const WSDXML_ELEMENT *pAny);
+  HRESULT MatchProbeEx ([in] const WSD_SOAP_MESSAGE *pProbeMessage,[in] IWSDMessageParameters *pMessageParameters,[in] LPCWSTR pszId,[in] ULONGLONG ullMetadataVersion,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] const WSD_URI_LIST *pXAddrsList,[in, optional] const WSDXML_ELEMENT *pHeaderAny,[in, optional] const WSDXML_ELEMENT *pReferenceParameterAny,[in, optional] const WSDXML_ELEMENT *pPolicyAny,[in, optional] const WSDXML_ELEMENT *pEndpointReferenceAny,[in, optional] const WSDXML_ELEMENT *pAny);
+  HRESULT MatchResolveEx ([in] const WSD_SOAP_MESSAGE *pResolveMessage,[in] IWSDMessageParameters *pMessageParameters,[in] LPCWSTR pszId,[in] ULONGLONG ullMetadataVersion,[in] ULONGLONG ullInstanceId,[in] ULONGLONG ullMessageNumber,[in, optional] LPCWSTR pszSessionId,[in, optional] const WSD_NAME_LIST *pTypesList,[in, optional] const WSD_URI_LIST *pScopesList,[in, optional] const WSD_URI_LIST *pXAddrsList,[in, optional] const WSDXML_ELEMENT *pHeaderAny,[in, optional] const WSDXML_ELEMENT *pReferenceParameterAny,[in, optional] const WSDXML_ELEMENT *pPolicyAny,[in, optional] const WSDXML_ELEMENT *pEndpointReferenceAny,[in, optional] const WSDXML_ELEMENT *pAny);
+  HRESULT RegisterScopeMatchingRule ([in] IWSDScopeMatchingRule *pScopeMatchingRule);
+  HRESULT UnRegisterScopeMatchingRule ([in] IWSDScopeMatchingRule *pScopeMatchingRule);
+  HRESULT GetXMLContext ([out] IWSDXMLContext **ppContext);
+}
+
+cpp_quote("HRESULT WINAPI WSDCreateDiscoveryProvider(IWSDXMLContext *pContext, IWSDiscoveryProvider **ppProvider);")
+cpp_quote("HRESULT WINAPI WSDCreateDiscoveryPublisher(IWSDXMLContext* pContext, IWSDiscoveryPublisher **ppPublisher);")
+cpp_quote("#if WINVER >= 0x601")
+cpp_quote("HRESULT WINAPI WSDCreateDiscoveryProvider2(IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDiscoveryProvider **ppProvider);")
+cpp_quote("HRESULT WINAPI WSDCreateDiscoveryPublisher2(IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDiscoveryPublisher **ppPublisher);")
+cpp_quote("#endif")
+
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/wsdhost.h b/mingw-w64-headers/include/wsdhost.h
index 665cb10..39f6865 100644
--- a/mingw-w64-headers/include/wsdhost.h
+++ b/mingw-w64-headers/include/wsdhost.h
@@ -1,117 +1,632 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#ifndef _INC_WSDHOST
-#define _INC_WSDHOST
+/*** Autogenerated by WIDL 1.6 from wsdhost.idl - Do not edit ***/
 
-#ifndef _INC_WSDAPI
-#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
 #endif
 
-#if (_WIN32_WINNT >= 0x0600)
+#include <rpc.h>
+#include <rpcndr.h>
 
-#undef  INTERFACE
-#define INTERFACE IWSDServiceMessaging
-DECLARE_INTERFACE_(IWSDServiceMessaging,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
 #endif
-    /* IWSDServiceMessaging methods */
-    STDMETHOD_(HRESULT,SendResponse)(THIS_ void *pBody,WSD_OPERATION *pOperation,IWSDMessageParameters *pMessageParameters) PURE;
-    STDMETHOD_(HRESULT,FaultRequest)(THIS_ WSD_SOAP_HEADER *pRequestHeader,IWSDMessageParameters *pMessageParameters,WSD_SOAP_FAULT *pFault) PURE;
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDServiceMessaging_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDServiceMessaging_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDServiceMessaging_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDServiceMessaging_FaultRequest(This,pRequestHeader,pMessageParameters,pFault) (This)->lpVtbl->FaultRequest(This,pRequestHeader,pMessageParameters,pFault)
-#define IWSDServiceMessaging_SendResponse(This,pBody,pOperation,pMessageParameters) (This)->lpVtbl->SendResponse(This,pBody,pOperation,pMessageParameters)
-#endif /*COBJMACROS*/
+#ifndef __wsdhost_h__
+#define __wsdhost_h__
 
-#undef  INTERFACE
-#define INTERFACE IWSDDeviceHostNotify
-DECLARE_INTERFACE_(IWSDDeviceHostNotify,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+/* Forward declarations */
+
+#ifndef __IWSDDeviceHostNotify_FWD_DEFINED__
+#define __IWSDDeviceHostNotify_FWD_DEFINED__
+typedef interface IWSDDeviceHostNotify IWSDDeviceHostNotify;
 #endif
-    /* IWSDDeviceHostNotify methods */
-    STDMETHOD_(HRESULT,GetService)(THIS_ LPCWSTR pszServiceId,IUnknown **ppService) PURE;
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDDeviceHostNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDDeviceHostNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDDeviceHostNotify_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDDeviceHostNotify_GetService(This,pszServiceId,ppService) (This)->lpVtbl->GetService(This,pszServiceId,ppService)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IWSDDeviceHost
-DECLARE_INTERFACE_(IWSDDeviceHost,IUnknown) {
-    BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+#ifndef __IWSDServiceMessaging_FWD_DEFINED__
+#define __IWSDServiceMessaging_FWD_DEFINED__
+typedef interface IWSDServiceMessaging IWSDServiceMessaging;
 #endif
-    /* IWSDDeviceHost methods */
-    STDMETHOD_(HRESULT,Init)(THIS_ LPCWSTR pszLocalId,DWORD dwHostAddressCount) PURE;
-    STDMETHOD_(HRESULT,Start)(THIS_ ULONGLONG ullInstanceId,const WSD_URI_LIST *pScopeList,IWSDDeviceHostNotify *pNotificationSink) PURE;
-    STDMETHOD_(HRESULT,Stop)(THIS) PURE;
-    STDMETHOD_(HRESULT,Terminate)(THIS) PURE;
-    STDMETHOD_(HRESULT,RegisterPortType)(THIS_ const WSD_PORT_TYPE *pPortType) PURE;
-    STDMETHOD_(HRESULT,SetMetadata)(THIS_ const WSD_THIS_MODEL_METADATA *pThisModelMetadata,const WSD_THIS_DEVICE_METADATA *pThisDeviceMetadata,const WSD_METADATA_SECTION_LIST *pCustomMetadata) PURE;
-    STDMETHOD_(HRESULT,RegisterService)(THIS_ LPCWSTR pszServiceId,IUnknown *pService) PURE;
-    STDMETHOD_(HRESULT,RetireService)(THIS_ LPCWSTR pszServiceId) PURE;
-    STDMETHOD_(HRESULT,AddDynamicService)(THIS_ LPCWSTR pszServiceId,IUnknown *pService) PURE;
-    STDMETHOD_(HRESULT,RemoveDynamicService)(THIS_ LPCWSTR pszServiceId) PURE;
-    STDMETHOD_(HRESULT,SetServiceDiscoverable)(THIS_ const WCHAR *pszServiceId,WINBOOL fDiscoverable) PURE;
-    STDMETHOD_(HRESULT,SignalEvent)(THIS_ LPCWSTR pszServiceId,const void *pBody,const WSD_OPERATION *pOperation) PURE;
 
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IWSDDeviceHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IWSDDeviceHost_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IWSDDeviceHost_Release(This) (This)->lpVtbl->Release(This)
-#define IWSDDeviceHost_Init(This,pszLocalId,dwHostAddressCount) (This)->lpVtbl->Init(This,pszLocalId,dwHostAddressCount)
-#define IWSDDeviceHost_Start(This,ullInstanceId,pScopeList,pNotificationSink) (This)->lpVtbl->Start(This,ullInstanceId,pScopeList,pNotificationSink)
-#define IWSDDeviceHost_Stop() (This)->lpVtbl->Stop(This)
-#define IWSDDeviceHost_Terminate() (This)->lpVtbl->Terminate(This)
-#define IWSDDeviceHost_RegisterPortType(This,pPortType) (This)->lpVtbl->RegisterPortType(This,pPortType)
-#define IWSDDeviceHost_SetMetadata(This,pThisModelMetadata,pThisDeviceMetadata,pCustomMetadata) (This)->lpVtbl->SetMetadata(This,pThisModelMetadata,pThisDeviceMetadata,pCustomMetadata)
-#define IWSDDeviceHost_RegisterService(This,pszServiceId,pService) (This)->lpVtbl->RegisterService(This,pszServiceId,pService)
-#define IWSDDeviceHost_RetireService(This,pszServiceId) (This)->lpVtbl->RetireService(This,pszServiceId)
-#define IWSDDeviceHost_AddDynamicService(This,pszServiceId,pService) (This)->lpVtbl->AddDynamicService(This,pszServiceId,pService)
-#define IWSDDeviceHost_RemoveDynamicService(This,pszServiceId) (This)->lpVtbl->RemoveDynamicService(This,pszServiceId)
-#define IWSDDeviceHost_SetServiceDiscoverable(This,pszServiceId,fDiscoverable) (This)->lpVtbl->SetServiceDiscoverable(This,pszServiceId,fDiscoverable)
-#define IWSDDeviceHost_SignalEvent(This,pszServiceId,pBody,pOperation) (This)->lpVtbl->SignalEvent(This,pszServiceId,pBody,pOperation)
-#endif /*COBJMACROS*/
+#ifndef __IWSDDeviceHost_FWD_DEFINED__
+#define __IWSDDeviceHost_FWD_DEFINED__
+typedef interface IWSDDeviceHost IWSDDeviceHost;
+#endif
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+#include <ocidl.h>
+#include <wsdxmldom.h>
+#include <wsdtypes.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-HRESULT WINAPI WSDCreateDeviceHost(const WCHAR *pszLocalId, IWSDXMLContext *pContext, IWSDDeviceHost **ppDeviceHost);
-HRESULT WSDCreateDeviceHostAdvanced(const WCHAR *pszLocalId, IWSDXMLContext *pContext, IWSDAddress **ppHostAddresses, DWORD dwHostAddressCount, IWSDDeviceHost **ppDeviceHost);
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef __IWSDAddress_FWD_DEFINED__
+#define __IWSDAddress_FWD_DEFINED__
+typedef interface IWSDAddress IWSDAddress;
+#endif
+
+#ifndef __IWSDXMLContext_FWD_DEFINED__
+#define __IWSDXMLContext_FWD_DEFINED__
+typedef interface IWSDXMLContext IWSDXMLContext;
+#endif
+
+#ifndef __IWSDDeviceHost_FWD_DEFINED__
+#define __IWSDDeviceHost_FWD_DEFINED__
+typedef interface IWSDDeviceHost IWSDDeviceHost;
+#endif
+
+#ifndef __IWSDDeviceHostNotify_FWD_DEFINED__
+#define __IWSDDeviceHostNotify_FWD_DEFINED__
+typedef interface IWSDDeviceHostNotify IWSDDeviceHostNotify;
+#endif
+
+#ifndef __IWSDServiceMessaging_FWD_DEFINED__
+#define __IWSDServiceMessaging_FWD_DEFINED__
+typedef interface IWSDServiceMessaging IWSDServiceMessaging;
+#endif
+
+/*****************************************************************************
+ * IWSDDeviceHostNotify interface
+ */
+#ifndef __IWSDDeviceHostNotify_INTERFACE_DEFINED__
+#define __IWSDDeviceHostNotify_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDDeviceHostNotify, 0xb5bee9f9, 0xeeda, 0x41fe, 0x96,0xf7, 0xf4,0x5e,0x14,0x99,0x0f,0xb0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b5bee9f9-eeda-41fe-96f7-f45e14990fb0")
+IWSDDeviceHostNotify : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetService(
+        LPCWSTR pszServiceId,
+        IUnknown **ppService) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDDeviceHostNotify, 0xb5bee9f9, 0xeeda, 0x41fe, 0x96,0xf7, 0xf4,0x5e,0x14,0x99,0x0f,0xb0)
+#endif
+#else
+typedef struct IWSDDeviceHostNotifyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDDeviceHostNotify* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDDeviceHostNotify* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDDeviceHostNotify* This);
+
+    /*** IWSDDeviceHostNotify methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetService)(
+        IWSDDeviceHostNotify* This,
+        LPCWSTR pszServiceId,
+        IUnknown **ppService);
+
+    END_INTERFACE
+} IWSDDeviceHostNotifyVtbl;
+interface IWSDDeviceHostNotify {
+    CONST_VTBL IWSDDeviceHostNotifyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDDeviceHostNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDDeviceHostNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDDeviceHostNotify_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDDeviceHostNotify methods ***/
+#define IWSDDeviceHostNotify_GetService(This,pszServiceId,ppService) (This)->lpVtbl->GetService(This,pszServiceId,ppService)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDDeviceHostNotify_QueryInterface(IWSDDeviceHostNotify* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDDeviceHostNotify_AddRef(IWSDDeviceHostNotify* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDDeviceHostNotify_Release(IWSDDeviceHostNotify* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDDeviceHostNotify methods ***/
+static FORCEINLINE HRESULT IWSDDeviceHostNotify_GetService(IWSDDeviceHostNotify* This,LPCWSTR pszServiceId,IUnknown **ppService) {
+    return This->lpVtbl->GetService(This,pszServiceId,ppService);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDDeviceHostNotify_GetService_Proxy(
+    IWSDDeviceHostNotify* This,
+    LPCWSTR pszServiceId,
+    IUnknown **ppService);
+void __RPC_STUB IWSDDeviceHostNotify_GetService_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDDeviceHostNotify_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDServiceMessaging interface
+ */
+#ifndef __IWSDServiceMessaging_INTERFACE_DEFINED__
+#define __IWSDServiceMessaging_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDServiceMessaging, 0x94974cf4, 0x0cab, 0x460d, 0xa3,0xf6, 0x7a,0x0a,0xd6,0x23,0xc0,0xe6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("94974cf4-0cab-460d-a3f6-7a0ad623c0e6")
+IWSDServiceMessaging : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SendResponse(
+        void *pBody,
+        WSD_OPERATION *pOperation,
+        IWSDMessageParameters *pMessageParameters) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FaultRequest(
+        WSD_SOAP_HEADER *pRequestHeader,
+        IWSDMessageParameters *pMessageParameters,
+        WSD_SOAP_FAULT *pFault) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDServiceMessaging, 0x94974cf4, 0x0cab, 0x460d, 0xa3,0xf6, 0x7a,0x0a,0xd6,0x23,0xc0,0xe6)
+#endif
+#else
+typedef struct IWSDServiceMessagingVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDServiceMessaging* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDServiceMessaging* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDServiceMessaging* This);
+
+    /*** IWSDServiceMessaging methods ***/
+    HRESULT (STDMETHODCALLTYPE *SendResponse)(
+        IWSDServiceMessaging* This,
+        void *pBody,
+        WSD_OPERATION *pOperation,
+        IWSDMessageParameters *pMessageParameters);
+
+    HRESULT (STDMETHODCALLTYPE *FaultRequest)(
+        IWSDServiceMessaging* This,
+        WSD_SOAP_HEADER *pRequestHeader,
+        IWSDMessageParameters *pMessageParameters,
+        WSD_SOAP_FAULT *pFault);
+
+    END_INTERFACE
+} IWSDServiceMessagingVtbl;
+interface IWSDServiceMessaging {
+    CONST_VTBL IWSDServiceMessagingVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDServiceMessaging_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDServiceMessaging_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDServiceMessaging_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDServiceMessaging methods ***/
+#define IWSDServiceMessaging_SendResponse(This,pBody,pOperation,pMessageParameters) (This)->lpVtbl->SendResponse(This,pBody,pOperation,pMessageParameters)
+#define IWSDServiceMessaging_FaultRequest(This,pRequestHeader,pMessageParameters,pFault) (This)->lpVtbl->FaultRequest(This,pRequestHeader,pMessageParameters,pFault)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDServiceMessaging_QueryInterface(IWSDServiceMessaging* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDServiceMessaging_AddRef(IWSDServiceMessaging* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDServiceMessaging_Release(IWSDServiceMessaging* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDServiceMessaging methods ***/
+static FORCEINLINE HRESULT IWSDServiceMessaging_SendResponse(IWSDServiceMessaging* This,void *pBody,WSD_OPERATION *pOperation,IWSDMessageParameters *pMessageParameters) {
+    return This->lpVtbl->SendResponse(This,pBody,pOperation,pMessageParameters);
+}
+static FORCEINLINE HRESULT IWSDServiceMessaging_FaultRequest(IWSDServiceMessaging* This,WSD_SOAP_HEADER *pRequestHeader,IWSDMessageParameters *pMessageParameters,WSD_SOAP_FAULT *pFault) {
+    return This->lpVtbl->FaultRequest(This,pRequestHeader,pMessageParameters,pFault);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDServiceMessaging_SendResponse_Proxy(
+    IWSDServiceMessaging* This,
+    void *pBody,
+    WSD_OPERATION *pOperation,
+    IWSDMessageParameters *pMessageParameters);
+void __RPC_STUB IWSDServiceMessaging_SendResponse_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDServiceMessaging_FaultRequest_Proxy(
+    IWSDServiceMessaging* This,
+    WSD_SOAP_HEADER *pRequestHeader,
+    IWSDMessageParameters *pMessageParameters,
+    WSD_SOAP_FAULT *pFault);
+void __RPC_STUB IWSDServiceMessaging_FaultRequest_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDServiceMessaging_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWSDDeviceHost interface
+ */
+#ifndef __IWSDDeviceHost_INTERFACE_DEFINED__
+#define __IWSDDeviceHost_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWSDDeviceHost, 0x917fe891, 0x3d13, 0x4138, 0x98,0x09, 0x93,0x4c,0x8a,0xbe,0xb1,0x2c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("917fe891-3d13-4138-9809-934c8abeb12c")
+IWSDDeviceHost : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Init(
+        LPCWSTR pszLocalId,
+        IWSDXMLContext *pContext,
+        IWSDAddress **ppHostAddresses,
+        DWORD dwHostAddressCount) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Start(
+        ULONGLONG ullInstanceId,
+        const WSD_URI_LIST *pScopeList,
+        IWSDDeviceHostNotify *pNotificationSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Stop(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Terminate(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterPortType(
+        const WSD_PORT_TYPE *pPortType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetMetadata(
+        const WSD_THIS_MODEL_METADATA *pThisModelMetadata,
+        const WSD_THIS_DEVICE_METADATA *pThisDeviceMetadata,
+        const WSD_HOST_METADATA *pHostMetadata,
+        const WSD_METADATA_SECTION_LIST *pCustomMetadata) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterService(
+        LPCWSTR pszServiceId,
+        IUnknown *pService) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RetireService(
+        LPCWSTR pszServiceId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddDynamicService(
+        LPCWSTR pszServiceId,
+        LPCWSTR pszEndpointAddress,
+        const WSD_PORT_TYPE *pPortType,
+        const WSDXML_NAME *pPortName,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pService) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveDynamicService(
+        LPCWSTR pszServiceId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetServiceDiscoverable(
+        LPCWSTR pszServiceId,
+        WINBOOL fDiscoverable) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SignalEvent(
+        LPCWSTR pszServiceId,
+        const void *pBody,
+        const WSD_OPERATION *pOperation) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDDeviceHost, 0x917fe891, 0x3d13, 0x4138, 0x98,0x09, 0x93,0x4c,0x8a,0xbe,0xb1,0x2c)
+#endif
+#else
+typedef struct IWSDDeviceHostVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDDeviceHost* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDDeviceHost* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDDeviceHost* This);
+
+    /*** IWSDDeviceHost methods ***/
+    HRESULT (STDMETHODCALLTYPE *Init)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszLocalId,
+        IWSDXMLContext *pContext,
+        IWSDAddress **ppHostAddresses,
+        DWORD dwHostAddressCount);
+
+    HRESULT (STDMETHODCALLTYPE *Start)(
+        IWSDDeviceHost* This,
+        ULONGLONG ullInstanceId,
+        const WSD_URI_LIST *pScopeList,
+        IWSDDeviceHostNotify *pNotificationSink);
+
+    HRESULT (STDMETHODCALLTYPE *Stop)(
+        IWSDDeviceHost* This);
+
+    HRESULT (STDMETHODCALLTYPE *Terminate)(
+        IWSDDeviceHost* This);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterPortType)(
+        IWSDDeviceHost* This,
+        const WSD_PORT_TYPE *pPortType);
+
+    HRESULT (STDMETHODCALLTYPE *SetMetadata)(
+        IWSDDeviceHost* This,
+        const WSD_THIS_MODEL_METADATA *pThisModelMetadata,
+        const WSD_THIS_DEVICE_METADATA *pThisDeviceMetadata,
+        const WSD_HOST_METADATA *pHostMetadata,
+        const WSD_METADATA_SECTION_LIST *pCustomMetadata);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterService)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszServiceId,
+        IUnknown *pService);
+
+    HRESULT (STDMETHODCALLTYPE *RetireService)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszServiceId);
+
+    HRESULT (STDMETHODCALLTYPE *AddDynamicService)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszServiceId,
+        LPCWSTR pszEndpointAddress,
+        const WSD_PORT_TYPE *pPortType,
+        const WSDXML_NAME *pPortName,
+        const WSDXML_ELEMENT *pAny,
+        IUnknown *pService);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveDynamicService)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszServiceId);
+
+    HRESULT (STDMETHODCALLTYPE *SetServiceDiscoverable)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszServiceId,
+        WINBOOL fDiscoverable);
+
+    HRESULT (STDMETHODCALLTYPE *SignalEvent)(
+        IWSDDeviceHost* This,
+        LPCWSTR pszServiceId,
+        const void *pBody,
+        const WSD_OPERATION *pOperation);
+
+    END_INTERFACE
+} IWSDDeviceHostVtbl;
+interface IWSDDeviceHost {
+    CONST_VTBL IWSDDeviceHostVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWSDDeviceHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWSDDeviceHost_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWSDDeviceHost_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDDeviceHost methods ***/
+#define IWSDDeviceHost_Init(This,pszLocalId,pContext,ppHostAddresses,dwHostAddressCount) (This)->lpVtbl->Init(This,pszLocalId,pContext,ppHostAddresses,dwHostAddressCount)
+#define IWSDDeviceHost_Start(This,ullInstanceId,pScopeList,pNotificationSink) (This)->lpVtbl->Start(This,ullInstanceId,pScopeList,pNotificationSink)
+#define IWSDDeviceHost_Stop(This) (This)->lpVtbl->Stop(This)
+#define IWSDDeviceHost_Terminate(This) (This)->lpVtbl->Terminate(This)
+#define IWSDDeviceHost_RegisterPortType(This,pPortType) (This)->lpVtbl->RegisterPortType(This,pPortType)
+#define IWSDDeviceHost_SetMetadata(This,pThisModelMetadata,pThisDeviceMetadata,pHostMetadata,pCustomMetadata) (This)->lpVtbl->SetMetadata(This,pThisModelMetadata,pThisDeviceMetadata,pHostMetadata,pCustomMetadata)
+#define IWSDDeviceHost_RegisterService(This,pszServiceId,pService) (This)->lpVtbl->RegisterService(This,pszServiceId,pService)
+#define IWSDDeviceHost_RetireService(This,pszServiceId) (This)->lpVtbl->RetireService(This,pszServiceId)
+#define IWSDDeviceHost_AddDynamicService(This,pszServiceId,pszEndpointAddress,pPortType,pPortName,pAny,pService) (This)->lpVtbl->AddDynamicService(This,pszServiceId,pszEndpointAddress,pPortType,pPortName,pAny,pService)
+#define IWSDDeviceHost_RemoveDynamicService(This,pszServiceId) (This)->lpVtbl->RemoveDynamicService(This,pszServiceId)
+#define IWSDDeviceHost_SetServiceDiscoverable(This,pszServiceId,fDiscoverable) (This)->lpVtbl->SetServiceDiscoverable(This,pszServiceId,fDiscoverable)
+#define IWSDDeviceHost_SignalEvent(This,pszServiceId,pBody,pOperation) (This)->lpVtbl->SignalEvent(This,pszServiceId,pBody,pOperation)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDDeviceHost_QueryInterface(IWSDDeviceHost* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDDeviceHost_AddRef(IWSDDeviceHost* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDDeviceHost_Release(IWSDDeviceHost* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDDeviceHost methods ***/
+static FORCEINLINE HRESULT IWSDDeviceHost_Init(IWSDDeviceHost* This,LPCWSTR pszLocalId,IWSDXMLContext *pContext,IWSDAddress **ppHostAddresses,DWORD dwHostAddressCount) {
+    return This->lpVtbl->Init(This,pszLocalId,pContext,ppHostAddresses,dwHostAddressCount);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_Start(IWSDDeviceHost* This,ULONGLONG ullInstanceId,const WSD_URI_LIST *pScopeList,IWSDDeviceHostNotify *pNotificationSink) {
+    return This->lpVtbl->Start(This,ullInstanceId,pScopeList,pNotificationSink);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_Stop(IWSDDeviceHost* This) {
+    return This->lpVtbl->Stop(This);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_Terminate(IWSDDeviceHost* This) {
+    return This->lpVtbl->Terminate(This);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_RegisterPortType(IWSDDeviceHost* This,const WSD_PORT_TYPE *pPortType) {
+    return This->lpVtbl->RegisterPortType(This,pPortType);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_SetMetadata(IWSDDeviceHost* This,const WSD_THIS_MODEL_METADATA *pThisModelMetadata,const WSD_THIS_DEVICE_METADATA *pThisDeviceMetadata,const WSD_HOST_METADATA *pHostMetadata,const WSD_METADATA_SECTION_LIST *pCustomMetadata) {
+    return This->lpVtbl->SetMetadata(This,pThisModelMetadata,pThisDeviceMetadata,pHostMetadata,pCustomMetadata);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_RegisterService(IWSDDeviceHost* This,LPCWSTR pszServiceId,IUnknown *pService) {
+    return This->lpVtbl->RegisterService(This,pszServiceId,pService);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_RetireService(IWSDDeviceHost* This,LPCWSTR pszServiceId) {
+    return This->lpVtbl->RetireService(This,pszServiceId);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_AddDynamicService(IWSDDeviceHost* This,LPCWSTR pszServiceId,LPCWSTR pszEndpointAddress,const WSD_PORT_TYPE *pPortType,const WSDXML_NAME *pPortName,const WSDXML_ELEMENT *pAny,IUnknown *pService) {
+    return This->lpVtbl->AddDynamicService(This,pszServiceId,pszEndpointAddress,pPortType,pPortName,pAny,pService);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_RemoveDynamicService(IWSDDeviceHost* This,LPCWSTR pszServiceId) {
+    return This->lpVtbl->RemoveDynamicService(This,pszServiceId);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_SetServiceDiscoverable(IWSDDeviceHost* This,LPCWSTR pszServiceId,WINBOOL fDiscoverable) {
+    return This->lpVtbl->SetServiceDiscoverable(This,pszServiceId,fDiscoverable);
+}
+static FORCEINLINE HRESULT IWSDDeviceHost_SignalEvent(IWSDDeviceHost* This,LPCWSTR pszServiceId,const void *pBody,const WSD_OPERATION *pOperation) {
+    return This->lpVtbl->SignalEvent(This,pszServiceId,pBody,pOperation);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_Init_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszLocalId,
+    IWSDXMLContext *pContext,
+    IWSDAddress **ppHostAddresses,
+    DWORD dwHostAddressCount);
+void __RPC_STUB IWSDDeviceHost_Init_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_Start_Proxy(
+    IWSDDeviceHost* This,
+    ULONGLONG ullInstanceId,
+    const WSD_URI_LIST *pScopeList,
+    IWSDDeviceHostNotify *pNotificationSink);
+void __RPC_STUB IWSDDeviceHost_Start_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_Stop_Proxy(
+    IWSDDeviceHost* This);
+void __RPC_STUB IWSDDeviceHost_Stop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_Terminate_Proxy(
+    IWSDDeviceHost* This);
+void __RPC_STUB IWSDDeviceHost_Terminate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_RegisterPortType_Proxy(
+    IWSDDeviceHost* This,
+    const WSD_PORT_TYPE *pPortType);
+void __RPC_STUB IWSDDeviceHost_RegisterPortType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_SetMetadata_Proxy(
+    IWSDDeviceHost* This,
+    const WSD_THIS_MODEL_METADATA *pThisModelMetadata,
+    const WSD_THIS_DEVICE_METADATA *pThisDeviceMetadata,
+    const WSD_HOST_METADATA *pHostMetadata,
+    const WSD_METADATA_SECTION_LIST *pCustomMetadata);
+void __RPC_STUB IWSDDeviceHost_SetMetadata_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_RegisterService_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszServiceId,
+    IUnknown *pService);
+void __RPC_STUB IWSDDeviceHost_RegisterService_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_RetireService_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszServiceId);
+void __RPC_STUB IWSDDeviceHost_RetireService_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_AddDynamicService_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszServiceId,
+    LPCWSTR pszEndpointAddress,
+    const WSD_PORT_TYPE *pPortType,
+    const WSDXML_NAME *pPortName,
+    const WSDXML_ELEMENT *pAny,
+    IUnknown *pService);
+void __RPC_STUB IWSDDeviceHost_AddDynamicService_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_RemoveDynamicService_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszServiceId);
+void __RPC_STUB IWSDDeviceHost_RemoveDynamicService_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_SetServiceDiscoverable_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszServiceId,
+    WINBOOL fDiscoverable);
+void __RPC_STUB IWSDDeviceHost_SetServiceDiscoverable_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDDeviceHost_SignalEvent_Proxy(
+    IWSDDeviceHost* This,
+    LPCWSTR pszServiceId,
+    const void *pBody,
+    const WSD_OPERATION *pOperation);
+void __RPC_STUB IWSDDeviceHost_SignalEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDDeviceHost_INTERFACE_DEFINED__ */
+
+HRESULT WINAPI WSDCreateDeviceHost(LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceHost **ppDeviceHost);
+#if WINVER >= 0x601
+HRESULT WINAPI WSDCreateDeviceHost2(LPCWSTR pszLocalId, IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDDeviceHost **ppDeviceHost);
+#endif
+HRESULT WINAPI WSDCreateDeviceHostAdvanced(LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDAddress** ppHostAddresses, DWORD dwHostAddressCount, IWSDDeviceHost **ppDeviceHost);
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_WSDHOST*/
+#endif /* __wsdhost_h__ */
diff --git a/mingw-w64-headers/include/wsdhost.idl b/mingw-w64-headers/include/wsdhost.idl
new file mode 100644
index 0000000..28d93a3
--- /dev/null
+++ b/mingw-w64-headers/include/wsdhost.idl
@@ -0,0 +1,54 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+import "oaidl.idl";
+import "ocidl.idl";
+import "wsdxmldom.h";
+import "wsdtypes.h";
+
+cpp_quote("")
+interface IWSDAddress;
+interface IWSDXMLContext;
+interface IWSDDeviceHost;
+interface IWSDDeviceHostNotify;
+interface IWSDServiceMessaging;
+
+[object, restricted, uuid (b5bee9f9-eeda-41fe-96f7-f45e14990fb0), pointer_default (unique)]
+interface IWSDDeviceHostNotify : IUnknown {
+  HRESULT GetService ([in] LPCWSTR pszServiceId,[out] IUnknown **ppService);
+};
+
+[object, local, restricted, uuid (94974cf4-0cab-460d-a3f6-7a0ad623c0e6), pointer_default (unique)]
+interface IWSDServiceMessaging : IUnknown {
+  HRESULT SendResponse ([in] void *pBody,[in] WSD_OPERATION *pOperation,[in] IWSDMessageParameters *pMessageParameters);
+  HRESULT FaultRequest ([in] WSD_SOAP_HEADER *pRequestHeader,[in] IWSDMessageParameters *pMessageParameters,[in, optional] WSD_SOAP_FAULT *pFault);
+};
+
+[object, local, restricted, uuid (917fe891-3d13-4138-9809-934c8abeb12c), pointer_default (unique)]
+interface IWSDDeviceHost : IUnknown {
+  HRESULT Init ([in] LPCWSTR pszLocalId,[in, optional] IWSDXMLContext *pContext,[in, optional] IWSDAddress **ppHostAddresses,[in, optional] DWORD dwHostAddressCount);
+  HRESULT Start ([in] ULONGLONG ullInstanceId,[in] const WSD_URI_LIST *pScopeList,[in, optional] IWSDDeviceHostNotify *pNotificationSink);
+  HRESULT Stop ();
+  HRESULT Terminate ();
+  HRESULT RegisterPortType ([in] const WSD_PORT_TYPE *pPortType);
+  HRESULT SetMetadata ([in] const WSD_THIS_MODEL_METADATA *pThisModelMetadata,[in] const WSD_THIS_DEVICE_METADATA *pThisDeviceMetadata,[in, optional] const WSD_HOST_METADATA *pHostMetadata,[in, optional] const WSD_METADATA_SECTION_LIST *pCustomMetadata);
+  HRESULT RegisterService ([in] LPCWSTR pszServiceId,[in] IUnknown *pService);
+  HRESULT RetireService ([in] LPCWSTR pszServiceId);
+  HRESULT AddDynamicService ([in] LPCWSTR pszServiceId,[in, optional] LPCWSTR pszEndpointAddress,[in, optional] const WSD_PORT_TYPE *pPortType,[in, optional] const WSDXML_NAME *pPortName,[in, optional] const WSDXML_ELEMENT *pAny,[in, optional] IUnknown *pService);
+  HRESULT RemoveDynamicService ([in] LPCWSTR pszServiceId);
+  HRESULT SetServiceDiscoverable ([in] LPCWSTR pszServiceId,[in] BOOL fDiscoverable);
+  HRESULT SignalEvent ([in] LPCWSTR pszServiceId,[in] const void *pBody,[in] const WSD_OPERATION *pOperation);
+};
+
+cpp_quote("HRESULT WINAPI WSDCreateDeviceHost(LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDDeviceHost **ppDeviceHost);")
+cpp_quote("#if WINVER >= 0x601")
+cpp_quote("HRESULT WINAPI WSDCreateDeviceHost2(LPCWSTR pszLocalId, IWSDXMLContext *pContext, WSD_CONFIG_PARAM *pConfigParams, DWORD dwConfigParamCount, IWSDDeviceHost **ppDeviceHost);")
+cpp_quote("#endif")
+cpp_quote("HRESULT WINAPI WSDCreateDeviceHostAdvanced(LPCWSTR pszLocalId, IWSDXMLContext *pContext, IWSDAddress** ppHostAddresses, DWORD dwHostAddressCount, IWSDDeviceHost **ppDeviceHost);")
+
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/wsdxml.h b/mingw-w64-headers/include/wsdxml.h
index f623ae5..a04f45f 100644
--- a/mingw-w64-headers/include/wsdxml.h
+++ b/mingw-w64-headers/include/wsdxml.h
@@ -1,46 +1,347 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+/*** Autogenerated by WIDL 1.6 from wsdxml.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __wsdxml_h__
+#define __wsdxml_h__
+
+/* Forward declarations */
+
+#ifndef __IWSDXMLContext_FWD_DEFINED__
+#define __IWSDXMLContext_FWD_DEFINED__
+typedef interface IWSDXMLContext IWSDXMLContext;
+#endif
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+#include <ocidl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef __IWSDXMLContext_FWD_DEFINED__
+#define __IWSDXMLContext_FWD_DEFINED__
+typedef interface IWSDXMLContext IWSDXMLContext;
+#endif
+
+enum {
+    OpNone = 0,
+    OpEndOfTable = 1,
+    OpBeginElement_ = 2,
+    OpBeginAnyElement = 3,
+    OpEndElement = 4,
+    OpElement_ = 5,
+    OpAnyElement = 6,
+    OpAnyElements = 7,
+    OpAnyText = 8,
+    OpAttribute_ = 9,
+    OpBeginChoice = 10,
+    OpEndChoice = 11,
+    OpBeginSequence = 12,
+    OpEndSequence = 13,
+    OpBeginAll = 14,
+    OpEndAll = 15,
+    OpAnything = 16,
+    OpAnyNumber = 17,
+    OpOneOrMore = 18,
+    OpOptional = 19,
+    OpFormatBool_ = 20,
+    OpFormatInt8_ = 21,
+    OpFormatInt16_ = 22,
+    OpFormatInt32_ = 23,
+    OpFormatInt64_ = 24,
+    OpFormatUInt8_ = 25,
+    OpFormatUInt16_ = 26,
+    OpFormatUInt32_ = 27,
+    OpFormatUInt64_ = 28,
+    OpFormatUnicodeString_ = 29,
+    OpFormatDom_ = 30,
+    OpFormatStruct_ = 31,
+    OpFormatUri_ = 32,
+    OpFormatUuidUri_ = 33,
+    OpFormatName_ = 34,
+    OpFormatListInsertTail_ = 35,
+    OpFormatType_ = 36,
+    OpFormatDynamicType_ = 37,
+    OpFormatLookupType_ = 38,
+    OpFormatDuration_ = 39,
+    OpFormatDateTime_ = 40,
+    OpFormatFloat_ = 41,
+    OpFormatDouble_ = 42,
+    OpProcess_ = 43,
+    OpQualifiedAttribute_ = 44,
+    OpFormatXMLDeclaration_ = 45,
+    OpFormatMax = 46
+};
+
+typedef struct _WSDXML_NAMESPACE WSDXML_NAMESPACE;
+typedef const WSDXML_NAMESPACE *PCWSDXML_NAMESPACE;
+typedef struct _WSDXML_NAME WSDXML_NAME;
+typedef struct _WSDXML_TYPE WSDXML_TYPE;
+typedef const WSDXML_TYPE *PCWSDXML_TYPE;
+typedef struct _WSDXML_PREFIX_MAPPING WSDXML_PREFIX_MAPPING;
+typedef struct _WSDXML_ATTRIBUTE WSDXML_ATTRIBUTE;
+typedef struct _WSDXML_NODE WSDXML_NODE;
+typedef struct _WSDXML_ELEMENT WSDXML_ELEMENT;
+typedef struct _WSDXML_TEXT WSDXML_TEXT;
+typedef struct _WSDXML_ELEMENT_LIST WSDXML_ELEMENT_LIST;
+typedef struct _WSD_DATETIME {
+    WINBOOL isPositive;
+    ULONG year;
+    UCHAR month;
+    UCHAR day;
+    UCHAR hour;
+    UCHAR minute;
+    UCHAR second;
+    UINT millisecond;
+    WINBOOL TZIsLocal;
+    WINBOOL TZIsPositive;
+    UCHAR TZHour;
+    UCHAR TZMinute;
+} WSD_DATETIME;
+typedef struct _WSD_DURATION {
+    WINBOOL isPositive;
+    ULONG year;
+    ULONG month;
+    ULONG day;
+    ULONG hour;
+    ULONG minute;
+    ULONG second;
+    ULONG millisecond;
+} WSD_DURATION;
+
+#define WSDXML_TYPE_ENCODING(tidx,lno) ((((DWORD) lno) << 28) | tidx)
+#define WSDXML_NAMESPACE_ENCODING(nsidx, lno) ((((WORD) lno) << 12) | nsidx)
+#define WSDXML_NAME_ENCODING(nidx, nsenc) ((((DWORD) nsenc) << 16) | nidx)
+
+#define OFFSET(type,field) ((DWORD_PTR) (&((type *)0)->field))
+#define BYTE0(n) (BYTE) (((DWORD) n) & 0xff)
+#define BYTE1(n) (BYTE) ((((DWORD) n) >> 8) & 0xff)
+#define BYTE2(n) (BYTE) ((((DWORD) n) >> 16) & 0xff)
+#define BYTE3(n) (BYTE)((((DWORD) n) >> 24) & 0xff)
+#define BYTES(n) BYTE0(n), BYTE1(n), BYTE2(n), BYTE3(n)
+
+#define OpAttribute(name) OpAttribute_, BYTES(name)
+#define OpBeginElement(name) OpBeginElement_, BYTES(name)
+#define OpElement(name) OpElement_, BYTES(name)
+#define OpFormatBool(type,field,isptr) OpFormatBool_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatDateTime(type,field) OpFormatDateTime_, BYTES(OFFSET(type,field))
+#define OpFormatDom(type,field) OpFormatDom_, BYTES(OFFSET(type,field))
+#define OpFormatDouble(type,field,isptr) OpFormatDouble_, BYTES(isptr),BYTES(OFFSET(type,field))
+#define OpFormatDuration(type,field) OpFormatDuration_, BYTES(OFFSET(type,field))
+#define OpFormatDynamicType(name,type,field) OpFormatDynamicType_, BYTES(name),BYTES(OFFSET(type,field))
+#define OpFormatFloat(type,field,isptr) OpFormatFloat_, BYTES(isptr),BYTES(OFFSET(type,field))
+#define OpFormatInt8(type,field,isptr) OpFormatInt8_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatInt16(type,field,isptr) OpFormatInt16_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatInt32(type,field,isptr) OpFormatInt32_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatInt64(type,field,isptr) OpFormatInt64_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatListInsertTail(s,type,field) OpFormatListInsertTail_,BYTES(sizeof(s)),BYTES(OFFSET(type,field))
+#define OpFormatLookupType(uriField,type,field) OpFormatLookupType_, BYTES(OFFSET(type,uriField)),BYTES(OFFSET(type,field))
+#define OpFormatName(type,field) OpFormatName_, BYTES(OFFSET(type,field))
+#define OpFormatPointerToStruct(sType) OpFormatStruct_, BYTES(sizeof(sType)),BYTES(0)
+#define OpFormatStruct(sType,type,field) OpFormatStruct_, BYTES(sizeof(sType)),BYTES(OFFSET(type,field))
+#define OpFormatType(table,type,field) OpFormatType_, BYTES(table),BYTES(OFFSET(type,field))
+#define OpFormatUInt8(type,field,isptr) OpFormatUInt8_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatUInt16(type,field,isptr) OpFormatUInt16_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatUInt32(type,field,isptr) OpFormatUInt32_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatUInt64(type,field,isptr) OpFormatUInt64_, BYTES(isptr), BYTES(OFFSET(type,field))
+#define OpFormatUnicodeString(type,field) OpFormatUnicodeString_, BYTES(OFFSET(type,field))
+#define OpFormatUri(type,field) OpFormatUri_, BYTES(OFFSET(type,field))
+#define OpFormatUuidUri(type,field,isptr) OpFormatUuidUri_, BYTES(isptr),BYTES(OFFSET(type,field))
+#define OpFormatXMLDeclaration(type,field) OpFormatXMLDeclaration_, BYTES(OFFSET(type,field))
+#define OpProcess(type,field) OpProcess_, BYTES(OFFSET(type,field))
+#define OpQualifiedAttribute(name) OpQualifiedAttribute_, BYTES(name)
+/*****************************************************************************
+ * IWSDXMLContext interface
  */
-#ifndef _INC_WSDXML
-#define _INC_WSDXML
+#ifndef __IWSDXMLContext_INTERFACE_DEFINED__
+#define __IWSDXMLContext_INTERFACE_DEFINED__
 
-#ifndef _INC_WSDAPI
-#error Please include wsdapi.h instead of this header. This header cannot be used directly.
+DEFINE_GUID(IID_IWSDXMLContext, 0x75d8f3ee, 0x3e5a, 0x43b4, 0xa1,0x5a, 0xbc,0xf6,0x88,0x74,0x60,0xc0);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("75d8f3ee-3e5a-43b4-a15a-bcf6887460c0")
+IWSDXMLContext : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddNamespace(
+        LPCWSTR pszUri,
+        LPCWSTR pszSuggestedPrefix,
+        WSDXML_NAMESPACE **ppNamespace) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddNameToNamespace(
+        LPCWSTR pszUri,
+        LPCWSTR pszName,
+        WSDXML_NAME **ppName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetNamespaces(
+        const PCWSDXML_NAMESPACE *pNamespaces,
+        WORD wNamespacesCount,
+        BYTE bLayerNumber) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTypes(
+        const PCWSDXML_TYPE *pTypes,
+        DWORD dwTypesCount,
+        BYTE bLayerNumber) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWSDXMLContext, 0x75d8f3ee, 0x3e5a, 0x43b4, 0xa1,0x5a, 0xbc,0xf6,0x88,0x74,0x60,0xc0)
 #endif
-
-#if (_WIN32_WINNT >= 0x0600)
-#undef  INTERFACE
-#define INTERFACE IWSDXMLContext
-DECLARE_INTERFACE_(IWSDXMLContext,IUnknown) {
+#else
+typedef struct IWSDXMLContextVtbl {
     BEGIN_INTERFACE
-#ifndef __cplusplus
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-#endif
-    /* IWSDXMLContext methods */
-    STDMETHOD_(HRESULT,AddNamespace)(THIS_ const LPCWSTR *pszUri,const LPCWSTR *pszSuggestedPrefix,WSDXML_NAMESPACE **ppNamespace) PURE;
-    STDMETHOD_(HRESULT,AddNameToNamespace) (THIS_ LPCWSTR pszUri, LPCWSTR pszName, WSDXML_NAME **ppName);
-    STDMETHOD_(HRESULT,SetNamespaces)(THIS_ const PCWSDXML_NAMESPACE *pNamespaces,WORD wNamespacesCount,BYTE bLayerNumber) PURE;
-    STDMETHOD_(HRESULT,SetTypes)(THIS_ const PCWSDXML_TYPE *pTypes,DWORD dwTypesCount,BYTE bLayerNumber) PURE;
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWSDXMLContext* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWSDXMLContext* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWSDXMLContext* This);
+
+    /*** IWSDXMLContext methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddNamespace)(
+        IWSDXMLContext* This,
+        LPCWSTR pszUri,
+        LPCWSTR pszSuggestedPrefix,
+        WSDXML_NAMESPACE **ppNamespace);
+
+    HRESULT (STDMETHODCALLTYPE *AddNameToNamespace)(
+        IWSDXMLContext* This,
+        LPCWSTR pszUri,
+        LPCWSTR pszName,
+        WSDXML_NAME **ppName);
+
+    HRESULT (STDMETHODCALLTYPE *SetNamespaces)(
+        IWSDXMLContext* This,
+        const PCWSDXML_NAMESPACE *pNamespaces,
+        WORD wNamespacesCount,
+        BYTE bLayerNumber);
+
+    HRESULT (STDMETHODCALLTYPE *SetTypes)(
+        IWSDXMLContext* This,
+        const PCWSDXML_TYPE *pTypes,
+        DWORD dwTypesCount,
+        BYTE bLayerNumber);
 
     END_INTERFACE
+} IWSDXMLContextVtbl;
+interface IWSDXMLContext {
+    CONST_VTBL IWSDXMLContextVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IWSDXMLContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IWSDXMLContext_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IWSDXMLContext_Release(This) (This)->lpVtbl->Release(This)
+/*** IWSDXMLContext methods ***/
+#define IWSDXMLContext_AddNamespace(This,pszUri,pszSuggestedPrefix,ppNamespace) (This)->lpVtbl->AddNamespace(This,pszUri,pszSuggestedPrefix,ppNamespace)
+#define IWSDXMLContext_AddNameToNamespace(This,pszUri,pszName,ppName) (This)->lpVtbl->AddNameToNamespace(This,pszUri,pszName,ppName)
 #define IWSDXMLContext_SetNamespaces(This,pNamespaces,wNamespacesCount,bLayerNumber) (This)->lpVtbl->SetNamespaces(This,pNamespaces,wNamespacesCount,bLayerNumber)
 #define IWSDXMLContext_SetTypes(This,pTypes,dwTypesCount,bLayerNumber) (This)->lpVtbl->SetTypes(This,pTypes,dwTypesCount,bLayerNumber)
-#define IWSDXMLContext_AddNamespace(This,pszUri,pszSuggestedPrefix,ppNamespace) (This)->lpVtbl->AddNamespace(This,pszUri,pszSuggestedPrefix,ppNamespace)
-#endif /*COBJMACROS*/
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWSDXMLContext_QueryInterface(IWSDXMLContext* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWSDXMLContext_AddRef(IWSDXMLContext* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWSDXMLContext_Release(IWSDXMLContext* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWSDXMLContext methods ***/
+static FORCEINLINE HRESULT IWSDXMLContext_AddNamespace(IWSDXMLContext* This,LPCWSTR pszUri,LPCWSTR pszSuggestedPrefix,WSDXML_NAMESPACE **ppNamespace) {
+    return This->lpVtbl->AddNamespace(This,pszUri,pszSuggestedPrefix,ppNamespace);
+}
+static FORCEINLINE HRESULT IWSDXMLContext_AddNameToNamespace(IWSDXMLContext* This,LPCWSTR pszUri,LPCWSTR pszName,WSDXML_NAME **ppName) {
+    return This->lpVtbl->AddNameToNamespace(This,pszUri,pszName,ppName);
+}
+static FORCEINLINE HRESULT IWSDXMLContext_SetNamespaces(IWSDXMLContext* This,const PCWSDXML_NAMESPACE *pNamespaces,WORD wNamespacesCount,BYTE bLayerNumber) {
+    return This->lpVtbl->SetNamespaces(This,pNamespaces,wNamespacesCount,bLayerNumber);
+}
+static FORCEINLINE HRESULT IWSDXMLContext_SetTypes(IWSDXMLContext* This,const PCWSDXML_TYPE *pTypes,DWORD dwTypesCount,BYTE bLayerNumber) {
+    return This->lpVtbl->SetTypes(This,pTypes,dwTypesCount,bLayerNumber);
+}
+#endif
+#endif
 
-HRESULT WINAPI WSDXMLGetNameFromBuiltinNamespace(LPCWSTR pszNamespace, LPCWSTR pszName, WSDXML_NAME **ppName);
+#endif
+
+HRESULT STDMETHODCALLTYPE IWSDXMLContext_AddNamespace_Proxy(
+    IWSDXMLContext* This,
+    LPCWSTR pszUri,
+    LPCWSTR pszSuggestedPrefix,
+    WSDXML_NAMESPACE **ppNamespace);
+void __RPC_STUB IWSDXMLContext_AddNamespace_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDXMLContext_AddNameToNamespace_Proxy(
+    IWSDXMLContext* This,
+    LPCWSTR pszUri,
+    LPCWSTR pszName,
+    WSDXML_NAME **ppName);
+void __RPC_STUB IWSDXMLContext_AddNameToNamespace_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDXMLContext_SetNamespaces_Proxy(
+    IWSDXMLContext* This,
+    const PCWSDXML_NAMESPACE *pNamespaces,
+    WORD wNamespacesCount,
+    BYTE bLayerNumber);
+void __RPC_STUB IWSDXMLContext_SetNamespaces_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWSDXMLContext_SetTypes_Proxy(
+    IWSDXMLContext* This,
+    const PCWSDXML_TYPE *pTypes,
+    DWORD dwTypesCount,
+    BYTE bLayerNumber);
+void __RPC_STUB IWSDXMLContext_SetTypes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWSDXMLContext_INTERFACE_DEFINED__ */
+
 HRESULT WINAPI WSDXMLGetNameFromBuiltinNamespace(LPCWSTR pszNamespace, LPCWSTR pszName, WSDXML_NAME **ppName);
 HRESULT WINAPI WSDXMLCreateContext(IWSDXMLContext **ppContext);
+#endif
+/* Begin additional prototypes for all interfaces */
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_WSDXML*/
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __wsdxml_h__ */
diff --git a/mingw-w64-headers/include/wsdxml.idl b/mingw-w64-headers/include/wsdxml.idl
new file mode 100644
index 0000000..22b7cdf
--- /dev/null
+++ b/mingw-w64-headers/include/wsdxml.idl
@@ -0,0 +1,158 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+cpp_quote("")
+interface IWSDXMLContext;
+
+enum {
+  OpNone,
+  OpEndOfTable,
+  OpBeginElement_,
+  OpBeginAnyElement,
+  OpEndElement,
+  OpElement_,
+  OpAnyElement,
+  OpAnyElements,
+  OpAnyText,
+  OpAttribute_,
+  OpBeginChoice,
+  OpEndChoice,
+  OpBeginSequence,
+  OpEndSequence,
+  OpBeginAll,
+  OpEndAll,
+  OpAnything,
+  OpAnyNumber,
+  OpOneOrMore,
+  OpOptional,
+  OpFormatBool_,
+  OpFormatInt8_,
+  OpFormatInt16_,
+  OpFormatInt32_,
+  OpFormatInt64_,
+  OpFormatUInt8_,
+  OpFormatUInt16_,
+  OpFormatUInt32_,
+  OpFormatUInt64_,
+  OpFormatUnicodeString_,
+  OpFormatDom_,
+  OpFormatStruct_,
+  OpFormatUri_,
+  OpFormatUuidUri_,
+  OpFormatName_,
+  OpFormatListInsertTail_,
+  OpFormatType_,
+  OpFormatDynamicType_,
+  OpFormatLookupType_,
+  OpFormatDuration_,
+  OpFormatDateTime_,
+  OpFormatFloat_,
+  OpFormatDouble_,
+  OpProcess_,
+  OpQualifiedAttribute_,
+  OpFormatXMLDeclaration_,
+  OpFormatMax
+};
+
+typedef struct _WSDXML_NAMESPACE WSDXML_NAMESPACE;
+typedef const WSDXML_NAMESPACE *PCWSDXML_NAMESPACE;
+typedef struct _WSDXML_NAME WSDXML_NAME;
+typedef struct _WSDXML_TYPE WSDXML_TYPE;
+typedef const WSDXML_TYPE *PCWSDXML_TYPE;
+typedef struct _WSDXML_PREFIX_MAPPING WSDXML_PREFIX_MAPPING;
+typedef struct _WSDXML_ATTRIBUTE WSDXML_ATTRIBUTE;
+typedef struct _WSDXML_NODE WSDXML_NODE;
+typedef struct _WSDXML_ELEMENT WSDXML_ELEMENT;
+typedef struct _WSDXML_TEXT WSDXML_TEXT;
+typedef struct _WSDXML_ELEMENT_LIST WSDXML_ELEMENT_LIST;
+
+typedef struct _WSD_DATETIME {
+  BOOL isPositive;
+  ULONG year;
+  UCHAR month;
+  UCHAR day;
+  UCHAR hour;
+  UCHAR minute;
+  UCHAR second;
+  UINT millisecond;
+  BOOL TZIsLocal;
+  BOOL TZIsPositive;
+  UCHAR TZHour;
+  UCHAR TZMinute;
+} WSD_DATETIME;
+
+typedef struct _WSD_DURATION {
+  BOOL isPositive;
+  ULONG year;
+  ULONG month;
+  ULONG day;
+  ULONG hour;
+  ULONG minute;
+  ULONG second;
+  ULONG millisecond;
+} WSD_DURATION;
+
+cpp_quote("")
+cpp_quote("#define WSDXML_TYPE_ENCODING(tidx,lno) ((((DWORD) lno) << 28) | tidx)")
+cpp_quote("#define WSDXML_NAMESPACE_ENCODING(nsidx, lno) ((((WORD) lno) << 12) | nsidx)")
+cpp_quote("#define WSDXML_NAME_ENCODING(nidx, nsenc) ((((DWORD) nsenc) << 16) | nidx)")
+cpp_quote("")
+cpp_quote("#define OFFSET(type,field) ((DWORD_PTR) (&((type *)0)->field))")
+cpp_quote("#define BYTE0(n) (BYTE) (((DWORD) n) & 0xff)")
+cpp_quote("#define BYTE1(n) (BYTE) ((((DWORD) n) >> 8) & 0xff)")
+cpp_quote("#define BYTE2(n) (BYTE) ((((DWORD) n) >> 16) & 0xff)")
+cpp_quote("#define BYTE3(n) (BYTE)((((DWORD) n) >> 24) & 0xff)")
+cpp_quote("#define BYTES(n) BYTE0(n), BYTE1(n), BYTE2(n), BYTE3(n)")
+cpp_quote("")
+cpp_quote("#define OpAttribute(name) OpAttribute_, BYTES(name)")
+cpp_quote("#define OpBeginElement(name) OpBeginElement_, BYTES(name)")
+cpp_quote("#define OpElement(name) OpElement_, BYTES(name)")
+cpp_quote("#define OpFormatBool(type,field,isptr) OpFormatBool_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatDateTime(type,field) OpFormatDateTime_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatDom(type,field) OpFormatDom_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatDouble(type,field,isptr) OpFormatDouble_, BYTES(isptr),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatDuration(type,field) OpFormatDuration_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatDynamicType(name,type,field) OpFormatDynamicType_, BYTES(name),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatFloat(type,field,isptr) OpFormatFloat_, BYTES(isptr),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatInt8(type,field,isptr) OpFormatInt8_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatInt16(type,field,isptr) OpFormatInt16_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatInt32(type,field,isptr) OpFormatInt32_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatInt64(type,field,isptr) OpFormatInt64_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatListInsertTail(s,type,field) OpFormatListInsertTail_,BYTES(sizeof(s)),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatLookupType(uriField,type,field) OpFormatLookupType_, BYTES(OFFSET(type,uriField)),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatName(type,field) OpFormatName_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatPointerToStruct(sType) OpFormatStruct_, BYTES(sizeof(sType)),BYTES(0)")
+cpp_quote("#define OpFormatStruct(sType,type,field) OpFormatStruct_, BYTES(sizeof(sType)),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatType(table,type,field) OpFormatType_, BYTES(table),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUInt8(type,field,isptr) OpFormatUInt8_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUInt16(type,field,isptr) OpFormatUInt16_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUInt32(type,field,isptr) OpFormatUInt32_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUInt64(type,field,isptr) OpFormatUInt64_, BYTES(isptr), BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUnicodeString(type,field) OpFormatUnicodeString_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUri(type,field) OpFormatUri_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatUuidUri(type,field,isptr) OpFormatUuidUri_, BYTES(isptr),BYTES(OFFSET(type,field))")
+cpp_quote("#define OpFormatXMLDeclaration(type,field) OpFormatXMLDeclaration_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpProcess(type,field) OpProcess_, BYTES(OFFSET(type,field))")
+cpp_quote("#define OpQualifiedAttribute(name) OpQualifiedAttribute_, BYTES(name)")
+
+[object, local, restricted, uuid (75d8f3ee-3e5a-43b4-a15a-bcf6887460c0), pointer_default (unique)]
+interface IWSDXMLContext : IUnknown {
+  HRESULT AddNamespace ([in] LPCWSTR pszUri,[in] LPCWSTR pszSuggestedPrefix,[out] WSDXML_NAMESPACE **ppNamespace);
+  HRESULT AddNameToNamespace ([in] LPCWSTR pszUri,[in] LPCWSTR pszName,[out] WSDXML_NAME **ppName);
+  HRESULT SetNamespaces ([in, size_is (wNamespacesCount)] const PCWSDXML_NAMESPACE *pNamespaces,[in] WORD wNamespacesCount,[in] BYTE bLayerNumber);
+  HRESULT SetTypes ([in, size_is (dwTypesCount)] const PCWSDXML_TYPE *pTypes,[in] DWORD dwTypesCount,[in] BYTE bLayerNumber);
+};
+
+cpp_quote("HRESULT WINAPI WSDXMLGetNameFromBuiltinNamespace(LPCWSTR pszNamespace, LPCWSTR pszName, WSDXML_NAME **ppName);")
+cpp_quote("HRESULT WINAPI WSDXMLCreateContext(IWSDXMLContext **ppContext);")
+
+cpp_quote("#endif")
