diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index 62dab90..ffbd843 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -64,6 +64,7 @@
   include/activdbg100.idl \
   include/activprof.idl \
   include/activscp.idl \
+  include/adhoc.idl \
   include/audioclient.idl \
   include/audioendpoints.idl \
   include/audiopolicy.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index 683b02e..b28f10f 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -288,6 +288,7 @@
 @HAVE_WIDL_TRUE@  include/activdbg100.idl \
 @HAVE_WIDL_TRUE@  include/activprof.idl \
 @HAVE_WIDL_TRUE@  include/activscp.idl \
+@HAVE_WIDL_TRUE@  include/adhoc.idl \
 @HAVE_WIDL_TRUE@  include/audioclient.idl \
 @HAVE_WIDL_TRUE@  include/audioendpoints.idl \
 @HAVE_WIDL_TRUE@  include/audiopolicy.idl \
diff --git a/mingw-w64-headers/include/adhoc.h b/mingw-w64-headers/include/adhoc.h
index 2612411..0908a8c 100644
--- a/mingw-w64-headers/include/adhoc.h
+++ b/mingw-w64-headers/include/adhoc.h
@@ -1,107 +1,1158 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#ifndef _INC_ADHOC
-#define _INC_ADHOC
+/*** Autogenerated by WIDL 1.6 from adhoc.idl - Do not edit ***/
 
-#if (_WIN32_WINNT >= 0x0600)
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
 
-typedef enum tagDOT11_ADHOC_AUTH_ALGORITHM {
-  DOT11_ADHOC_AUTH_ALGO_INVALID      = -1,
-  DOT11_ADHOC_AUTH_ALGO_80211_OPEN   = 1,
-  DOT11_ADHOC_AUTH_ALGO_RSNA_PSK     = 7 
-} DOT11_ADHOC_AUTH_ALGORITHM;
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __adhoc_h__
+#define __adhoc_h__
+
+/* Forward declarations */
+
+#ifndef __IDot11AdHocManager_FWD_DEFINED__
+#define __IDot11AdHocManager_FWD_DEFINED__
+typedef interface IDot11AdHocManager IDot11AdHocManager;
+#endif
+
+#ifndef __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
+#define __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
+typedef interface IDot11AdHocManagerNotificationSink IDot11AdHocManagerNotificationSink;
+#endif
+
+#ifndef __IEnumDot11AdHocNetworks_FWD_DEFINED__
+#define __IEnumDot11AdHocNetworks_FWD_DEFINED__
+typedef interface IEnumDot11AdHocNetworks IEnumDot11AdHocNetworks;
+#endif
+
+#ifndef __IDot11AdHocNetwork_FWD_DEFINED__
+#define __IDot11AdHocNetwork_FWD_DEFINED__
+typedef interface IDot11AdHocNetwork IDot11AdHocNetwork;
+#endif
+
+#ifndef __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
+#define __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
+typedef interface IDot11AdHocNetworkNotificationSink IDot11AdHocNetworkNotificationSink;
+#endif
+
+#ifndef __IDot11AdHocInterface_FWD_DEFINED__
+#define __IDot11AdHocInterface_FWD_DEFINED__
+typedef interface IDot11AdHocInterface IDot11AdHocInterface;
+#endif
+
+#ifndef __IEnumDot11AdHocInterfaces_FWD_DEFINED__
+#define __IEnumDot11AdHocInterfaces_FWD_DEFINED__
+typedef interface IEnumDot11AdHocInterfaces IEnumDot11AdHocInterfaces;
+#endif
+
+#ifndef __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
+#define __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
+typedef interface IEnumDot11AdHocSecuritySettings IEnumDot11AdHocSecuritySettings;
+#endif
+
+#ifndef __IDot11AdHocSecuritySettings_FWD_DEFINED__
+#define __IDot11AdHocSecuritySettings_FWD_DEFINED__
+typedef interface IDot11AdHocSecuritySettings IDot11AdHocSecuritySettings;
+#endif
+
+#ifndef __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
+#define __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
+typedef interface IDot11AdHocInterfaceNotificationSink IDot11AdHocInterfaceNotificationSink;
+#endif
+
+#ifndef __Dot11AdHocManager_FWD_DEFINED__
+#define __Dot11AdHocManager_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class Dot11AdHocManager Dot11AdHocManager;
+#else
+typedef struct Dot11AdHocManager Dot11AdHocManager;
+#endif /* defined __cplusplus */
+#endif /* defined __Dot11AdHocManager_FWD_DEFINED__ */
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+#include <unknwn.h>
+#include <wtypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#ifndef __IDot11AdHocManager_FWD_DEFINED__
+#define __IDot11AdHocManager_FWD_DEFINED__
+typedef interface IDot11AdHocManager IDot11AdHocManager;
+#endif
+
+#ifndef __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
+#define __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
+typedef interface IDot11AdHocManagerNotificationSink IDot11AdHocManagerNotificationSink;
+#endif
+
+#ifndef __IDot11AdHocNetwork_FWD_DEFINED__
+#define __IDot11AdHocNetwork_FWD_DEFINED__
+typedef interface IDot11AdHocNetwork IDot11AdHocNetwork;
+#endif
+
+#ifndef __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
+#define __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
+typedef interface IDot11AdHocNetworkNotificationSink IDot11AdHocNetworkNotificationSink;
+#endif
+
+#ifndef __IDot11AdHocInterface_FWD_DEFINED__
+#define __IDot11AdHocInterface_FWD_DEFINED__
+typedef interface IDot11AdHocInterface IDot11AdHocInterface;
+#endif
+
+#ifndef __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
+#define __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
+typedef interface IDot11AdHocInterfaceNotificationSink IDot11AdHocInterfaceNotificationSink;
+#endif
+
+#ifndef __IDot11AdHocSecuritySettings_FWD_DEFINED__
+#define __IDot11AdHocSecuritySettings_FWD_DEFINED__
+typedef interface IDot11AdHocSecuritySettings IDot11AdHocSecuritySettings;
+#endif
+
+#ifndef __IEnumDot11AdHocInterfaces_FWD_DEFINED__
+#define __IEnumDot11AdHocInterfaces_FWD_DEFINED__
+typedef interface IEnumDot11AdHocInterfaces IEnumDot11AdHocInterfaces;
+#endif
+
+#ifndef __IEnumDot11AdHocNetworks_FWD_DEFINED__
+#define __IEnumDot11AdHocNetworks_FWD_DEFINED__
+typedef interface IEnumDot11AdHocNetworks IEnumDot11AdHocNetworks;
+#endif
+
+#ifndef __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
+#define __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
+typedef interface IEnumDot11AdHocSecuritySettings IEnumDot11AdHocSecuritySettings;
+#endif
 
 typedef enum tagDOT11_ADHOC_CIPHER_ALGORITHM {
-  DOT11_ADHOC_CIPHER_ALGO_INVALID   = -1,
-  DOT11_ADHOC_CIPHER_ALGO_NONE      = 0x00,
-  DOT11_ADHOC_CIPHER_ALGO_CCMP      = 0x04,
-  DOT11_ADHOC_CIPHER_ALGO_WEP       = 0x101 
+    DOT11_ADHOC_CIPHER_ALGO_INVALID = -1,
+    DOT11_ADHOC_CIPHER_ALGO_NONE = 0x0,
+    DOT11_ADHOC_CIPHER_ALGO_CCMP = 0x4,
+    DOT11_ADHOC_CIPHER_ALGO_WEP = 0x101
 } DOT11_ADHOC_CIPHER_ALGORITHM;
-
-typedef enum tagDOT11_ADHOC_CONNECT_FAIL_REASON {
-  DOT11_ADHOC_CONNECT_FAIL_DOMAIN_MISMATCH       = 0,
-  DOT11_ADHOC_CONNECT_FAIL_PASSPHRASE_MISMATCH   = 1,
-  DOT11_ADHOC_CONNECT_FAIL_OTHER                 = 2 
-} DOT11_ADHOC_CONNECT_FAIL_REASON;
-
+typedef enum tagDOT11_ADHOC_AUTH_ALGORITHM {
+    DOT11_ADHOC_AUTH_ALGO_INVALID = -1,
+    DOT11_ADHOC_AUTH_ALGO_80211_OPEN = 1,
+    DOT11_ADHOC_AUTH_ALGO_RSNA_PSK = 7
+} DOT11_ADHOC_AUTH_ALGORITHM;
 typedef enum tagDOT11_ADHOC_NETWORK_CONNECTION_STATUS {
-  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_INVALID        = 0,
-  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_DISCONNECTED   = 11,
-  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTING     = 12,
-  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTED      = 13,
-  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_FORMED         = 14 
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_INVALID = 0,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_DISCONNECTED = 11,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTING = 12,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTED = 13,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS_FORMED = 14
 } DOT11_ADHOC_NETWORK_CONNECTION_STATUS;
+typedef enum tagDOT11_ADHOC_CONNECT_FAIL_REASON {
+    DOT11_ADHOC_CONNECT_FAIL_DOMAIN_MISMATCH = 0,
+    DOT11_ADHOC_CONNECT_FAIL_PASSPHRASE_MISMATCH = 1,
+    DOT11_ADHOC_CONNECT_FAIL_OTHER = 2
+} DOT11_ADHOC_CONNECT_FAIL_REASON;
+EXTERN_C const CLSID CLSID_AdHocManager;
+/*****************************************************************************
+ * IDot11AdHocManager interface
+ */
+#ifndef __IDot11AdHocManager_INTERFACE_DEFINED__
+#define __IDot11AdHocManager_INTERFACE_DEFINED__
 
