/*** Autogenerated by WIDL 6.3 from include/netcfgn.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 __netcfgn_h__
#define __netcfgn_h__

/* Forward declarations */

#ifndef __INetCfgPnpReconfigCallback_FWD_DEFINED__
#define __INetCfgPnpReconfigCallback_FWD_DEFINED__
typedef interface INetCfgPnpReconfigCallback INetCfgPnpReconfigCallback;
#ifdef __cplusplus
interface INetCfgPnpReconfigCallback;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentControl_FWD_DEFINED__
#define __INetCfgComponentControl_FWD_DEFINED__
typedef interface INetCfgComponentControl INetCfgComponentControl;
#ifdef __cplusplus
interface INetCfgComponentControl;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentSetup_FWD_DEFINED__
#define __INetCfgComponentSetup_FWD_DEFINED__
typedef interface INetCfgComponentSetup INetCfgComponentSetup;
#ifdef __cplusplus
interface INetCfgComponentSetup;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentPropertyUi_FWD_DEFINED__
#define __INetCfgComponentPropertyUi_FWD_DEFINED__
typedef interface INetCfgComponentPropertyUi INetCfgComponentPropertyUi;
#ifdef __cplusplus
interface INetCfgComponentPropertyUi;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentNotifyBinding_FWD_DEFINED__
#define __INetCfgComponentNotifyBinding_FWD_DEFINED__
typedef interface INetCfgComponentNotifyBinding INetCfgComponentNotifyBinding;
#ifdef __cplusplus
interface INetCfgComponentNotifyBinding;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentNotifyGlobal_FWD_DEFINED__
#define __INetCfgComponentNotifyGlobal_FWD_DEFINED__
typedef interface INetCfgComponentNotifyGlobal INetCfgComponentNotifyGlobal;
#ifdef __cplusplus
interface INetCfgComponentNotifyGlobal;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentUpperEdge_FWD_DEFINED__
#define __INetCfgComponentUpperEdge_FWD_DEFINED__
typedef interface INetCfgComponentUpperEdge INetCfgComponentUpperEdge;
#ifdef __cplusplus
interface INetCfgComponentUpperEdge;
#endif /* __cplusplus */
#endif

#ifndef __INetLanConnectionUiInfo_FWD_DEFINED__
#define __INetLanConnectionUiInfo_FWD_DEFINED__
typedef interface INetLanConnectionUiInfo INetLanConnectionUiInfo;
#ifdef __cplusplus
interface INetLanConnectionUiInfo;
#endif /* __cplusplus */
#endif

#ifndef __INetRasConnectionIpUiInfo_FWD_DEFINED__
#define __INetRasConnectionIpUiInfo_FWD_DEFINED__
typedef interface INetRasConnectionIpUiInfo INetRasConnectionIpUiInfo;
#ifdef __cplusplus
interface INetRasConnectionIpUiInfo;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentSysPrep_FWD_DEFINED__
#define __INetCfgComponentSysPrep_FWD_DEFINED__
typedef interface INetCfgComponentSysPrep INetCfgComponentSysPrep;
#ifdef __cplusplus
interface INetCfgComponentSysPrep;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <wtypes.h>
#include <netcfgx.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

/*****************************************************************************
 * INetCfgPnpReconfigCallback interface
 */
#ifndef __INetCfgPnpReconfigCallback_INTERFACE_DEFINED__
#define __INetCfgPnpReconfigCallback_INTERFACE_DEFINED__

typedef enum tagNCPNP_RECONFIG_LAYER {
    NCRL_NDIS = 1,
    NCRL_TDI = 2
} NCPNP_RECONFIG_LAYER;
DEFINE_GUID(IID_INetCfgPnpReconfigCallback, 0x8d84bd35, 0xe227, 0x11d2, 0xb7,0x00, 0x00,0xa0,0xc9,0x8a,0x6a,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8d84bd35-e227-11d2-b700-00a0c98a6a85")
INetCfgPnpReconfigCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SendPnpReconfig(
        NCPNP_RECONFIG_LAYER Layer,
        LPCWSTR pszwUpper,
        LPCWSTR pszwLower,
        PVOID pvData,
        DWORD dwSizeOfData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgPnpReconfigCallback, 0x8d84bd35, 0xe227, 0x11d2, 0xb7,0x00, 0x00,0xa0,0xc9,0x8a,0x6a,0x85)
#endif
#else
typedef struct INetCfgPnpReconfigCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgPnpReconfigCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgPnpReconfigCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgPnpReconfigCallback *This);

    /*** INetCfgPnpReconfigCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *SendPnpReconfig)(
        INetCfgPnpReconfigCallback *This,
        NCPNP_RECONFIG_LAYER Layer,
        LPCWSTR pszwUpper,
        LPCWSTR pszwLower,
        PVOID pvData,
        DWORD dwSizeOfData);

    END_INTERFACE
} INetCfgPnpReconfigCallbackVtbl;

interface INetCfgPnpReconfigCallback {
    CONST_VTBL INetCfgPnpReconfigCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgPnpReconfigCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgPnpReconfigCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgPnpReconfigCallback_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgPnpReconfigCallback methods ***/
