/*** Autogenerated by WIDL 1.6 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;
#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 = 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

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)
#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

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

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

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