-typedef struct IDot11AdHocInterfaceNotificationSink IDot11AdHocInterfaceNotificationSink;
-typedef struct IDot11AdHocInterface IDot11AdHocInterface;
-typedef struct IDot11AdHocManager IDot11AdHocManager;
-typedef struct IDot11AdHocManagerNotificationSink IDot11AdHocManagerNotificationSink;
-typedef struct IDot11AdHocNetwork IDot11AdHocNetwork;
-typedef struct IEnumDot11AdHocSecuritySettings IEnumDot11AdHocSecuritySettings;
-typedef struct IEnumDot11AdHocNetworks IEnumDot11AdHocNetworks;
-typedef struct IDot11AdHocSecuritySettings IDot11AdHocSecuritySettings;
-typedef struct IEnumDot11AdHocNetworks IEnumDot11AdHocNetworks;
-typedef struct IEnumDot11AdHocInterfaces IEnumDot11AdHocInterfaces;
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocInterfaceNotificationSink
-DECLARE_INTERFACE_(IDot11AdHocInterfaceNotificationSink,IUnknown)
+DEFINE_GUID(IID_IDot11AdHocManager, 0x8f10cc26, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc26-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocManager : public IUnknown
 {
-    BEGIN_INTERFACE
+    virtual HRESULT STDMETHODCALLTYPE CreateNetwork(
+        LPCWSTR Name,
+        LPCWSTR Password,
+        LONG GeographicalId,
+        IDot11AdHocInterface *pInterface,
+        IDot11AdHocSecuritySettings *pSecurity,
+        GUID *pContextGuid,
+        IDot11AdHocNetwork **pIAdHoc) = 0;
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    virtual HRESULT STDMETHODCALLTYPE CommitCreatedNetwork(
+        IDot11AdHocNetwork *pIAdHoc,
+        BOOLEAN fSaveProfile,
+        BOOLEAN fMakeSavedProfileUserSpecific) = 0;
 
-    /* IDot11AdHocInterfaceNotificationSink methods */
-    STDMETHOD_(HRESULT,OnConnectionStatusChange)(THIS_ DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus) PURE;
+    virtual HRESULT STDMETHODCALLTYPE GetIEnumDot11AdHocNetworks(
+        GUID *pContextGuid,
+        IEnumDot11AdHocNetworks **ppEnum) = 0;
 
-    END_INTERFACE
+    virtual HRESULT STDMETHODCALLTYPE GetIEnumDot11AdHocInterfaces(
+        IEnumDot11AdHocInterfaces **ppEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetNetwork(
+        GUID *NetworkSignature,
+        IDot11AdHocNetwork **pNetwork) = 0;
+
 };
-#ifdef COBJMACROS
-#define IDot11AdHocInterfaceNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDot11AdHocInterfaceNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDot11AdHocInterfaceNotificationSink_Release(This) (This)->lpVtbl->Release(This)
-#define IDot11AdHocInterfaceNotificationSink_OnConnectionStatusChange(This,eStatus) (This)->lpVtbl->OnConnectionStatusChange(This,eStatus)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocInterface
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocManager, 0x8f10cc26, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
 #endif
-DECLARE_INTERFACE_(IDot11AdHocInterface,IUnknown)
-{
+#else
+typedef struct IDot11AdHocManagerVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocManager* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDot11AdHocInterface methods */
-    STDMETHOD_(HRESULT,GetDeviceSignature)(THIS_ GUID *pSignature) PURE;
-    STDMETHOD_(HRESULT,GetFriendlyName)(THIS_ LPWSTR *ppszName) PURE;
-    STDMETHOD_(HRESULT,IsDot11d)(THIS_ BOOLEAN *pf11d) PURE;
-    STDMETHOD_(HRESULT,IsAdHocCapable)(THIS_ BOOLEAN *pfAdHocCapable) PURE;
-    STDMETHOD_(HRESULT,IsRadioOn)(THIS_ BOOLEAN *pfIsRadioOn) PURE;
-    STDMETHOD_(HRESULT,GetActiveNetwork)(THIS_ IDot11AdHocNetwork **ppNetwork) PURE;
-    STDMETHOD_(HRESULT,GetIEnumSecuritySettings)(THIS_ IEnumDot11AdHocSecuritySettings **ppEnum) PURE;
-    STDMETHOD_(HRESULT,GetIEnumDot11AdHocNetworks)(THIS_ GUID *pFilterGuid,IEnumDot11AdHocNetworks **ppEnum) PURE;
-    STDMETHOD_(HRESULT,GetStatus)(THIS_ DOT11_ADHOC_NETWORK_CONNECTION_STATUS *pState) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocManager* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocManager* This);
+
+    /*** IDot11AdHocManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateNetwork)(
+        IDot11AdHocManager* This,
+        LPCWSTR Name,
+        LPCWSTR Password,
+        LONG GeographicalId,
+        IDot11AdHocInterface *pInterface,
+        IDot11AdHocSecuritySettings *pSecurity,
+        GUID *pContextGuid,
+        IDot11AdHocNetwork **pIAdHoc);
+
+    HRESULT (STDMETHODCALLTYPE *CommitCreatedNetwork)(
+        IDot11AdHocManager* This,
+        IDot11AdHocNetwork *pIAdHoc,
+        BOOLEAN fSaveProfile,
+        BOOLEAN fMakeSavedProfileUserSpecific);
+
+    HRESULT (STDMETHODCALLTYPE *GetIEnumDot11AdHocNetworks)(
+        IDot11AdHocManager* This,
+        GUID *pContextGuid,
+        IEnumDot11AdHocNetworks **ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *GetIEnumDot11AdHocInterfaces)(
+        IDot11AdHocManager* This,
+        IEnumDot11AdHocInterfaces **ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *GetNetwork)(
+        IDot11AdHocManager* This,
+        GUID *NetworkSignature,
+        IDot11AdHocNetwork **pNetwork);
 
     END_INTERFACE
+} IDot11AdHocManagerVtbl;
+interface IDot11AdHocManager {
+    CONST_VTBL IDot11AdHocManagerVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDot11AdHocManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDot11AdHocManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDot11AdHocManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocManager methods ***/
+#define IDot11AdHocManager_CreateNetwork(This,Name,Password,GeographicalId,pInterface,pSecurity,pContextGuid,pIAdHoc) (This)->lpVtbl->CreateNetwork(This,Name,Password,GeographicalId,pInterface,pSecurity,pContextGuid,pIAdHoc)
+#define IDot11AdHocManager_CommitCreatedNetwork(This,pIAdHoc,fSaveProfile,fMakeSavedProfileUserSpecific) (This)->lpVtbl->CommitCreatedNetwork(This,pIAdHoc,fSaveProfile,fMakeSavedProfileUserSpecific)
+#define IDot11AdHocManager_GetIEnumDot11AdHocNetworks(This,pContextGuid,ppEnum) (This)->lpVtbl->GetIEnumDot11AdHocNetworks(This,pContextGuid,ppEnum)
+#define IDot11AdHocManager_GetIEnumDot11AdHocInterfaces(This,ppEnum) (This)->lpVtbl->GetIEnumDot11AdHocInterfaces(This,ppEnum)
+#define IDot11AdHocManager_GetNetwork(This,NetworkSignature,pNetwork) (This)->lpVtbl->GetNetwork(This,NetworkSignature,pNetwork)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocManager_QueryInterface(IDot11AdHocManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocManager_AddRef(IDot11AdHocManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocManager_Release(IDot11AdHocManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocManager methods ***/
+static FORCEINLINE HRESULT IDot11AdHocManager_CreateNetwork(IDot11AdHocManager* This,LPCWSTR Name,LPCWSTR Password,LONG GeographicalId,IDot11AdHocInterface *pInterface,IDot11AdHocSecuritySettings *pSecurity,GUID *pContextGuid,IDot11AdHocNetwork **pIAdHoc) {
+    return This->lpVtbl->CreateNetwork(This,Name,Password,GeographicalId,pInterface,pSecurity,pContextGuid,pIAdHoc);
+}
+static FORCEINLINE HRESULT IDot11AdHocManager_CommitCreatedNetwork(IDot11AdHocManager* This,IDot11AdHocNetwork *pIAdHoc,BOOLEAN fSaveProfile,BOOLEAN fMakeSavedProfileUserSpecific) {
+    return This->lpVtbl->CommitCreatedNetwork(This,pIAdHoc,fSaveProfile,fMakeSavedProfileUserSpecific);
+}
+static FORCEINLINE HRESULT IDot11AdHocManager_GetIEnumDot11AdHocNetworks(IDot11AdHocManager* This,GUID *pContextGuid,IEnumDot11AdHocNetworks **ppEnum) {
+    return This->lpVtbl->GetIEnumDot11AdHocNetworks(This,pContextGuid,ppEnum);
+}
+static FORCEINLINE HRESULT IDot11AdHocManager_GetIEnumDot11AdHocInterfaces(IDot11AdHocManager* This,IEnumDot11AdHocInterfaces **ppEnum) {
+    return This->lpVtbl->GetIEnumDot11AdHocInterfaces(This,ppEnum);
+}
+static FORCEINLINE HRESULT IDot11AdHocManager_GetNetwork(IDot11AdHocManager* This,GUID *NetworkSignature,IDot11AdHocNetwork **pNetwork) {
+    return This->lpVtbl->GetNetwork(This,NetworkSignature,pNetwork);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocManager_CreateNetwork_Proxy(
+    IDot11AdHocManager* This,
+    LPCWSTR Name,
+    LPCWSTR Password,
+    LONG GeographicalId,
+    IDot11AdHocInterface *pInterface,
+    IDot11AdHocSecuritySettings *pSecurity,
+    GUID *pContextGuid,
+    IDot11AdHocNetwork **pIAdHoc);
+void __RPC_STUB IDot11AdHocManager_CreateNetwork_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManager_CommitCreatedNetwork_Proxy(
+    IDot11AdHocManager* This,
+    IDot11AdHocNetwork *pIAdHoc,
+    BOOLEAN fSaveProfile,
+    BOOLEAN fMakeSavedProfileUserSpecific);
+void __RPC_STUB IDot11AdHocManager_CommitCreatedNetwork_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManager_GetIEnumDot11AdHocNetworks_Proxy(
+    IDot11AdHocManager* This,
+    GUID *pContextGuid,
+    IEnumDot11AdHocNetworks **ppEnum);
+void __RPC_STUB IDot11AdHocManager_GetIEnumDot11AdHocNetworks_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManager_GetIEnumDot11AdHocInterfaces_Proxy(
+    IDot11AdHocManager* This,
+    IEnumDot11AdHocInterfaces **ppEnum);
+void __RPC_STUB IDot11AdHocManager_GetIEnumDot11AdHocInterfaces_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManager_GetNetwork_Proxy(
+    IDot11AdHocManager* This,
+    GUID *NetworkSignature,
+    IDot11AdHocNetwork **pNetwork);
+void __RPC_STUB IDot11AdHocManager_GetNetwork_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDot11AdHocManagerNotificationSink interface
+ */
+#ifndef __IDot11AdHocManagerNotificationSink_INTERFACE_DEFINED__
+#define __IDot11AdHocManagerNotificationSink_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDot11AdHocManagerNotificationSink, 0x8f10cc27, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc27-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocManagerNotificationSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnNetworkAdd(
+        IDot11AdHocNetwork *pIAdHocNetwork) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnNetworkRemove(
+        GUID *Signature) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnInterfaceAdd(
+        IDot11AdHocInterface *pIAdHocInterface) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnInterfaceRemove(
+        GUID *Signature) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocManagerNotificationSink, 0x8f10cc27, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IDot11AdHocManagerNotificationSinkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocManagerNotificationSink* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocManagerNotificationSink* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocManagerNotificationSink* This);
+
+    /*** IDot11AdHocManagerNotificationSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnNetworkAdd)(
+        IDot11AdHocManagerNotificationSink* This,
+        IDot11AdHocNetwork *pIAdHocNetwork);
+
+    HRESULT (STDMETHODCALLTYPE *OnNetworkRemove)(
+        IDot11AdHocManagerNotificationSink* This,
+        GUID *Signature);
+
+    HRESULT (STDMETHODCALLTYPE *OnInterfaceAdd)(
+        IDot11AdHocManagerNotificationSink* This,
+        IDot11AdHocInterface *pIAdHocInterface);
+
+    HRESULT (STDMETHODCALLTYPE *OnInterfaceRemove)(
+        IDot11AdHocManagerNotificationSink* This,
+        GUID *Signature);
+
+    END_INTERFACE
+} IDot11AdHocManagerNotificationSinkVtbl;
+interface IDot11AdHocManagerNotificationSink {
+    CONST_VTBL IDot11AdHocManagerNotificationSinkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDot11AdHocManagerNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDot11AdHocManagerNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDot11AdHocManagerNotificationSink_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocManagerNotificationSink methods ***/
+#define IDot11AdHocManagerNotificationSink_OnNetworkAdd(This,pIAdHocNetwork) (This)->lpVtbl->OnNetworkAdd(This,pIAdHocNetwork)
+#define IDot11AdHocManagerNotificationSink_OnNetworkRemove(This,Signature) (This)->lpVtbl->OnNetworkRemove(This,Signature)
+#define IDot11AdHocManagerNotificationSink_OnInterfaceAdd(This,pIAdHocInterface) (This)->lpVtbl->OnInterfaceAdd(This,pIAdHocInterface)
+#define IDot11AdHocManagerNotificationSink_OnInterfaceRemove(This,Signature) (This)->lpVtbl->OnInterfaceRemove(This,Signature)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocManagerNotificationSink_QueryInterface(IDot11AdHocManagerNotificationSink* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocManagerNotificationSink_AddRef(IDot11AdHocManagerNotificationSink* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocManagerNotificationSink_Release(IDot11AdHocManagerNotificationSink* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocManagerNotificationSink methods ***/
+static FORCEINLINE HRESULT IDot11AdHocManagerNotificationSink_OnNetworkAdd(IDot11AdHocManagerNotificationSink* This,IDot11AdHocNetwork *pIAdHocNetwork) {
+    return This->lpVtbl->OnNetworkAdd(This,pIAdHocNetwork);
+}
+static FORCEINLINE HRESULT IDot11AdHocManagerNotificationSink_OnNetworkRemove(IDot11AdHocManagerNotificationSink* This,GUID *Signature) {
+    return This->lpVtbl->OnNetworkRemove(This,Signature);
+}
+static FORCEINLINE HRESULT IDot11AdHocManagerNotificationSink_OnInterfaceAdd(IDot11AdHocManagerNotificationSink* This,IDot11AdHocInterface *pIAdHocInterface) {
+    return This->lpVtbl->OnInterfaceAdd(This,pIAdHocInterface);
+}
+static FORCEINLINE HRESULT IDot11AdHocManagerNotificationSink_OnInterfaceRemove(IDot11AdHocManagerNotificationSink* This,GUID *Signature) {
+    return This->lpVtbl->OnInterfaceRemove(This,Signature);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocManagerNotificationSink_OnNetworkAdd_Proxy(
+    IDot11AdHocManagerNotificationSink* This,
+    IDot11AdHocNetwork *pIAdHocNetwork);
+void __RPC_STUB IDot11AdHocManagerNotificationSink_OnNetworkAdd_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManagerNotificationSink_OnNetworkRemove_Proxy(
+    IDot11AdHocManagerNotificationSink* This,
+    GUID *Signature);
+void __RPC_STUB IDot11AdHocManagerNotificationSink_OnNetworkRemove_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManagerNotificationSink_OnInterfaceAdd_Proxy(
+    IDot11AdHocManagerNotificationSink* This,
+    IDot11AdHocInterface *pIAdHocInterface);
+void __RPC_STUB IDot11AdHocManagerNotificationSink_OnInterfaceAdd_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocManagerNotificationSink_OnInterfaceRemove_Proxy(
+    IDot11AdHocManagerNotificationSink* This,
+    GUID *Signature);
+void __RPC_STUB IDot11AdHocManagerNotificationSink_OnInterfaceRemove_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocManagerNotificationSink_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDot11AdHocNetworks interface
+ */
+#ifndef __IEnumDot11AdHocNetworks_INTERFACE_DEFINED__
+#define __IEnumDot11AdHocNetworks_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDot11AdHocNetworks, 0x8f10cc28, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc28-cf0d-42a0-acbe-e2de7007384d")
+IEnumDot11AdHocNetworks : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cElt,
+        IDot11AdHocNetwork **rgElt,
+        ULONG *pcEltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cElt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDot11AdHocNetworks **ppEnum) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDot11AdHocNetworks, 0x8f10cc28, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IEnumDot11AdHocNetworksVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDot11AdHocNetworks* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDot11AdHocNetworks* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDot11AdHocNetworks* This);
+
+    /*** IEnumDot11AdHocNetworks methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumDot11AdHocNetworks* This,
+        ULONG cElt,
+        IDot11AdHocNetwork **rgElt,
+        ULONG *pcEltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDot11AdHocNetworks* This,
+        ULONG cElt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDot11AdHocNetworks* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDot11AdHocNetworks* This,
+        IEnumDot11AdHocNetworks **ppEnum);
+
+    END_INTERFACE
+} IEnumDot11AdHocNetworksVtbl;
+interface IEnumDot11AdHocNetworks {
+    CONST_VTBL IEnumDot11AdHocNetworksVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumDot11AdHocNetworks_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumDot11AdHocNetworks_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumDot11AdHocNetworks_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDot11AdHocNetworks methods ***/
+#define IEnumDot11AdHocNetworks_Next(This,cElt,rgElt,pcEltFetched) (This)->lpVtbl->Next(This,cElt,rgElt,pcEltFetched)
+#define IEnumDot11AdHocNetworks_Skip(This,cElt) (This)->lpVtbl->Skip(This,cElt)
+#define IEnumDot11AdHocNetworks_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumDot11AdHocNetworks_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDot11AdHocNetworks_QueryInterface(IEnumDot11AdHocNetworks* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDot11AdHocNetworks_AddRef(IEnumDot11AdHocNetworks* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDot11AdHocNetworks_Release(IEnumDot11AdHocNetworks* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDot11AdHocNetworks methods ***/
+static FORCEINLINE HRESULT IEnumDot11AdHocNetworks_Next(IEnumDot11AdHocNetworks* This,ULONG cElt,IDot11AdHocNetwork **rgElt,ULONG *pcEltFetched) {
+    return This->lpVtbl->Next(This,cElt,rgElt,pcEltFetched);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocNetworks_Skip(IEnumDot11AdHocNetworks* This,ULONG cElt) {
+    return This->lpVtbl->Skip(This,cElt);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocNetworks_Reset(IEnumDot11AdHocNetworks* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocNetworks_Clone(IEnumDot11AdHocNetworks* This,IEnumDot11AdHocNetworks **ppEnum) {
+    return This->lpVtbl->Clone(This,ppEnum);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocNetworks_Next_Proxy(
+    IEnumDot11AdHocNetworks* This,
+    ULONG cElt,
+    IDot11AdHocNetwork **rgElt,
+    ULONG *pcEltFetched);
+void __RPC_STUB IEnumDot11AdHocNetworks_Next_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocNetworks_Skip_Proxy(
+    IEnumDot11AdHocNetworks* This,
+    ULONG cElt);
+void __RPC_STUB IEnumDot11AdHocNetworks_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocNetworks_Reset_Proxy(
+    IEnumDot11AdHocNetworks* This);
+void __RPC_STUB IEnumDot11AdHocNetworks_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocNetworks_Clone_Proxy(
+    IEnumDot11AdHocNetworks* This,
+    IEnumDot11AdHocNetworks **ppEnum);
+void __RPC_STUB IEnumDot11AdHocNetworks_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IEnumDot11AdHocNetworks_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDot11AdHocNetwork interface
+ */
+#ifndef __IDot11AdHocNetwork_INTERFACE_DEFINED__
+#define __IDot11AdHocNetwork_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDot11AdHocNetwork, 0x8f10cc29, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc29-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocNetwork : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetStatus(
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS *eStatus) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSSID(
+        LPWSTR *ppszwSSID) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HasProfile(
+        BOOLEAN *pf11d) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetProfileName(
+        LPWSTR *ppszwProfileName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DeleteProfile(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSignalQuality(
+        ULONG *puStrengthValue,
+        ULONG *puStrengthMax) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSecuritySetting(
+        IDot11AdHocSecuritySettings **pAdHocSecuritySetting) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetContextGuid(
+        GUID *pContextGuid) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSignature(
+        GUID *pSignature) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInterface(
+        IDot11AdHocInterface **pAdHocInterface) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Connect(
+        LPCWSTR Passphrase,
+        LONG GeographicalId,
+        BOOLEAN fSaveProfile,
+        BOOLEAN fMakeSavedProfileUserSpecific) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Disconnect(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocNetwork, 0x8f10cc29, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IDot11AdHocNetworkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocNetwork* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocNetwork* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocNetwork* This);
+
+    /*** IDot11AdHocNetwork methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetStatus)(
+        IDot11AdHocNetwork* This,
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS *eStatus);
+
+    HRESULT (STDMETHODCALLTYPE *GetSSID)(
+        IDot11AdHocNetwork* This,
+        LPWSTR *ppszwSSID);
+
+    HRESULT (STDMETHODCALLTYPE *HasProfile)(
+        IDot11AdHocNetwork* This,
+        BOOLEAN *pf11d);
+
+    HRESULT (STDMETHODCALLTYPE *GetProfileName)(
+        IDot11AdHocNetwork* This,
+        LPWSTR *ppszwProfileName);
+
+    HRESULT (STDMETHODCALLTYPE *DeleteProfile)(
+        IDot11AdHocNetwork* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetSignalQuality)(
+        IDot11AdHocNetwork* This,
+        ULONG *puStrengthValue,
+        ULONG *puStrengthMax);
+
+    HRESULT (STDMETHODCALLTYPE *GetSecuritySetting)(
+        IDot11AdHocNetwork* This,
+        IDot11AdHocSecuritySettings **pAdHocSecuritySetting);
+
+    HRESULT (STDMETHODCALLTYPE *GetContextGuid)(
+        IDot11AdHocNetwork* This,
+        GUID *pContextGuid);
+
+    HRESULT (STDMETHODCALLTYPE *GetSignature)(
+        IDot11AdHocNetwork* This,
+        GUID *pSignature);
+
+    HRESULT (STDMETHODCALLTYPE *GetInterface)(
+        IDot11AdHocNetwork* This,
+        IDot11AdHocInterface **pAdHocInterface);
+
+    HRESULT (STDMETHODCALLTYPE *Connect)(
+        IDot11AdHocNetwork* This,
+        LPCWSTR Passphrase,
+        LONG GeographicalId,
+        BOOLEAN fSaveProfile,
+        BOOLEAN fMakeSavedProfileUserSpecific);
+
+    HRESULT (STDMETHODCALLTYPE *Disconnect)(
+        IDot11AdHocNetwork* This);
+
+    END_INTERFACE
+} IDot11AdHocNetworkVtbl;
+interface IDot11AdHocNetwork {
+    CONST_VTBL IDot11AdHocNetworkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDot11AdHocNetwork_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDot11AdHocNetwork_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDot11AdHocNetwork_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocNetwork methods ***/
+#define IDot11AdHocNetwork_GetStatus(This,eStatus) (This)->lpVtbl->GetStatus(This,eStatus)
+#define IDot11AdHocNetwork_GetSSID(This,ppszwSSID) (This)->lpVtbl->GetSSID(This,ppszwSSID)
+#define IDot11AdHocNetwork_HasProfile(This,pf11d) (This)->lpVtbl->HasProfile(This,pf11d)
+#define IDot11AdHocNetwork_GetProfileName(This,ppszwProfileName) (This)->lpVtbl->GetProfileName(This,ppszwProfileName)
+#define IDot11AdHocNetwork_DeleteProfile(This) (This)->lpVtbl->DeleteProfile(This)
+#define IDot11AdHocNetwork_GetSignalQuality(This,puStrengthValue,puStrengthMax) (This)->lpVtbl->GetSignalQuality(This,puStrengthValue,puStrengthMax)
+#define IDot11AdHocNetwork_GetSecuritySetting(This,pAdHocSecuritySetting) (This)->lpVtbl->GetSecuritySetting(This,pAdHocSecuritySetting)
+#define IDot11AdHocNetwork_GetContextGuid(This,pContextGuid) (This)->lpVtbl->GetContextGuid(This,pContextGuid)
+#define IDot11AdHocNetwork_GetSignature(This,pSignature) (This)->lpVtbl->GetSignature(This,pSignature)
+#define IDot11AdHocNetwork_GetInterface(This,pAdHocInterface) (This)->lpVtbl->GetInterface(This,pAdHocInterface)
+#define IDot11AdHocNetwork_Connect(This,Passphrase,GeographicalId,fSaveProfile,fMakeSavedProfileUserSpecific) (This)->lpVtbl->Connect(This,Passphrase,GeographicalId,fSaveProfile,fMakeSavedProfileUserSpecific)
+#define IDot11AdHocNetwork_Disconnect(This) (This)->lpVtbl->Disconnect(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocNetwork_QueryInterface(IDot11AdHocNetwork* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocNetwork_AddRef(IDot11AdHocNetwork* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocNetwork_Release(IDot11AdHocNetwork* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocNetwork methods ***/
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetStatus(IDot11AdHocNetwork* This,DOT11_ADHOC_NETWORK_CONNECTION_STATUS *eStatus) {
+    return This->lpVtbl->GetStatus(This,eStatus);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetSSID(IDot11AdHocNetwork* This,LPWSTR *ppszwSSID) {
+    return This->lpVtbl->GetSSID(This,ppszwSSID);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_HasProfile(IDot11AdHocNetwork* This,BOOLEAN *pf11d) {
+    return This->lpVtbl->HasProfile(This,pf11d);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetProfileName(IDot11AdHocNetwork* This,LPWSTR *ppszwProfileName) {
+    return This->lpVtbl->GetProfileName(This,ppszwProfileName);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_DeleteProfile(IDot11AdHocNetwork* This) {
+    return This->lpVtbl->DeleteProfile(This);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetSignalQuality(IDot11AdHocNetwork* This,ULONG *puStrengthValue,ULONG *puStrengthMax) {
+    return This->lpVtbl->GetSignalQuality(This,puStrengthValue,puStrengthMax);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetSecuritySetting(IDot11AdHocNetwork* This,IDot11AdHocSecuritySettings **pAdHocSecuritySetting) {
+    return This->lpVtbl->GetSecuritySetting(This,pAdHocSecuritySetting);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetContextGuid(IDot11AdHocNetwork* This,GUID *pContextGuid) {
+    return This->lpVtbl->GetContextGuid(This,pContextGuid);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetSignature(IDot11AdHocNetwork* This,GUID *pSignature) {
+    return This->lpVtbl->GetSignature(This,pSignature);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_GetInterface(IDot11AdHocNetwork* This,IDot11AdHocInterface **pAdHocInterface) {
+    return This->lpVtbl->GetInterface(This,pAdHocInterface);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_Connect(IDot11AdHocNetwork* This,LPCWSTR Passphrase,LONG GeographicalId,BOOLEAN fSaveProfile,BOOLEAN fMakeSavedProfileUserSpecific) {
+    return This->lpVtbl->Connect(This,Passphrase,GeographicalId,fSaveProfile,fMakeSavedProfileUserSpecific);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetwork_Disconnect(IDot11AdHocNetwork* This) {
+    return This->lpVtbl->Disconnect(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetStatus_Proxy(
+    IDot11AdHocNetwork* This,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS *eStatus);
+void __RPC_STUB IDot11AdHocNetwork_GetStatus_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetSSID_Proxy(
+    IDot11AdHocNetwork* This,
+    LPWSTR *ppszwSSID);
+void __RPC_STUB IDot11AdHocNetwork_GetSSID_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_HasProfile_Proxy(
+    IDot11AdHocNetwork* This,
+    BOOLEAN *pf11d);
+void __RPC_STUB IDot11AdHocNetwork_HasProfile_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetProfileName_Proxy(
+    IDot11AdHocNetwork* This,
+    LPWSTR *ppszwProfileName);
+void __RPC_STUB IDot11AdHocNetwork_GetProfileName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_DeleteProfile_Proxy(
+    IDot11AdHocNetwork* This);
+void __RPC_STUB IDot11AdHocNetwork_DeleteProfile_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetSignalQuality_Proxy(
+    IDot11AdHocNetwork* This,
+    ULONG *puStrengthValue,
+    ULONG *puStrengthMax);
+void __RPC_STUB IDot11AdHocNetwork_GetSignalQuality_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetSecuritySetting_Proxy(
+    IDot11AdHocNetwork* This,
+    IDot11AdHocSecuritySettings **pAdHocSecuritySetting);
+void __RPC_STUB IDot11AdHocNetwork_GetSecuritySetting_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetContextGuid_Proxy(
+    IDot11AdHocNetwork* This,
+    GUID *pContextGuid);
+void __RPC_STUB IDot11AdHocNetwork_GetContextGuid_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetSignature_Proxy(
+    IDot11AdHocNetwork* This,
+    GUID *pSignature);
+void __RPC_STUB IDot11AdHocNetwork_GetSignature_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_GetInterface_Proxy(
+    IDot11AdHocNetwork* This,
+    IDot11AdHocInterface **pAdHocInterface);
+void __RPC_STUB IDot11AdHocNetwork_GetInterface_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_Connect_Proxy(
+    IDot11AdHocNetwork* This,
+    LPCWSTR Passphrase,
+    LONG GeographicalId,
+    BOOLEAN fSaveProfile,
+    BOOLEAN fMakeSavedProfileUserSpecific);
+void __RPC_STUB IDot11AdHocNetwork_Connect_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetwork_Disconnect_Proxy(
+    IDot11AdHocNetwork* This);
+void __RPC_STUB IDot11AdHocNetwork_Disconnect_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocNetwork_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDot11AdHocNetworkNotificationSink interface
+ */
+#ifndef __IDot11AdHocNetworkNotificationSink_INTERFACE_DEFINED__
+#define __IDot11AdHocNetworkNotificationSink_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDot11AdHocNetworkNotificationSink, 0x8f10cc2a, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc2a-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocNetworkNotificationSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnStatusChange(
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnConnectFail(
+        DOT11_ADHOC_CONNECT_FAIL_REASON eFailReason) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocNetworkNotificationSink, 0x8f10cc2a, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IDot11AdHocNetworkNotificationSinkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocNetworkNotificationSink* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocNetworkNotificationSink* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocNetworkNotificationSink* This);
+
+    /*** IDot11AdHocNetworkNotificationSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnStatusChange)(
+        IDot11AdHocNetworkNotificationSink* This,
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus);
+
+    HRESULT (STDMETHODCALLTYPE *OnConnectFail)(
+        IDot11AdHocNetworkNotificationSink* This,
+        DOT11_ADHOC_CONNECT_FAIL_REASON eFailReason);
+
+    END_INTERFACE
+} IDot11AdHocNetworkNotificationSinkVtbl;
+interface IDot11AdHocNetworkNotificationSink {
+    CONST_VTBL IDot11AdHocNetworkNotificationSinkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDot11AdHocNetworkNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDot11AdHocNetworkNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDot11AdHocNetworkNotificationSink_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocNetworkNotificationSink methods ***/
+#define IDot11AdHocNetworkNotificationSink_OnStatusChange(This,eStatus) (This)->lpVtbl->OnStatusChange(This,eStatus)
+#define IDot11AdHocNetworkNotificationSink_OnConnectFail(This,eFailReason) (This)->lpVtbl->OnConnectFail(This,eFailReason)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocNetworkNotificationSink_QueryInterface(IDot11AdHocNetworkNotificationSink* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocNetworkNotificationSink_AddRef(IDot11AdHocNetworkNotificationSink* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocNetworkNotificationSink_Release(IDot11AdHocNetworkNotificationSink* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocNetworkNotificationSink methods ***/
+static FORCEINLINE HRESULT IDot11AdHocNetworkNotificationSink_OnStatusChange(IDot11AdHocNetworkNotificationSink* This,DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus) {
+    return This->lpVtbl->OnStatusChange(This,eStatus);
+}
+static FORCEINLINE HRESULT IDot11AdHocNetworkNotificationSink_OnConnectFail(IDot11AdHocNetworkNotificationSink* This,DOT11_ADHOC_CONNECT_FAIL_REASON eFailReason) {
+    return This->lpVtbl->OnConnectFail(This,eFailReason);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetworkNotificationSink_OnStatusChange_Proxy(
+    IDot11AdHocNetworkNotificationSink* This,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus);
+void __RPC_STUB IDot11AdHocNetworkNotificationSink_OnStatusChange_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocNetworkNotificationSink_OnConnectFail_Proxy(
+    IDot11AdHocNetworkNotificationSink* This,
+    DOT11_ADHOC_CONNECT_FAIL_REASON eFailReason);
+void __RPC_STUB IDot11AdHocNetworkNotificationSink_OnConnectFail_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocNetworkNotificationSink_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDot11AdHocInterface interface
+ */
+#ifndef __IDot11AdHocInterface_INTERFACE_DEFINED__
+#define __IDot11AdHocInterface_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDot11AdHocInterface, 0x8f10cc2b, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc2b-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocInterface : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDeviceSignature(
+        GUID *pSignature) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFriendlyName(
+        LPWSTR *ppszName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsDot11d(
+        BOOLEAN *pf11d) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsAdHocCapable(
+        BOOLEAN *pfAdHocCapable) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsRadioOn(
+        BOOLEAN *pfIsRadioOn) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetActiveNetwork(
+        IDot11AdHocNetwork **ppNetwork) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetIEnumSecuritySettings(
+        IEnumDot11AdHocSecuritySettings **ppEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetIEnumDot11AdHocNetworks(
+        GUID *pFilterGuid,
+        IEnumDot11AdHocNetworks **ppEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStatus(
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS *pState) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocInterface, 0x8f10cc2b, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IDot11AdHocInterfaceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocInterface* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocInterface* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocInterface* This);
+
+    /*** IDot11AdHocInterface methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDeviceSignature)(
+        IDot11AdHocInterface* This,
+        GUID *pSignature);
+
+    HRESULT (STDMETHODCALLTYPE *GetFriendlyName)(
+        IDot11AdHocInterface* This,
+        LPWSTR *ppszName);
+
+    HRESULT (STDMETHODCALLTYPE *IsDot11d)(
+        IDot11AdHocInterface* This,
+        BOOLEAN *pf11d);
+
+    HRESULT (STDMETHODCALLTYPE *IsAdHocCapable)(
+        IDot11AdHocInterface* This,
+        BOOLEAN *pfAdHocCapable);
+
+    HRESULT (STDMETHODCALLTYPE *IsRadioOn)(
+        IDot11AdHocInterface* This,
+        BOOLEAN *pfIsRadioOn);
+
+    HRESULT (STDMETHODCALLTYPE *GetActiveNetwork)(
+        IDot11AdHocInterface* This,
+        IDot11AdHocNetwork **ppNetwork);
+
+    HRESULT (STDMETHODCALLTYPE *GetIEnumSecuritySettings)(
+        IDot11AdHocInterface* This,
+        IEnumDot11AdHocSecuritySettings **ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *GetIEnumDot11AdHocNetworks)(
+        IDot11AdHocInterface* This,
+        GUID *pFilterGuid,
+        IEnumDot11AdHocNetworks **ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *GetStatus)(
+        IDot11AdHocInterface* This,
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS *pState);
+
+    END_INTERFACE
+} IDot11AdHocInterfaceVtbl;
+interface IDot11AdHocInterface {
+    CONST_VTBL IDot11AdHocInterfaceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IDot11AdHocInterface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IDot11AdHocInterface_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IDot11AdHocInterface_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocInterface methods ***/
 #define IDot11AdHocInterface_GetDeviceSignature(This,pSignature) (This)->lpVtbl->GetDeviceSignature(This,pSignature)
 #define IDot11AdHocInterface_GetFriendlyName(This,ppszName) (This)->lpVtbl->GetFriendlyName(This,ppszName)
 #define IDot11AdHocInterface_IsDot11d(This,pf11d) (This)->lpVtbl->IsDot11d(This,pf11d)
@@ -111,289 +1162,627 @@
 #define IDot11AdHocInterface_GetIEnumSecuritySettings(This,ppEnum) (This)->lpVtbl->GetIEnumSecuritySettings(This,ppEnum)
 #define IDot11AdHocInterface_GetIEnumDot11AdHocNetworks(This,pFilterGuid,ppEnum) (This)->lpVtbl->GetIEnumDot11AdHocNetworks(This,pFilterGuid,ppEnum)
 #define IDot11AdHocInterface_GetStatus(This,pState) (This)->lpVtbl->GetStatus(This,pState)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocInterface_QueryInterface(IDot11AdHocInterface* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocInterface_AddRef(IDot11AdHocInterface* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocInterface_Release(IDot11AdHocInterface* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocInterface methods ***/
+static FORCEINLINE HRESULT IDot11AdHocInterface_GetDeviceSignature(IDot11AdHocInterface* This,GUID *pSignature) {
+    return This->lpVtbl->GetDeviceSignature(This,pSignature);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_GetFriendlyName(IDot11AdHocInterface* This,LPWSTR *ppszName) {
+    return This->lpVtbl->GetFriendlyName(This,ppszName);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_IsDot11d(IDot11AdHocInterface* This,BOOLEAN *pf11d) {
+    return This->lpVtbl->IsDot11d(This,pf11d);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_IsAdHocCapable(IDot11AdHocInterface* This,BOOLEAN *pfAdHocCapable) {
+    return This->lpVtbl->IsAdHocCapable(This,pfAdHocCapable);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_IsRadioOn(IDot11AdHocInterface* This,BOOLEAN *pfIsRadioOn) {
+    return This->lpVtbl->IsRadioOn(This,pfIsRadioOn);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_GetActiveNetwork(IDot11AdHocInterface* This,IDot11AdHocNetwork **ppNetwork) {
+    return This->lpVtbl->GetActiveNetwork(This,ppNetwork);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_GetIEnumSecuritySettings(IDot11AdHocInterface* This,IEnumDot11AdHocSecuritySettings **ppEnum) {
+    return This->lpVtbl->GetIEnumSecuritySettings(This,ppEnum);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_GetIEnumDot11AdHocNetworks(IDot11AdHocInterface* This,GUID *pFilterGuid,IEnumDot11AdHocNetworks **ppEnum) {
+    return This->lpVtbl->GetIEnumDot11AdHocNetworks(This,pFilterGuid,ppEnum);
+}
+static FORCEINLINE HRESULT IDot11AdHocInterface_GetStatus(IDot11AdHocInterface* This,DOT11_ADHOC_NETWORK_CONNECTION_STATUS *pState) {
+    return This->lpVtbl->GetStatus(This,pState);
+}
 #endif
-DECLARE_INTERFACE_(IDot11AdHocManager,IUnknown)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_GetDeviceSignature_Proxy(
+    IDot11AdHocInterface* This,
+    GUID *pSignature);
+void __RPC_STUB IDot11AdHocInterface_GetDeviceSignature_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_GetFriendlyName_Proxy(
+    IDot11AdHocInterface* This,
+    LPWSTR *ppszName);
+void __RPC_STUB IDot11AdHocInterface_GetFriendlyName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_IsDot11d_Proxy(
+    IDot11AdHocInterface* This,
+    BOOLEAN *pf11d);
+void __RPC_STUB IDot11AdHocInterface_IsDot11d_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_IsAdHocCapable_Proxy(
+    IDot11AdHocInterface* This,
+    BOOLEAN *pfAdHocCapable);
+void __RPC_STUB IDot11AdHocInterface_IsAdHocCapable_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_IsRadioOn_Proxy(
+    IDot11AdHocInterface* This,
+    BOOLEAN *pfIsRadioOn);
+void __RPC_STUB IDot11AdHocInterface_IsRadioOn_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_GetActiveNetwork_Proxy(
+    IDot11AdHocInterface* This,
+    IDot11AdHocNetwork **ppNetwork);
+void __RPC_STUB IDot11AdHocInterface_GetActiveNetwork_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_GetIEnumSecuritySettings_Proxy(
+    IDot11AdHocInterface* This,
+    IEnumDot11AdHocSecuritySettings **ppEnum);
+void __RPC_STUB IDot11AdHocInterface_GetIEnumSecuritySettings_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_GetIEnumDot11AdHocNetworks_Proxy(
+    IDot11AdHocInterface* This,
+    GUID *pFilterGuid,
+    IEnumDot11AdHocNetworks **ppEnum);
+void __RPC_STUB IDot11AdHocInterface_GetIEnumDot11AdHocNetworks_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterface_GetStatus_Proxy(
+    IDot11AdHocInterface* This,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS *pState);
+void __RPC_STUB IDot11AdHocInterface_GetStatus_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocInterface_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDot11AdHocInterfaces interface
+ */
+#ifndef __IEnumDot11AdHocInterfaces_INTERFACE_DEFINED__
+#define __IEnumDot11AdHocInterfaces_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDot11AdHocInterfaces, 0x8f10cc2c, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc2c-cf0d-42a0-acbe-e2de7007384d")
+IEnumDot11AdHocInterfaces : public IUnknown
 {
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cElt,
+        IDot11AdHocInterface **rgElt,
+        ULONG *pcEltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cElt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDot11AdHocInterfaces **ppEnum) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDot11AdHocInterfaces, 0x8f10cc2c, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IEnumDot11AdHocInterfacesVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDot11AdHocInterfaces* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDot11AdHocManager methods */
-    STDMETHOD_(HRESULT,CreateNetwork)(THIS_ LPCWSTR Name,LPCWSTR Password,LONG GeographicalId,IDot11AdHocInterface *pInterface,IDot11AdHocSecuritySettings *pSecurity,GUID *pContextGuid,IDot11AdHocNetwork **pIAdHoc) PURE;
-    STDMETHOD_(HRESULT,CommitCreatedNetwork)(THIS_ IDot11AdHocNetwork *pIAdHoc,BOOLEAN fSaveProfile,BOOLEAN fMakeSavedProfileUserSpecific) PURE;
-    STDMETHOD_(HRESULT,GetIEnumDot11AdHocNetworks)(THIS_ GUID *pContextGuid,IEnumDot11AdHocNetworks **ppEnum) PURE;
-    STDMETHOD_(HRESULT,GetIEnumDot11AdHocInterfaces)(THIS_ IEnumDot11AdHocInterfaces **ppEnum) PURE;
-    STDMETHOD_(HRESULT,GetNetwork)(THIS_ GUID *NetworkSignature,IDot11AdHocNetwork **pNetwork) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDot11AdHocInterfaces* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDot11AdHocInterfaces* This);
+
+    /*** IEnumDot11AdHocInterfaces methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumDot11AdHocInterfaces* This,
+        ULONG cElt,
+        IDot11AdHocInterface **rgElt,
+        ULONG *pcEltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDot11AdHocInterfaces* This,
+        ULONG cElt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDot11AdHocInterfaces* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDot11AdHocInterfaces* This,
+        IEnumDot11AdHocInterfaces **ppEnum);
 
     END_INTERFACE
+} IEnumDot11AdHocInterfacesVtbl;
+interface IEnumDot11AdHocInterfaces {
+    CONST_VTBL IEnumDot11AdHocInterfacesVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IDot11AdHocManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDot11AdHocManager_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDot11AdHocManager_Release(This) (This)->lpVtbl->Release(This)
-#define IDot11AdHocManager_CreateNetwork(This,Name,Password,GeographicalId,pInterface,pSecurity,pContextGuid,pIAdHoc) (This)->lpVtbl->CreateNetwork(This,Name,Password,GeographicalId,pInterface,pSecurity,pContextGuid,pIAdHoc)
-#define IDot11AdHocManager_CommitCreatedNetwork(This,pIAdHoc,fSaveProfile,fMakeSavedProfileUserSpecific) (This)->lpVtbl->CommitCreatedNetwork(This,pIAdHoc,fSaveProfile,fMakeSavedProfileUserSpecific)
-#define IDot11AdHocManager_GetIEnumDot11AdHocNetworks(This,pContextGuid,ppEnum) (This)->lpVtbl->GetIEnumDot11AdHocNetworks(This,pContextGuid,ppEnum)
-#define IDot11AdHocManager_GetIEnumDot11AdHocInterfaces(This,ppEnum) (This)->lpVtbl->GetIEnumDot11AdHocInterfaces(This,ppEnum)
-#define IDot11AdHocManager_GetNetwork(This,NetworkSignature,pNetwork) (This)->lpVtbl->GetNetwork(This,NetworkSignature,pNetwork)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocManagerNotificationSink
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IDot11AdHocManagerNotificationSink,IUnknown)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDot11AdHocManagerNotificationSink methods */
-    STDMETHOD_(HRESULT,OnNetworkAdd)(THIS_ IDot11AdHocNetwork *pIAdHocNetwork) PURE;
-    STDMETHOD_(HRESULT,OnNetworkRemove)(THIS_ GUID *Signature) PURE;
-    STDMETHOD_(HRESULT,OnInterfaceAdd)(THIS_ IDot11AdHocInterface *pIAdHocInterface) PURE;
-    STDMETHOD_(HRESULT,OnInterfaceRemove)(THIS_ GUID *Signature) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDot11AdHocManagerNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDot11AdHocManagerNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDot11AdHocManagerNotificationSink_Release(This) (This)->lpVtbl->Release(This)
-#define IDot11AdHocManagerNotificationSink_OnNetworkAdd(This,pIAdHocNetwork) (This)->lpVtbl->OnNetworkAdd(This,pIAdHocNetwork)
-#define IDot11AdHocManagerNotificationSink_OnNetworkRemove(This,Signature) (This)->lpVtbl->OnNetworkRemove(This,Signature)
-#define IDot11AdHocManagerNotificationSink_OnInterfaceAdd(This,pIAdHocInterface) (This)->lpVtbl->OnInterfaceAdd(This,pIAdHocInterface)
-#define IDot11AdHocManagerNotificationSink_OnInterfaceRemove(This,Signature) (This)->lpVtbl->OnInterfaceRemove(This,Signature)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocNetwork
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IDot11AdHocNetwork,IUnknown)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDot11AdHocNetwork methods */
-    STDMETHOD_(HRESULT,GetStatus)(THIS_ DOT11_ADHOC_NETWORK_CONNECTION_STATUS *eStatus) PURE;
-    STDMETHOD_(HRESULT,GetSSID)(THIS_ LPWSTR *ppszwSSID) PURE;
-    STDMETHOD_(HRESULT,HasProfile)(THIS_ BOOLEAN *pf11d) PURE;
-    STDMETHOD_(HRESULT,GetProfileName)(THIS_ LPWSTR *ppszwProfileName) PURE;
-    STDMETHOD_(HRESULT,DeleteProfile)(THIS) PURE;
-    STDMETHOD_(HRESULT,GetSignalQuality)(THIS_ ULONG *puStrengthValue,ULONG *puStrengthMax) PURE;
-    STDMETHOD_(HRESULT,GetSecuritySetting)(THIS_ IDot11AdHocSecuritySettings **pAdHocSecuritySetting) PURE;
-    STDMETHOD_(HRESULT,GetContextGuid)(THIS_ GUID *pContextGuid) PURE;
-    STDMETHOD_(HRESULT,GetSignature)(THIS_ GUID *pSignature) PURE;
-    STDMETHOD_(HRESULT,GetInterface)(THIS_ IDot11AdHocInterface **pAdHocInterface) PURE;
-    STDMETHOD_(HRESULT,Connect)(THIS_ LPCWSTR Passphrase,LONG GeographicalId,BOOLEAN fSaveProfile,BOOLEAN fMakeSavedProfileUserSpecific) PURE;
-    STDMETHOD_(HRESULT,Disconnect)(THIS) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDot11AdHocNetwork_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDot11AdHocNetwork_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDot11AdHocNetwork_Release(This) (This)->lpVtbl->Release(This)
-#define IDot11AdHocNetwork_GetStatus(This,eStatus) (This)->lpVtbl->GetStatus(This,eStatus)
-#define IDot11AdHocNetwork_GetSSID(This,ppszwSSID) (This)->lpVtbl->GetSSID(This,ppszwSSID)
-#define IDot11AdHocNetwork_HasProfile(This,pf11d) (This)->lpVtbl->HasProfile(This,pf11d)
-#define IDot11AdHocNetwork_GetProfileName(This,ppszwProfileName) (This)->lpVtbl->GetProfileName(This,ppszwProfileName)
-#define IDot11AdHocNetwork_DeleteProfile() (This)->lpVtbl->DeleteProfile(This)
-#define IDot11AdHocNetwork_GetSignalQuality(This,puStrengthValue,puStrengthMax) (This)->lpVtbl->GetSignalQuality(This,puStrengthValue,puStrengthMax)
-#define IDot11AdHocNetwork_GetSecuritySetting(This,pAdHocSecuritySetting) (This)->lpVtbl->GetSecuritySetting(This,pAdHocSecuritySetting)
-#define IDot11AdHocNetwork_GetContextGuid(This,pContextGuid) (This)->lpVtbl->GetContextGuid(This,pContextGuid)
-#define IDot11AdHocNetwork_GetSignature(This,pSignature) (This)->lpVtbl->GetSignature(This,pSignature)
-#define IDot11AdHocNetwork_GetInterface(This,pAdHocInterface) (This)->lpVtbl->GetInterface(This,pAdHocInterface)
-#define IDot11AdHocNetwork_Connect(This,Passphrase,GeographicalId,fSaveProfile,fMakeSavedProfileUserSpecific) (This)->lpVtbl->Connect(This,Passphrase,GeographicalId,fSaveProfile,fMakeSavedProfileUserSpecific)
-#define IDot11AdHocNetwork_Disconnect() (This)->lpVtbl->Disconnect(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocNetworkNotificationSink
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IDot11AdHocNetworkNotificationSink,IUnknown)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDot11AdHocNetworkNotificationSink methods */
-    STDMETHOD_(HRESULT,OnStatusChange)(THIS_ DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus) PURE;
-    STDMETHOD_(HRESULT,OnConnectFail)(THIS_ DOT11_ADHOC_CONNECT_FAIL_REASON eFailReason) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDot11AdHocNetworkNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDot11AdHocNetworkNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDot11AdHocNetworkNotificationSink_Release(This) (This)->lpVtbl->Release(This)
-#define IDot11AdHocNetworkNotificationSink_OnStatusChange(This,eStatus) (This)->lpVtbl->OnStatusChange(This,eStatus)
-#define IDot11AdHocNetworkNotificationSink_OnConnectFail(This,eFailReason) (This)->lpVtbl->OnConnectFail(This,eFailReason)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IDot11AdHocSecuritySettings
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IDot11AdHocSecuritySettings,IUnknown)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDot11AdHocSecuritySettings methods */
-    STDMETHOD_(HRESULT,GetDot11AuthAlgorithm)(THIS_ DOT11_ADHOC_AUTH_ALGORITHM *pAuth) PURE;
-    STDMETHOD_(HRESULT,GetDot11CipherAlgorithm)(THIS_ DOT11_ADHOC_CIPHER_ALGORITHM *pCipher) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IDot11AdHocSecuritySettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IDot11AdHocSecuritySettings_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IDot11AdHocSecuritySettings_Release(This) (This)->lpVtbl->Release(This)
-#define IDot11AdHocSecuritySettings_GetDot11AuthAlgorithm(This,pAuth) (This)->lpVtbl->GetDot11AuthAlgorithm(This,pAuth)
-#define IDot11AdHocSecuritySettings_GetDot11CipherAlgorithm(This,pCipher) (This)->lpVtbl->GetDot11CipherAlgorithm(This,pCipher)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IEnumDot11AdHocInterfaces
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IEnumDot11AdHocInterfaces,IUnknown)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IEnumDot11AdHocInterfaces methods */
-    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cElt,IDot11AdHocInterface **rgElt,ULONG *pcEltFetched) PURE;
-    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cElt) PURE;
-    STDMETHOD_(HRESULT,Reset)(THIS) PURE;
-    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumDot11AdHocInterfaces **ppEnum) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IEnumDot11AdHocInterfaces_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IEnumDot11AdHocInterfaces_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IEnumDot11AdHocInterfaces_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDot11AdHocInterfaces methods ***/
 #define IEnumDot11AdHocInterfaces_Next(This,cElt,rgElt,pcEltFetched) (This)->lpVtbl->Next(This,cElt,rgElt,pcEltFetched)
 #define IEnumDot11AdHocInterfaces_Skip(This,cElt) (This)->lpVtbl->Skip(This,cElt)
-#define IEnumDot11AdHocInterfaces_Reset() (This)->lpVtbl->Reset(This)
+#define IEnumDot11AdHocInterfaces_Reset(This) (This)->lpVtbl->Reset(This)
 #define IEnumDot11AdHocInterfaces_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IEnumDot11AdHocNetworks
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDot11AdHocInterfaces_QueryInterface(IEnumDot11AdHocInterfaces* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDot11AdHocInterfaces_AddRef(IEnumDot11AdHocInterfaces* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDot11AdHocInterfaces_Release(IEnumDot11AdHocInterfaces* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDot11AdHocInterfaces methods ***/
+static FORCEINLINE HRESULT IEnumDot11AdHocInterfaces_Next(IEnumDot11AdHocInterfaces* This,ULONG cElt,IDot11AdHocInterface **rgElt,ULONG *pcEltFetched) {
+    return This->lpVtbl->Next(This,cElt,rgElt,pcEltFetched);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocInterfaces_Skip(IEnumDot11AdHocInterfaces* This,ULONG cElt) {
+    return This->lpVtbl->Skip(This,cElt);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocInterfaces_Reset(IEnumDot11AdHocInterfaces* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocInterfaces_Clone(IEnumDot11AdHocInterfaces* This,IEnumDot11AdHocInterfaces **ppEnum) {
+    return This->lpVtbl->Clone(This,ppEnum);
+}
 #endif
-DECLARE_INTERFACE_(IEnumDot11AdHocNetworks,IUnknown)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocInterfaces_Next_Proxy(
+    IEnumDot11AdHocInterfaces* This,
+    ULONG cElt,
+    IDot11AdHocInterface **rgElt,
+    ULONG *pcEltFetched);
+void __RPC_STUB IEnumDot11AdHocInterfaces_Next_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocInterfaces_Skip_Proxy(
+    IEnumDot11AdHocInterfaces* This,
+    ULONG cElt);
+void __RPC_STUB IEnumDot11AdHocInterfaces_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocInterfaces_Reset_Proxy(
+    IEnumDot11AdHocInterfaces* This);
+void __RPC_STUB IEnumDot11AdHocInterfaces_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocInterfaces_Clone_Proxy(
+    IEnumDot11AdHocInterfaces* This,
+    IEnumDot11AdHocInterfaces **ppEnum);
+void __RPC_STUB IEnumDot11AdHocInterfaces_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IEnumDot11AdHocInterfaces_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDot11AdHocSecuritySettings interface
+ */
+#ifndef __IEnumDot11AdHocSecuritySettings_INTERFACE_DEFINED__
+#define __IEnumDot11AdHocSecuritySettings_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDot11AdHocSecuritySettings, 0x8f10cc2d, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc2d-cf0d-42a0-acbe-e2de7007384d")
+IEnumDot11AdHocSecuritySettings : public IUnknown
 {
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cElt,
+        IDot11AdHocSecuritySettings **rgElt,
+        ULONG *pcEltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cElt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDot11AdHocSecuritySettings **ppEnum) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDot11AdHocSecuritySettings, 0x8f10cc2d, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IEnumDot11AdHocSecuritySettingsVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDot11AdHocSecuritySettings* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IEnumDot11AdHocNetworks methods */
-    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cElt,IDot11AdHocNetwork **rgElt,ULONG *pcEltFetched) PURE;
-    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cElt) PURE;
-    STDMETHOD_(HRESULT,Reset)(THIS) PURE;
-    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumDot11AdHocNetworks **ppEnum) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDot11AdHocSecuritySettings* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDot11AdHocSecuritySettings* This);
+
+    /*** IEnumDot11AdHocSecuritySettings methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumDot11AdHocSecuritySettings* This,
+        ULONG cElt,
+        IDot11AdHocSecuritySettings **rgElt,
+        ULONG *pcEltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDot11AdHocSecuritySettings* This,
+        ULONG cElt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDot11AdHocSecuritySettings* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDot11AdHocSecuritySettings* This,
+        IEnumDot11AdHocSecuritySettings **ppEnum);
 
     END_INTERFACE
+} IEnumDot11AdHocSecuritySettingsVtbl;
+interface IEnumDot11AdHocSecuritySettings {
+    CONST_VTBL IEnumDot11AdHocSecuritySettingsVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IEnumDot11AdHocNetworks_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IEnumDot11AdHocNetworks_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IEnumDot11AdHocNetworks_Release(This) (This)->lpVtbl->Release(This)
-#define IEnumDot11AdHocNetworks_Next(This,cElt,rgElt,pcEltFetched) (This)->lpVtbl->Next(This,cElt,rgElt,pcEltFetched)
-#define IEnumDot11AdHocNetworks_Skip(This,cElt) (This)->lpVtbl->Skip(This,cElt)
-#define IEnumDot11AdHocNetworks_Reset() (This)->lpVtbl->Reset(This)
-#define IEnumDot11AdHocNetworks_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IEnumDot11AdHocSecuritySettings
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IEnumDot11AdHocSecuritySettings,IUnknown)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IEnumDot11AdHocSecuritySettings methods */
-    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cElt,IDot11AdHocSecuritySettings **rgElt,ULONG *pcEltFetched) PURE;
-    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cElt) PURE;
-    STDMETHOD_(HRESULT,Reset)(THIS) PURE;
-    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumDot11AdHocSecuritySettings **ppEnum) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IEnumDot11AdHocSecuritySettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IEnumDot11AdHocSecuritySettings_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IEnumDot11AdHocSecuritySettings_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDot11AdHocSecuritySettings methods ***/
 #define IEnumDot11AdHocSecuritySettings_Next(This,cElt,rgElt,pcEltFetched) (This)->lpVtbl->Next(This,cElt,rgElt,pcEltFetched)
 #define IEnumDot11AdHocSecuritySettings_Skip(This,cElt) (This)->lpVtbl->Skip(This,cElt)
-#define IEnumDot11AdHocSecuritySettings_Reset() (This)->lpVtbl->Reset(This)
+#define IEnumDot11AdHocSecuritySettings_Reset(This) (This)->lpVtbl->Reset(This)
 #define IEnumDot11AdHocSecuritySettings_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
-#endif /*COBJMACROS*/
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDot11AdHocSecuritySettings_QueryInterface(IEnumDot11AdHocSecuritySettings* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDot11AdHocSecuritySettings_AddRef(IEnumDot11AdHocSecuritySettings* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDot11AdHocSecuritySettings_Release(IEnumDot11AdHocSecuritySettings* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDot11AdHocSecuritySettings methods ***/
+static FORCEINLINE HRESULT IEnumDot11AdHocSecuritySettings_Next(IEnumDot11AdHocSecuritySettings* This,ULONG cElt,IDot11AdHocSecuritySettings **rgElt,ULONG *pcEltFetched) {
+    return This->lpVtbl->Next(This,cElt,rgElt,pcEltFetched);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocSecuritySettings_Skip(IEnumDot11AdHocSecuritySettings* This,ULONG cElt) {
+    return This->lpVtbl->Skip(This,cElt);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocSecuritySettings_Reset(IEnumDot11AdHocSecuritySettings* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDot11AdHocSecuritySettings_Clone(IEnumDot11AdHocSecuritySettings* This,IEnumDot11AdHocSecuritySettings **ppEnum) {
+    return This->lpVtbl->Clone(This,ppEnum);
+}
+#endif
+#endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_ADHOC*/
+#endif
+
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocSecuritySettings_Next_Proxy(
+    IEnumDot11AdHocSecuritySettings* This,
+    ULONG cElt,
+    IDot11AdHocSecuritySettings **rgElt,
+    ULONG *pcEltFetched);
+void __RPC_STUB IEnumDot11AdHocSecuritySettings_Next_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocSecuritySettings_Skip_Proxy(
+    IEnumDot11AdHocSecuritySettings* This,
+    ULONG cElt);
+void __RPC_STUB IEnumDot11AdHocSecuritySettings_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocSecuritySettings_Reset_Proxy(
+    IEnumDot11AdHocSecuritySettings* This);
+void __RPC_STUB IEnumDot11AdHocSecuritySettings_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDot11AdHocSecuritySettings_Clone_Proxy(
+    IEnumDot11AdHocSecuritySettings* This,
+    IEnumDot11AdHocSecuritySettings **ppEnum);
+void __RPC_STUB IEnumDot11AdHocSecuritySettings_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IEnumDot11AdHocSecuritySettings_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDot11AdHocSecuritySettings interface
+ */
+#ifndef __IDot11AdHocSecuritySettings_INTERFACE_DEFINED__
+#define __IDot11AdHocSecuritySettings_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDot11AdHocSecuritySettings, 0x8f10cc2e, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc2e-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocSecuritySettings : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDot11AuthAlgorithm(
+        DOT11_ADHOC_AUTH_ALGORITHM *pAuth) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDot11CipherAlgorithm(
+        DOT11_ADHOC_CIPHER_ALGORITHM *pCipher) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocSecuritySettings, 0x8f10cc2e, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IDot11AdHocSecuritySettingsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocSecuritySettings* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocSecuritySettings* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocSecuritySettings* This);
+
+    /*** IDot11AdHocSecuritySettings methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDot11AuthAlgorithm)(
+        IDot11AdHocSecuritySettings* This,
+        DOT11_ADHOC_AUTH_ALGORITHM *pAuth);
+
+    HRESULT (STDMETHODCALLTYPE *GetDot11CipherAlgorithm)(
+        IDot11AdHocSecuritySettings* This,
+        DOT11_ADHOC_CIPHER_ALGORITHM *pCipher);
+
+    END_INTERFACE
+} IDot11AdHocSecuritySettingsVtbl;
+interface IDot11AdHocSecuritySettings {
+    CONST_VTBL IDot11AdHocSecuritySettingsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDot11AdHocSecuritySettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDot11AdHocSecuritySettings_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDot11AdHocSecuritySettings_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocSecuritySettings methods ***/
+#define IDot11AdHocSecuritySettings_GetDot11AuthAlgorithm(This,pAuth) (This)->lpVtbl->GetDot11AuthAlgorithm(This,pAuth)
+#define IDot11AdHocSecuritySettings_GetDot11CipherAlgorithm(This,pCipher) (This)->lpVtbl->GetDot11CipherAlgorithm(This,pCipher)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocSecuritySettings_QueryInterface(IDot11AdHocSecuritySettings* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocSecuritySettings_AddRef(IDot11AdHocSecuritySettings* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocSecuritySettings_Release(IDot11AdHocSecuritySettings* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocSecuritySettings methods ***/
+static FORCEINLINE HRESULT IDot11AdHocSecuritySettings_GetDot11AuthAlgorithm(IDot11AdHocSecuritySettings* This,DOT11_ADHOC_AUTH_ALGORITHM *pAuth) {
+    return This->lpVtbl->GetDot11AuthAlgorithm(This,pAuth);
+}
+static FORCEINLINE HRESULT IDot11AdHocSecuritySettings_GetDot11CipherAlgorithm(IDot11AdHocSecuritySettings* This,DOT11_ADHOC_CIPHER_ALGORITHM *pCipher) {
+    return This->lpVtbl->GetDot11CipherAlgorithm(This,pCipher);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocSecuritySettings_GetDot11AuthAlgorithm_Proxy(
+    IDot11AdHocSecuritySettings* This,
+    DOT11_ADHOC_AUTH_ALGORITHM *pAuth);
+void __RPC_STUB IDot11AdHocSecuritySettings_GetDot11AuthAlgorithm_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDot11AdHocSecuritySettings_GetDot11CipherAlgorithm_Proxy(
+    IDot11AdHocSecuritySettings* This,
+    DOT11_ADHOC_CIPHER_ALGORITHM *pCipher);
+void __RPC_STUB IDot11AdHocSecuritySettings_GetDot11CipherAlgorithm_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocSecuritySettings_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDot11AdHocInterfaceNotificationSink interface
+ */
+#ifndef __IDot11AdHocInterfaceNotificationSink_INTERFACE_DEFINED__
+#define __IDot11AdHocInterfaceNotificationSink_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDot11AdHocInterfaceNotificationSink, 0x8f10cc2f, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8f10cc2f-cf0d-42a0-acbe-e2de7007384d")
+IDot11AdHocInterfaceNotificationSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnConnectionStatusChange(
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDot11AdHocInterfaceNotificationSink, 0x8f10cc2f, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
+#endif
+#else
+typedef struct IDot11AdHocInterfaceNotificationSinkVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDot11AdHocInterfaceNotificationSink* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDot11AdHocInterfaceNotificationSink* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDot11AdHocInterfaceNotificationSink* This);
+
+    /*** IDot11AdHocInterfaceNotificationSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnConnectionStatusChange)(
+        IDot11AdHocInterfaceNotificationSink* This,
+        DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus);
+
+    END_INTERFACE
+} IDot11AdHocInterfaceNotificationSinkVtbl;
+interface IDot11AdHocInterfaceNotificationSink {
+    CONST_VTBL IDot11AdHocInterfaceNotificationSinkVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDot11AdHocInterfaceNotificationSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDot11AdHocInterfaceNotificationSink_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDot11AdHocInterfaceNotificationSink_Release(This) (This)->lpVtbl->Release(This)
+/*** IDot11AdHocInterfaceNotificationSink methods ***/
+#define IDot11AdHocInterfaceNotificationSink_OnConnectionStatusChange(This,eStatus) (This)->lpVtbl->OnConnectionStatusChange(This,eStatus)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDot11AdHocInterfaceNotificationSink_QueryInterface(IDot11AdHocInterfaceNotificationSink* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDot11AdHocInterfaceNotificationSink_AddRef(IDot11AdHocInterfaceNotificationSink* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDot11AdHocInterfaceNotificationSink_Release(IDot11AdHocInterfaceNotificationSink* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDot11AdHocInterfaceNotificationSink methods ***/
+static FORCEINLINE HRESULT IDot11AdHocInterfaceNotificationSink_OnConnectionStatusChange(IDot11AdHocInterfaceNotificationSink* This,DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus) {
+    return This->lpVtbl->OnConnectionStatusChange(This,eStatus);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDot11AdHocInterfaceNotificationSink_OnConnectionStatusChange_Proxy(
+    IDot11AdHocInterfaceNotificationSink* This,
+    DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus);
+void __RPC_STUB IDot11AdHocInterfaceNotificationSink_OnConnectionStatusChange_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDot11AdHocInterfaceNotificationSink_INTERFACE_DEFINED__ */
+
+
+DEFINE_GUID(LIBID_ADHOCLib, 0x45357166, 0xff38, 0x4302, 0x8f,0x5c, 0xdf,0x5b,0x70,0x3a,0x6e,0x3d);
+
+/*****************************************************************************
+ * Dot11AdHocManager coclass
+ */
+
+DEFINE_GUID(CLSID_Dot11AdHocManager, 0xdd06a84f, 0x83bd, 0x4d01, 0x8a,0xb9, 0x23,0x89,0xfe,0xa0,0x86,0x9e);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("dd06a84f-83bd-4d01-8ab9-2389fea0869e") Dot11AdHocManager;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(Dot11AdHocManager, 0xdd06a84f, 0x83bd, 0x4d01, 0x8a,0xb9, 0x23,0x89,0xfe,0xa0,0x86,0x9e)
+#endif
+#endif
+
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __adhoc_h__ */
diff --git a/mingw-w64-headers/include/adhoc.idl b/mingw-w64-headers/include/adhoc.idl
new file mode 100755
index 0000000..b53ced5
--- /dev/null
+++ b/mingw-w64-headers/include/adhoc.idl
@@ -0,0 +1,151 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+#ifndef DO_NO_IMPORTS
+import "oaidl.idl";
+import "unknwn.idl";
+import "wtypes.idl";
+#endif
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+interface IDot11AdHocManager;
+interface IDot11AdHocManagerNotificationSink;
+interface IDot11AdHocNetwork;
+interface IDot11AdHocNetworkNotificationSink;
+interface IDot11AdHocInterface;
+interface IDot11AdHocInterfaceNotificationSink;
+interface IDot11AdHocSecuritySettings;
+interface IEnumDot11AdHocInterfaces;
+interface IEnumDot11AdHocNetworks;
+interface IEnumDot11AdHocSecuritySettings;
+
+typedef [v1_enum] enum tagDOT11_ADHOC_CIPHER_ALGORITHM {
+  DOT11_ADHOC_CIPHER_ALGO_INVALID = -1,
+  DOT11_ADHOC_CIPHER_ALGO_NONE = 0x00,
+  DOT11_ADHOC_CIPHER_ALGO_CCMP = 0x04,
+  DOT11_ADHOC_CIPHER_ALGO_WEP = 0x101,
+} DOT11_ADHOC_CIPHER_ALGORITHM;
+
+typedef [v1_enum] enum tagDOT11_ADHOC_AUTH_ALGORITHM {
+  DOT11_ADHOC_AUTH_ALGO_INVALID = -1,
+  DOT11_ADHOC_AUTH_ALGO_80211_OPEN = 1,
+  DOT11_ADHOC_AUTH_ALGO_RSNA_PSK = 7
+} DOT11_ADHOC_AUTH_ALGORITHM;
+
+typedef [v1_enum] enum tagDOT11_ADHOC_NETWORK_CONNECTION_STATUS {
+  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_INVALID = 0,
+  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_DISCONNECTED = 11,
+  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTING = 12,
+  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_CONNECTED = 13,
+  DOT11_ADHOC_NETWORK_CONNECTION_STATUS_FORMED = 14
+} DOT11_ADHOC_NETWORK_CONNECTION_STATUS;
+
+typedef [v1_enum] enum tagDOT11_ADHOC_CONNECT_FAIL_REASON {
+  DOT11_ADHOC_CONNECT_FAIL_DOMAIN_MISMATCH = 0,
+  DOT11_ADHOC_CONNECT_FAIL_PASSPHRASE_MISMATCH = 1,
+  DOT11_ADHOC_CONNECT_FAIL_OTHER = 2
+} DOT11_ADHOC_CONNECT_FAIL_REASON;
+
+cpp_quote("EXTERN_C const CLSID CLSID_AdHocManager;")
+
+[object, local, uuid (8f10cc26-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocManager : IUnknown {
+  HRESULT CreateNetwork ([in, string] LPCWSTR Name,[in, string] LPCWSTR Password,[in] LONG GeographicalId,[in] IDot11AdHocInterface *pInterface,[in] IDot11AdHocSecuritySettings *pSecurity,[in] GUID *pContextGuid,[out] IDot11AdHocNetwork **pIAdHoc);
+  HRESULT CommitCreatedNetwork ([in] IDot11AdHocNetwork *pIAdHoc,[in] BOOLEAN fSaveProfile,[in] BOOLEAN fMakeSavedProfileUserSpecific);
+  HRESULT GetIEnumDot11AdHocNetworks ([in] GUID *pContextGuid,[out] IEnumDot11AdHocNetworks **ppEnum);
+  HRESULT GetIEnumDot11AdHocInterfaces ([out] IEnumDot11AdHocInterfaces **ppEnum);
+  HRESULT GetNetwork ([in] GUID *NetworkSignature,[out] IDot11AdHocNetwork **pNetwork);
+};
+
+[object, local, uuid (8f10cc27-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocManagerNotificationSink : IUnknown {
+  HRESULT OnNetworkAdd ([in] IDot11AdHocNetwork *pIAdHocNetwork);
+  HRESULT OnNetworkRemove ([in] GUID *Signature);
+  HRESULT OnInterfaceAdd ([in] IDot11AdHocInterface *pIAdHocInterface);
+  HRESULT OnInterfaceRemove ([in] GUID *Signature);
+}
+
+[object, local, uuid (8f10cc28-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IEnumDot11AdHocNetworks : IUnknown {
+  HRESULT Next ([in] ULONG cElt,[out, size_is (cElt), length_is (*pcEltFetched)]IDot11AdHocNetwork **rgElt,[out] ULONG *pcEltFetched);
+  HRESULT Skip ([in] ULONG cElt);
+  HRESULT Reset ();
+  HRESULT Clone ([out] IEnumDot11AdHocNetworks **ppEnum);
+};
+
+[object, local, uuid (8f10cc29-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocNetwork : IUnknown {
+  HRESULT GetStatus ([in, out] DOT11_ADHOC_NETWORK_CONNECTION_STATUS *eStatus);
+  HRESULT GetSSID ([out, string] LPWSTR *ppszwSSID);
+  HRESULT HasProfile ([in, out] BOOLEAN *pf11d);
+  HRESULT GetProfileName ([out, string] LPWSTR *ppszwProfileName);
+  HRESULT DeleteProfile ();
+  HRESULT GetSignalQuality ([out] ULONG *puStrengthValue,[out] ULONG *puStrengthMax);
+  HRESULT GetSecuritySetting ([out] IDot11AdHocSecuritySettings **pAdHocSecuritySetting);
+  HRESULT GetContextGuid ([in, out] GUID *pContextGuid);
+  HRESULT GetSignature ([in, out] GUID *pSignature);
+  HRESULT GetInterface ([out] IDot11AdHocInterface **pAdHocInterface);
+  HRESULT Connect ([in, string] LPCWSTR Passphrase,[in] LONG GeographicalId,[in] BOOLEAN fSaveProfile,[in] BOOLEAN fMakeSavedProfileUserSpecific);
+  HRESULT Disconnect ();
+};
+
+[object, local, uuid (8f10cc2a-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocNetworkNotificationSink : IUnknown {
+  HRESULT OnStatusChange (DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus);
+  HRESULT OnConnectFail (DOT11_ADHOC_CONNECT_FAIL_REASON eFailReason);
+}
+
+[object, local, uuid (8f10cc2b-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocInterface : IUnknown {
+  HRESULT GetDeviceSignature ([in, out] GUID *pSignature);
+  HRESULT GetFriendlyName ([out, string] LPWSTR *ppszName);
+  HRESULT IsDot11d ([in, out] BOOLEAN *pf11d);
+  HRESULT IsAdHocCapable ([in, out] BOOLEAN *pfAdHocCapable);
+  HRESULT IsRadioOn ([in, out] BOOLEAN *pfIsRadioOn);
+  HRESULT GetActiveNetwork ([out] IDot11AdHocNetwork **ppNetwork);
+  HRESULT GetIEnumSecuritySettings ([out] IEnumDot11AdHocSecuritySettings **ppEnum);
+  HRESULT GetIEnumDot11AdHocNetworks ([in] GUID *pFilterGuid,[out] IEnumDot11AdHocNetworks **ppEnum);
+  HRESULT GetStatus ([in, out] DOT11_ADHOC_NETWORK_CONNECTION_STATUS *pState);
+}
+
+[object, local, uuid (8f10cc2c-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IEnumDot11AdHocInterfaces : IUnknown {
+  HRESULT Next ([in] ULONG cElt,[out, size_is (cElt), length_is (*pcEltFetched)]IDot11AdHocInterface **rgElt,[out] ULONG *pcEltFetched);
+  HRESULT Skip ([in] ULONG cElt);
+  HRESULT Reset ();
+  HRESULT Clone ([out] IEnumDot11AdHocInterfaces **ppEnum);
+}
+
+[object, local, uuid (8f10cc2d-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IEnumDot11AdHocSecuritySettings : IUnknown {
+  HRESULT Next ([in] ULONG cElt,[out, size_is (cElt), length_is (*pcEltFetched)]IDot11AdHocSecuritySettings **rgElt,[out] ULONG *pcEltFetched);
+  HRESULT Skip ([in] ULONG cElt);
+  HRESULT Reset ();
+  HRESULT Clone ([out] IEnumDot11AdHocSecuritySettings **ppEnum);
+}
+
+[object, local, uuid (8f10cc2e-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocSecuritySettings : IUnknown {
+  HRESULT GetDot11AuthAlgorithm ([in, out] DOT11_ADHOC_AUTH_ALGORITHM *pAuth);
+  HRESULT GetDot11CipherAlgorithm ([in, out] DOT11_ADHOC_CIPHER_ALGORITHM *pCipher);
+}
+
+[object, local, uuid (8f10cc2f-cf0d-42a0-acbe-e2de7007384d), pointer_default (unique)]
+interface IDot11AdHocInterfaceNotificationSink : IUnknown {
+  HRESULT OnConnectionStatusChange (DOT11_ADHOC_NETWORK_CONNECTION_STATUS eStatus);
+}
+
+[uuid (45357166-ff38-4302-8f5c-df5b703a6e3d), version (1.0)]
+library ADHOCLib {
+  importlib ("stdole2.tlb");
+  [uuid (dd06a84f-83bd-4d01-8ab9-2389fea0869e)]
+  coclass Dot11AdHocManager {
+    [default] interface IDot11AdHocManager;
+  };
+};
+cpp_quote("#endif")
