/*** Autogenerated by WIDL 1.6 from include/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__ */
