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