diff --git a/mingw-w64-headers/include/netcfgn.h b/mingw-w64-headers/include/netcfgn.h
new file mode 100644
index 0000000..a974b4f
--- /dev/null
+++ b/mingw-w64-headers/include/netcfgn.h
@@ -0,0 +1,1215 @@
+/*** Autogenerated by WIDL 5.0-rc1 from 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__ */
