/*** Autogenerated by WIDL 6.0-rc1 from include/netcfgx.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 __netcfgx_h__
#define __netcfgx_h__

/* Forward declarations */

#ifndef __IEnumNetCfgBindingInterface_FWD_DEFINED__
#define __IEnumNetCfgBindingInterface_FWD_DEFINED__
typedef interface IEnumNetCfgBindingInterface IEnumNetCfgBindingInterface;
#ifdef __cplusplus
interface IEnumNetCfgBindingInterface;
#endif /* __cplusplus */
#endif

#ifndef __IEnumNetCfgBindingPath_FWD_DEFINED__
#define __IEnumNetCfgBindingPath_FWD_DEFINED__
typedef interface IEnumNetCfgBindingPath IEnumNetCfgBindingPath;
#ifdef __cplusplus
interface IEnumNetCfgBindingPath;
#endif /* __cplusplus */
#endif

#ifndef __IEnumNetCfgComponent_FWD_DEFINED__
#define __IEnumNetCfgComponent_FWD_DEFINED__
typedef interface IEnumNetCfgComponent IEnumNetCfgComponent;
#ifdef __cplusplus
interface IEnumNetCfgComponent;
#endif /* __cplusplus */
#endif

#ifndef __INetCfg_FWD_DEFINED__
#define __INetCfg_FWD_DEFINED__
typedef interface INetCfg INetCfg;
#ifdef __cplusplus
interface INetCfg;
#endif /* __cplusplus */
#endif

#ifndef __CNetCfg_FWD_DEFINED__
#define __CNetCfg_FWD_DEFINED__
#ifdef __cplusplus
typedef class CNetCfg CNetCfg;
#else
typedef struct CNetCfg CNetCfg;
#endif /* defined __cplusplus */
#endif /* defined __CNetCfg_FWD_DEFINED__ */

#ifndef __INetCfgLock_FWD_DEFINED__
#define __INetCfgLock_FWD_DEFINED__
typedef interface INetCfgLock INetCfgLock;
#ifdef __cplusplus
interface INetCfgLock;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgBindingInterface_FWD_DEFINED__
#define __INetCfgBindingInterface_FWD_DEFINED__
typedef interface INetCfgBindingInterface INetCfgBindingInterface;
#ifdef __cplusplus
interface INetCfgBindingInterface;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgBindingPath_FWD_DEFINED__
#define __INetCfgBindingPath_FWD_DEFINED__
typedef interface INetCfgBindingPath INetCfgBindingPath;
#ifdef __cplusplus
interface INetCfgBindingPath;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgClass_FWD_DEFINED__
#define __INetCfgClass_FWD_DEFINED__
typedef interface INetCfgClass INetCfgClass;
#ifdef __cplusplus
interface INetCfgClass;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgClassSetup_FWD_DEFINED__
#define __INetCfgClassSetup_FWD_DEFINED__
typedef interface INetCfgClassSetup INetCfgClassSetup;
#ifdef __cplusplus
interface INetCfgClassSetup;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgClassSetup2_FWD_DEFINED__
#define __INetCfgClassSetup2_FWD_DEFINED__
typedef interface INetCfgClassSetup2 INetCfgClassSetup2;
#ifdef __cplusplus
interface INetCfgClassSetup2;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponent_FWD_DEFINED__
#define __INetCfgComponent_FWD_DEFINED__
typedef interface INetCfgComponent INetCfgComponent;
#ifdef __cplusplus
interface INetCfgComponent;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentBindings_FWD_DEFINED__
#define __INetCfgComponentBindings_FWD_DEFINED__
typedef interface INetCfgComponentBindings INetCfgComponentBindings;
#ifdef __cplusplus
interface INetCfgComponentBindings;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgSysPrep_FWD_DEFINED__
#define __INetCfgSysPrep_FWD_DEFINED__
typedef interface INetCfgSysPrep INetCfgSysPrep;
#ifdef __cplusplus
interface INetCfgSysPrep;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

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

#define NETCFG_E_ALREADY_INITIALIZED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa020)
#define NETCFG_E_NOT_INITIALIZED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa021)
#define NETCFG_E_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa022)
#define NETCFG_E_NO_WRITE_LOCK MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa024)
#define NETCFG_E_NEED_REBOOT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa025)
#define NETCFG_E_ACTIVE_RAS_CONNECTIONS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa026)
#define NETCFG_E_ADAPTER_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa027)
#define NETCFG_E_COMPONENT_REMOVED_PENDING_REBOOT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa028)
#define NETCFG_E_MAX_FILTER_LIMIT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa029)
#define NETCFG_E_VMSWITCH_ACTIVE_OVER_ADAPTER MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa02a)
#define NETCFG_E_DUPLICATE_INSTANCEID MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0xa02b)

#define NETCFG_S_REBOOT MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xa020)
#define NETCFG_S_DISABLE_QUERY MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xa022)
#define NETCFG_S_STILL_REFERENCED MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xa023)
#define NETCFG_S_CAUSED_SETUP_CHANGE MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xa024)
#define NETCFG_S_COMMIT_NOW MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0xa025)

#define NETCFG_CLIENT_CID_MS_MSClient TEXT("ms_msclient")
#define NETCFG_SERVICE_CID_MS_SERVER TEXT("ms_server")
#define NETCFG_SERVICE_CID_MS_NETBIOS TEXT("ms_netbios")
#define NETCFG_SERVICE_CID_MS_PSCHED TEXT("ms_pschedpc")
#define NETCFG_SERVICE_CID_MS_WLBS TEXT("ms_wlbs")
#define NETCFG_TRANS_CID_MS_APPLETALK TEXT("ms_appletalk")
#define NETCFG_TRANS_CID_MS_NETBEUI TEXT("ms_netbeui")
#define NETCFG_TRANS_CID_MS_NETMON TEXT("ms_netmon")
#define NETCFG_TRANS_CID_MS_NWIPX TEXT("ms_nwipx")
#define NETCFG_TRANS_CID_MS_NWSPX TEXT("ms_nwspx")
#define NETCFG_TRANS_CID_MS_TCPIP TEXT("ms_tcpip")

#ifndef __IEnumNetCfgBindingInterface_FWD_DEFINED__
#define __IEnumNetCfgBindingInterface_FWD_DEFINED__
typedef interface IEnumNetCfgBindingInterface IEnumNetCfgBindingInterface;
#ifdef __cplusplus
interface IEnumNetCfgBindingInterface;
#endif /* __cplusplus */
#endif

#ifndef __IEnumNetCfgBindingPath_FWD_DEFINED__
#define __IEnumNetCfgBindingPath_FWD_DEFINED__
typedef interface IEnumNetCfgBindingPath IEnumNetCfgBindingPath;
#ifdef __cplusplus
interface IEnumNetCfgBindingPath;
#endif /* __cplusplus */
#endif

#ifndef __IEnumNetCfgComponent_FWD_DEFINED__
#define __IEnumNetCfgComponent_FWD_DEFINED__
typedef interface IEnumNetCfgComponent IEnumNetCfgComponent;
#ifdef __cplusplus
interface IEnumNetCfgComponent;
#endif /* __cplusplus */
#endif