#define INetCfgPnpReconfigCallback_SendPnpReconfig(This,Layer,pszwUpper,pszwLower,pvData,dwSizeOfData) (This)->lpVtbl->SendPnpReconfig(This,Layer,pszwUpper,pszwLower,pvData,dwSizeOfData)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgPnpReconfigCallback_QueryInterface(INetCfgPnpReconfigCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgPnpReconfigCallback_AddRef(INetCfgPnpReconfigCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgPnpReconfigCallback_Release(INetCfgPnpReconfigCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgPnpReconfigCallback methods ***/
static FORCEINLINE HRESULT INetCfgPnpReconfigCallback_SendPnpReconfig(INetCfgPnpReconfigCallback* This,NCPNP_RECONFIG_LAYER Layer,LPCWSTR pszwUpper,LPCWSTR pszwLower,PVOID pvData,DWORD dwSizeOfData) {
    return This->lpVtbl->SendPnpReconfig(This,Layer,pszwUpper,pszwLower,pvData,dwSizeOfData);
}
#endif
#endif

#endif


#endif  /* __INetCfgPnpReconfigCallback_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentControl interface
 */
#ifndef __INetCfgComponentControl_INTERFACE_DEFINED__
#define __INetCfgComponentControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgComponentControl, 0x932238df, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("932238df-bea1-11d0-9298-00c04fc99dcf")
INetCfgComponentControl : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        INetCfgComponent *pIComp,
        INetCfg *pINetCfg,
        WINBOOL fInstalling) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyRegistryChanges(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyPnpChanges(
        INetCfgPnpReconfigCallback *pICallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelChanges(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentControl, 0x932238df, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf)
#endif
#else
typedef struct INetCfgComponentControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentControl *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentControl *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentControl *This);

    /*** INetCfgComponentControl methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        INetCfgComponentControl *This,
        INetCfgComponent *pIComp,
        INetCfg *pINetCfg,
        WINBOOL fInstalling);

    HRESULT (STDMETHODCALLTYPE *ApplyRegistryChanges)(
        INetCfgComponentControl *This);

    HRESULT (STDMETHODCALLTYPE *ApplyPnpChanges)(
        INetCfgComponentControl *This,
        INetCfgPnpReconfigCallback *pICallback);

    HRESULT (STDMETHODCALLTYPE *CancelChanges)(
        INetCfgComponentControl *This);

    END_INTERFACE
} INetCfgComponentControlVtbl;

interface INetCfgComponentControl {
    CONST_VTBL INetCfgComponentControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentControl_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentControl methods ***/
#define INetCfgComponentControl_Initialize(This,pIComp,pINetCfg,fInstalling) (This)->lpVtbl->Initialize(This,pIComp,pINetCfg,fInstalling)
#define INetCfgComponentControl_ApplyRegistryChanges(This) (This)->lpVtbl->ApplyRegistryChanges(This)
#define INetCfgComponentControl_ApplyPnpChanges(This,pICallback) (This)->lpVtbl->ApplyPnpChanges(This,pICallback)
#define INetCfgComponentControl_CancelChanges(This) (This)->lpVtbl->CancelChanges(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentControl_QueryInterface(INetCfgComponentControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentControl_AddRef(INetCfgComponentControl* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentControl_Release(INetCfgComponentControl* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentControl methods ***/
static FORCEINLINE HRESULT INetCfgComponentControl_Initialize(INetCfgComponentControl* This,INetCfgComponent *pIComp,INetCfg *pINetCfg,WINBOOL fInstalling) {
    return This->lpVtbl->Initialize(This,pIComp,pINetCfg,fInstalling);
}
static FORCEINLINE HRESULT INetCfgComponentControl_ApplyRegistryChanges(INetCfgComponentControl* This) {
    return This->lpVtbl->ApplyRegistryChanges(This);
}
static FORCEINLINE HRESULT INetCfgComponentControl_ApplyPnpChanges(INetCfgComponentControl* This,INetCfgPnpReconfigCallback *pICallback) {
    return This->lpVtbl->ApplyPnpChanges(This,pICallback);
}
static FORCEINLINE HRESULT INetCfgComponentControl_CancelChanges(INetCfgComponentControl* This) {
    return This->lpVtbl->CancelChanges(This);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentControl_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentSetup interface
 */
#ifndef __INetCfgComponentSetup_INTERFACE_DEFINED__
#define __INetCfgComponentSetup_INTERFACE_DEFINED__

typedef enum tagNETWORK_INSTALL_TIME {
    NSF_PRIMARYINSTALL = 0x1,
    NSF_POSTSYSINSTALL = 0x2
} NETWORK_INSTALL_TIME;
typedef enum tagNETWORK_UPGRADE_TYPE {
    NSF_WIN16_UPGRADE = 0x10,
    NSF_WIN95_UPGRADE = 0x20,
    NSF_WINNT_WKS_UPGRADE = 0x40,
    NSF_WINNT_SVR_UPGRADE = 0x80,
    NSF_WINNT_SBS_UPGRADE = 0x100,
    NSF_COMPONENT_UPDATE = 0x200
} NETWORK_UPGRADE_TYPE;
DEFINE_GUID(IID_INetCfgComponentSetup, 0x932238e3, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("932238e3-bea1-11d0-9298-00c04fc99dcf")
INetCfgComponentSetup : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Install(
        DWORD dwSetupFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Upgrade(
        DWORD dwSetupFlags,
        DWORD dwUpgradeFomBuildNo) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadAnswerFile(
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSections) = 0;

    virtual HRESULT STDMETHODCALLTYPE Removing(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentSetup, 0x932238e3, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf)
#endif
#else
typedef struct INetCfgComponentSetupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentSetup *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentSetup *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentSetup *This);

    /*** INetCfgComponentSetup methods ***/
    HRESULT (STDMETHODCALLTYPE *Install)(
        INetCfgComponentSetup *This,
        DWORD dwSetupFlags);

    HRESULT (STDMETHODCALLTYPE *Upgrade)(
        INetCfgComponentSetup *This,
        DWORD dwSetupFlags,
        DWORD dwUpgradeFomBuildNo);

    HRESULT (STDMETHODCALLTYPE *ReadAnswerFile)(
        INetCfgComponentSetup *This,
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSections);

    HRESULT (STDMETHODCALLTYPE *Removing)(
        INetCfgComponentSetup *This);

    END_INTERFACE
} INetCfgComponentSetupVtbl;

interface INetCfgComponentSetup {
    CONST_VTBL INetCfgComponentSetupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentSetup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentSetup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentSetup_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentSetup methods ***/
#define INetCfgComponentSetup_Install(This,dwSetupFlags) (This)->lpVtbl->Install(This,dwSetupFlags)
#define INetCfgComponentSetup_Upgrade(This,dwSetupFlags,dwUpgradeFomBuildNo) (This)->lpVtbl->Upgrade(This,dwSetupFlags,dwUpgradeFomBuildNo)
#define INetCfgComponentSetup_ReadAnswerFile(This,pszwAnswerFile,pszwAnswerSections) (This)->lpVtbl->ReadAnswerFile(This,pszwAnswerFile,pszwAnswerSections)
#define INetCfgComponentSetup_Removing(This) (This)->lpVtbl->Removing(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentSetup_QueryInterface(INetCfgComponentSetup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentSetup_AddRef(INetCfgComponentSetup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentSetup_Release(INetCfgComponentSetup* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentSetup methods ***/
static FORCEINLINE HRESULT INetCfgComponentSetup_Install(INetCfgComponentSetup* This,DWORD dwSetupFlags) {
    return This->lpVtbl->Install(This,dwSetupFlags);
}
static FORCEINLINE HRESULT INetCfgComponentSetup_Upgrade(INetCfgComponentSetup* This,DWORD dwSetupFlags,DWORD dwUpgradeFomBuildNo) {
    return This->lpVtbl->Upgrade(This,dwSetupFlags,dwUpgradeFomBuildNo);
}
static FORCEINLINE HRESULT INetCfgComponentSetup_ReadAnswerFile(INetCfgComponentSetup* This,LPCWSTR pszwAnswerFile,LPCWSTR pszwAnswerSections) {
    return This->lpVtbl->ReadAnswerFile(This,pszwAnswerFile,pszwAnswerSections);
}
static FORCEINLINE HRESULT INetCfgComponentSetup_Removing(INetCfgComponentSetup* This) {
    return This->lpVtbl->Removing(This);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentSetup_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentPropertyUi interface
 */
#ifndef __INetCfgComponentPropertyUi_INTERFACE_DEFINED__
#define __INetCfgComponentPropertyUi_INTERFACE_DEFINED__

typedef enum tagDEFAULT_PAGES {
    DPP_ADVANCED = 1
} DEFAULT_PAGES;
DEFINE_GUID(IID_INetCfgComponentPropertyUi, 0x932238e0, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("932238e0-bea1-11d0-9298-00c04fc99dcf")
INetCfgComponentPropertyUi : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryPropertyUi(
        IUnknown *pUnkReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContext(
        IUnknown *pUnkReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE MergePropPages(
        DWORD *pdwDefPages,
        BYTE **pahpspPrivate,
        UINT *pcPages,
        HWND hwndParent,
        LPCWSTR *pszStartPage) = 0;

    virtual HRESULT STDMETHODCALLTYPE ValidateProperties(
        HWND hwndSheet) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyProperties(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelProperties(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentPropertyUi, 0x932238e0, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf)
#endif
#else
typedef struct INetCfgComponentPropertyUiVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentPropertyUi *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentPropertyUi *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentPropertyUi *This);

    /*** INetCfgComponentPropertyUi methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryPropertyUi)(
        INetCfgComponentPropertyUi *This,
        IUnknown *pUnkReserved);

    HRESULT (STDMETHODCALLTYPE *SetContext)(
        INetCfgComponentPropertyUi *This,
        IUnknown *pUnkReserved);

    HRESULT (STDMETHODCALLTYPE *MergePropPages)(
        INetCfgComponentPropertyUi *This,
        DWORD *pdwDefPages,
        BYTE **pahpspPrivate,
        UINT *pcPages,
        HWND hwndParent,
        LPCWSTR *pszStartPage);

    HRESULT (STDMETHODCALLTYPE *ValidateProperties)(
        INetCfgComponentPropertyUi *This,
        HWND hwndSheet);

    HRESULT (STDMETHODCALLTYPE *ApplyProperties)(
        INetCfgComponentPropertyUi *This);

    HRESULT (STDMETHODCALLTYPE *CancelProperties)(
        INetCfgComponentPropertyUi *This);

    END_INTERFACE
} INetCfgComponentPropertyUiVtbl;

interface INetCfgComponentPropertyUi {
    CONST_VTBL INetCfgComponentPropertyUiVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentPropertyUi_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentPropertyUi_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentPropertyUi_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentPropertyUi methods ***/
#define INetCfgComponentPropertyUi_QueryPropertyUi(This,pUnkReserved) (This)->lpVtbl->QueryPropertyUi(This,pUnkReserved)
#define INetCfgComponentPropertyUi_SetContext(This,pUnkReserved) (This)->lpVtbl->SetContext(This,pUnkReserved)
#define INetCfgComponentPropertyUi_MergePropPages(This,pdwDefPages,pahpspPrivate,pcPages,hwndParent,pszStartPage) (This)->lpVtbl->MergePropPages(This,pdwDefPages,pahpspPrivate,pcPages,hwndParent,pszStartPage)
#define INetCfgComponentPropertyUi_ValidateProperties(This,hwndSheet) (This)->lpVtbl->ValidateProperties(This,hwndSheet)
#define INetCfgComponentPropertyUi_ApplyProperties(This) (This)->lpVtbl->ApplyProperties(This)
#define INetCfgComponentPropertyUi_CancelProperties(This) (This)->lpVtbl->CancelProperties(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_QueryInterface(INetCfgComponentPropertyUi* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentPropertyUi_AddRef(INetCfgComponentPropertyUi* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentPropertyUi_Release(INetCfgComponentPropertyUi* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentPropertyUi methods ***/
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_QueryPropertyUi(INetCfgComponentPropertyUi* This,IUnknown *pUnkReserved) {
    return This->lpVtbl->QueryPropertyUi(This,pUnkReserved);
}
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_SetContext(INetCfgComponentPropertyUi* This,IUnknown *pUnkReserved) {
    return This->lpVtbl->SetContext(This,pUnkReserved);
}
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_MergePropPages(INetCfgComponentPropertyUi* This,DWORD *pdwDefPages,BYTE **pahpspPrivate,UINT *pcPages,HWND hwndParent,LPCWSTR *pszStartPage) {
    return This->lpVtbl->MergePropPages(This,pdwDefPages,pahpspPrivate,pcPages,hwndParent,pszStartPage);
}
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_ValidateProperties(INetCfgComponentPropertyUi* This,HWND hwndSheet) {
    return This->lpVtbl->ValidateProperties(This,hwndSheet);
}
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_ApplyProperties(INetCfgComponentPropertyUi* This) {
    return This->lpVtbl->ApplyProperties(This);
}
static FORCEINLINE HRESULT INetCfgComponentPropertyUi_CancelProperties(INetCfgComponentPropertyUi* This) {
    return This->lpVtbl->CancelProperties(This);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentPropertyUi_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentNotifyBinding interface
 */
#ifndef __INetCfgComponentNotifyBinding_INTERFACE_DEFINED__
#define __INetCfgComponentNotifyBinding_INTERFACE_DEFINED__

typedef enum tagBIND_FLAGS1 {
    NCN_ADD = 0x1,
    NCN_REMOVE = 0x2,
    NCN_UPDATE = 0x4,
    NCN_ENABLE = 0x10,
    NCN_DISABLE = 0x20,
    NCN_BINDING_PATH = 0x100,
    NCN_PROPERTYCHANGE = 0x200,
    NCN_NET = 0x10000,
    NCN_NETTRANS = 0x20000,
    NCN_NETCLIENT = 0x40000,
    NCN_NETSERVICE = 0x80000
} BIND_FLAGS1;
DEFINE_GUID(IID_INetCfgComponentNotifyBinding, 0x932238e1, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("932238e1-bea1-11d0-9298-00c04fc99dcf")
INetCfgComponentNotifyBinding : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryBindingPath(
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE NotifyBindingPath(
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentNotifyBinding, 0x932238e1, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf)
#endif
#else
typedef struct INetCfgComponentNotifyBindingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentNotifyBinding *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentNotifyBinding *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentNotifyBinding *This);

    /*** INetCfgComponentNotifyBinding methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryBindingPath)(
        INetCfgComponentNotifyBinding *This,
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath);

    HRESULT (STDMETHODCALLTYPE *NotifyBindingPath)(
        INetCfgComponentNotifyBinding *This,
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath);

    END_INTERFACE
} INetCfgComponentNotifyBindingVtbl;

interface INetCfgComponentNotifyBinding {
    CONST_VTBL INetCfgComponentNotifyBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentNotifyBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentNotifyBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentNotifyBinding_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentNotifyBinding methods ***/
#define INetCfgComponentNotifyBinding_QueryBindingPath(This,dwChangeFlag,pIPath) (This)->lpVtbl->QueryBindingPath(This,dwChangeFlag,pIPath)
#define INetCfgComponentNotifyBinding_NotifyBindingPath(This,dwChangeFlag,pIPath) (This)->lpVtbl->NotifyBindingPath(This,dwChangeFlag,pIPath)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentNotifyBinding_QueryInterface(INetCfgComponentNotifyBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentNotifyBinding_AddRef(INetCfgComponentNotifyBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentNotifyBinding_Release(INetCfgComponentNotifyBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentNotifyBinding methods ***/
static FORCEINLINE HRESULT INetCfgComponentNotifyBinding_QueryBindingPath(INetCfgComponentNotifyBinding* This,DWORD dwChangeFlag,INetCfgBindingPath *pIPath) {
    return This->lpVtbl->QueryBindingPath(This,dwChangeFlag,pIPath);
}
static FORCEINLINE HRESULT INetCfgComponentNotifyBinding_NotifyBindingPath(INetCfgComponentNotifyBinding* This,DWORD dwChangeFlag,INetCfgBindingPath *pIPath) {
    return This->lpVtbl->NotifyBindingPath(This,dwChangeFlag,pIPath);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentNotifyBinding_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentNotifyGlobal interface
 */
#ifndef __INetCfgComponentNotifyGlobal_INTERFACE_DEFINED__
#define __INetCfgComponentNotifyGlobal_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgComponentNotifyGlobal, 0x932238e2, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("932238e2-bea1-11d0-9298-00c04fc99dcf")
INetCfgComponentNotifyGlobal : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSupportedNotifications(
        DWORD *dwNotifications) = 0;

    virtual HRESULT STDMETHODCALLTYPE SysQueryBindingPath(
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE SysNotifyBindingPath(
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE SysNotifyComponent(
        DWORD dwChangeFlag,
        INetCfgComponent *pIComp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentNotifyGlobal, 0x932238e2, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf)
#endif
#else
typedef struct INetCfgComponentNotifyGlobalVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentNotifyGlobal *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentNotifyGlobal *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentNotifyGlobal *This);

    /*** INetCfgComponentNotifyGlobal methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSupportedNotifications)(
        INetCfgComponentNotifyGlobal *This,
        DWORD *dwNotifications);

    HRESULT (STDMETHODCALLTYPE *SysQueryBindingPath)(
        INetCfgComponentNotifyGlobal *This,
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath);

    HRESULT (STDMETHODCALLTYPE *SysNotifyBindingPath)(
        INetCfgComponentNotifyGlobal *This,
        DWORD dwChangeFlag,
        INetCfgBindingPath *pIPath);

    HRESULT (STDMETHODCALLTYPE *SysNotifyComponent)(
        INetCfgComponentNotifyGlobal *This,
        DWORD dwChangeFlag,
        INetCfgComponent *pIComp);

    END_INTERFACE
} INetCfgComponentNotifyGlobalVtbl;

interface INetCfgComponentNotifyGlobal {
    CONST_VTBL INetCfgComponentNotifyGlobalVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentNotifyGlobal_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentNotifyGlobal_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentNotifyGlobal_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentNotifyGlobal methods ***/
#define INetCfgComponentNotifyGlobal_GetSupportedNotifications(This,dwNotifications) (This)->lpVtbl->GetSupportedNotifications(This,dwNotifications)
#define INetCfgComponentNotifyGlobal_SysQueryBindingPath(This,dwChangeFlag,pIPath) (This)->lpVtbl->SysQueryBindingPath(This,dwChangeFlag,pIPath)
#define INetCfgComponentNotifyGlobal_SysNotifyBindingPath(This,dwChangeFlag,pIPath) (This)->lpVtbl->SysNotifyBindingPath(This,dwChangeFlag,pIPath)
#define INetCfgComponentNotifyGlobal_SysNotifyComponent(This,dwChangeFlag,pIComp) (This)->lpVtbl->SysNotifyComponent(This,dwChangeFlag,pIComp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentNotifyGlobal_QueryInterface(INetCfgComponentNotifyGlobal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentNotifyGlobal_AddRef(INetCfgComponentNotifyGlobal* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentNotifyGlobal_Release(INetCfgComponentNotifyGlobal* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentNotifyGlobal methods ***/
static FORCEINLINE HRESULT INetCfgComponentNotifyGlobal_GetSupportedNotifications(INetCfgComponentNotifyGlobal* This,DWORD *dwNotifications) {
    return This->lpVtbl->GetSupportedNotifications(This,dwNotifications);
}
static FORCEINLINE HRESULT INetCfgComponentNotifyGlobal_SysQueryBindingPath(INetCfgComponentNotifyGlobal* This,DWORD dwChangeFlag,INetCfgBindingPath *pIPath) {
    return This->lpVtbl->SysQueryBindingPath(This,dwChangeFlag,pIPath);
}
static FORCEINLINE HRESULT INetCfgComponentNotifyGlobal_SysNotifyBindingPath(INetCfgComponentNotifyGlobal* This,DWORD dwChangeFlag,INetCfgBindingPath *pIPath) {
    return This->lpVtbl->SysNotifyBindingPath(This,dwChangeFlag,pIPath);
}
static FORCEINLINE HRESULT INetCfgComponentNotifyGlobal_SysNotifyComponent(INetCfgComponentNotifyGlobal* This,DWORD dwChangeFlag,INetCfgComponent *pIComp) {
    return This->lpVtbl->SysNotifyComponent(This,dwChangeFlag,pIComp);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentNotifyGlobal_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentUpperEdge interface
 */
#ifndef __INetCfgComponentUpperEdge_INTERFACE_DEFINED__
#define __INetCfgComponentUpperEdge_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgComponentUpperEdge, 0x932238e4, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("932238e4-bea1-11d0-9298-00c04fc99dcf")
INetCfgComponentUpperEdge : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetInterfaceIdsForAdapter(
        INetCfgComponent *pAdapter,
        DWORD *pdwNumInterfaces,
        GUID **ppguidInterfaceIds) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddInterfacesToAdapter(
        INetCfgComponent *pAdapter,
        DWORD dwNumInterfaces) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveInterfacesFromAdapter(
        INetCfgComponent *pAdapter,
        DWORD dwNumInterfaces,
        const GUID *pguidInterfaceIds) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentUpperEdge, 0x932238e4, 0xbea1, 0x11d0, 0x92,0x98, 0x00,0xc0,0x4f,0xc9,0x9d,0xcf)
#endif
#else
typedef struct INetCfgComponentUpperEdgeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentUpperEdge *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentUpperEdge *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentUpperEdge *This);

    /*** INetCfgComponentUpperEdge methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInterfaceIdsForAdapter)(
        INetCfgComponentUpperEdge *This,
        INetCfgComponent *pAdapter,
        DWORD *pdwNumInterfaces,
        GUID **ppguidInterfaceIds);

    HRESULT (STDMETHODCALLTYPE *AddInterfacesToAdapter)(
        INetCfgComponentUpperEdge *This,
        INetCfgComponent *pAdapter,
        DWORD dwNumInterfaces);

    HRESULT (STDMETHODCALLTYPE *RemoveInterfacesFromAdapter)(
        INetCfgComponentUpperEdge *This,
        INetCfgComponent *pAdapter,
        DWORD dwNumInterfaces,
        const GUID *pguidInterfaceIds);

    END_INTERFACE
} INetCfgComponentUpperEdgeVtbl;

interface INetCfgComponentUpperEdge {
    CONST_VTBL INetCfgComponentUpperEdgeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentUpperEdge_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentUpperEdge_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentUpperEdge_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentUpperEdge methods ***/
#define INetCfgComponentUpperEdge_GetInterfaceIdsForAdapter(This,pAdapter,pdwNumInterfaces,ppguidInterfaceIds) (This)->lpVtbl->GetInterfaceIdsForAdapter(This,pAdapter,pdwNumInterfaces,ppguidInterfaceIds)
#define INetCfgComponentUpperEdge_AddInterfacesToAdapter(This,pAdapter,dwNumInterfaces) (This)->lpVtbl->AddInterfacesToAdapter(This,pAdapter,dwNumInterfaces)
#define INetCfgComponentUpperEdge_RemoveInterfacesFromAdapter(This,pAdapter,dwNumInterfaces,pguidInterfaceIds) (This)->lpVtbl->RemoveInterfacesFromAdapter(This,pAdapter,dwNumInterfaces,pguidInterfaceIds)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentUpperEdge_QueryInterface(INetCfgComponentUpperEdge* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentUpperEdge_AddRef(INetCfgComponentUpperEdge* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentUpperEdge_Release(INetCfgComponentUpperEdge* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentUpperEdge methods ***/
static FORCEINLINE HRESULT INetCfgComponentUpperEdge_GetInterfaceIdsForAdapter(INetCfgComponentUpperEdge* This,INetCfgComponent *pAdapter,DWORD *pdwNumInterfaces,GUID **ppguidInterfaceIds) {
    return This->lpVtbl->GetInterfaceIdsForAdapter(This,pAdapter,pdwNumInterfaces,ppguidInterfaceIds);
}
static FORCEINLINE HRESULT INetCfgComponentUpperEdge_AddInterfacesToAdapter(INetCfgComponentUpperEdge* This,INetCfgComponent *pAdapter,DWORD dwNumInterfaces) {
    return This->lpVtbl->AddInterfacesToAdapter(This,pAdapter,dwNumInterfaces);
}
static FORCEINLINE HRESULT INetCfgComponentUpperEdge_RemoveInterfacesFromAdapter(INetCfgComponentUpperEdge* This,INetCfgComponent *pAdapter,DWORD dwNumInterfaces,const GUID *pguidInterfaceIds) {
    return This->lpVtbl->RemoveInterfacesFromAdapter(This,pAdapter,dwNumInterfaces,pguidInterfaceIds);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentUpperEdge_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetLanConnectionUiInfo interface
 */
#ifndef __INetLanConnectionUiInfo_INTERFACE_DEFINED__
#define __INetLanConnectionUiInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetLanConnectionUiInfo, 0xc08956a6, 0x1cd3, 0x11d1, 0xb1,0xc5, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c08956a6-1cd3-11d1-b1c5-00805fc1270e")
INetLanConnectionUiInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDeviceGuid(
        GUID *pguid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetLanConnectionUiInfo, 0xc08956a6, 0x1cd3, 0x11d1, 0xb1,0xc5, 0x00,0x80,0x5f,0xc1,0x27,0x0e)
#endif
#else
typedef struct INetLanConnectionUiInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetLanConnectionUiInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetLanConnectionUiInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetLanConnectionUiInfo *This);

    /*** INetLanConnectionUiInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDeviceGuid)(
        INetLanConnectionUiInfo *This,
        GUID *pguid);

    END_INTERFACE
} INetLanConnectionUiInfoVtbl;

interface INetLanConnectionUiInfo {
    CONST_VTBL INetLanConnectionUiInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetLanConnectionUiInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetLanConnectionUiInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetLanConnectionUiInfo_Release(This) (This)->lpVtbl->Release(This)
/*** INetLanConnectionUiInfo methods ***/
#define INetLanConnectionUiInfo_GetDeviceGuid(This,pguid) (This)->lpVtbl->GetDeviceGuid(This,pguid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetLanConnectionUiInfo_QueryInterface(INetLanConnectionUiInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetLanConnectionUiInfo_AddRef(INetLanConnectionUiInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetLanConnectionUiInfo_Release(INetLanConnectionUiInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** INetLanConnectionUiInfo methods ***/
static FORCEINLINE HRESULT INetLanConnectionUiInfo_GetDeviceGuid(INetLanConnectionUiInfo* This,GUID *pguid) {
    return This->lpVtbl->GetDeviceGuid(This,pguid);
}
#endif
#endif

#endif


#endif  /* __INetLanConnectionUiInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetRasConnectionIpUiInfo interface
 */
#ifndef __INetRasConnectionIpUiInfo_INTERFACE_DEFINED__
#define __INetRasConnectionIpUiInfo_INTERFACE_DEFINED__

typedef enum tagRASCON_IPUI_FLAGS {
    RCUIF_VPN = 0x1,
    RCUIF_DEMAND_DIAL = 0x2,
    RCUIF_NOT_ADMIN = 0x4,
    RCUIF_USE_IPv4_STATICADDRESS = 0x8,
    RCUIF_USE_IPv4_NAME_SERVERS = 0x10,
    RCUIF_USE_IPv4_REMOTE_GATEWAY = 0x20,
    RCUIF_USE_IPv4_EXPLICIT_METRIC = 0x40,
    RCUIF_USE_HEADER_COMPRESSION = 0x80,
    RCUIF_USE_DISABLE_REGISTER_DNS = 0x100,
    RCUIF_USE_PRIVATE_DNS_SUFFIX = 0x200,
    RCUIF_ENABLE_NBT = 0x400,
    RCUIF_USE_IPv6_STATICADDRESS = 0x800,
    RCUIF_USE_IPv6_NAME_SERVERS = 0x1000,
    RCUIF_USE_IPv6_REMOTE_GATEWAY = 0x2000,
    RCUIF_USE_IPv6_EXPLICIT_METRIC = 0x4000,
    RCUIF_DISABLE_CLASS_BASED_ROUTE = 0x8000
} RASCON_UIINFO_FLAGS;
typedef struct tagRASCON_IPUI {
    GUID guidConnection;
    WINBOOL fIPv6Cfg;
    DWORD dwFlags;
    WCHAR pszwIpAddr[16];
    WCHAR pszwDnsAddr[16];
    WCHAR pszwDns2Addr[16];
    WCHAR pszwWinsAddr[16];
    WCHAR pszwWins2Addr[16];
    WCHAR pszwDnsSuffix[256];
    WCHAR pszwIpv6Addr[65];
    DWORD dwIpv6PrefixLength;
    WCHAR pszwIpv6DnsAddr[65];
    WCHAR pszwIpv6Dns2Addr[65];
    DWORD dwIPv4InfMetric;
    DWORD dwIPv6InfMetric;
} RASCON_IPUI;
DEFINE_GUID(IID_INetRasConnectionIpUiInfo, 0xfaedcf58, 0x31fe, 0x11d1, 0xaa,0xd2, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("faedcf58-31fe-11d1-aad2-00805fc1270e")
INetRasConnectionIpUiInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetUiInfo(
        RASCON_IPUI *pInfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetRasConnectionIpUiInfo, 0xfaedcf58, 0x31fe, 0x11d1, 0xaa,0xd2, 0x00,0x80,0x5f,0xc1,0x27,0x0e)
#endif
#else
typedef struct INetRasConnectionIpUiInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetRasConnectionIpUiInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetRasConnectionIpUiInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetRasConnectionIpUiInfo *This);

    /*** INetRasConnectionIpUiInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUiInfo)(
        INetRasConnectionIpUiInfo *This,
        RASCON_IPUI *pInfo);

    END_INTERFACE
} INetRasConnectionIpUiInfoVtbl;

interface INetRasConnectionIpUiInfo {
    CONST_VTBL INetRasConnectionIpUiInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetRasConnectionIpUiInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetRasConnectionIpUiInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetRasConnectionIpUiInfo_Release(This) (This)->lpVtbl->Release(This)
/*** INetRasConnectionIpUiInfo methods ***/
#define INetRasConnectionIpUiInfo_GetUiInfo(This,pInfo) (This)->lpVtbl->GetUiInfo(This,pInfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetRasConnectionIpUiInfo_QueryInterface(INetRasConnectionIpUiInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetRasConnectionIpUiInfo_AddRef(INetRasConnectionIpUiInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetRasConnectionIpUiInfo_Release(INetRasConnectionIpUiInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** INetRasConnectionIpUiInfo methods ***/
static FORCEINLINE HRESULT INetRasConnectionIpUiInfo_GetUiInfo(INetRasConnectionIpUiInfo* This,RASCON_IPUI *pInfo) {
    return This->lpVtbl->GetUiInfo(This,pInfo);
}
#endif
#endif

#endif


#endif  /* __INetRasConnectionIpUiInfo_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentSysPrep interface
 */
#ifndef __INetCfgComponentSysPrep_INTERFACE_DEFINED__
#define __INetCfgComponentSysPrep_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgComponentSysPrep, 0xc0e8ae9a, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae9a-306e-11d1-aacf-00805fc1270e")
INetCfgComponentSysPrep : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SaveAdapterParameters(
        INetCfgSysPrep *pncsp,
        LPCWSTR pszwAnswerSections,
        GUID *pAdapterInstanceGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE RestoreAdapterParameters(
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSection,
        GUID *pAdapterInstanceGuid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INetCfgComponentSysPrep, 0xc0e8ae9a, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e)
#endif
#else
typedef struct INetCfgComponentSysPrepVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INetCfgComponentSysPrep *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INetCfgComponentSysPrep *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INetCfgComponentSysPrep *This);

    /*** INetCfgComponentSysPrep methods ***/
    HRESULT (STDMETHODCALLTYPE *SaveAdapterParameters)(
        INetCfgComponentSysPrep *This,
        INetCfgSysPrep *pncsp,
        LPCWSTR pszwAnswerSections,
        GUID *pAdapterInstanceGuid);

    HRESULT (STDMETHODCALLTYPE *RestoreAdapterParameters)(
        INetCfgComponentSysPrep *This,
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSection,
        GUID *pAdapterInstanceGuid);

    END_INTERFACE
} INetCfgComponentSysPrepVtbl;

interface INetCfgComponentSysPrep {
    CONST_VTBL INetCfgComponentSysPrepVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentSysPrep_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentSysPrep_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentSysPrep_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentSysPrep methods ***/
#define INetCfgComponentSysPrep_SaveAdapterParameters(This,pncsp,pszwAnswerSections,pAdapterInstanceGuid) (This)->lpVtbl->SaveAdapterParameters(This,pncsp,pszwAnswerSections,pAdapterInstanceGuid)
#define INetCfgComponentSysPrep_RestoreAdapterParameters(This,pszwAnswerFile,pszwAnswerSection,pAdapterInstanceGuid) (This)->lpVtbl->RestoreAdapterParameters(This,pszwAnswerFile,pszwAnswerSection,pAdapterInstanceGuid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentSysPrep_QueryInterface(INetCfgComponentSysPrep* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentSysPrep_AddRef(INetCfgComponentSysPrep* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentSysPrep_Release(INetCfgComponentSysPrep* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentSysPrep methods ***/
static FORCEINLINE HRESULT INetCfgComponentSysPrep_SaveAdapterParameters(INetCfgComponentSysPrep* This,INetCfgSysPrep *pncsp,LPCWSTR pszwAnswerSections,GUID *pAdapterInstanceGuid) {
    return This->lpVtbl->SaveAdapterParameters(This,pncsp,pszwAnswerSections,pAdapterInstanceGuid);
}
static FORCEINLINE HRESULT INetCfgComponentSysPrep_RestoreAdapterParameters(INetCfgComponentSysPrep* This,LPCWSTR pszwAnswerFile,LPCWSTR pszwAnswerSection,GUID *pAdapterInstanceGuid) {
    return This->lpVtbl->RestoreAdapterParameters(This,pszwAnswerFile,pszwAnswerSection,pAdapterInstanceGuid);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentSysPrep_INTERFACE_DEFINED__ */

#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __netcfgn_h__ */
