/*** Autogenerated by WIDL 6.0-rc3 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__ */