#ifndef __INetCfg_FWD_DEFINED__
#define __INetCfg_FWD_DEFINED__
typedef interface INetCfg INetCfg;
#ifdef __cplusplus
interface INetCfg;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgProperties_FWD_DEFINED__
#define __INetCfgProperties_FWD_DEFINED__
typedef interface INetCfgProperties INetCfgProperties;
#ifdef __cplusplus
interface INetCfgProperties;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgLock_FWD_DEFINED__
#define __INetCfgLock_FWD_DEFINED__
typedef interface INetCfgLock INetCfgLock;
#ifdef __cplusplus
interface INetCfgLock;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgBindingInterface_FWD_DEFINED__
#define __INetCfgBindingInterface_FWD_DEFINED__
typedef interface INetCfgBindingInterface INetCfgBindingInterface;
#ifdef __cplusplus
interface INetCfgBindingInterface;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgBindingPath_FWD_DEFINED__
#define __INetCfgBindingPath_FWD_DEFINED__
typedef interface INetCfgBindingPath INetCfgBindingPath;
#ifdef __cplusplus
interface INetCfgBindingPath;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponentBindings_FWD_DEFINED__
#define __INetCfgComponentBindings_FWD_DEFINED__
typedef interface INetCfgComponentBindings INetCfgComponentBindings;
#ifdef __cplusplus
interface INetCfgComponentBindings;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgBindingPath_FWD_DEFINED__
#define __INetCfgBindingPath_FWD_DEFINED__
typedef interface INetCfgBindingPath INetCfgBindingPath;
#ifdef __cplusplus
interface INetCfgBindingPath;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgClass_FWD_DEFINED__
#define __INetCfgClass_FWD_DEFINED__
typedef interface INetCfgClass INetCfgClass;
#ifdef __cplusplus
interface INetCfgClass;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgComponent_FWD_DEFINED__
#define __INetCfgComponent_FWD_DEFINED__
typedef interface INetCfgComponent INetCfgComponent;
#ifdef __cplusplus
interface INetCfgComponent;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgIdentification_FWD_DEFINED__
#define __INetCfgIdentification_FWD_DEFINED__
typedef interface INetCfgIdentification INetCfgIdentification;
#ifdef __cplusplus
interface INetCfgIdentification;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgClassSetup_FWD_DEFINED__
#define __INetCfgClassSetup_FWD_DEFINED__
typedef interface INetCfgClassSetup INetCfgClassSetup;
#ifdef __cplusplus
interface INetCfgClassSetup;
#endif /* __cplusplus */
#endif

#ifndef __INetCfgClassSetup2_FWD_DEFINED__
#define __INetCfgClassSetup2_FWD_DEFINED__
typedef interface INetCfgClassSetup2 INetCfgClassSetup2;
#ifdef __cplusplus
interface INetCfgClassSetup2;
#endif /* __cplusplus */
#endif


/*****************************************************************************
 * IEnumNetCfgBindingInterface interface
 */
#ifndef __IEnumNetCfgBindingInterface_INTERFACE_DEFINED__
#define __IEnumNetCfgBindingInterface_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumNetCfgBindingInterface, 0xc0e8ae90, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae90-306e-11d1-aacf-00805fc1270e")
IEnumNetCfgBindingInterface : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        INetCfgBindingInterface **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumNetCfgBindingInterface **ppenum) = 0;

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

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

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

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

    /*** IEnumNetCfgBindingInterface methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumNetCfgBindingInterface *This,
        ULONG celt,
        INetCfgBindingInterface **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumNetCfgBindingInterface *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumNetCfgBindingInterface *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumNetCfgBindingInterface *This,
        IEnumNetCfgBindingInterface **ppenum);

    END_INTERFACE
} IEnumNetCfgBindingInterfaceVtbl;

interface IEnumNetCfgBindingInterface {
    CONST_VTBL IEnumNetCfgBindingInterfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumNetCfgBindingInterface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumNetCfgBindingInterface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumNetCfgBindingInterface_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumNetCfgBindingInterface methods ***/
