/*** Autogenerated by WIDL 6.0-rc1 from include/alg.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __alg_h__
#define __alg_h__

/* Forward declarations */

#ifndef __IAdapterInfo_FWD_DEFINED__
#define __IAdapterInfo_FWD_DEFINED__
typedef interface IAdapterInfo IAdapterInfo;
#ifdef __cplusplus
interface IAdapterInfo;
#endif /* __cplusplus */
#endif

#ifndef __IPendingProxyConnection_FWD_DEFINED__
#define __IPendingProxyConnection_FWD_DEFINED__
typedef interface IPendingProxyConnection IPendingProxyConnection;
#ifdef __cplusplus
interface IPendingProxyConnection;
#endif /* __cplusplus */
#endif

#ifndef __IDataChannel_FWD_DEFINED__
#define __IDataChannel_FWD_DEFINED__
typedef interface IDataChannel IDataChannel;
#ifdef __cplusplus
interface IDataChannel;
#endif /* __cplusplus */
#endif

#ifndef __IPersistentDataChannel_FWD_DEFINED__
#define __IPersistentDataChannel_FWD_DEFINED__
typedef interface IPersistentDataChannel IPersistentDataChannel;
#ifdef __cplusplus
interface IPersistentDataChannel;
#endif /* __cplusplus */
#endif

#ifndef __IPrimaryControlChannel_FWD_DEFINED__
#define __IPrimaryControlChannel_FWD_DEFINED__
typedef interface IPrimaryControlChannel IPrimaryControlChannel;
#ifdef __cplusplus
interface IPrimaryControlChannel;
#endif /* __cplusplus */
#endif

#ifndef __ISecondaryControlChannel_FWD_DEFINED__
#define __ISecondaryControlChannel_FWD_DEFINED__
typedef interface ISecondaryControlChannel ISecondaryControlChannel;
#ifdef __cplusplus
interface ISecondaryControlChannel;
#endif /* __cplusplus */
#endif

#ifndef __IEnumAdapterInfo_FWD_DEFINED__
#define __IEnumAdapterInfo_FWD_DEFINED__
typedef interface IEnumAdapterInfo IEnumAdapterInfo;
#ifdef __cplusplus
interface IEnumAdapterInfo;
#endif /* __cplusplus */
#endif

#ifndef __IAdapterNotificationSink_FWD_DEFINED__
#define __IAdapterNotificationSink_FWD_DEFINED__
typedef interface IAdapterNotificationSink IAdapterNotificationSink;
#ifdef __cplusplus
interface IAdapterNotificationSink;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationGatewayServices_FWD_DEFINED__
#define __IApplicationGatewayServices_FWD_DEFINED__
typedef interface IApplicationGatewayServices IApplicationGatewayServices;
#ifdef __cplusplus
interface IApplicationGatewayServices;
#endif /* __cplusplus */
#endif

#ifndef __IApplicationGateway_FWD_DEFINED__
#define __IApplicationGateway_FWD_DEFINED__
typedef interface IApplicationGateway IApplicationGateway;
#ifdef __cplusplus
interface IApplicationGateway;
#endif /* __cplusplus */
#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#endif  /* __IApplicationGateway_INTERFACE_DEFINED__ */

#ifndef __ALGLib_LIBRARY_DEFINED__
#define __ALGLib_LIBRARY_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 /* __ALGLib_LIBRARY_DEFINED__ */
#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __alg_h__ */
