/*** Autogenerated by WIDL 3.20 from include/adhoc.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#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;
#ifdef __cplusplus
interface IDot11AdHocManager;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
#define __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
typedef interface IDot11AdHocManagerNotificationSink IDot11AdHocManagerNotificationSink;
#ifdef __cplusplus
interface IDot11AdHocManagerNotificationSink;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDot11AdHocNetworks_FWD_DEFINED__
#define __IEnumDot11AdHocNetworks_FWD_DEFINED__
typedef interface IEnumDot11AdHocNetworks IEnumDot11AdHocNetworks;
#ifdef __cplusplus
interface IEnumDot11AdHocNetworks;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocNetwork_FWD_DEFINED__
#define __IDot11AdHocNetwork_FWD_DEFINED__
typedef interface IDot11AdHocNetwork IDot11AdHocNetwork;
#ifdef __cplusplus
interface IDot11AdHocNetwork;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
#define __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
typedef interface IDot11AdHocNetworkNotificationSink IDot11AdHocNetworkNotificationSink;
#ifdef __cplusplus
interface IDot11AdHocNetworkNotificationSink;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocInterface_FWD_DEFINED__
#define __IDot11AdHocInterface_FWD_DEFINED__
typedef interface IDot11AdHocInterface IDot11AdHocInterface;
#ifdef __cplusplus
interface IDot11AdHocInterface;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDot11AdHocInterfaces_FWD_DEFINED__
#define __IEnumDot11AdHocInterfaces_FWD_DEFINED__
typedef interface IEnumDot11AdHocInterfaces IEnumDot11AdHocInterfaces;
#ifdef __cplusplus
interface IEnumDot11AdHocInterfaces;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
#define __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
typedef interface IEnumDot11AdHocSecuritySettings IEnumDot11AdHocSecuritySettings;
#ifdef __cplusplus
interface IEnumDot11AdHocSecuritySettings;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocSecuritySettings_FWD_DEFINED__
#define __IDot11AdHocSecuritySettings_FWD_DEFINED__
typedef interface IDot11AdHocSecuritySettings IDot11AdHocSecuritySettings;
#ifdef __cplusplus
interface IDot11AdHocSecuritySettings;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
#define __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
typedef interface IDot11AdHocInterfaceNotificationSink IDot11AdHocInterfaceNotificationSink;
#ifdef __cplusplus
interface IDot11AdHocInterfaceNotificationSink;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IDot11AdHocManager;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
#define __IDot11AdHocManagerNotificationSink_FWD_DEFINED__
typedef interface IDot11AdHocManagerNotificationSink IDot11AdHocManagerNotificationSink;
#ifdef __cplusplus
interface IDot11AdHocManagerNotificationSink;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocNetwork_FWD_DEFINED__
#define __IDot11AdHocNetwork_FWD_DEFINED__
typedef interface IDot11AdHocNetwork IDot11AdHocNetwork;
#ifdef __cplusplus
interface IDot11AdHocNetwork;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
#define __IDot11AdHocNetworkNotificationSink_FWD_DEFINED__
typedef interface IDot11AdHocNetworkNotificationSink IDot11AdHocNetworkNotificationSink;
#ifdef __cplusplus
interface IDot11AdHocNetworkNotificationSink;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocInterface_FWD_DEFINED__
#define __IDot11AdHocInterface_FWD_DEFINED__
typedef interface IDot11AdHocInterface IDot11AdHocInterface;
#ifdef __cplusplus
interface IDot11AdHocInterface;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
#define __IDot11AdHocInterfaceNotificationSink_FWD_DEFINED__
typedef interface IDot11AdHocInterfaceNotificationSink IDot11AdHocInterfaceNotificationSink;
#ifdef __cplusplus
interface IDot11AdHocInterfaceNotificationSink;
#endif /* __cplusplus */
#endif

#ifndef __IDot11AdHocSecuritySettings_FWD_DEFINED__
#define __IDot11AdHocSecuritySettings_FWD_DEFINED__
typedef interface IDot11AdHocSecuritySettings IDot11AdHocSecuritySettings;
#ifdef __cplusplus
interface IDot11AdHocSecuritySettings;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDot11AdHocInterfaces_FWD_DEFINED__
#define __IEnumDot11AdHocInterfaces_FWD_DEFINED__
typedef interface IEnumDot11AdHocInterfaces IEnumDot11AdHocInterfaces;
#ifdef __cplusplus
interface IEnumDot11AdHocInterfaces;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDot11AdHocNetworks_FWD_DEFINED__
#define __IEnumDot11AdHocNetworks_FWD_DEFINED__
typedef interface IEnumDot11AdHocNetworks IEnumDot11AdHocNetworks;
#ifdef __cplusplus
interface IEnumDot11AdHocNetworks;
#endif /* __cplusplus */
#endif

#ifndef __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
#define __IEnumDot11AdHocSecuritySettings_FWD_DEFINED__
typedef interface IEnumDot11AdHocSecuritySettings IEnumDot11AdHocSecuritySettings;
#ifdef __cplusplus
interface IEnumDot11AdHocSecuritySettings;
#endif /* __cplusplus */
#endif

typedef enum tagDOT11_ADHOC_CIPHER_ALGORITHM {
    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_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;
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__

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
{
    virtual HRESULT STDMETHODCALLTYPE CreateNetwork(
        LPCWSTR Name,
        LPCWSTR Password,
        LONG GeographicalId,
        IDot11AdHocInterface *pInterface,
        IDot11AdHocSecuritySettings *pSecurity,
        GUID *pContextGuid,
        IDot11AdHocNetwork **pIAdHoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitCreatedNetwork(
        IDot11AdHocNetwork *pIAdHoc,
        BOOLEAN fSaveProfile,
        BOOLEAN fMakeSavedProfileUserSpecific) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIEnumDot11AdHocNetworks(
        GUID *pContextGuid,
        IEnumDot11AdHocNetworks **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIEnumDot11AdHocInterfaces(
        IEnumDot11AdHocInterfaces **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNetwork(
        GUID *NetworkSignature,
        IDot11AdHocNetwork **pNetwork) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDot11AdHocManager, 0x8f10cc26, 0xcf0d, 0x42a0, 0xac,0xbe, 0xe2,0xde,0x70,0x07,0x38,0x4d)
#endif
#else
typedef struct IDot11AdHocManagerVtbl {
    BEGIN_INTERFACE

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

    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


#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


#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


#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


#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


#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)
#define IDot11AdHocInterface_IsAdHocCapable(This,pfAdHocCapable) (This)->lpVtbl->IsAdHocCapable(This,pfAdHocCapable)
#define IDot11AdHocInterface_IsRadioOn(This,pfIsRadioOn) (This)->lpVtbl->IsRadioOn(This,pfIsRadioOn)
#define IDot11AdHocInterface_GetActiveNetwork(This,ppNetwork) (This)->lpVtbl->GetActiveNetwork(This,ppNetwork)
#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)
#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
#endif

#endif


#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 ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumDot11AdHocInterfaces *This,
        REFIID riid,
        void **ppvObject);

    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
#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) (This)->lpVtbl->Reset(This)
#define IEnumDot11AdHocInterfaces_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#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
#endif

#endif


#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 ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IEnumDot11AdHocSecuritySettings *This,
        REFIID riid,
        void **ppvObject);

    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
#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) (This)->lpVtbl->Reset(This)
#define IEnumDot11AdHocSecuritySettings_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#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


#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


#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


#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__ */