#define IEnumNetCfgBindingInterface_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumNetCfgBindingInterface_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumNetCfgBindingInterface_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumNetCfgBindingInterface_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumNetCfgBindingInterface_QueryInterface(IEnumNetCfgBindingInterface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumNetCfgBindingInterface_AddRef(IEnumNetCfgBindingInterface* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumNetCfgBindingInterface_Release(IEnumNetCfgBindingInterface* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumNetCfgBindingInterface methods ***/
static FORCEINLINE HRESULT IEnumNetCfgBindingInterface_Next(IEnumNetCfgBindingInterface* This,ULONG celt,INetCfgBindingInterface **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumNetCfgBindingInterface_Skip(IEnumNetCfgBindingInterface* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumNetCfgBindingInterface_Reset(IEnumNetCfgBindingInterface* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumNetCfgBindingInterface_Clone(IEnumNetCfgBindingInterface* This,IEnumNetCfgBindingInterface **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif


#endif  /* __IEnumNetCfgBindingInterface_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumNetCfgBindingPath interface
 */
#ifndef __IEnumNetCfgBindingPath_INTERFACE_DEFINED__
#define __IEnumNetCfgBindingPath_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumNetCfgBindingPath, 0xc0e8ae91, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae91-306e-11d1-aacf-00805fc1270e")
IEnumNetCfgBindingPath : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        INetCfgBindingPath **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumNetCfgBindingPath **ppenum) = 0;

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

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

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

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

    /*** IEnumNetCfgBindingPath methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumNetCfgBindingPath *This,
        ULONG celt,
        INetCfgBindingPath **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumNetCfgBindingPath *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumNetCfgBindingPath *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumNetCfgBindingPath *This,
        IEnumNetCfgBindingPath **ppenum);

    END_INTERFACE
} IEnumNetCfgBindingPathVtbl;

interface IEnumNetCfgBindingPath {
    CONST_VTBL IEnumNetCfgBindingPathVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumNetCfgBindingPath_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumNetCfgBindingPath_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumNetCfgBindingPath_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumNetCfgBindingPath methods ***/
#define IEnumNetCfgBindingPath_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumNetCfgBindingPath_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumNetCfgBindingPath_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumNetCfgBindingPath_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumNetCfgBindingPath_QueryInterface(IEnumNetCfgBindingPath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumNetCfgBindingPath_AddRef(IEnumNetCfgBindingPath* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumNetCfgBindingPath_Release(IEnumNetCfgBindingPath* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumNetCfgBindingPath methods ***/
static FORCEINLINE HRESULT IEnumNetCfgBindingPath_Next(IEnumNetCfgBindingPath* This,ULONG celt,INetCfgBindingPath **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumNetCfgBindingPath_Skip(IEnumNetCfgBindingPath* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumNetCfgBindingPath_Reset(IEnumNetCfgBindingPath* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumNetCfgBindingPath_Clone(IEnumNetCfgBindingPath* This,IEnumNetCfgBindingPath **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif


#endif  /* __IEnumNetCfgBindingPath_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IEnumNetCfgComponent interface
 */
#ifndef __IEnumNetCfgComponent_INTERFACE_DEFINED__
#define __IEnumNetCfgComponent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumNetCfgComponent, 0xc0e8ae92, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae92-306e-11d1-aacf-00805fc1270e")
IEnumNetCfgComponent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        INetCfgComponent **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumNetCfgComponent **ppenum) = 0;

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

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

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

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

    /*** IEnumNetCfgComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumNetCfgComponent *This,
        ULONG celt,
        INetCfgComponent **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumNetCfgComponent *This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumNetCfgComponent *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumNetCfgComponent *This,
        IEnumNetCfgComponent **ppenum);

    END_INTERFACE
} IEnumNetCfgComponentVtbl;

interface IEnumNetCfgComponent {
    CONST_VTBL IEnumNetCfgComponentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumNetCfgComponent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumNetCfgComponent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumNetCfgComponent_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumNetCfgComponent methods ***/
#define IEnumNetCfgComponent_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumNetCfgComponent_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumNetCfgComponent_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumNetCfgComponent_Clone(This,ppenum) (This)->lpVtbl->Clone(This,ppenum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumNetCfgComponent_QueryInterface(IEnumNetCfgComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumNetCfgComponent_AddRef(IEnumNetCfgComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumNetCfgComponent_Release(IEnumNetCfgComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumNetCfgComponent methods ***/
static FORCEINLINE HRESULT IEnumNetCfgComponent_Next(IEnumNetCfgComponent* This,ULONG celt,INetCfgComponent **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumNetCfgComponent_Skip(IEnumNetCfgComponent* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumNetCfgComponent_Reset(IEnumNetCfgComponent* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumNetCfgComponent_Clone(IEnumNetCfgComponent* This,IEnumNetCfgComponent **ppenum) {
    return This->lpVtbl->Clone(This,ppenum);
}
#endif
#endif

#endif


#endif  /* __IEnumNetCfgComponent_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfg interface
 */
#ifndef __INetCfg_INTERFACE_DEFINED__
#define __INetCfg_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfg, 0xc0e8ae93, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae93-306e-11d1-aacf-00805fc1270e")
INetCfg : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        PVOID pvReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Uninitialize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Apply(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumComponents(
        const GUID *pguidClass,
        IEnumNetCfgComponent **ppenumComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindComponent(
        LPCWSTR pszwInfId,
        INetCfgComponent **pComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryNetCfgClass(
        const GUID *pguidClass,
        REFIID riid,
        void **ppvObject) = 0;

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

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

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

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

    /*** INetCfg methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        INetCfg *This,
        PVOID pvReserved);

    HRESULT (STDMETHODCALLTYPE *Uninitialize)(
        INetCfg *This);

    HRESULT (STDMETHODCALLTYPE *Apply)(
        INetCfg *This);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        INetCfg *This);

    HRESULT (STDMETHODCALLTYPE *EnumComponents)(
        INetCfg *This,
        const GUID *pguidClass,
        IEnumNetCfgComponent **ppenumComponent);

    HRESULT (STDMETHODCALLTYPE *FindComponent)(
        INetCfg *This,
        LPCWSTR pszwInfId,
        INetCfgComponent **pComponent);

    HRESULT (STDMETHODCALLTYPE *QueryNetCfgClass)(
        INetCfg *This,
        const GUID *pguidClass,
        REFIID riid,
        void **ppvObject);

    END_INTERFACE
} INetCfgVtbl;

interface INetCfg {
    CONST_VTBL INetCfgVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfg_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfg_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfg_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfg methods ***/
#define INetCfg_Initialize(This,pvReserved) (This)->lpVtbl->Initialize(This,pvReserved)
#define INetCfg_Uninitialize(This) (This)->lpVtbl->Uninitialize(This)
#define INetCfg_Apply(This) (This)->lpVtbl->Apply(This)
#define INetCfg_Cancel(This) (This)->lpVtbl->Cancel(This)
#define INetCfg_EnumComponents(This,pguidClass,ppenumComponent) (This)->lpVtbl->EnumComponents(This,pguidClass,ppenumComponent)
#define INetCfg_FindComponent(This,pszwInfId,pComponent) (This)->lpVtbl->FindComponent(This,pszwInfId,pComponent)
#define INetCfg_QueryNetCfgClass(This,pguidClass,riid,ppvObject) (This)->lpVtbl->QueryNetCfgClass(This,pguidClass,riid,ppvObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfg_QueryInterface(INetCfg* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfg_AddRef(INetCfg* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfg_Release(INetCfg* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfg methods ***/
static FORCEINLINE HRESULT INetCfg_Initialize(INetCfg* This,PVOID pvReserved) {
    return This->lpVtbl->Initialize(This,pvReserved);
}
static FORCEINLINE HRESULT INetCfg_Uninitialize(INetCfg* This) {
    return This->lpVtbl->Uninitialize(This);
}
static FORCEINLINE HRESULT INetCfg_Apply(INetCfg* This) {
    return This->lpVtbl->Apply(This);
}
static FORCEINLINE HRESULT INetCfg_Cancel(INetCfg* This) {
    return This->lpVtbl->Cancel(This);
}
static FORCEINLINE HRESULT INetCfg_EnumComponents(INetCfg* This,const GUID *pguidClass,IEnumNetCfgComponent **ppenumComponent) {
    return This->lpVtbl->EnumComponents(This,pguidClass,ppenumComponent);
}
static FORCEINLINE HRESULT INetCfg_FindComponent(INetCfg* This,LPCWSTR pszwInfId,INetCfgComponent **pComponent) {
    return This->lpVtbl->FindComponent(This,pszwInfId,pComponent);
}
static FORCEINLINE HRESULT INetCfg_QueryNetCfgClass(INetCfg* This,const GUID *pguidClass,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryNetCfgClass(This,pguidClass,riid,ppvObject);
}
#endif
#endif

#endif


#endif  /* __INetCfg_INTERFACE_DEFINED__ */


/*****************************************************************************
 * CNetCfg coclass
 */

DEFINE_GUID(CLSID_CNetCfg, 0x5b035261, 0x40f9, 0x11d1, 0xaa,0xec, 0x00,0x80,0x5f,0xc1,0x27,0x0e);

#ifdef __cplusplus
class DECLSPEC_UUID("5b035261-40f9-11d1-aaec-00805fc1270e") CNetCfg;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CNetCfg, 0x5b035261, 0x40f9, 0x11d1, 0xaa,0xec, 0x00,0x80,0x5f,0xc1,0x27,0x0e)
#endif
#endif


/*****************************************************************************
 * INetCfgLock interface
 */
#ifndef __INetCfgLock_INTERFACE_DEFINED__
#define __INetCfgLock_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgLock, 0xc0e8ae9f, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae9f-306e-11d1-aacf-00805fc1270e")
INetCfgLock : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AcquireWriteLock(
        DWORD cmsTimeout,
        LPCWSTR pszwClientDescription,
        LPWSTR *ppszwClientDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseWriteLock(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsWriteLocked(
        LPWSTR *ppszwClientDescription) = 0;

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

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

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

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

    /*** INetCfgLock methods ***/
    HRESULT (STDMETHODCALLTYPE *AcquireWriteLock)(
        INetCfgLock *This,
        DWORD cmsTimeout,
        LPCWSTR pszwClientDescription,
        LPWSTR *ppszwClientDescription);

    HRESULT (STDMETHODCALLTYPE *ReleaseWriteLock)(
        INetCfgLock *This);

    HRESULT (STDMETHODCALLTYPE *IsWriteLocked)(
        INetCfgLock *This,
        LPWSTR *ppszwClientDescription);

    END_INTERFACE
} INetCfgLockVtbl;

interface INetCfgLock {
    CONST_VTBL INetCfgLockVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgLock_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgLock_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgLock_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgLock methods ***/
#define INetCfgLock_AcquireWriteLock(This,cmsTimeout,pszwClientDescription,ppszwClientDescription) (This)->lpVtbl->AcquireWriteLock(This,cmsTimeout,pszwClientDescription,ppszwClientDescription)
#define INetCfgLock_ReleaseWriteLock(This) (This)->lpVtbl->ReleaseWriteLock(This)
#define INetCfgLock_IsWriteLocked(This,ppszwClientDescription) (This)->lpVtbl->IsWriteLocked(This,ppszwClientDescription)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgLock_QueryInterface(INetCfgLock* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgLock_AddRef(INetCfgLock* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgLock_Release(INetCfgLock* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgLock methods ***/
static FORCEINLINE HRESULT INetCfgLock_AcquireWriteLock(INetCfgLock* This,DWORD cmsTimeout,LPCWSTR pszwClientDescription,LPWSTR *ppszwClientDescription) {
    return This->lpVtbl->AcquireWriteLock(This,cmsTimeout,pszwClientDescription,ppszwClientDescription);
}
static FORCEINLINE HRESULT INetCfgLock_ReleaseWriteLock(INetCfgLock* This) {
    return This->lpVtbl->ReleaseWriteLock(This);
}
static FORCEINLINE HRESULT INetCfgLock_IsWriteLocked(INetCfgLock* This,LPWSTR *ppszwClientDescription) {
    return This->lpVtbl->IsWriteLocked(This,ppszwClientDescription);
}
#endif
#endif

#endif


#endif  /* __INetCfgLock_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgBindingInterface interface
 */
#ifndef __INetCfgBindingInterface_INTERFACE_DEFINED__
#define __INetCfgBindingInterface_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgBindingInterface, 0xc0e8ae94, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae94-306e-11d1-aacf-00805fc1270e")
INetCfgBindingInterface : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetName(
        LPWSTR *ppszwInterfaceName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpperComponent(
        INetCfgComponent **ppnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLowerComponent(
        INetCfgComponent **ppnccItem) = 0;

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

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

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

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

    /*** INetCfgBindingInterface methods ***/
    HRESULT (STDMETHODCALLTYPE *GetName)(
        INetCfgBindingInterface *This,
        LPWSTR *ppszwInterfaceName);

    HRESULT (STDMETHODCALLTYPE *GetUpperComponent)(
        INetCfgBindingInterface *This,
        INetCfgComponent **ppnccItem);

    HRESULT (STDMETHODCALLTYPE *GetLowerComponent)(
        INetCfgBindingInterface *This,
        INetCfgComponent **ppnccItem);

    END_INTERFACE
} INetCfgBindingInterfaceVtbl;

interface INetCfgBindingInterface {
    CONST_VTBL INetCfgBindingInterfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgBindingInterface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgBindingInterface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgBindingInterface_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgBindingInterface methods ***/
#define INetCfgBindingInterface_GetName(This,ppszwInterfaceName) (This)->lpVtbl->GetName(This,ppszwInterfaceName)
#define INetCfgBindingInterface_GetUpperComponent(This,ppnccItem) (This)->lpVtbl->GetUpperComponent(This,ppnccItem)
#define INetCfgBindingInterface_GetLowerComponent(This,ppnccItem) (This)->lpVtbl->GetLowerComponent(This,ppnccItem)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgBindingInterface_QueryInterface(INetCfgBindingInterface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgBindingInterface_AddRef(INetCfgBindingInterface* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgBindingInterface_Release(INetCfgBindingInterface* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgBindingInterface methods ***/
static FORCEINLINE HRESULT INetCfgBindingInterface_GetName(INetCfgBindingInterface* This,LPWSTR *ppszwInterfaceName) {
    return This->lpVtbl->GetName(This,ppszwInterfaceName);
}
static FORCEINLINE HRESULT INetCfgBindingInterface_GetUpperComponent(INetCfgBindingInterface* This,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->GetUpperComponent(This,ppnccItem);
}
static FORCEINLINE HRESULT INetCfgBindingInterface_GetLowerComponent(INetCfgBindingInterface* This,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->GetLowerComponent(This,ppnccItem);
}
#endif
#endif

#endif


#endif  /* __INetCfgBindingInterface_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgBindingPath interface
 */
#ifndef __INetCfgBindingPath_INTERFACE_DEFINED__
#define __INetCfgBindingPath_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgBindingPath, 0xc0e8ae96, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae96-306e-11d1-aacf-00805fc1270e")
INetCfgBindingPath : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IsSamePathAs(
        INetCfgBindingPath *pPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSubPathOf(
        INetCfgBindingPath *pPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEnabled(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Enable(
        WINBOOL fEnable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPathToken(
        LPWSTR *ppszwPathToken) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        INetCfgComponent **ppComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDepth(
        ULONG *pcInterfaces) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumBindingInterfaces(
        IEnumNetCfgBindingInterface **ppenumInterface) = 0;

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

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

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

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

    /*** INetCfgBindingPath methods ***/
    HRESULT (STDMETHODCALLTYPE *IsSamePathAs)(
        INetCfgBindingPath *This,
        INetCfgBindingPath *pPath);

    HRESULT (STDMETHODCALLTYPE *IsSubPathOf)(
        INetCfgBindingPath *This,
        INetCfgBindingPath *pPath);

    HRESULT (STDMETHODCALLTYPE *IsEnabled)(
        INetCfgBindingPath *This);

    HRESULT (STDMETHODCALLTYPE *Enable)(
        INetCfgBindingPath *This,
        WINBOOL fEnable);

    HRESULT (STDMETHODCALLTYPE *GetPathToken)(
        INetCfgBindingPath *This,
        LPWSTR *ppszwPathToken);

    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        INetCfgBindingPath *This,
        INetCfgComponent **ppComponent);

    HRESULT (STDMETHODCALLTYPE *GetDepth)(
        INetCfgBindingPath *This,
        ULONG *pcInterfaces);

    HRESULT (STDMETHODCALLTYPE *EnumBindingInterfaces)(
        INetCfgBindingPath *This,
        IEnumNetCfgBindingInterface **ppenumInterface);

    END_INTERFACE
} INetCfgBindingPathVtbl;

interface INetCfgBindingPath {
    CONST_VTBL INetCfgBindingPathVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgBindingPath_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgBindingPath_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgBindingPath_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgBindingPath methods ***/
#define INetCfgBindingPath_IsSamePathAs(This,pPath) (This)->lpVtbl->IsSamePathAs(This,pPath)
#define INetCfgBindingPath_IsSubPathOf(This,pPath) (This)->lpVtbl->IsSubPathOf(This,pPath)
#define INetCfgBindingPath_IsEnabled(This) (This)->lpVtbl->IsEnabled(This)
#define INetCfgBindingPath_Enable(This,fEnable) (This)->lpVtbl->Enable(This,fEnable)
#define INetCfgBindingPath_GetPathToken(This,ppszwPathToken) (This)->lpVtbl->GetPathToken(This,ppszwPathToken)
#define INetCfgBindingPath_GetOwner(This,ppComponent) (This)->lpVtbl->GetOwner(This,ppComponent)
#define INetCfgBindingPath_GetDepth(This,pcInterfaces) (This)->lpVtbl->GetDepth(This,pcInterfaces)
#define INetCfgBindingPath_EnumBindingInterfaces(This,ppenumInterface) (This)->lpVtbl->EnumBindingInterfaces(This,ppenumInterface)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgBindingPath_QueryInterface(INetCfgBindingPath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgBindingPath_AddRef(INetCfgBindingPath* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgBindingPath_Release(INetCfgBindingPath* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgBindingPath methods ***/
static FORCEINLINE HRESULT INetCfgBindingPath_IsSamePathAs(INetCfgBindingPath* This,INetCfgBindingPath *pPath) {
    return This->lpVtbl->IsSamePathAs(This,pPath);
}
static FORCEINLINE HRESULT INetCfgBindingPath_IsSubPathOf(INetCfgBindingPath* This,INetCfgBindingPath *pPath) {
    return This->lpVtbl->IsSubPathOf(This,pPath);
}
static FORCEINLINE HRESULT INetCfgBindingPath_IsEnabled(INetCfgBindingPath* This) {
    return This->lpVtbl->IsEnabled(This);
}
static FORCEINLINE HRESULT INetCfgBindingPath_Enable(INetCfgBindingPath* This,WINBOOL fEnable) {
    return This->lpVtbl->Enable(This,fEnable);
}
static FORCEINLINE HRESULT INetCfgBindingPath_GetPathToken(INetCfgBindingPath* This,LPWSTR *ppszwPathToken) {
    return This->lpVtbl->GetPathToken(This,ppszwPathToken);
}
static FORCEINLINE HRESULT INetCfgBindingPath_GetOwner(INetCfgBindingPath* This,INetCfgComponent **ppComponent) {
    return This->lpVtbl->GetOwner(This,ppComponent);
}
static FORCEINLINE HRESULT INetCfgBindingPath_GetDepth(INetCfgBindingPath* This,ULONG *pcInterfaces) {
    return This->lpVtbl->GetDepth(This,pcInterfaces);
}
static FORCEINLINE HRESULT INetCfgBindingPath_EnumBindingInterfaces(INetCfgBindingPath* This,IEnumNetCfgBindingInterface **ppenumInterface) {
    return This->lpVtbl->EnumBindingInterfaces(This,ppenumInterface);
}
#endif
#endif

#endif


#endif  /* __INetCfgBindingPath_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgClass interface
 */
#ifndef __INetCfgClass_INTERFACE_DEFINED__
#define __INetCfgClass_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgClass, 0xc0e8ae97, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae97-306e-11d1-aacf-00805fc1270e")
INetCfgClass : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FindComponent(
        LPCWSTR pszwInfId,
        INetCfgComponent **ppnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumComponents(
        IEnumNetCfgComponent **ppenumComponent) = 0;

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

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

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

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

    /*** INetCfgClass methods ***/
    HRESULT (STDMETHODCALLTYPE *FindComponent)(
        INetCfgClass *This,
        LPCWSTR pszwInfId,
        INetCfgComponent **ppnccItem);

    HRESULT (STDMETHODCALLTYPE *EnumComponents)(
        INetCfgClass *This,
        IEnumNetCfgComponent **ppenumComponent);

    END_INTERFACE
} INetCfgClassVtbl;

interface INetCfgClass {
    CONST_VTBL INetCfgClassVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgClass_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgClass_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgClass_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgClass methods ***/
#define INetCfgClass_FindComponent(This,pszwInfId,ppnccItem) (This)->lpVtbl->FindComponent(This,pszwInfId,ppnccItem)
#define INetCfgClass_EnumComponents(This,ppenumComponent) (This)->lpVtbl->EnumComponents(This,ppenumComponent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgClass_QueryInterface(INetCfgClass* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgClass_AddRef(INetCfgClass* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgClass_Release(INetCfgClass* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgClass methods ***/
static FORCEINLINE HRESULT INetCfgClass_FindComponent(INetCfgClass* This,LPCWSTR pszwInfId,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->FindComponent(This,pszwInfId,ppnccItem);
}
static FORCEINLINE HRESULT INetCfgClass_EnumComponents(INetCfgClass* This,IEnumNetCfgComponent **ppenumComponent) {
    return This->lpVtbl->EnumComponents(This,ppenumComponent);
}
#endif
#endif

#endif


#endif  /* __INetCfgClass_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgClassSetup interface
 */
#ifndef __INetCfgClassSetup_INTERFACE_DEFINED__
#define __INetCfgClassSetup_INTERFACE_DEFINED__

typedef enum tagOBO_TOKEN_TYPE {
    OBO_USER = 1,
    OBO_COMPONENT = 2,
    OBO_SOFTWARE = 3
} OBO_TOKEN_TYPE;
typedef struct tagOBO_TOKEN {
    OBO_TOKEN_TYPE Type;
    INetCfgComponent *pncc;
    LPCWSTR pszwManufacturer;
    LPCWSTR pszwProduct;
    LPCWSTR pszwDisplayName;
    WINBOOL fRegistered;
} OBO_TOKEN;
DEFINE_GUID(IID_INetCfgClassSetup, 0xc0e8ae9d, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae9d-306e-11d1-aacf-00805fc1270e")
INetCfgClassSetup : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SelectAndInstall(
        HWND hwndParent,
        OBO_TOKEN *pOboToken,
        INetCfgComponent **ppnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE Install(
        LPCWSTR pszwInfId,
        OBO_TOKEN *pOboToken,
        DWORD dwSetupFlags,
        DWORD dwUpgradeFromBuildNo,
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSections,
        INetCfgComponent **ppnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeInstall(
        INetCfgComponent *pComponent,
        OBO_TOKEN *pOboToken,
        LPWSTR *pmszwRefs) = 0;

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

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

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

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

    /*** INetCfgClassSetup methods ***/
    HRESULT (STDMETHODCALLTYPE *SelectAndInstall)(
        INetCfgClassSetup *This,
        HWND hwndParent,
        OBO_TOKEN *pOboToken,
        INetCfgComponent **ppnccItem);

    HRESULT (STDMETHODCALLTYPE *Install)(
        INetCfgClassSetup *This,
        LPCWSTR pszwInfId,
        OBO_TOKEN *pOboToken,
        DWORD dwSetupFlags,
        DWORD dwUpgradeFromBuildNo,
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSections,
        INetCfgComponent **ppnccItem);

    HRESULT (STDMETHODCALLTYPE *DeInstall)(
        INetCfgClassSetup *This,
        INetCfgComponent *pComponent,
        OBO_TOKEN *pOboToken,
        LPWSTR *pmszwRefs);

    END_INTERFACE
} INetCfgClassSetupVtbl;

interface INetCfgClassSetup {
    CONST_VTBL INetCfgClassSetupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgClassSetup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgClassSetup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgClassSetup_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgClassSetup methods ***/
#define INetCfgClassSetup_SelectAndInstall(This,hwndParent,pOboToken,ppnccItem) (This)->lpVtbl->SelectAndInstall(This,hwndParent,pOboToken,ppnccItem)
#define INetCfgClassSetup_Install(This,pszwInfId,pOboToken,dwSetupFlags,dwUpgradeFromBuildNo,pszwAnswerFile,pszwAnswerSections,ppnccItem) (This)->lpVtbl->Install(This,pszwInfId,pOboToken,dwSetupFlags,dwUpgradeFromBuildNo,pszwAnswerFile,pszwAnswerSections,ppnccItem)
#define INetCfgClassSetup_DeInstall(This,pComponent,pOboToken,pmszwRefs) (This)->lpVtbl->DeInstall(This,pComponent,pOboToken,pmszwRefs)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgClassSetup_QueryInterface(INetCfgClassSetup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgClassSetup_AddRef(INetCfgClassSetup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgClassSetup_Release(INetCfgClassSetup* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgClassSetup methods ***/
static FORCEINLINE HRESULT INetCfgClassSetup_SelectAndInstall(INetCfgClassSetup* This,HWND hwndParent,OBO_TOKEN *pOboToken,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->SelectAndInstall(This,hwndParent,pOboToken,ppnccItem);
}
static FORCEINLINE HRESULT INetCfgClassSetup_Install(INetCfgClassSetup* This,LPCWSTR pszwInfId,OBO_TOKEN *pOboToken,DWORD dwSetupFlags,DWORD dwUpgradeFromBuildNo,LPCWSTR pszwAnswerFile,LPCWSTR pszwAnswerSections,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->Install(This,pszwInfId,pOboToken,dwSetupFlags,dwUpgradeFromBuildNo,pszwAnswerFile,pszwAnswerSections,ppnccItem);
}
static FORCEINLINE HRESULT INetCfgClassSetup_DeInstall(INetCfgClassSetup* This,INetCfgComponent *pComponent,OBO_TOKEN *pOboToken,LPWSTR *pmszwRefs) {
    return This->lpVtbl->DeInstall(This,pComponent,pOboToken,pmszwRefs);
}
#endif
#endif

#endif


#endif  /* __INetCfgClassSetup_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgClassSetup2 interface
 */
#ifndef __INetCfgClassSetup2_INTERFACE_DEFINED__
#define __INetCfgClassSetup2_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgClassSetup2, 0xc0e8aea0, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8aea0-306e-11d1-aacf-00805fc1270e")
INetCfgClassSetup2 : public INetCfgClassSetup
{
    virtual HRESULT STDMETHODCALLTYPE UpdateNonEnumeratedComponent(
        INetCfgComponent *pIComp,
        DWORD dwSetupFlags,
        DWORD dwUpgradeFromBuildNo) = 0;

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

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

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

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

    /*** INetCfgClassSetup methods ***/
    HRESULT (STDMETHODCALLTYPE *SelectAndInstall)(
        INetCfgClassSetup2 *This,
        HWND hwndParent,
        OBO_TOKEN *pOboToken,
        INetCfgComponent **ppnccItem);

    HRESULT (STDMETHODCALLTYPE *Install)(
        INetCfgClassSetup2 *This,
        LPCWSTR pszwInfId,
        OBO_TOKEN *pOboToken,
        DWORD dwSetupFlags,
        DWORD dwUpgradeFromBuildNo,
        LPCWSTR pszwAnswerFile,
        LPCWSTR pszwAnswerSections,
        INetCfgComponent **ppnccItem);

    HRESULT (STDMETHODCALLTYPE *DeInstall)(
        INetCfgClassSetup2 *This,
        INetCfgComponent *pComponent,
        OBO_TOKEN *pOboToken,
        LPWSTR *pmszwRefs);

    /*** INetCfgClassSetup2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UpdateNonEnumeratedComponent)(
        INetCfgClassSetup2 *This,
        INetCfgComponent *pIComp,
        DWORD dwSetupFlags,
        DWORD dwUpgradeFromBuildNo);

    END_INTERFACE
} INetCfgClassSetup2Vtbl;

interface INetCfgClassSetup2 {
    CONST_VTBL INetCfgClassSetup2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgClassSetup2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgClassSetup2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgClassSetup2_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgClassSetup methods ***/
#define INetCfgClassSetup2_SelectAndInstall(This,hwndParent,pOboToken,ppnccItem) (This)->lpVtbl->SelectAndInstall(This,hwndParent,pOboToken,ppnccItem)
#define INetCfgClassSetup2_Install(This,pszwInfId,pOboToken,dwSetupFlags,dwUpgradeFromBuildNo,pszwAnswerFile,pszwAnswerSections,ppnccItem) (This)->lpVtbl->Install(This,pszwInfId,pOboToken,dwSetupFlags,dwUpgradeFromBuildNo,pszwAnswerFile,pszwAnswerSections,ppnccItem)
#define INetCfgClassSetup2_DeInstall(This,pComponent,pOboToken,pmszwRefs) (This)->lpVtbl->DeInstall(This,pComponent,pOboToken,pmszwRefs)
/*** INetCfgClassSetup2 methods ***/
#define INetCfgClassSetup2_UpdateNonEnumeratedComponent(This,pIComp,dwSetupFlags,dwUpgradeFromBuildNo) (This)->lpVtbl->UpdateNonEnumeratedComponent(This,pIComp,dwSetupFlags,dwUpgradeFromBuildNo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgClassSetup2_QueryInterface(INetCfgClassSetup2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgClassSetup2_AddRef(INetCfgClassSetup2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgClassSetup2_Release(INetCfgClassSetup2* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgClassSetup methods ***/
static FORCEINLINE HRESULT INetCfgClassSetup2_SelectAndInstall(INetCfgClassSetup2* This,HWND hwndParent,OBO_TOKEN *pOboToken,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->SelectAndInstall(This,hwndParent,pOboToken,ppnccItem);
}
static FORCEINLINE HRESULT INetCfgClassSetup2_Install(INetCfgClassSetup2* This,LPCWSTR pszwInfId,OBO_TOKEN *pOboToken,DWORD dwSetupFlags,DWORD dwUpgradeFromBuildNo,LPCWSTR pszwAnswerFile,LPCWSTR pszwAnswerSections,INetCfgComponent **ppnccItem) {
    return This->lpVtbl->Install(This,pszwInfId,pOboToken,dwSetupFlags,dwUpgradeFromBuildNo,pszwAnswerFile,pszwAnswerSections,ppnccItem);
}
static FORCEINLINE HRESULT INetCfgClassSetup2_DeInstall(INetCfgClassSetup2* This,INetCfgComponent *pComponent,OBO_TOKEN *pOboToken,LPWSTR *pmszwRefs) {
    return This->lpVtbl->DeInstall(This,pComponent,pOboToken,pmszwRefs);
}
/*** INetCfgClassSetup2 methods ***/
static FORCEINLINE HRESULT INetCfgClassSetup2_UpdateNonEnumeratedComponent(INetCfgClassSetup2* This,INetCfgComponent *pIComp,DWORD dwSetupFlags,DWORD dwUpgradeFromBuildNo) {
    return This->lpVtbl->UpdateNonEnumeratedComponent(This,pIComp,dwSetupFlags,dwUpgradeFromBuildNo);
}
#endif
#endif

#endif


#endif  /* __INetCfgClassSetup2_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponent interface
 */
#ifndef __INetCfgComponent_INTERFACE_DEFINED__
#define __INetCfgComponent_INTERFACE_DEFINED__

typedef enum tagCOMPONENT_CHARACTERISTICS {
    NCF_VIRTUAL = 0x1,
    NCF_SOFTWARE_ENUMERATED = 0x2,
    NCF_PHYSICAL = 0x4,
    NCF_HIDDEN = 0x8,
    NCF_NO_SERVICE = 0x10,
    NCF_NOT_USER_REMOVABLE = 0x20,
    NCF_MULTIPORT_INSTANCED_ADAPTER = 0x40,
    NCF_HAS_UI = 0x80,
    NCF_SINGLE_INSTANCE = 0x100,
    NCF_FILTER = 0x400,
    NCF_DONTEXPOSELOWER = 0x1000,
    NCF_HIDE_BINDING = 0x2000,
    NCF_NDIS_PROTOCOL = 0x4000,
    NCF_FIXED_BINDING = 0x20000,
    NCF_LW_FILTER = 0x40000
} COMPONENT_CHARACTERISTICS;
typedef enum tagNCRP_FLAGS {
    NCRP_QUERY_PROPERTY_UI = 0x1,
    NCRP_SHOW_PROPERTY_UI = 0x2
} NCRP_FLAGS;
DEFINE_GUID(IID_INetCfgComponent, 0xc0e8ae99, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae99-306e-11d1-aacf-00805fc1270e")
INetCfgComponent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
        LPWSTR *ppszwDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDisplayName(
        LPCWSTR pszwDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHelpText(
        LPWSTR *pszwHelpText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetId(
        LPWSTR *ppszwId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCharacteristics(
        LPDWORD pdwCharacteristics) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInstanceGuid(
        GUID *pGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPnpDevNodeId(
        LPWSTR *ppszwDevNodeId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetClassGuid(
        GUID *pGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBindName(
        LPWSTR *ppszwBindName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceStatus(
        ULONG *pulStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenParamKey(
        HKEY *phkey) = 0;

    virtual HRESULT STDMETHODCALLTYPE RaisePropertyUi(
        HWND hwndParent,
        DWORD dwFlags,
        IUnknown *punkContext) = 0;

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

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

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

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

    /*** INetCfgComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        INetCfgComponent *This,
        LPWSTR *ppszwDisplayName);

    HRESULT (STDMETHODCALLTYPE *SetDisplayName)(
        INetCfgComponent *This,
        LPCWSTR pszwDisplayName);

    HRESULT (STDMETHODCALLTYPE *GetHelpText)(
        INetCfgComponent *This,
        LPWSTR *pszwHelpText);

    HRESULT (STDMETHODCALLTYPE *GetId)(
        INetCfgComponent *This,
        LPWSTR *ppszwId);

    HRESULT (STDMETHODCALLTYPE *GetCharacteristics)(
        INetCfgComponent *This,
        LPDWORD pdwCharacteristics);

    HRESULT (STDMETHODCALLTYPE *GetInstanceGuid)(
        INetCfgComponent *This,
        GUID *pGuid);

    HRESULT (STDMETHODCALLTYPE *GetPnpDevNodeId)(
        INetCfgComponent *This,
        LPWSTR *ppszwDevNodeId);

    HRESULT (STDMETHODCALLTYPE *GetClassGuid)(
        INetCfgComponent *This,
        GUID *pGuid);

    HRESULT (STDMETHODCALLTYPE *GetBindName)(
        INetCfgComponent *This,
        LPWSTR *ppszwBindName);

    HRESULT (STDMETHODCALLTYPE *GetDeviceStatus)(
        INetCfgComponent *This,
        ULONG *pulStatus);

    HRESULT (STDMETHODCALLTYPE *OpenParamKey)(
        INetCfgComponent *This,
        HKEY *phkey);

    HRESULT (STDMETHODCALLTYPE *RaisePropertyUi)(
        INetCfgComponent *This,
        HWND hwndParent,
        DWORD dwFlags,
        IUnknown *punkContext);

    END_INTERFACE
} INetCfgComponentVtbl;

interface INetCfgComponent {
    CONST_VTBL INetCfgComponentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponent_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponent methods ***/
#define INetCfgComponent_GetDisplayName(This,ppszwDisplayName) (This)->lpVtbl->GetDisplayName(This,ppszwDisplayName)
#define INetCfgComponent_SetDisplayName(This,pszwDisplayName) (This)->lpVtbl->SetDisplayName(This,pszwDisplayName)
#define INetCfgComponent_GetHelpText(This,pszwHelpText) (This)->lpVtbl->GetHelpText(This,pszwHelpText)
#define INetCfgComponent_GetId(This,ppszwId) (This)->lpVtbl->GetId(This,ppszwId)
#define INetCfgComponent_GetCharacteristics(This,pdwCharacteristics) (This)->lpVtbl->GetCharacteristics(This,pdwCharacteristics)
#define INetCfgComponent_GetInstanceGuid(This,pGuid) (This)->lpVtbl->GetInstanceGuid(This,pGuid)
#define INetCfgComponent_GetPnpDevNodeId(This,ppszwDevNodeId) (This)->lpVtbl->GetPnpDevNodeId(This,ppszwDevNodeId)
#define INetCfgComponent_GetClassGuid(This,pGuid) (This)->lpVtbl->GetClassGuid(This,pGuid)
#define INetCfgComponent_GetBindName(This,ppszwBindName) (This)->lpVtbl->GetBindName(This,ppszwBindName)
#define INetCfgComponent_GetDeviceStatus(This,pulStatus) (This)->lpVtbl->GetDeviceStatus(This,pulStatus)
#define INetCfgComponent_OpenParamKey(This,phkey) (This)->lpVtbl->OpenParamKey(This,phkey)
#define INetCfgComponent_RaisePropertyUi(This,hwndParent,dwFlags,punkContext) (This)->lpVtbl->RaisePropertyUi(This,hwndParent,dwFlags,punkContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponent_QueryInterface(INetCfgComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponent_AddRef(INetCfgComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponent_Release(INetCfgComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponent methods ***/
static FORCEINLINE HRESULT INetCfgComponent_GetDisplayName(INetCfgComponent* This,LPWSTR *ppszwDisplayName) {
    return This->lpVtbl->GetDisplayName(This,ppszwDisplayName);
}
static FORCEINLINE HRESULT INetCfgComponent_SetDisplayName(INetCfgComponent* This,LPCWSTR pszwDisplayName) {
    return This->lpVtbl->SetDisplayName(This,pszwDisplayName);
}
static FORCEINLINE HRESULT INetCfgComponent_GetHelpText(INetCfgComponent* This,LPWSTR *pszwHelpText) {
    return This->lpVtbl->GetHelpText(This,pszwHelpText);
}
static FORCEINLINE HRESULT INetCfgComponent_GetId(INetCfgComponent* This,LPWSTR *ppszwId) {
    return This->lpVtbl->GetId(This,ppszwId);
}
static FORCEINLINE HRESULT INetCfgComponent_GetCharacteristics(INetCfgComponent* This,LPDWORD pdwCharacteristics) {
    return This->lpVtbl->GetCharacteristics(This,pdwCharacteristics);
}
static FORCEINLINE HRESULT INetCfgComponent_GetInstanceGuid(INetCfgComponent* This,GUID *pGuid) {
    return This->lpVtbl->GetInstanceGuid(This,pGuid);
}
static FORCEINLINE HRESULT INetCfgComponent_GetPnpDevNodeId(INetCfgComponent* This,LPWSTR *ppszwDevNodeId) {
    return This->lpVtbl->GetPnpDevNodeId(This,ppszwDevNodeId);
}
static FORCEINLINE HRESULT INetCfgComponent_GetClassGuid(INetCfgComponent* This,GUID *pGuid) {
    return This->lpVtbl->GetClassGuid(This,pGuid);
}
static FORCEINLINE HRESULT INetCfgComponent_GetBindName(INetCfgComponent* This,LPWSTR *ppszwBindName) {
    return This->lpVtbl->GetBindName(This,ppszwBindName);
}
static FORCEINLINE HRESULT INetCfgComponent_GetDeviceStatus(INetCfgComponent* This,ULONG *pulStatus) {
    return This->lpVtbl->GetDeviceStatus(This,pulStatus);
}
static FORCEINLINE HRESULT INetCfgComponent_OpenParamKey(INetCfgComponent* This,HKEY *phkey) {
    return This->lpVtbl->OpenParamKey(This,phkey);
}
static FORCEINLINE HRESULT INetCfgComponent_RaisePropertyUi(INetCfgComponent* This,HWND hwndParent,DWORD dwFlags,IUnknown *punkContext) {
    return This->lpVtbl->RaisePropertyUi(This,hwndParent,dwFlags,punkContext);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponent_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgComponentBindings interface
 */
#ifndef __INetCfgComponentBindings_INTERFACE_DEFINED__
#define __INetCfgComponentBindings_INTERFACE_DEFINED__

typedef enum tagSUPPORTS_BINDING_INTERFACE_FLAGS {
    NCF_LOWER = 0x1,
    NCF_UPPER = 0x2
} SUPPORTS_BINDING_INTERFACE_FLAGS;
typedef enum tagENUM_BINDING_PATHS_FLAGS {
    EBP_ABOVE = 0x1,
    EBP_BELOW = 0x2
} ENUM_BINDING_PATHS_FLAGS;
DEFINE_GUID(IID_INetCfgComponentBindings, 0xc0e8ae9e, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae9e-306e-11d1-aacf-00805fc1270e")
INetCfgComponentBindings : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE BindTo(
        INetCfgComponent *pnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnbindFrom(
        INetCfgComponent *pnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE SupportsBindingInterface(
        DWORD dwFlags,
        LPCWSTR pszwInterfaceName) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsBoundTo(
        INetCfgComponent *pnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsBindableTo(
        INetCfgComponent *pnccItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumBindingPaths(
        DWORD dwFlags,
        IEnumNetCfgBindingPath **ppIEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveBefore(
        INetCfgBindingPath *pncbItemSrc,
        INetCfgBindingPath *pncbItemDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveAfter(
        INetCfgBindingPath *pncbItemSrc,
        INetCfgBindingPath *pncbItemDest) = 0;

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

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

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

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

    /*** INetCfgComponentBindings methods ***/
    HRESULT (STDMETHODCALLTYPE *BindTo)(
        INetCfgComponentBindings *This,
        INetCfgComponent *pnccItem);

    HRESULT (STDMETHODCALLTYPE *UnbindFrom)(
        INetCfgComponentBindings *This,
        INetCfgComponent *pnccItem);

    HRESULT (STDMETHODCALLTYPE *SupportsBindingInterface)(
        INetCfgComponentBindings *This,
        DWORD dwFlags,
        LPCWSTR pszwInterfaceName);

    HRESULT (STDMETHODCALLTYPE *IsBoundTo)(
        INetCfgComponentBindings *This,
        INetCfgComponent *pnccItem);

    HRESULT (STDMETHODCALLTYPE *IsBindableTo)(
        INetCfgComponentBindings *This,
        INetCfgComponent *pnccItem);

    HRESULT (STDMETHODCALLTYPE *EnumBindingPaths)(
        INetCfgComponentBindings *This,
        DWORD dwFlags,
        IEnumNetCfgBindingPath **ppIEnum);

    HRESULT (STDMETHODCALLTYPE *MoveBefore)(
        INetCfgComponentBindings *This,
        INetCfgBindingPath *pncbItemSrc,
        INetCfgBindingPath *pncbItemDest);

    HRESULT (STDMETHODCALLTYPE *MoveAfter)(
        INetCfgComponentBindings *This,
        INetCfgBindingPath *pncbItemSrc,
        INetCfgBindingPath *pncbItemDest);

    END_INTERFACE
} INetCfgComponentBindingsVtbl;

interface INetCfgComponentBindings {
    CONST_VTBL INetCfgComponentBindingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgComponentBindings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgComponentBindings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgComponentBindings_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgComponentBindings methods ***/
#define INetCfgComponentBindings_BindTo(This,pnccItem) (This)->lpVtbl->BindTo(This,pnccItem)
#define INetCfgComponentBindings_UnbindFrom(This,pnccItem) (This)->lpVtbl->UnbindFrom(This,pnccItem)
#define INetCfgComponentBindings_SupportsBindingInterface(This,dwFlags,pszwInterfaceName) (This)->lpVtbl->SupportsBindingInterface(This,dwFlags,pszwInterfaceName)
#define INetCfgComponentBindings_IsBoundTo(This,pnccItem) (This)->lpVtbl->IsBoundTo(This,pnccItem)
#define INetCfgComponentBindings_IsBindableTo(This,pnccItem) (This)->lpVtbl->IsBindableTo(This,pnccItem)
#define INetCfgComponentBindings_EnumBindingPaths(This,dwFlags,ppIEnum) (This)->lpVtbl->EnumBindingPaths(This,dwFlags,ppIEnum)
#define INetCfgComponentBindings_MoveBefore(This,pncbItemSrc,pncbItemDest) (This)->lpVtbl->MoveBefore(This,pncbItemSrc,pncbItemDest)
#define INetCfgComponentBindings_MoveAfter(This,pncbItemSrc,pncbItemDest) (This)->lpVtbl->MoveAfter(This,pncbItemSrc,pncbItemDest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgComponentBindings_QueryInterface(INetCfgComponentBindings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgComponentBindings_AddRef(INetCfgComponentBindings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgComponentBindings_Release(INetCfgComponentBindings* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgComponentBindings methods ***/
static FORCEINLINE HRESULT INetCfgComponentBindings_BindTo(INetCfgComponentBindings* This,INetCfgComponent *pnccItem) {
    return This->lpVtbl->BindTo(This,pnccItem);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_UnbindFrom(INetCfgComponentBindings* This,INetCfgComponent *pnccItem) {
    return This->lpVtbl->UnbindFrom(This,pnccItem);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_SupportsBindingInterface(INetCfgComponentBindings* This,DWORD dwFlags,LPCWSTR pszwInterfaceName) {
    return This->lpVtbl->SupportsBindingInterface(This,dwFlags,pszwInterfaceName);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_IsBoundTo(INetCfgComponentBindings* This,INetCfgComponent *pnccItem) {
    return This->lpVtbl->IsBoundTo(This,pnccItem);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_IsBindableTo(INetCfgComponentBindings* This,INetCfgComponent *pnccItem) {
    return This->lpVtbl->IsBindableTo(This,pnccItem);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_EnumBindingPaths(INetCfgComponentBindings* This,DWORD dwFlags,IEnumNetCfgBindingPath **ppIEnum) {
    return This->lpVtbl->EnumBindingPaths(This,dwFlags,ppIEnum);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_MoveBefore(INetCfgComponentBindings* This,INetCfgBindingPath *pncbItemSrc,INetCfgBindingPath *pncbItemDest) {
    return This->lpVtbl->MoveBefore(This,pncbItemSrc,pncbItemDest);
}
static FORCEINLINE HRESULT INetCfgComponentBindings_MoveAfter(INetCfgComponentBindings* This,INetCfgBindingPath *pncbItemSrc,INetCfgBindingPath *pncbItemDest) {
    return This->lpVtbl->MoveAfter(This,pncbItemSrc,pncbItemDest);
}
#endif
#endif

#endif


#endif  /* __INetCfgComponentBindings_INTERFACE_DEFINED__ */


/*****************************************************************************
 * INetCfgSysPrep interface
 */
#ifndef __INetCfgSysPrep_INTERFACE_DEFINED__
#define __INetCfgSysPrep_INTERFACE_DEFINED__

DEFINE_GUID(IID_INetCfgSysPrep, 0xc0e8ae98, 0x306e, 0x11d1, 0xaa,0xcf, 0x00,0x80,0x5f,0xc1,0x27,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0e8ae98-306e-11d1-aacf-00805fc1270e")
INetCfgSysPrep : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HrSetupSetFirstDword(
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        DWORD dwValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE HrSetupSetFirstString(
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        LPCWSTR pwszValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE HrSetupSetFirstStringAsBool(
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        WINBOOL fValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE HrSetupSetFirstMultiSzField(
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        LPCWSTR pmszValue) = 0;

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

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

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

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

    /*** INetCfgSysPrep methods ***/
    HRESULT (STDMETHODCALLTYPE *HrSetupSetFirstDword)(
        INetCfgSysPrep *This,
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        DWORD dwValue);

    HRESULT (STDMETHODCALLTYPE *HrSetupSetFirstString)(
        INetCfgSysPrep *This,
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        LPCWSTR pwszValue);

    HRESULT (STDMETHODCALLTYPE *HrSetupSetFirstStringAsBool)(
        INetCfgSysPrep *This,
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        WINBOOL fValue);

    HRESULT (STDMETHODCALLTYPE *HrSetupSetFirstMultiSzField)(
        INetCfgSysPrep *This,
        LPCWSTR pwszSection,
        LPCWSTR pwszKey,
        LPCWSTR pmszValue);

    END_INTERFACE
} INetCfgSysPrepVtbl;

interface INetCfgSysPrep {
    CONST_VTBL INetCfgSysPrepVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INetCfgSysPrep_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INetCfgSysPrep_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INetCfgSysPrep_Release(This) (This)->lpVtbl->Release(This)
/*** INetCfgSysPrep methods ***/
#define INetCfgSysPrep_HrSetupSetFirstDword(This,pwszSection,pwszKey,dwValue) (This)->lpVtbl->HrSetupSetFirstDword(This,pwszSection,pwszKey,dwValue)
#define INetCfgSysPrep_HrSetupSetFirstString(This,pwszSection,pwszKey,pwszValue) (This)->lpVtbl->HrSetupSetFirstString(This,pwszSection,pwszKey,pwszValue)
#define INetCfgSysPrep_HrSetupSetFirstStringAsBool(This,pwszSection,pwszKey,fValue) (This)->lpVtbl->HrSetupSetFirstStringAsBool(This,pwszSection,pwszKey,fValue)
#define INetCfgSysPrep_HrSetupSetFirstMultiSzField(This,pwszSection,pwszKey,pmszValue) (This)->lpVtbl->HrSetupSetFirstMultiSzField(This,pwszSection,pwszKey,pmszValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INetCfgSysPrep_QueryInterface(INetCfgSysPrep* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INetCfgSysPrep_AddRef(INetCfgSysPrep* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INetCfgSysPrep_Release(INetCfgSysPrep* This) {
    return This->lpVtbl->Release(This);
}
/*** INetCfgSysPrep methods ***/
static FORCEINLINE HRESULT INetCfgSysPrep_HrSetupSetFirstDword(INetCfgSysPrep* This,LPCWSTR pwszSection,LPCWSTR pwszKey,DWORD dwValue) {
    return This->lpVtbl->HrSetupSetFirstDword(This,pwszSection,pwszKey,dwValue);
}
static FORCEINLINE HRESULT INetCfgSysPrep_HrSetupSetFirstString(INetCfgSysPrep* This,LPCWSTR pwszSection,LPCWSTR pwszKey,LPCWSTR pwszValue) {
    return This->lpVtbl->HrSetupSetFirstString(This,pwszSection,pwszKey,pwszValue);
}
static FORCEINLINE HRESULT INetCfgSysPrep_HrSetupSetFirstStringAsBool(INetCfgSysPrep* This,LPCWSTR pwszSection,LPCWSTR pwszKey,WINBOOL fValue) {
    return This->lpVtbl->HrSetupSetFirstStringAsBool(This,pwszSection,pwszKey,fValue);
}
static FORCEINLINE HRESULT INetCfgSysPrep_HrSetupSetFirstMultiSzField(INetCfgSysPrep* This,LPCWSTR pwszSection,LPCWSTR pwszKey,LPCWSTR pmszValue) {
    return This->lpVtbl->HrSetupSetFirstMultiSzField(This,pwszSection,pwszKey,pmszValue);
}
#endif
#endif

#endif


#endif  /* __INetCfgSysPrep_INTERFACE_DEFINED__ */

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __netcfgx_h__ */
