diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index ffbd843..58dec81 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -65,6 +65,7 @@
   include/activprof.idl \
   include/activscp.idl \
   include/adhoc.idl \
+  include/alg.idl \
   include/audioclient.idl \
   include/audioendpoints.idl \
   include/audiopolicy.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index b28f10f..b09e933 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -289,6 +289,7 @@
 @HAVE_WIDL_TRUE@  include/activprof.idl \
 @HAVE_WIDL_TRUE@  include/activscp.idl \
 @HAVE_WIDL_TRUE@  include/adhoc.idl \
+@HAVE_WIDL_TRUE@  include/alg.idl \
 @HAVE_WIDL_TRUE@  include/audioclient.idl \
 @HAVE_WIDL_TRUE@  include/audioendpoints.idl \
 @HAVE_WIDL_TRUE@  include/audiopolicy.idl \
diff --git a/mingw-w64-headers/include/alg.h b/mingw-w64-headers/include/alg.h
new file mode 100644
index 0000000..2e423d9
--- /dev/null
+++ b/mingw-w64-headers/include/alg.h
@@ -0,0 +1,1933 @@
+/*** Autogenerated by WIDL 1.6 from alg.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 __alg_h__
+#define __alg_h__
+
+/* Forward declarations */
+
+#ifndef __IAdapterInfo_FWD_DEFINED__
+#define __IAdapterInfo_FWD_DEFINED__
+typedef interface IAdapterInfo IAdapterInfo;
+#endif
+
+#ifndef __IPendingProxyConnection_FWD_DEFINED__
+#define __IPendingProxyConnection_FWD_DEFINED__
+typedef interface IPendingProxyConnection IPendingProxyConnection;
+#endif
+
+#ifndef __IDataChannel_FWD_DEFINED__
+#define __IDataChannel_FWD_DEFINED__
+typedef interface IDataChannel IDataChannel;
+#endif
+
+#ifndef __IPersistentDataChannel_FWD_DEFINED__
+#define __IPersistentDataChannel_FWD_DEFINED__
+typedef interface IPersistentDataChannel IPersistentDataChannel;
+#endif
+
+#ifndef __IPrimaryControlChannel_FWD_DEFINED__
+#define __IPrimaryControlChannel_FWD_DEFINED__
+typedef interface IPrimaryControlChannel IPrimaryControlChannel;
+#endif
+
+#ifndef __ISecondaryControlChannel_FWD_DEFINED__
+#define __ISecondaryControlChannel_FWD_DEFINED__
+typedef interface ISecondaryControlChannel ISecondaryControlChannel;
+#endif
+
+#ifndef __IEnumAdapterInfo_FWD_DEFINED__
+#define __IEnumAdapterInfo_FWD_DEFINED__
+typedef interface IEnumAdapterInfo IEnumAdapterInfo;
+#endif
+
+#ifndef __IAdapterNotificationSink_FWD_DEFINED__
+#define __IAdapterNotificationSink_FWD_DEFINED__
+typedef interface IAdapterNotificationSink IAdapterNotificationSink;
+#endif
+
+#ifndef __IApplicationGatewayServices_FWD_DEFINED__
+#define __IApplicationGatewayServices_FWD_DEFINED__
+typedef interface IApplicationGatewayServices IApplicationGatewayServices;
+#endif
+
+#ifndef __IApplicationGateway_FWD_DEFINED__
+#define __IApplicationGateway_FWD_DEFINED__
+typedef interface IApplicationGateway IApplicationGateway;
+#endif
+
+#ifndef __ApplicationGatewayServices_FWD_DEFINED__
+#define __ApplicationGatewayServices_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class ApplicationGatewayServices ApplicationGatewayServices;
+#else
+typedef struct ApplicationGatewayServices ApplicationGatewayServices;
+#endif /* defined __cplusplus */
+#endif /* defined __ApplicationGatewayServices_FWD_DEFINED__ */
+
+#ifndef __PrimaryControlChannel_FWD_DEFINED__
+#define __PrimaryControlChannel_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class PrimaryControlChannel PrimaryControlChannel;
+#else
+typedef struct PrimaryControlChannel PrimaryControlChannel;
+#endif /* defined __cplusplus */
+#endif /* defined __PrimaryControlChannel_FWD_DEFINED__ */
+
+#ifndef __SecondaryControlChannel_FWD_DEFINED__
+#define __SecondaryControlChannel_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class SecondaryControlChannel SecondaryControlChannel;
+#else
+typedef struct SecondaryControlChannel SecondaryControlChannel;
+#endif /* defined __cplusplus */
+#endif /* defined __SecondaryControlChannel_FWD_DEFINED__ */
+
+#ifndef __AdapterInfo_FWD_DEFINED__
+#define __AdapterInfo_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class AdapterInfo AdapterInfo;
+#else
+typedef struct AdapterInfo AdapterInfo;
+#endif /* defined __cplusplus */
+#endif /* defined __AdapterInfo_FWD_DEFINED__ */
+
+#ifndef __EnumAdapterInfo_FWD_DEFINED__
+#define __EnumAdapterInfo_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class EnumAdapterInfo EnumAdapterInfo;
+#else
+typedef struct EnumAdapterInfo EnumAdapterInfo;
+#endif /* defined __cplusplus */
+#endif /* defined __EnumAdapterInfo_FWD_DEFINED__ */
+
+#ifndef __PendingProxyConnection_FWD_DEFINED__
+#define __PendingProxyConnection_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class PendingProxyConnection PendingProxyConnection;
+#else
+typedef struct PendingProxyConnection PendingProxyConnection;
+#endif /* defined __cplusplus */
+#endif /* defined __PendingProxyConnection_FWD_DEFINED__ */
+
+#ifndef __DataChannel_FWD_DEFINED__
+#define __DataChannel_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DataChannel DataChannel;
+#else
+typedef struct DataChannel DataChannel;
+#endif /* defined __cplusplus */
+#endif /* defined __DataChannel_FWD_DEFINED__ */
+
+#ifndef __PersistentDataChannel_FWD_DEFINED__
+#define __PersistentDataChannel_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class PersistentDataChannel PersistentDataChannel;
+#else
+typedef struct PersistentDataChannel PersistentDataChannel;
+#endif /* defined __cplusplus */
+#endif /* defined __PersistentDataChannel_FWD_DEFINED__ */
+
+/* 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)
+typedef enum _ALG_ADAPTER_TYPE {
+    eALG_PRIVATE = 0x1,
+    eALG_BOUNDARY = 0x2,
+    eALG_FIREWALLED = 0x4
+} ALG_ADAPTER_TYPE;
+typedef enum _ALG_CAPTURE {
+    eALG_SOURCE_CAPTURE = 0x1,
+    eALG_DESTINATION_CAPTURE = 0x2
+} ALG_CAPTURE;
+typedef enum _ALG_DIRECTION {
+    eALG_INBOUND = 0x1,
+    eALG_OUTBOUND = 0x2,
+    eALG_BOTH = 0x3
+} ALG_DIRECTION;
+typedef enum _ALG_NOTIFICATION {
+    eALG_NONE = 0x0,
+    eALG_SESSION_CREATION = 0x1,
+    eALG_SESSION_DELETION = 0x2,
+    eALG_SESSION_BOTH = 0x3
+} ALG_NOTIFICATION;
+typedef enum _ALG_PROTOCOL {
+    eALG_TCP = 0x1,
+    eALG_UDP = 0x2
+} ALG_PROTOCOL;
+typedef struct _ALG_PRIMARY_CHANNEL_PROPERTIES {
+    ALG_PROTOCOL eProtocol;
+    USHORT usCapturePort;
+    ALG_CAPTURE eCaptureType;
+    WINBOOL fCaptureInbound;
+    ULONG ulListeningAddress;
+    USHORT usListeningPort;
+    ULONG ulAdapterIndex;
+} ALG_PRIMARY_CHANNEL_PROPERTIES;
+typedef struct _ALG_SECONDARY_CHANNEL_PROPERTIES {
+    ALG_PROTOCOL eProtocol;
+    ULONG ulPrivateAddress;
+    USHORT usPrivatePort;
+    ULONG ulPublicAddress;
+    USHORT usPublicPort;
+    ULONG ulRemoteAddress;
+    USHORT usRemotePort;
+    ULONG ulListenAddress;
+    USHORT usListenPort;
+    ALG_DIRECTION eDirection;
+    WINBOOL fPersistent;
+} ALG_SECONDARY_CHANNEL_PROPERTIES;
+typedef struct _ALG_DATA_CHANNEL_PROPERTIES {
+    ALG_PROTOCOL eProtocol;
+    ULONG ulPrivateAddress;
+    USHORT usPrivatePort;
+    ULONG ulPublicAddress;
+    USHORT usPublicPort;
+    ULONG ulRemoteAddress;
+    USHORT usRemotePort;
+    ALG_DIRECTION eDirection;
+    ALG_NOTIFICATION eDesiredNotification;
+} ALG_DATA_CHANNEL_PROPERTIES;
+typedef struct _ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES {
+    ALG_PROTOCOL eProtocol;
+    ULONG ulPrivateAddress;
+    USHORT usPrivatePort;
+    ULONG ulPublicAddress;
+    USHORT usPublicPort;
+    ULONG ulRemoteAddress;
+    USHORT usRemotePort;
+    ALG_DIRECTION eDirection;
+} ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES;
+#define ALG_MAXIMUM_PORT_RANGE_SIZE (10)
+
+/*****************************************************************************
+ * IAdapterInfo interface
+ */
+#ifndef __IAdapterInfo_INTERFACE_DEFINED__
+#define __IAdapterInfo_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAdapterInfo, 0x480bf94a, 0x09fd, 0x4f8a, 0xa3,0xe0, 0xb0,0x70,0x02,0x82,0xd8,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("480bf94a-09fd-4f8a-a3e0-b0700282d84d")
+IAdapterInfo : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetAdapterIndex(
+        ULONG *pulIndex) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAdapterType(
+        ALG_ADAPTER_TYPE *pAdapterType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAdapterAddresses(
+        ULONG *pulAddressCount,
+        ULONG **prgAddresses) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAdapterInfo, 0x480bf94a, 0x09fd, 0x4f8a, 0xa3,0xe0, 0xb0,0x70,0x02,0x82,0xd8,0x4d)
+#endif
+#else
+typedef struct IAdapterInfoVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAdapterInfo* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAdapterInfo* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAdapterInfo* This);
+
+    /*** IAdapterInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetAdapterIndex)(
+        IAdapterInfo* This,
+        ULONG *pulIndex);
+
+    HRESULT (STDMETHODCALLTYPE *GetAdapterType)(
+        IAdapterInfo* This,
+        ALG_ADAPTER_TYPE *pAdapterType);
+
+    HRESULT (STDMETHODCALLTYPE *GetAdapterAddresses)(
+        IAdapterInfo* This,
+        ULONG *pulAddressCount,
+        ULONG **prgAddresses);
+
+    END_INTERFACE
+} IAdapterInfoVtbl;
+interface IAdapterInfo {
+    CONST_VTBL IAdapterInfoVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAdapterInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAdapterInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAdapterInfo_Release(This) (This)->lpVtbl->Release(This)
+/*** IAdapterInfo methods ***/
+#define IAdapterInfo_GetAdapterIndex(This,pulIndex) (This)->lpVtbl->GetAdapterIndex(This,pulIndex)
+#define IAdapterInfo_GetAdapterType(This,pAdapterType) (This)->lpVtbl->GetAdapterType(This,pAdapterType)
+#define IAdapterInfo_GetAdapterAddresses(This,pulAddressCount,prgAddresses) (This)->lpVtbl->GetAdapterAddresses(This,pulAddressCount,prgAddresses)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAdapterInfo_QueryInterface(IAdapterInfo* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAdapterInfo_AddRef(IAdapterInfo* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAdapterInfo_Release(IAdapterInfo* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAdapterInfo methods ***/
+static FORCEINLINE HRESULT IAdapterInfo_GetAdapterIndex(IAdapterInfo* This,ULONG *pulIndex) {
+    return This->lpVtbl->GetAdapterIndex(This,pulIndex);
+}
+static FORCEINLINE HRESULT IAdapterInfo_GetAdapterType(IAdapterInfo* This,ALG_ADAPTER_TYPE *pAdapterType) {
+    return This->lpVtbl->GetAdapterType(This,pAdapterType);
+}
+static FORCEINLINE HRESULT IAdapterInfo_GetAdapterAddresses(IAdapterInfo* This,ULONG *pulAddressCount,ULONG **prgAddresses) {
+    return This->lpVtbl->GetAdapterAddresses(This,pulAddressCount,prgAddresses);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IAdapterInfo_GetAdapterIndex_Proxy(
+    IAdapterInfo* This,
+    ULONG *pulIndex);
+void __RPC_STUB IAdapterInfo_GetAdapterIndex_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IAdapterInfo_GetAdapterType_Proxy(
+    IAdapterInfo* This,
+    ALG_ADAPTER_TYPE *pAdapterType);
+void __RPC_STUB IAdapterInfo_GetAdapterType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IAdapterInfo_GetAdapterAddresses_Proxy(
+    IAdapterInfo* This,
+    ULONG *pulAddressCount,
+    ULONG **prgAddresses);
+void __RPC_STUB IAdapterInfo_GetAdapterAddresses_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IAdapterInfo_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IPendingProxyConnection interface
+ */
+#ifndef __IPendingProxyConnection_INTERFACE_DEFINED__
+#define __IPendingProxyConnection_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IPendingProxyConnection, 0xb68e5043, 0x3e3d, 0x4cc2, 0xb9,0xc1, 0x5f,0x8f,0x88,0xfe,0xe8,0x1c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("b68e5043-3e3d-4cc2-b9c1-5f8f88fee81c")
+IPendingProxyConnection : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IPendingProxyConnection, 0xb68e5043, 0x3e3d, 0x4cc2, 0xb9,0xc1, 0x5f,0x8f,0x88,0xfe,0xe8,0x1c)
+#endif
+#else
+typedef struct IPendingProxyConnectionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IPendingProxyConnection* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IPendingProxyConnection* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IPendingProxyConnection* This);
+
+    /*** IPendingProxyConnection methods ***/
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IPendingProxyConnection* This);
+
+    END_INTERFACE
+} IPendingProxyConnectionVtbl;
+interface IPendingProxyConnection {
+    CONST_VTBL IPendingProxyConnectionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IPendingProxyConnection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IPendingProxyConnection_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPendingProxyConnection_Release(This) (This)->lpVtbl->Release(This)
+/*** IPendingProxyConnection methods ***/
+#define IPendingProxyConnection_Cancel(This) (This)->lpVtbl->Cancel(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IPendingProxyConnection_QueryInterface(IPendingProxyConnection* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IPendingProxyConnection_AddRef(IPendingProxyConnection* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IPendingProxyConnection_Release(IPendingProxyConnection* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IPendingProxyConnection methods ***/
+static FORCEINLINE HRESULT IPendingProxyConnection_Cancel(IPendingProxyConnection* This) {
+    return This->lpVtbl->Cancel(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IPendingProxyConnection_Cancel_Proxy(
+    IPendingProxyConnection* This);
+void __RPC_STUB IPendingProxyConnection_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IPendingProxyConnection_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDataChannel interface
+ */
+#ifndef __IDataChannel_INTERFACE_DEFINED__
+#define __IDataChannel_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDataChannel, 0xad42d12a, 0x4ad0, 0x4856, 0x91,0x9e, 0xe8,0x54,0xc9,0x1d,0x18,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ad42d12a-4ad0-4856-919e-e854c91d1856")
+IDataChannel : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetChannelProperties(
+        ALG_DATA_CHANNEL_PROPERTIES **ppProperties) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSessionCreationEventHandle(
+        HANDLE *pHandle) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSessionDeletionEventHandle(
+        HANDLE *pHandle) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDataChannel, 0xad42d12a, 0x4ad0, 0x4856, 0x91,0x9e, 0xe8,0x54,0xc9,0x1d,0x18,0x56)
+#endif
+#else
+typedef struct IDataChannelVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDataChannel* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDataChannel* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDataChannel* This);
+
+    /*** IDataChannel methods ***/
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IDataChannel* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetChannelProperties)(
+        IDataChannel* This,
+        ALG_DATA_CHANNEL_PROPERTIES **ppProperties);
+
+    HRESULT (STDMETHODCALLTYPE *GetSessionCreationEventHandle)(
+        IDataChannel* This,
+        HANDLE *pHandle);
+
+    HRESULT (STDMETHODCALLTYPE *GetSessionDeletionEventHandle)(
+        IDataChannel* This,
+        HANDLE *pHandle);
+
+    END_INTERFACE
+} IDataChannelVtbl;
+interface IDataChannel {
+    CONST_VTBL IDataChannelVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDataChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDataChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDataChannel_Release(This) (This)->lpVtbl->Release(This)
+/*** IDataChannel methods ***/
+#define IDataChannel_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define IDataChannel_GetChannelProperties(This,ppProperties) (This)->lpVtbl->GetChannelProperties(This,ppProperties)
+#define IDataChannel_GetSessionCreationEventHandle(This,pHandle) (This)->lpVtbl->GetSessionCreationEventHandle(This,pHandle)
+#define IDataChannel_GetSessionDeletionEventHandle(This,pHandle) (This)->lpVtbl->GetSessionDeletionEventHandle(This,pHandle)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDataChannel_QueryInterface(IDataChannel* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDataChannel_AddRef(IDataChannel* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDataChannel_Release(IDataChannel* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDataChannel methods ***/
+static FORCEINLINE HRESULT IDataChannel_Cancel(IDataChannel* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IDataChannel_GetChannelProperties(IDataChannel* This,ALG_DATA_CHANNEL_PROPERTIES **ppProperties) {
+    return This->lpVtbl->GetChannelProperties(This,ppProperties);
+}
+static FORCEINLINE HRESULT IDataChannel_GetSessionCreationEventHandle(IDataChannel* This,HANDLE *pHandle) {
+    return This->lpVtbl->GetSessionCreationEventHandle(This,pHandle);
+}
+static FORCEINLINE HRESULT IDataChannel_GetSessionDeletionEventHandle(IDataChannel* This,HANDLE *pHandle) {
+    return This->lpVtbl->GetSessionDeletionEventHandle(This,pHandle);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDataChannel_Cancel_Proxy(
+    IDataChannel* This);
+void __RPC_STUB IDataChannel_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDataChannel_GetChannelProperties_Proxy(
+    IDataChannel* This,
+    ALG_DATA_CHANNEL_PROPERTIES **ppProperties);
+void __RPC_STUB IDataChannel_GetChannelProperties_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDataChannel_GetSessionCreationEventHandle_Proxy(
+    IDataChannel* This,
+    HANDLE *pHandle);
+void __RPC_STUB IDataChannel_GetSessionCreationEventHandle_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDataChannel_GetSessionDeletionEventHandle_Proxy(
+    IDataChannel* This,
+    HANDLE *pHandle);
+void __RPC_STUB IDataChannel_GetSessionDeletionEventHandle_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDataChannel_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IPersistentDataChannel interface
+ */
+#ifndef __IPersistentDataChannel_INTERFACE_DEFINED__
+#define __IPersistentDataChannel_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IPersistentDataChannel, 0xa180e934, 0xd92a, 0x415d, 0x91,0x44, 0x75,0x9f,0x80,0x54,0xe8,0xf6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a180e934-d92a-415d-9144-759f8054e8f6")
+IPersistentDataChannel : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetChannelProperties(
+        ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES **ppProperties) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IPersistentDataChannel, 0xa180e934, 0xd92a, 0x415d, 0x91,0x44, 0x75,0x9f,0x80,0x54,0xe8,0xf6)
+#endif
+#else
+typedef struct IPersistentDataChannelVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IPersistentDataChannel* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IPersistentDataChannel* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IPersistentDataChannel* This);
+
+    /*** IPersistentDataChannel methods ***/
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IPersistentDataChannel* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetChannelProperties)(
+        IPersistentDataChannel* This,
+        ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES **ppProperties);
+
+    END_INTERFACE
+} IPersistentDataChannelVtbl;
+interface IPersistentDataChannel {
+    CONST_VTBL IPersistentDataChannelVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IPersistentDataChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IPersistentDataChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPersistentDataChannel_Release(This) (This)->lpVtbl->Release(This)
+/*** IPersistentDataChannel methods ***/
+#define IPersistentDataChannel_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define IPersistentDataChannel_GetChannelProperties(This,ppProperties) (This)->lpVtbl->GetChannelProperties(This,ppProperties)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IPersistentDataChannel_QueryInterface(IPersistentDataChannel* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IPersistentDataChannel_AddRef(IPersistentDataChannel* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IPersistentDataChannel_Release(IPersistentDataChannel* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IPersistentDataChannel methods ***/
+static FORCEINLINE HRESULT IPersistentDataChannel_Cancel(IPersistentDataChannel* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IPersistentDataChannel_GetChannelProperties(IPersistentDataChannel* This,ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES **ppProperties) {
+    return This->lpVtbl->GetChannelProperties(This,ppProperties);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IPersistentDataChannel_Cancel_Proxy(
+    IPersistentDataChannel* This);
+void __RPC_STUB IPersistentDataChannel_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IPersistentDataChannel_GetChannelProperties_Proxy(
+    IPersistentDataChannel* This,
+    ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES **ppProperties);
+void __RPC_STUB IPersistentDataChannel_GetChannelProperties_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IPersistentDataChannel_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IPrimaryControlChannel interface
+ */
+#ifndef __IPrimaryControlChannel_INTERFACE_DEFINED__
+#define __IPrimaryControlChannel_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IPrimaryControlChannel, 0x1a2e8b62, 0x9012, 0x4be6, 0x84,0xae, 0x32,0xbd,0x66,0xba,0x65,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1a2e8b62-9012-4be6-84ae-32bd66ba657a")
+IPrimaryControlChannel : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetChannelProperties(
+        ALG_PRIMARY_CHANNEL_PROPERTIES **ppProperties) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOriginalDestinationInformation(
+        ULONG ulSourceAddress,
+        USHORT usSourcePort,
+        ULONG *pulOriginalDestinationAddress,
+        USHORT *pusOriginalDestinationPort,
+        ULONG *pulRemapDestinationAddress,
+        USHORT *pulRemapDestinationPort,
+        IAdapterInfo **ppReceiveAdapter) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IPrimaryControlChannel, 0x1a2e8b62, 0x9012, 0x4be6, 0x84,0xae, 0x32,0xbd,0x66,0xba,0x65,0x7a)
+#endif
+#else
+typedef struct IPrimaryControlChannelVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IPrimaryControlChannel* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IPrimaryControlChannel* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IPrimaryControlChannel* This);
+
+    /*** IPrimaryControlChannel methods ***/
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IPrimaryControlChannel* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetChannelProperties)(
+        IPrimaryControlChannel* This,
+        ALG_PRIMARY_CHANNEL_PROPERTIES **ppProperties);
+
+    HRESULT (STDMETHODCALLTYPE *GetOriginalDestinationInformation)(
+        IPrimaryControlChannel* This,
+        ULONG ulSourceAddress,
+        USHORT usSourcePort,
+        ULONG *pulOriginalDestinationAddress,
+        USHORT *pusOriginalDestinationPort,
+        ULONG *pulRemapDestinationAddress,
+        USHORT *pulRemapDestinationPort,
+        IAdapterInfo **ppReceiveAdapter);
+
+    END_INTERFACE
+} IPrimaryControlChannelVtbl;
+interface IPrimaryControlChannel {
+    CONST_VTBL IPrimaryControlChannelVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IPrimaryControlChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IPrimaryControlChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IPrimaryControlChannel_Release(This) (This)->lpVtbl->Release(This)
+/*** IPrimaryControlChannel methods ***/
+#define IPrimaryControlChannel_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define IPrimaryControlChannel_GetChannelProperties(This,ppProperties) (This)->lpVtbl->GetChannelProperties(This,ppProperties)
+#define IPrimaryControlChannel_GetOriginalDestinationInformation(This,ulSourceAddress,usSourcePort,pulOriginalDestinationAddress,pusOriginalDestinationPort,pulRemapDestinationAddress,pulRemapDestinationPort,ppReceiveAdapter) (This)->lpVtbl->GetOriginalDestinationInformation(This,ulSourceAddress,usSourcePort,pulOriginalDestinationAddress,pusOriginalDestinationPort,pulRemapDestinationAddress,pulRemapDestinationPort,ppReceiveAdapter)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IPrimaryControlChannel_QueryInterface(IPrimaryControlChannel* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IPrimaryControlChannel_AddRef(IPrimaryControlChannel* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IPrimaryControlChannel_Release(IPrimaryControlChannel* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IPrimaryControlChannel methods ***/
+static FORCEINLINE HRESULT IPrimaryControlChannel_Cancel(IPrimaryControlChannel* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IPrimaryControlChannel_GetChannelProperties(IPrimaryControlChannel* This,ALG_PRIMARY_CHANNEL_PROPERTIES **ppProperties) {
+    return This->lpVtbl->GetChannelProperties(This,ppProperties);
+}
+static FORCEINLINE HRESULT IPrimaryControlChannel_GetOriginalDestinationInformation(IPrimaryControlChannel* This,ULONG ulSourceAddress,USHORT usSourcePort,ULONG *pulOriginalDestinationAddress,USHORT *pusOriginalDestinationPort,ULONG *pulRemapDestinationAddress,USHORT *pulRemapDestinationPort,IAdapterInfo **ppReceiveAdapter) {
+    return This->lpVtbl->GetOriginalDestinationInformation(This,ulSourceAddress,usSourcePort,pulOriginalDestinationAddress,pusOriginalDestinationPort,pulRemapDestinationAddress,pulRemapDestinationPort,ppReceiveAdapter);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IPrimaryControlChannel_Cancel_Proxy(
+    IPrimaryControlChannel* This);
+void __RPC_STUB IPrimaryControlChannel_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IPrimaryControlChannel_GetChannelProperties_Proxy(
+    IPrimaryControlChannel* This,
+    ALG_PRIMARY_CHANNEL_PROPERTIES **ppProperties);
+void __RPC_STUB IPrimaryControlChannel_GetChannelProperties_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IPrimaryControlChannel_GetOriginalDestinationInformation_Proxy(
+    IPrimaryControlChannel* This,
+    ULONG ulSourceAddress,
+    USHORT usSourcePort,
+    ULONG *pulOriginalDestinationAddress,
+    USHORT *pusOriginalDestinationPort,
+    ULONG *pulRemapDestinationAddress,
+    USHORT *pulRemapDestinationPort,
+    IAdapterInfo **ppReceiveAdapter);
+void __RPC_STUB IPrimaryControlChannel_GetOriginalDestinationInformation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IPrimaryControlChannel_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ISecondaryControlChannel interface
+ */
+#ifndef __ISecondaryControlChannel_INTERFACE_DEFINED__
+#define __ISecondaryControlChannel_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_ISecondaryControlChannel, 0xa23f9d10, 0x714c, 0x41fe, 0x84,0x71, 0xff,0xb1,0x9b,0xc2,0x84,0x54);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a23f9d10-714c-41fe-8471-ffb19bc28454")
+ISecondaryControlChannel : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetChannelProperties(
+        ALG_SECONDARY_CHANNEL_PROPERTIES **ppProperties) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOriginalDestinationInformation(
+        ULONG ulSourceAddress,
+        USHORT usSourcePort,
+        ULONG *pulOriginalDestinationAddress,
+        USHORT *pusOriginalDestinationPort,
+        IAdapterInfo **ppReceiveAdapter) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ISecondaryControlChannel, 0xa23f9d10, 0x714c, 0x41fe, 0x84,0x71, 0xff,0xb1,0x9b,0xc2,0x84,0x54)
+#endif
+#else
+typedef struct ISecondaryControlChannelVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ISecondaryControlChannel* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ISecondaryControlChannel* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ISecondaryControlChannel* This);
+
+    /*** ISecondaryControlChannel methods ***/
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        ISecondaryControlChannel* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetChannelProperties)(
+        ISecondaryControlChannel* This,
+        ALG_SECONDARY_CHANNEL_PROPERTIES **ppProperties);
+
+    HRESULT (STDMETHODCALLTYPE *GetOriginalDestinationInformation)(
+        ISecondaryControlChannel* This,
+        ULONG ulSourceAddress,
+        USHORT usSourcePort,
+        ULONG *pulOriginalDestinationAddress,
+        USHORT *pusOriginalDestinationPort,
+        IAdapterInfo **ppReceiveAdapter);
+
+    END_INTERFACE
+} ISecondaryControlChannelVtbl;
+interface ISecondaryControlChannel {
+    CONST_VTBL ISecondaryControlChannelVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define ISecondaryControlChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define ISecondaryControlChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define ISecondaryControlChannel_Release(This) (This)->lpVtbl->Release(This)
+/*** ISecondaryControlChannel methods ***/
+#define ISecondaryControlChannel_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define ISecondaryControlChannel_GetChannelProperties(This,ppProperties) (This)->lpVtbl->GetChannelProperties(This,ppProperties)
+#define ISecondaryControlChannel_GetOriginalDestinationInformation(This,ulSourceAddress,usSourcePort,pulOriginalDestinationAddress,pusOriginalDestinationPort,ppReceiveAdapter) (This)->lpVtbl->GetOriginalDestinationInformation(This,ulSourceAddress,usSourcePort,pulOriginalDestinationAddress,pusOriginalDestinationPort,ppReceiveAdapter)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT ISecondaryControlChannel_QueryInterface(ISecondaryControlChannel* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG ISecondaryControlChannel_AddRef(ISecondaryControlChannel* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG ISecondaryControlChannel_Release(ISecondaryControlChannel* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ISecondaryControlChannel methods ***/
+static FORCEINLINE HRESULT ISecondaryControlChannel_Cancel(ISecondaryControlChannel* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT ISecondaryControlChannel_GetChannelProperties(ISecondaryControlChannel* This,ALG_SECONDARY_CHANNEL_PROPERTIES **ppProperties) {
+    return This->lpVtbl->GetChannelProperties(This,ppProperties);
+}
+static FORCEINLINE HRESULT ISecondaryControlChannel_GetOriginalDestinationInformation(ISecondaryControlChannel* This,ULONG ulSourceAddress,USHORT usSourcePort,ULONG *pulOriginalDestinationAddress,USHORT *pusOriginalDestinationPort,IAdapterInfo **ppReceiveAdapter) {
+    return This->lpVtbl->GetOriginalDestinationInformation(This,ulSourceAddress,usSourcePort,pulOriginalDestinationAddress,pusOriginalDestinationPort,ppReceiveAdapter);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE ISecondaryControlChannel_Cancel_Proxy(
+    ISecondaryControlChannel* This);
+void __RPC_STUB ISecondaryControlChannel_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ISecondaryControlChannel_GetChannelProperties_Proxy(
+    ISecondaryControlChannel* This,
+    ALG_SECONDARY_CHANNEL_PROPERTIES **ppProperties);
+void __RPC_STUB ISecondaryControlChannel_GetChannelProperties_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ISecondaryControlChannel_GetOriginalDestinationInformation_Proxy(
+    ISecondaryControlChannel* This,
+    ULONG ulSourceAddress,
+    USHORT usSourcePort,
+    ULONG *pulOriginalDestinationAddress,
+    USHORT *pusOriginalDestinationPort,
+    IAdapterInfo **ppReceiveAdapter);
+void __RPC_STUB ISecondaryControlChannel_GetOriginalDestinationInformation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __ISecondaryControlChannel_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumAdapterInfo interface
+ */
+#ifndef __IEnumAdapterInfo_INTERFACE_DEFINED__
+#define __IEnumAdapterInfo_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumAdapterInfo, 0xa23f9d11, 0x714c, 0x41fe, 0x84,0x71, 0xff,0xb1,0x9b,0xc2,0x84,0x54);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a23f9d11-714c-41fe-8471-ffb19bc28454")
+IEnumAdapterInfo : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG celt,
+        IAdapterInfo **rgAI,
+        ULONG *pCeltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumAdapterInfo **ppEnum) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumAdapterInfo, 0xa23f9d11, 0x714c, 0x41fe, 0x84,0x71, 0xff,0xb1,0x9b,0xc2,0x84,0x54)
+#endif
+#else
+typedef struct IEnumAdapterInfoVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumAdapterInfo* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumAdapterInfo* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumAdapterInfo* This);
+
+    /*** IEnumAdapterInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumAdapterInfo* This,
+        ULONG celt,
+        IAdapterInfo **rgAI,
+        ULONG *pCeltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumAdapterInfo* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumAdapterInfo* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumAdapterInfo* This,
+        IEnumAdapterInfo **ppEnum);
+
+    END_INTERFACE
+} IEnumAdapterInfoVtbl;
+interface IEnumAdapterInfo {
+    CONST_VTBL IEnumAdapterInfoVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumAdapterInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumAdapterInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumAdapterInfo_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumAdapterInfo methods ***/
+#define IEnumAdapterInfo_Next(This,celt,rgAI,pCeltFetched) (This)->lpVtbl->Next(This,celt,rgAI,pCeltFetched)
+#define IEnumAdapterInfo_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumAdapterInfo_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumAdapterInfo_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumAdapterInfo_QueryInterface(IEnumAdapterInfo* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumAdapterInfo_AddRef(IEnumAdapterInfo* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumAdapterInfo_Release(IEnumAdapterInfo* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumAdapterInfo methods ***/
+static FORCEINLINE HRESULT IEnumAdapterInfo_Next(IEnumAdapterInfo* This,ULONG celt,IAdapterInfo **rgAI,ULONG *pCeltFetched) {
+    return This->lpVtbl->Next(This,celt,rgAI,pCeltFetched);
+}
+static FORCEINLINE HRESULT IEnumAdapterInfo_Skip(IEnumAdapterInfo* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumAdapterInfo_Reset(IEnumAdapterInfo* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumAdapterInfo_Clone(IEnumAdapterInfo* This,IEnumAdapterInfo **ppEnum) {
+    return This->lpVtbl->Clone(This,ppEnum);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IEnumAdapterInfo_Next_Proxy(
+    IEnumAdapterInfo* This,
+    ULONG celt,
+    IAdapterInfo **rgAI,
+    ULONG *pCeltFetched);
+void __RPC_STUB IEnumAdapterInfo_Next_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumAdapterInfo_Skip_Proxy(
+    IEnumAdapterInfo* This,
+    ULONG celt);
+void __RPC_STUB IEnumAdapterInfo_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumAdapterInfo_Reset_Proxy(
+    IEnumAdapterInfo* This);
+void __RPC_STUB IEnumAdapterInfo_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumAdapterInfo_Clone_Proxy(
+    IEnumAdapterInfo* This,
+    IEnumAdapterInfo **ppEnum);
+void __RPC_STUB IEnumAdapterInfo_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IEnumAdapterInfo_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAdapterNotificationSink interface
+ */
+#ifndef __IAdapterNotificationSink_INTERFACE_DEFINED__
+#define __IAdapterNotificationSink_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAdapterNotificationSink, 0x44ab2dc3, 0x23b2, 0x47de, 0x82,0x28, 0x2e,0x1c,0xce,0xeb,0x99,0x11);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("44ab2dc3-23b2-47de-8228-2e1cceeb9911")
+IAdapterNotificationSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AdapterAdded(
+        IAdapterInfo *pAdapter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AdapterRemoved(
+        IAdapterInfo *pAdapter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AdapterModified(
+        IAdapterInfo *pAdapter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AdapterUpdatePortMapping(
+        IAdapterInfo *pAdapter) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAdapterNotificationSink, 0x44ab2dc3, 0x23b2, 0x47de, 0x82,0x28, 0x2e,0x1c,0xce,0xeb,0x99,0x11)
+#endif
+#else
+typedef struct IAdapterNotificationSinkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAdapterNotificationSink* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAdapterNotificationSink* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAdapterNotificationSink* This);
+
+    /*** IAdapterNotificationSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *AdapterAdded)(
+        IAdapterNotificationSink* This,
+        IAdapterInfo *pAdapter);
+
+    HRESULT (STDMETHODCALLTYPE *AdapterRemoved)(
+        IAdapterNotificationSink* This,
+        IAdapterInfo *pAdapter);
+
+    HRESULT (STDMETHODCALLTYPE *AdapterModified)(
+        IAdapterNotificationSink* This,
+        IAdapterInfo *pAdapter);
+
+    HRESULT (STDMETHODCALLTYPE *AdapterUpdatePortMapping)(
+        IAdapterNotificationSink* This,
+        IAdapterInfo *pAdapter);
+
+    END_INTERFACE
+} IAdapterNotificationSinkVtbl;
+interface IAdapterNotificationSink {
+    CONST_VTBL IAdapterNotificationSinkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAdapterNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAdapterNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAdapterNotificationSink_Release(This) (This)->lpVtbl->Release(This)
+/*** IAdapterNotificationSink methods ***/
+#define IAdapterNotificationSink_AdapterAdded(This,pAdapter) (This)->lpVtbl->AdapterAdded(This,pAdapter)
+#define IAdapterNotificationSink_AdapterRemoved(This,pAdapter) (This)->lpVtbl->AdapterRemoved(This,pAdapter)
+#define IAdapterNotificationSink_AdapterModified(This,pAdapter) (This)->lpVtbl->AdapterModified(This,pAdapter)
+#define IAdapterNotificationSink_AdapterUpdatePortMapping(This,pAdapter) (This)->lpVtbl->AdapterUpdatePortMapping(This,pAdapter)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAdapterNotificationSink_QueryInterface(IAdapterNotificationSink* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAdapterNotificationSink_AddRef(IAdapterNotificationSink* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAdapterNotificationSink_Release(IAdapterNotificationSink* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAdapterNotificationSink methods ***/
+static FORCEINLINE HRESULT IAdapterNotificationSink_AdapterAdded(IAdapterNotificationSink* This,IAdapterInfo *pAdapter) {
+    return This->lpVtbl->AdapterAdded(This,pAdapter);
+}
+static FORCEINLINE HRESULT IAdapterNotificationSink_AdapterRemoved(IAdapterNotificationSink* This,IAdapterInfo *pAdapter) {
+    return This->lpVtbl->AdapterRemoved(This,pAdapter);
+}
+static FORCEINLINE HRESULT IAdapterNotificationSink_AdapterModified(IAdapterNotificationSink* This,IAdapterInfo *pAdapter) {
+    return This->lpVtbl->AdapterModified(This,pAdapter);
+}
+static FORCEINLINE HRESULT IAdapterNotificationSink_AdapterUpdatePortMapping(IAdapterNotificationSink* This,IAdapterInfo *pAdapter) {
+    return This->lpVtbl->AdapterUpdatePortMapping(This,pAdapter);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IAdapterNotificationSink_AdapterAdded_Proxy(
+    IAdapterNotificationSink* This,
+    IAdapterInfo *pAdapter);
+void __RPC_STUB IAdapterNotificationSink_AdapterAdded_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IAdapterNotificationSink_AdapterRemoved_Proxy(
+    IAdapterNotificationSink* This,
+    IAdapterInfo *pAdapter);
+void __RPC_STUB IAdapterNotificationSink_AdapterRemoved_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IAdapterNotificationSink_AdapterModified_Proxy(
+    IAdapterNotificationSink* This,
+    IAdapterInfo *pAdapter);
+void __RPC_STUB IAdapterNotificationSink_AdapterModified_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IAdapterNotificationSink_AdapterUpdatePortMapping_Proxy(
+    IAdapterNotificationSink* This,
+    IAdapterInfo *pAdapter);
+void __RPC_STUB IAdapterNotificationSink_AdapterUpdatePortMapping_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IAdapterNotificationSink_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IApplicationGatewayServices interface
+ */
+#ifndef __IApplicationGatewayServices_INTERFACE_DEFINED__
+#define __IApplicationGatewayServices_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IApplicationGatewayServices, 0x5134842a, 0xfdce, 0x485d, 0x93,0xcd, 0xde,0x16,0x40,0x64,0x3b,0xbe);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5134842a-fdce-485d-93cd-de1640643bbe")
+IApplicationGatewayServices : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreatePrimaryControlChannel(
+        ULONG uAdapterIndex,
+        ALG_PROTOCOL eProtocol,
+        USHORT usPortToCapture,
+        ALG_CAPTURE eCaptureType,
+        WINBOOL fCaptureInbound,
+        ULONG ulListenAddress,
+        USHORT usListenPort,
+        IPrimaryControlChannel **ppIControlChannel) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateSecondaryControlChannel(
+        ALG_PROTOCOL eProtocol,
+        ULONG ulPrivateAddress,
+        USHORT usPrivatePort,
+        ULONG ulPublicAddress,
+        USHORT usPublicPort,
+        ULONG ulRemoteAddress,
+        USHORT usRemotePort,
+        ULONG ulListenAddress,
+        USHORT usListenPort,
+        ALG_DIRECTION eDirection,
+        WINBOOL fPersistent,
+        ISecondaryControlChannel **ppControlChannel) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetBestSourceAddressForDestinationAddress(
+        ULONG ulDstAddress,
+        WINBOOL fDemandDial,
+        ULONG *pulBestSrcAddress) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE PrepareProxyConnection(
+        ALG_PROTOCOL eProtocol,
+        ULONG ulSrcAddress,
+        USHORT usSrcPort,
+        ULONG ulDstAddress,
+        USHORT usDstPort,
+        WINBOOL fNoTimeout,
+        IPendingProxyConnection **ppPendingConnection) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE PrepareSourceModifiedProxyConnection(
+        ALG_PROTOCOL eProtocol,
+        ULONG ulSrcAddress,
+        USHORT usSrcPort,
+        ULONG ulDstAddress,
+        USHORT usDstPort,
+        ULONG ulNewSrcAddress,
+        USHORT usNewSourcePort,
+        IPendingProxyConnection **ppPendingConnection) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDataChannel(
+        ALG_PROTOCOL eProtocol,
+        ULONG ulPrivateAddress,
+        USHORT usPrivatePort,
+        ULONG ulPublicAddress,
+        USHORT usPublicPort,
+        ULONG ulRemoteAddress,
+        USHORT usRemotePort,
+        ALG_DIRECTION eDirection,
+        ALG_NOTIFICATION eDesiredNotification,
+        WINBOOL fNoTimeout,
+        IDataChannel **ppDataChannel) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreatePersistentDataChannel(
+        ALG_PROTOCOL eProtocol,
+        ULONG ulPrivateAddress,
+        USHORT usPrivatePort,
+        ULONG ulPublicAddress,
+        USHORT usPublicPort,
+        ULONG ulRemoteAddress,
+        USHORT usRemotePort,
+        ALG_DIRECTION eDirection,
+        IPersistentDataChannel **ppIPersistentDataChannel) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReservePort(
+        USHORT usPortCount,
+        USHORT *pusReservedPort) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReleaseReservedPort(
+        USHORT usReservedPortBase,
+        USHORT usPortCount) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumerateAdapters(
+        IEnumAdapterInfo **ppIEnumAdapterInfo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StartAdapterNotifications(
+        IAdapterNotificationSink *pSink,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StopAdapterNotifications(
+        DWORD dwCookieOfSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE LookupAdapterPortMapping(
+        ULONG ulAdapterIndex,
+        UCHAR Protocol,
+        ULONG ulDestinationAddress,
+        USHORT usDestinationPort,
+        ULONG *pulRemapAddress,
+        USHORT *pusRemapPort) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IApplicationGatewayServices, 0x5134842a, 0xfdce, 0x485d, 0x93,0xcd, 0xde,0x16,0x40,0x64,0x3b,0xbe)
+#endif
+#else
+typedef struct IApplicationGatewayServicesVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IApplicationGatewayServices* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IApplicationGatewayServices* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IApplicationGatewayServices* This);
+
+    /*** IApplicationGatewayServices methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreatePrimaryControlChannel)(
+        IApplicationGatewayServices* This,
+        ULONG uAdapterIndex,
+        ALG_PROTOCOL eProtocol,
+        USHORT usPortToCapture,
+        ALG_CAPTURE eCaptureType,
+        WINBOOL fCaptureInbound,
+        ULONG ulListenAddress,
+        USHORT usListenPort,
+        IPrimaryControlChannel **ppIControlChannel);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSecondaryControlChannel)(
+        IApplicationGatewayServices* This,
+        ALG_PROTOCOL eProtocol,
+        ULONG ulPrivateAddress,
+        USHORT usPrivatePort,
+        ULONG ulPublicAddress,
+        USHORT usPublicPort,
+        ULONG ulRemoteAddress,
+        USHORT usRemotePort,
+        ULONG ulListenAddress,
+        USHORT usListenPort,
+        ALG_DIRECTION eDirection,
+        WINBOOL fPersistent,
+        ISecondaryControlChannel **ppControlChannel);
+
+    HRESULT (STDMETHODCALLTYPE *GetBestSourceAddressForDestinationAddress)(
+        IApplicationGatewayServices* This,
+        ULONG ulDstAddress,
+        WINBOOL fDemandDial,
+        ULONG *pulBestSrcAddress);
+
+    HRESULT (STDMETHODCALLTYPE *PrepareProxyConnection)(
+        IApplicationGatewayServices* This,
+        ALG_PROTOCOL eProtocol,
+        ULONG ulSrcAddress,
+        USHORT usSrcPort,
+        ULONG ulDstAddress,
+        USHORT usDstPort,
+        WINBOOL fNoTimeout,
+        IPendingProxyConnection **ppPendingConnection);
+
+    HRESULT (STDMETHODCALLTYPE *PrepareSourceModifiedProxyConnection)(
+        IApplicationGatewayServices* This,
+        ALG_PROTOCOL eProtocol,
+        ULONG ulSrcAddress,
+        USHORT usSrcPort,
+        ULONG ulDstAddress,
+        USHORT usDstPort,
+        ULONG ulNewSrcAddress,
+        USHORT usNewSourcePort,
+        IPendingProxyConnection **ppPendingConnection);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDataChannel)(
+        IApplicationGatewayServices* This,
+        ALG_PROTOCOL eProtocol,
+        ULONG ulPrivateAddress,
+        USHORT usPrivatePort,
+        ULONG ulPublicAddress,
+        USHORT usPublicPort,
+        ULONG ulRemoteAddress,
+        USHORT usRemotePort,
+        ALG_DIRECTION eDirection,
+        ALG_NOTIFICATION eDesiredNotification,
+        WINBOOL fNoTimeout,
+        IDataChannel **ppDataChannel);
+
+    HRESULT (STDMETHODCALLTYPE *CreatePersistentDataChannel)(
+        IApplicationGatewayServices* This,
+        ALG_PROTOCOL eProtocol,
+        ULONG ulPrivateAddress,
+        USHORT usPrivatePort,
+        ULONG ulPublicAddress,
+        USHORT usPublicPort,
+        ULONG ulRemoteAddress,
+        USHORT usRemotePort,
+        ALG_DIRECTION eDirection,
+        IPersistentDataChannel **ppIPersistentDataChannel);
+
+    HRESULT (STDMETHODCALLTYPE *ReservePort)(
+        IApplicationGatewayServices* This,
+        USHORT usPortCount,
+        USHORT *pusReservedPort);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseReservedPort)(
+        IApplicationGatewayServices* This,
+        USHORT usReservedPortBase,
+        USHORT usPortCount);
+
+    HRESULT (STDMETHODCALLTYPE *EnumerateAdapters)(
+        IApplicationGatewayServices* This,
+        IEnumAdapterInfo **ppIEnumAdapterInfo);
+
+    HRESULT (STDMETHODCALLTYPE *StartAdapterNotifications)(
+        IApplicationGatewayServices* This,
+        IAdapterNotificationSink *pSink,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *StopAdapterNotifications)(
+        IApplicationGatewayServices* This,
+        DWORD dwCookieOfSink);
+
+    HRESULT (STDMETHODCALLTYPE *LookupAdapterPortMapping)(
+        IApplicationGatewayServices* This,
+        ULONG ulAdapterIndex,
+        UCHAR Protocol,
+        ULONG ulDestinationAddress,
+        USHORT usDestinationPort,
+        ULONG *pulRemapAddress,
+        USHORT *pusRemapPort);
+
+    END_INTERFACE
+} IApplicationGatewayServicesVtbl;
+interface IApplicationGatewayServices {
+    CONST_VTBL IApplicationGatewayServicesVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IApplicationGatewayServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IApplicationGatewayServices_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IApplicationGatewayServices_Release(This) (This)->lpVtbl->Release(This)
+/*** IApplicationGatewayServices methods ***/
+#define IApplicationGatewayServices_CreatePrimaryControlChannel(This,uAdapterIndex,eProtocol,usPortToCapture,eCaptureType,fCaptureInbound,ulListenAddress,usListenPort,ppIControlChannel) (This)->lpVtbl->CreatePrimaryControlChannel(This,uAdapterIndex,eProtocol,usPortToCapture,eCaptureType,fCaptureInbound,ulListenAddress,usListenPort,ppIControlChannel)
+#define IApplicationGatewayServices_CreateSecondaryControlChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,ulListenAddress,usListenPort,eDirection,fPersistent,ppControlChannel) (This)->lpVtbl->CreateSecondaryControlChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,ulListenAddress,usListenPort,eDirection,fPersistent,ppControlChannel)
+#define IApplicationGatewayServices_GetBestSourceAddressForDestinationAddress(This,ulDstAddress,fDemandDial,pulBestSrcAddress) (This)->lpVtbl->GetBestSourceAddressForDestinationAddress(This,ulDstAddress,fDemandDial,pulBestSrcAddress)
+#define IApplicationGatewayServices_PrepareProxyConnection(This,eProtocol,ulSrcAddress,usSrcPort,ulDstAddress,usDstPort,fNoTimeout,ppPendingConnection) (This)->lpVtbl->PrepareProxyConnection(This,eProtocol,ulSrcAddress,usSrcPort,ulDstAddress,usDstPort,fNoTimeout,ppPendingConnection)
+#define IApplicationGatewayServices_PrepareSourceModifiedProxyConnection(This,eProtocol,ulSrcAddress,usSrcPort,ulDstAddress,usDstPort,ulNewSrcAddress,usNewSourcePort,ppPendingConnection) (This)->lpVtbl->PrepareSourceModifiedProxyConnection(This,eProtocol,ulSrcAddress,usSrcPort,ulDstAddress,usDstPort,ulNewSrcAddress,usNewSourcePort,ppPendingConnection)
+#define IApplicationGatewayServices_CreateDataChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,eDirection,eDesiredNotification,fNoTimeout,ppDataChannel) (This)->lpVtbl->CreateDataChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,eDirection,eDesiredNotification,fNoTimeout,ppDataChannel)
+#define IApplicationGatewayServices_CreatePersistentDataChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,eDirection,ppIPersistentDataChannel) (This)->lpVtbl->CreatePersistentDataChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,eDirection,ppIPersistentDataChannel)
+#define IApplicationGatewayServices_ReservePort(This,usPortCount,pusReservedPort) (This)->lpVtbl->ReservePort(This,usPortCount,pusReservedPort)
+#define IApplicationGatewayServices_ReleaseReservedPort(This,usReservedPortBase,usPortCount) (This)->lpVtbl->ReleaseReservedPort(This,usReservedPortBase,usPortCount)
+#define IApplicationGatewayServices_EnumerateAdapters(This,ppIEnumAdapterInfo) (This)->lpVtbl->EnumerateAdapters(This,ppIEnumAdapterInfo)
+#define IApplicationGatewayServices_StartAdapterNotifications(This,pSink,pdwCookie) (This)->lpVtbl->StartAdapterNotifications(This,pSink,pdwCookie)
+#define IApplicationGatewayServices_StopAdapterNotifications(This,dwCookieOfSink) (This)->lpVtbl->StopAdapterNotifications(This,dwCookieOfSink)
+#define IApplicationGatewayServices_LookupAdapterPortMapping(This,ulAdapterIndex,Protocol,ulDestinationAddress,usDestinationPort,pulRemapAddress,pusRemapPort) (This)->lpVtbl->LookupAdapterPortMapping(This,ulAdapterIndex,Protocol,ulDestinationAddress,usDestinationPort,pulRemapAddress,pusRemapPort)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IApplicationGatewayServices_QueryInterface(IApplicationGatewayServices* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IApplicationGatewayServices_AddRef(IApplicationGatewayServices* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IApplicationGatewayServices_Release(IApplicationGatewayServices* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IApplicationGatewayServices methods ***/
+static FORCEINLINE HRESULT IApplicationGatewayServices_CreatePrimaryControlChannel(IApplicationGatewayServices* This,ULONG uAdapterIndex,ALG_PROTOCOL eProtocol,USHORT usPortToCapture,ALG_CAPTURE eCaptureType,WINBOOL fCaptureInbound,ULONG ulListenAddress,USHORT usListenPort,IPrimaryControlChannel **ppIControlChannel) {
+    return This->lpVtbl->CreatePrimaryControlChannel(This,uAdapterIndex,eProtocol,usPortToCapture,eCaptureType,fCaptureInbound,ulListenAddress,usListenPort,ppIControlChannel);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_CreateSecondaryControlChannel(IApplicationGatewayServices* This,ALG_PROTOCOL eProtocol,ULONG ulPrivateAddress,USHORT usPrivatePort,ULONG ulPublicAddress,USHORT usPublicPort,ULONG ulRemoteAddress,USHORT usRemotePort,ULONG ulListenAddress,USHORT usListenPort,ALG_DIRECTION eDirection,WINBOOL fPersistent,ISecondaryControlChannel **ppControlChannel) {
+    return This->lpVtbl->CreateSecondaryControlChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,ulListenAddress,usListenPort,eDirection,fPersistent,ppControlChannel);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_GetBestSourceAddressForDestinationAddress(IApplicationGatewayServices* This,ULONG ulDstAddress,WINBOOL fDemandDial,ULONG *pulBestSrcAddress) {
+    return This->lpVtbl->GetBestSourceAddressForDestinationAddress(This,ulDstAddress,fDemandDial,pulBestSrcAddress);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_PrepareProxyConnection(IApplicationGatewayServices* This,ALG_PROTOCOL eProtocol,ULONG ulSrcAddress,USHORT usSrcPort,ULONG ulDstAddress,USHORT usDstPort,WINBOOL fNoTimeout,IPendingProxyConnection **ppPendingConnection) {
+    return This->lpVtbl->PrepareProxyConnection(This,eProtocol,ulSrcAddress,usSrcPort,ulDstAddress,usDstPort,fNoTimeout,ppPendingConnection);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_PrepareSourceModifiedProxyConnection(IApplicationGatewayServices* This,ALG_PROTOCOL eProtocol,ULONG ulSrcAddress,USHORT usSrcPort,ULONG ulDstAddress,USHORT usDstPort,ULONG ulNewSrcAddress,USHORT usNewSourcePort,IPendingProxyConnection **ppPendingConnection) {
+    return This->lpVtbl->PrepareSourceModifiedProxyConnection(This,eProtocol,ulSrcAddress,usSrcPort,ulDstAddress,usDstPort,ulNewSrcAddress,usNewSourcePort,ppPendingConnection);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_CreateDataChannel(IApplicationGatewayServices* This,ALG_PROTOCOL eProtocol,ULONG ulPrivateAddress,USHORT usPrivatePort,ULONG ulPublicAddress,USHORT usPublicPort,ULONG ulRemoteAddress,USHORT usRemotePort,ALG_DIRECTION eDirection,ALG_NOTIFICATION eDesiredNotification,WINBOOL fNoTimeout,IDataChannel **ppDataChannel) {
+    return This->lpVtbl->CreateDataChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,eDirection,eDesiredNotification,fNoTimeout,ppDataChannel);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_CreatePersistentDataChannel(IApplicationGatewayServices* This,ALG_PROTOCOL eProtocol,ULONG ulPrivateAddress,USHORT usPrivatePort,ULONG ulPublicAddress,USHORT usPublicPort,ULONG ulRemoteAddress,USHORT usRemotePort,ALG_DIRECTION eDirection,IPersistentDataChannel **ppIPersistentDataChannel) {
+    return This->lpVtbl->CreatePersistentDataChannel(This,eProtocol,ulPrivateAddress,usPrivatePort,ulPublicAddress,usPublicPort,ulRemoteAddress,usRemotePort,eDirection,ppIPersistentDataChannel);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_ReservePort(IApplicationGatewayServices* This,USHORT usPortCount,USHORT *pusReservedPort) {
+    return This->lpVtbl->ReservePort(This,usPortCount,pusReservedPort);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_ReleaseReservedPort(IApplicationGatewayServices* This,USHORT usReservedPortBase,USHORT usPortCount) {
+    return This->lpVtbl->ReleaseReservedPort(This,usReservedPortBase,usPortCount);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_EnumerateAdapters(IApplicationGatewayServices* This,IEnumAdapterInfo **ppIEnumAdapterInfo) {
+    return This->lpVtbl->EnumerateAdapters(This,ppIEnumAdapterInfo);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_StartAdapterNotifications(IApplicationGatewayServices* This,IAdapterNotificationSink *pSink,DWORD *pdwCookie) {
+    return This->lpVtbl->StartAdapterNotifications(This,pSink,pdwCookie);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_StopAdapterNotifications(IApplicationGatewayServices* This,DWORD dwCookieOfSink) {
+    return This->lpVtbl->StopAdapterNotifications(This,dwCookieOfSink);
+}
+static FORCEINLINE HRESULT IApplicationGatewayServices_LookupAdapterPortMapping(IApplicationGatewayServices* This,ULONG ulAdapterIndex,UCHAR Protocol,ULONG ulDestinationAddress,USHORT usDestinationPort,ULONG *pulRemapAddress,USHORT *pusRemapPort) {
+    return This->lpVtbl->LookupAdapterPortMapping(This,ulAdapterIndex,Protocol,ulDestinationAddress,usDestinationPort,pulRemapAddress,pusRemapPort);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_CreatePrimaryControlChannel_Proxy(
+    IApplicationGatewayServices* This,
+    ULONG uAdapterIndex,
+    ALG_PROTOCOL eProtocol,
+    USHORT usPortToCapture,
+    ALG_CAPTURE eCaptureType,
+    WINBOOL fCaptureInbound,
+    ULONG ulListenAddress,
+    USHORT usListenPort,
+    IPrimaryControlChannel **ppIControlChannel);
+void __RPC_STUB IApplicationGatewayServices_CreatePrimaryControlChannel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_CreateSecondaryControlChannel_Proxy(
+    IApplicationGatewayServices* This,
+    ALG_PROTOCOL eProtocol,
+    ULONG ulPrivateAddress,
+    USHORT usPrivatePort,
+    ULONG ulPublicAddress,
+    USHORT usPublicPort,
+    ULONG ulRemoteAddress,
+    USHORT usRemotePort,
+    ULONG ulListenAddress,
+    USHORT usListenPort,
+    ALG_DIRECTION eDirection,
+    WINBOOL fPersistent,
+    ISecondaryControlChannel **ppControlChannel);
+void __RPC_STUB IApplicationGatewayServices_CreateSecondaryControlChannel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_GetBestSourceAddressForDestinationAddress_Proxy(
+    IApplicationGatewayServices* This,
+    ULONG ulDstAddress,
+    WINBOOL fDemandDial,
+    ULONG *pulBestSrcAddress);
+void __RPC_STUB IApplicationGatewayServices_GetBestSourceAddressForDestinationAddress_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_PrepareProxyConnection_Proxy(
+    IApplicationGatewayServices* This,
+    ALG_PROTOCOL eProtocol,
+    ULONG ulSrcAddress,
+    USHORT usSrcPort,
+    ULONG ulDstAddress,
+    USHORT usDstPort,
+    WINBOOL fNoTimeout,
+    IPendingProxyConnection **ppPendingConnection);
+void __RPC_STUB IApplicationGatewayServices_PrepareProxyConnection_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_PrepareSourceModifiedProxyConnection_Proxy(
+    IApplicationGatewayServices* This,
+    ALG_PROTOCOL eProtocol,
+    ULONG ulSrcAddress,
+    USHORT usSrcPort,
+    ULONG ulDstAddress,
+    USHORT usDstPort,
+    ULONG ulNewSrcAddress,
+    USHORT usNewSourcePort,
+    IPendingProxyConnection **ppPendingConnection);
+void __RPC_STUB IApplicationGatewayServices_PrepareSourceModifiedProxyConnection_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_CreateDataChannel_Proxy(
+    IApplicationGatewayServices* This,
+    ALG_PROTOCOL eProtocol,
+    ULONG ulPrivateAddress,
+    USHORT usPrivatePort,
+    ULONG ulPublicAddress,
+    USHORT usPublicPort,
+    ULONG ulRemoteAddress,
+    USHORT usRemotePort,
+    ALG_DIRECTION eDirection,
+    ALG_NOTIFICATION eDesiredNotification,
+    WINBOOL fNoTimeout,
+    IDataChannel **ppDataChannel);
+void __RPC_STUB IApplicationGatewayServices_CreateDataChannel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_CreatePersistentDataChannel_Proxy(
+    IApplicationGatewayServices* This,
+    ALG_PROTOCOL eProtocol,
+    ULONG ulPrivateAddress,
+    USHORT usPrivatePort,
+    ULONG ulPublicAddress,
+    USHORT usPublicPort,
+    ULONG ulRemoteAddress,
+    USHORT usRemotePort,
+    ALG_DIRECTION eDirection,
+    IPersistentDataChannel **ppIPersistentDataChannel);
+void __RPC_STUB IApplicationGatewayServices_CreatePersistentDataChannel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_ReservePort_Proxy(
+    IApplicationGatewayServices* This,
+    USHORT usPortCount,
+    USHORT *pusReservedPort);
+void __RPC_STUB IApplicationGatewayServices_ReservePort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_ReleaseReservedPort_Proxy(
+    IApplicationGatewayServices* This,
+    USHORT usReservedPortBase,
+    USHORT usPortCount);
+void __RPC_STUB IApplicationGatewayServices_ReleaseReservedPort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_EnumerateAdapters_Proxy(
+    IApplicationGatewayServices* This,
+    IEnumAdapterInfo **ppIEnumAdapterInfo);
+void __RPC_STUB IApplicationGatewayServices_EnumerateAdapters_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_StartAdapterNotifications_Proxy(
+    IApplicationGatewayServices* This,
+    IAdapterNotificationSink *pSink,
+    DWORD *pdwCookie);
+void __RPC_STUB IApplicationGatewayServices_StartAdapterNotifications_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_StopAdapterNotifications_Proxy(
+    IApplicationGatewayServices* This,
+    DWORD dwCookieOfSink);
+void __RPC_STUB IApplicationGatewayServices_StopAdapterNotifications_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGatewayServices_LookupAdapterPortMapping_Proxy(
+    IApplicationGatewayServices* This,
+    ULONG ulAdapterIndex,
+    UCHAR Protocol,
+    ULONG ulDestinationAddress,
+    USHORT usDestinationPort,
+    ULONG *pulRemapAddress,
+    USHORT *pusRemapPort);
+void __RPC_STUB IApplicationGatewayServices_LookupAdapterPortMapping_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IApplicationGatewayServices_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IApplicationGateway interface
+ */
+#ifndef __IApplicationGateway_INTERFACE_DEFINED__
+#define __IApplicationGateway_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IApplicationGateway, 0x5134842b, 0xfdce, 0x485d, 0x93,0xcd, 0xde,0x16,0x40,0x64,0x3b,0xbe);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5134842b-fdce-485d-93cd-de1640643bbe")
+IApplicationGateway : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Initialize(
+        IApplicationGatewayServices *pAlgServices) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Stop(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IApplicationGateway, 0x5134842b, 0xfdce, 0x485d, 0x93,0xcd, 0xde,0x16,0x40,0x64,0x3b,0xbe)
+#endif
+#else
+typedef struct IApplicationGatewayVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IApplicationGateway* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IApplicationGateway* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IApplicationGateway* This);
+
+    /*** IApplicationGateway methods ***/
+    HRESULT (STDMETHODCALLTYPE *Initialize)(
+        IApplicationGateway* This,
+        IApplicationGatewayServices *pAlgServices);
+
+    HRESULT (STDMETHODCALLTYPE *Stop)(
+        IApplicationGateway* This);
+
+    END_INTERFACE
+} IApplicationGatewayVtbl;
+interface IApplicationGateway {
+    CONST_VTBL IApplicationGatewayVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IApplicationGateway_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IApplicationGateway_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IApplicationGateway_Release(This) (This)->lpVtbl->Release(This)
+/*** IApplicationGateway methods ***/
+#define IApplicationGateway_Initialize(This,pAlgServices) (This)->lpVtbl->Initialize(This,pAlgServices)
+#define IApplicationGateway_Stop(This) (This)->lpVtbl->Stop(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IApplicationGateway_QueryInterface(IApplicationGateway* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IApplicationGateway_AddRef(IApplicationGateway* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IApplicationGateway_Release(IApplicationGateway* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IApplicationGateway methods ***/
+static FORCEINLINE HRESULT IApplicationGateway_Initialize(IApplicationGateway* This,IApplicationGatewayServices *pAlgServices) {
+    return This->lpVtbl->Initialize(This,pAlgServices);
+}
+static FORCEINLINE HRESULT IApplicationGateway_Stop(IApplicationGateway* This) {
+    return This->lpVtbl->Stop(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IApplicationGateway_Initialize_Proxy(
+    IApplicationGateway* This,
+    IApplicationGatewayServices *pAlgServices);
+void __RPC_STUB IApplicationGateway_Initialize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationGateway_Stop_Proxy(
+    IApplicationGateway* This);
+void __RPC_STUB IApplicationGateway_Stop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IApplicationGateway_INTERFACE_DEFINED__ */
+
+
+DEFINE_GUID(LIBID_ALGLib, 0xb6d1d098, 0xe235, 0x4b99, 0xba,0x98, 0x7c,0x62,0x4f,0xd8,0x75,0xdb);
+
+/*****************************************************************************
+ * ApplicationGatewayServices coclass
+ */
+
+DEFINE_GUID(CLSID_ApplicationGatewayServices, 0xf8ade1d3, 0x49df, 0x4b75, 0x90,0x05, 0xef,0x95,0x08,0xe6,0xa3,0x37);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("f8ade1d3-49df-4b75-9005-ef9508e6a337") ApplicationGatewayServices;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ApplicationGatewayServices, 0xf8ade1d3, 0x49df, 0x4b75, 0x90,0x05, 0xef,0x95,0x08,0xe6,0xa3,0x37)
+#endif
+#endif
+
+/*****************************************************************************
+ * PrimaryControlChannel coclass
+ */
+
+DEFINE_GUID(CLSID_PrimaryControlChannel, 0x3ceb5509, 0xc1cd, 0x432f, 0x9d,0x8f, 0x65,0xd1,0xe2,0x86,0xaa,0x80);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("3ceb5509-c1cd-432f-9d8f-65d1e286aa80") PrimaryControlChannel;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(PrimaryControlChannel, 0x3ceb5509, 0xc1cd, 0x432f, 0x9d,0x8f, 0x65,0xd1,0xe2,0x86,0xaa,0x80)
+#endif
+#endif
+
+/*****************************************************************************
+ * SecondaryControlChannel coclass
+ */
+
+DEFINE_GUID(CLSID_SecondaryControlChannel, 0x7b3181a0, 0xc92f, 0x4567, 0xb0,0xfa, 0xcd,0x9a,0x10,0xec,0xd7,0xd1);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("7b3181a0-c92f-4567-b0fa-cd9a10ecd7d1") SecondaryControlChannel;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(SecondaryControlChannel, 0x7b3181a0, 0xc92f, 0x4567, 0xb0,0xfa, 0xcd,0x9a,0x10,0xec,0xd7,0xd1)
+#endif
+#endif
+
+/*****************************************************************************
+ * AdapterInfo coclass
+ */
+
+DEFINE_GUID(CLSID_AdapterInfo, 0x6f9942c9, 0xc1b1, 0x4ab5, 0x93,0xda, 0x60,0x58,0x99,0x1d,0xc8,0xf3);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("6f9942c9-c1b1-4ab5-93da-6058991dc8f3") AdapterInfo;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AdapterInfo, 0x6f9942c9, 0xc1b1, 0x4ab5, 0x93,0xda, 0x60,0x58,0x99,0x1d,0xc8,0xf3)
+#endif
+#endif
+
+/*****************************************************************************
+ * EnumAdapterInfo coclass
+ */
+
+DEFINE_GUID(CLSID_EnumAdapterInfo, 0x6f9942ca, 0xc1b1, 0x4ab5, 0x93,0xda, 0x60,0x58,0x99,0x1d,0xc8,0xf3);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("6f9942ca-c1b1-4ab5-93da-6058991dc8f3") EnumAdapterInfo;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(EnumAdapterInfo, 0x6f9942ca, 0xc1b1, 0x4ab5, 0x93,0xda, 0x60,0x58,0x99,0x1d,0xc8,0xf3)
+#endif
+#endif
+
+/*****************************************************************************
+ * PendingProxyConnection coclass
+ */
+
+DEFINE_GUID(CLSID_PendingProxyConnection, 0xd8a68e5e, 0x2b37, 0x426c, 0xa3,0x29, 0xc1,0x17,0xc1,0x4c,0x42,0x9e);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("d8a68e5e-2b37-426c-a329-c117c14c429e") PendingProxyConnection;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(PendingProxyConnection, 0xd8a68e5e, 0x2b37, 0x426c, 0xa3,0x29, 0xc1,0x17,0xc1,0x4c,0x42,0x9e)
+#endif
+#endif
+
+/*****************************************************************************
+ * DataChannel coclass
+ */
+
+DEFINE_GUID(CLSID_DataChannel, 0xbbb36f15, 0x408d, 0x4056, 0x8c,0x27, 0x92,0x08,0x43,0xd4,0x0b,0xe5);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("bbb36f15-408d-4056-8c27-920843d40be5") DataChannel;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DataChannel, 0xbbb36f15, 0x408d, 0x4056, 0x8c,0x27, 0x92,0x08,0x43,0xd4,0x0b,0xe5)
+#endif
+#endif
+
+/*****************************************************************************
+ * PersistentDataChannel coclass
+ */
+
+DEFINE_GUID(CLSID_PersistentDataChannel, 0xbc9b54ab, 0x7883, 0x4c13, 0x90,0x9f, 0x03,0x3d,0x03,0x26,0x79,0x90);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("bc9b54ab-7883-4c13-909f-033d03267990") PersistentDataChannel;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(PersistentDataChannel, 0xbc9b54ab, 0x7883, 0x4c13, 0x90,0x9f, 0x03,0x3d,0x03,0x26,0x79,0x90)
+#endif
+#endif
+
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __alg_h__ */
diff --git a/mingw-w64-headers/include/alg.idl b/mingw-w64-headers/include/alg.idl
new file mode 100755
index 0000000..7119212
--- /dev/null
+++ b/mingw-w64-headers/include/alg.idl
@@ -0,0 +1,209 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+typedef enum _ALG_ADAPTER_TYPE {
+  eALG_PRIVATE = 0x1,
+  eALG_BOUNDARY = 0x2,
+  eALG_FIREWALLED = 0x4
+} ALG_ADAPTER_TYPE;
+
+typedef enum _ALG_CAPTURE {
+  eALG_SOURCE_CAPTURE = 0x1,
+  eALG_DESTINATION_CAPTURE = 0x2
+} ALG_CAPTURE;
+
+typedef enum _ALG_DIRECTION {
+  eALG_INBOUND = 0x1,
+  eALG_OUTBOUND = 0x2,
+  eALG_BOTH = 0x3
+} ALG_DIRECTION;
+
+typedef enum _ALG_NOTIFICATION {
+  eALG_NONE = 0x0,
+  eALG_SESSION_CREATION = 0x1,
+  eALG_SESSION_DELETION = 0x2,
+  eALG_SESSION_BOTH = 0x3
+} ALG_NOTIFICATION;
+
+typedef enum _ALG_PROTOCOL {
+  eALG_TCP = 0x1,
+  eALG_UDP = 0x2
+} ALG_PROTOCOL;
+
+typedef struct _ALG_PRIMARY_CHANNEL_PROPERTIES {
+  ALG_PROTOCOL eProtocol;
+  USHORT usCapturePort;
+  ALG_CAPTURE eCaptureType;
+  BOOL fCaptureInbound;
+  ULONG ulListeningAddress;
+  USHORT usListeningPort;
+  ULONG ulAdapterIndex;
+} ALG_PRIMARY_CHANNEL_PROPERTIES;
+
+typedef struct _ALG_SECONDARY_CHANNEL_PROPERTIES {
+  ALG_PROTOCOL eProtocol;
+  ULONG ulPrivateAddress;
+  USHORT usPrivatePort;
+  ULONG ulPublicAddress;
+  USHORT usPublicPort;
+  ULONG ulRemoteAddress;
+  USHORT usRemotePort;
+  ULONG ulListenAddress;
+  USHORT usListenPort;
+  ALG_DIRECTION eDirection;
+  BOOL fPersistent;
+} ALG_SECONDARY_CHANNEL_PROPERTIES;
+
+typedef struct _ALG_DATA_CHANNEL_PROPERTIES {
+  ALG_PROTOCOL eProtocol;
+  ULONG ulPrivateAddress;
+  USHORT usPrivatePort;
+  ULONG ulPublicAddress;
+  USHORT usPublicPort;
+  ULONG ulRemoteAddress;
+  USHORT usRemotePort;
+  ALG_DIRECTION eDirection;
+  ALG_NOTIFICATION eDesiredNotification;
+} ALG_DATA_CHANNEL_PROPERTIES;
+
+typedef struct _ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES {
+  ALG_PROTOCOL eProtocol;
+  ULONG ulPrivateAddress;
+  USHORT usPrivatePort;
+  ULONG ulPublicAddress;
+  USHORT usPublicPort;
+  ULONG ulRemoteAddress;
+  USHORT usRemotePort;
+  ALG_DIRECTION eDirection;
+} ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES;
+
+const int ALG_MAXIMUM_PORT_RANGE_SIZE = 10;
+
+[object, uuid (480bf94a-09fd-4f8a-a3e0-b0700282d84d), pointer_default (unique)]
+interface IAdapterInfo : IUnknown {
+  HRESULT GetAdapterIndex ([out] ULONG *pulIndex);
+  HRESULT GetAdapterType ([out] ALG_ADAPTER_TYPE *pAdapterType);
+  HRESULT GetAdapterAddresses ([out] ULONG *pulAddressCount,[out, size_is (,*pulAddressCount)] ULONG **prgAddresses);
+};
+
+[object, uuid (B68E5043-3e3d-4cc2-b9c1-5f8f88fee81c), pointer_default (unique)]
+interface IPendingProxyConnection : IUnknown {
+  HRESULT Cancel ();
+};
+
+[object, local, uuid (ad42d12a-4ad0-4856-919e-e854c91d1856), pointer_default (unique)]
+interface IDataChannel : IUnknown {
+  HRESULT Cancel ();
+  HRESULT GetChannelProperties ([out] ALG_DATA_CHANNEL_PROPERTIES **ppProperties);
+  HRESULT GetSessionCreationEventHandle ([out] HANDLE *pHandle);
+  HRESULT GetSessionDeletionEventHandle ([out] HANDLE *pHandle);
+};
+
+[object, uuid (a180e934-d92a-415d-9144-759f8054e8f6), pointer_default (unique)]
+interface IPersistentDataChannel : IUnknown {
+  HRESULT Cancel ();
+  HRESULT GetChannelProperties ([out] ALG_PERSISTENT_DATA_CHANNEL_PROPERTIES **ppProperties);
+};
+
+[object, uuid (1a2e8b62-9012-4be6-84ae-32bd66ba657a), pointer_default (unique)]
+interface IPrimaryControlChannel : IUnknown {
+  HRESULT Cancel ();
+  HRESULT GetChannelProperties ([out] ALG_PRIMARY_CHANNEL_PROPERTIES **ppProperties);
+  HRESULT GetOriginalDestinationInformation ([in] ULONG ulSourceAddress,[in] USHORT usSourcePort,[out] ULONG *pulOriginalDestinationAddress,[out] USHORT *pusOriginalDestinationPort,[out] ULONG *pulRemapDestinationAddress,[out] USHORT *pulRemapDestinationPort,[out] IAdapterInfo **ppReceiveAdapter);
+};
+
+[object, uuid (a23f9d10-714c-41fe-8471-ffb19bc28454), pointer_default (unique)]
+interface ISecondaryControlChannel : IUnknown {
+  HRESULT Cancel ();
+  HRESULT GetChannelProperties ([out] ALG_SECONDARY_CHANNEL_PROPERTIES **ppProperties);
+  HRESULT GetOriginalDestinationInformation ([in] ULONG ulSourceAddress,[in] USHORT usSourcePort,[out] ULONG *pulOriginalDestinationAddress,[out] USHORT *pusOriginalDestinationPort,[out] IAdapterInfo **ppReceiveAdapter);
+};
+
+[object, uuid (a23f9d11-714c-41fe-8471-ffb19bc28454), pointer_default (unique)]
+interface IEnumAdapterInfo : IUnknown {
+  HRESULT Next ([in] ULONG celt,[out, size_is (celt), length_is (*pCeltFetched)] IAdapterInfo **rgAI,[out] ULONG *pCeltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset ();
+  HRESULT Clone ([out] IEnumAdapterInfo **ppEnum);
+}
+
+[object, uuid (44ab2dc3-23b2-47de-8228-2e1cceeb9911), pointer_default (unique)]
+interface IAdapterNotificationSink : IUnknown {
+  HRESULT AdapterAdded (IAdapterInfo *pAdapter);
+  HRESULT AdapterRemoved (IAdapterInfo *pAdapter);
+  HRESULT AdapterModified (IAdapterInfo *pAdapter);
+  HRESULT AdapterUpdatePortMapping (IAdapterInfo *pAdapter);
+};
+
+[object, uuid (5134842a-fdce-485d-93cd-de1640643bbe), pointer_default (unique)]
+interface IApplicationGatewayServices : IUnknown {
+  HRESULT CreatePrimaryControlChannel ([in] ULONG uAdapterIndex,[in] ALG_PROTOCOL eProtocol,[in] USHORT usPortToCapture,[in] ALG_CAPTURE eCaptureType,[in] BOOL fCaptureInbound,[in] ULONG ulListenAddress,[in] USHORT usListenPort,[out] IPrimaryControlChannel **ppIControlChannel);
+  HRESULT CreateSecondaryControlChannel ([in] ALG_PROTOCOL eProtocol,[in] ULONG ulPrivateAddress,[in] USHORT usPrivatePort,[in] ULONG ulPublicAddress,[in] USHORT usPublicPort,[in] ULONG ulRemoteAddress,[in] USHORT usRemotePort,[in] ULONG ulListenAddress,[in] USHORT usListenPort,[in] ALG_DIRECTION eDirection,[in] BOOL fPersistent,[out] ISecondaryControlChannel **ppControlChannel);
+  HRESULT GetBestSourceAddressForDestinationAddress ([in] ULONG ulDstAddress,[in] BOOL fDemandDial,[out] ULONG *pulBestSrcAddress);
+  HRESULT PrepareProxyConnection ([in] ALG_PROTOCOL eProtocol,[in] ULONG ulSrcAddress,[in] USHORT usSrcPort,[in] ULONG ulDstAddress,[in] USHORT usDstPort,[in] BOOL fNoTimeout,[out] IPendingProxyConnection **ppPendingConnection);
+  HRESULT PrepareSourceModifiedProxyConnection ([in] ALG_PROTOCOL eProtocol,[in] ULONG ulSrcAddress,[in] USHORT usSrcPort,[in] ULONG ulDstAddress,[in] USHORT usDstPort,[in] ULONG ulNewSrcAddress,[in] USHORT usNewSourcePort,[out] IPendingProxyConnection **ppPendingConnection);
+  HRESULT CreateDataChannel ([in] ALG_PROTOCOL eProtocol,[in] ULONG ulPrivateAddress,[in] USHORT usPrivatePort,[in] ULONG ulPublicAddress,[in] USHORT usPublicPort,[in] ULONG ulRemoteAddress,[in] USHORT usRemotePort,[in] ALG_DIRECTION eDirection,[in] ALG_NOTIFICATION eDesiredNotification,[in] BOOL fNoTimeout,[out] IDataChannel **ppDataChannel);
+  HRESULT CreatePersistentDataChannel ([in] ALG_PROTOCOL eProtocol,[in] ULONG ulPrivateAddress,[in] USHORT usPrivatePort,[in] ULONG ulPublicAddress,[in] USHORT usPublicPort,[in] ULONG ulRemoteAddress,[in] USHORT usRemotePort,[in] ALG_DIRECTION eDirection,[out] IPersistentDataChannel **ppIPersistentDataChannel);
+  HRESULT ReservePort ([in] USHORT usPortCount,[out] USHORT *pusReservedPort);
+  HRESULT ReleaseReservedPort ([in] USHORT usReservedPortBase,[in] USHORT usPortCount);
+  HRESULT EnumerateAdapters ([out] IEnumAdapterInfo **ppIEnumAdapterInfo);
+  HRESULT StartAdapterNotifications ([in] IAdapterNotificationSink *pSink,[in] DWORD *pdwCookie);
+  HRESULT StopAdapterNotifications ([in] DWORD dwCookieOfSink);
+  HRESULT LookupAdapterPortMapping ([in] ULONG ulAdapterIndex,[in] UCHAR Protocol,[in] ULONG ulDestinationAddress,[in] USHORT usDestinationPort,[out] ULONG *pulRemapAddress,[out] USHORT *pusRemapPort);
+};
+
+[object, uuid (5134842b-fdce-485d-93cd-de1640643bbe), pointer_default (unique)]
+interface IApplicationGateway : IUnknown {
+  HRESULT Initialize ([in] IApplicationGatewayServices *pAlgServices);
+  HRESULT Stop (void);
+};
+
+[uuid (b6d1d098-e235-4b99-ba98-7c624fd875db), version (1.0)]
+library ALGLib {
+  importlib ("stdole32.tlb");
+  importlib ("stdole2.tlb");
+
+  [uuid (f8ade1d3-49df-4b75-9005-ef9508e6a337)]
+  coclass ApplicationGatewayServices {
+    [default] interface IApplicationGatewayServices;
+  };
+  [uuid (3ceb5509-C1CD-432f-9d8f-65d1e286aa80)]
+  coclass PrimaryControlChannel {
+    [default] interface IPrimaryControlChannel;
+  };
+  [uuid (7b3181a0-c92F-4567-b0fa-cd9a10ecd7d1)]
+  coclass SecondaryControlChannel {
+    [default] interface ISecondaryControlChannel;
+  };
+  [uuid (6f9942c9-c1b1-4ab5-93da-6058991dc8f3)]
+  coclass AdapterInfo {
+    [default] interface IAdapterInfo;
+  };
+  [uuid (6f9942ca-c1b1-4ab5-93da-6058991dc8f3)]
+  coclass EnumAdapterInfo {
+    [default] interface IEnumAdapterInfo;
+  };
+  [uuid (d8a68e5e-2b37-426c-a329-c117c14c429e)]
+  coclass PendingProxyConnection {
+    [default] interface IPendingProxyConnection;
+  };
+  [uuid (bbb36f15-408d-4056-8c27-920843d40be5)]
+  coclass DataChannel {
+    [default] interface IDataChannel;
+  };
+  [uuid (bc9B54ab-7883-4c13-909f-033d03267990)]
+
+  coclass PersistentDataChannel {
+    [default] interface IPersistentDataChannel;
+  };
+};
+cpp_quote("#endif")
