/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef _INC_WLANAPI
#define _INC_WLANAPI
#include <windot11.h>
#include <eaptypes.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef DWORD WLAN_REASON_CODE, *PWLAN_REASON_CODE;
typedef ULONG WLAN_SIGNAL_QUALITY, *PWLAN_SIGNAL_QUALITY;

typedef struct _DOT11_NETWORK {
  DOT11_SSID     dot11Ssid;
  DOT11_BSS_TYPE dot11BssType;
} DOT11_NETWORK, *PDOT11_NETWORK;

typedef enum _DOT11_RADIO_STATE {
  dot11_radio_state_unknown,
  dot11_radio_state_on,
  dot11_radio_state_off 
} DOT11_RADIO_STATE, *PDOT11_RADIO_STATE;

typedef enum _WLAN_NOTIFICATION_ACM {
    wlan_notification_acm_start = 0,
    wlan_notification_acm_autoconf_enabled,
    wlan_notification_acm_autoconf_disabled,
    wlan_notification_acm_background_scan_enabled,
    wlan_notification_acm_background_scan_disabled,
    wlan_notification_acm_bss_type_change,
    wlan_notification_acm_power_setting_change,
    wlan_notification_acm_scan_complete,
    wlan_notification_acm_scan_fail,
    wlan_notification_acm_connection_start,
    wlan_notification_acm_connection_complete,
    wlan_notification_acm_connection_attempt_fail,
    wlan_notification_acm_filter_list_change,
    wlan_notification_acm_interface_arrival,
    wlan_notification_acm_interface_removal,
    wlan_notification_acm_profile_change,
    wlan_notification_acm_profile_name_change,
    wlan_notification_acm_profiles_exhausted,
    wlan_notification_acm_network_not_available,
    wlan_notification_acm_network_available,
    wlan_notification_acm_disconnecting,
    wlan_notification_acm_disconnected,
    wlan_notification_acm_adhoc_network_state_change,
    wlan_notification_acm_end
} WLAN_NOTIFICATION_ACM, *PWLAN_NOTIFICATION_ACM;

typedef enum _WLAN_INTERFACE_STATE {
  wlan_interface_state_not_ready               = 0,
  wlan_interface_state_connected               = 1,
  wlan_interface_state_ad_hoc_network_formed   = 2,
  wlan_interface_state_disconnecting           = 3,
  wlan_interface_state_disconnected            = 4,
  wlan_interface_state_associating             = 5,
  wlan_interface_state_discovering             = 6,
  wlan_interface_state_authenticating          = 7 
} WLAN_INTERFACE_STATE, *PWLAN_INTERFACE_STATE;

typedef enum _WLAN_CONNECTION_MODE {
  wlan_connection_mode_profile,
  wlan_connection_mode_temporary_profile,
  wlan_connection_mode_discovery_secure,
  wlan_connection_mode_discovery_unsecure,
  wlan_connection_mode_auto,
  wlan_connection_mode_invalid 
} WLAN_CONNECTION_MODE, *PWLAN_CONNECTION_MODE;

typedef enum _WLAN_INTERFACE_TYPE {
  wlan_interface_type_emulated_802_11   = 0,
  wlan_interface_type_native_802_11,
  wlan_interface_type_invalid 
} WLAN_INTERFACE_TYPE, *PWLAN_INTERFACE_TYPE;

typedef enum _WLAN_INTF_OPCODE {
  wlan_intf_opcode_autoconf_start                               = 0x000000000,
  wlan_intf_opcode_autoconf_enabled,
  wlan_intf_opcode_background_scan_enabled,
  wlan_intf_opcode_media_streaming_mode,
  wlan_intf_opcode_radio_state,
  wlan_intf_opcode_bss_type,
  wlan_intf_opcode_interface_state,
  wlan_intf_opcode_current_connection,
  wlan_intf_opcode_channel_number,
  wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs,
  wlan_intf_opcode_supported_adhoc_auth_cipher_pairs,
  wlan_intf_opcode_supported_country_or_region_string_list,
  wlan_intf_opcode_current_operation_mode,
  wlan_intf_opcode_supported_safe_mode,
  wlan_intf_opcode_certified_safe_mode,
  wlan_intf_opcode_hosted_network_capable,
  wlan_intf_opcode_autoconf_end                                 = 0x0fffffff,
  wlan_intf_opcode_msm_start                                    = 0x10000100,
  wlan_intf_opcode_statistics,
  wlan_intf_opcode_rssi,
  wlan_intf_opcode_msm_end                                      = 0x1fffffff,
  wlan_intf_opcode_security_start                               = 0x20010000,
  wlan_intf_opcode_security_end                                 = 0x2fffffff,
  wlan_intf_opcode_ihv_start                                    = 0x30000000,
  wlan_intf_opcode_ihv_end                                      = 0x3fffffff 
} WLAN_INTF_OPCODE, *PWLAN_INTF_OPCODE;

typedef enum _WLAN_OPCODE_VALUE_TYPE {
  wlan_opcode_value_type_query_only            = 0,
  wlan_opcode_value_type_set_by_group_policy   = 1,
  wlan_opcode_value_type_set_by_user           = 2,
  wlan_opcode_value_type_invalid               = 3 
} WLAN_OPCODE_VALUE_TYPE, *PWLAN_OPCODE_VALUE_TYPE;

typedef enum _WLAN_POWER_SETTING {
  wlan_power_setting_no_saving,
  wlan_power_setting_low_saving,
  wlan_power_setting_medium_saving,
  wlan_power_setting_maximum_saving,
  wlan_power_setting_invalid 
} WLAN_POWER_SETTING, *PWLAN_POWER_SETTING;

typedef struct _WLAN_ASSOCIATION_ATTRIBUTES {
  DOT11_SSID          dot11Ssid;
  DOT11_BSS_TYPE      dot11BssType;
  DOT11_MAC_ADDRESS   dot11Bssid;
  DOT11_PHY_TYPE      dot11PhyType;
  ULONG               uDot11PhyIndex;
  WLAN_SIGNAL_QUALITY wlanSignalQuality;
  ULONG               ulRxRate;
  ULONG               ulTxRate;
} WLAN_ASSOCIATION_ATTRIBUTES, *PWLAN_ASSOCIATION_ATTRIBUTES;

typedef struct _WLAN_AUTH_CIPHER_PAIR_LIST {
  DWORD                  dwNumberOfItems;
  DOT11_AUTH_CIPHER_PAIR pAuthCipherPairList;
} WLAN_AUTH_CIPHER_PAIR_LIST, *PWLAN_AUTH_CIPHER_PAIR_LIST;

typedef struct _WLAN_NOTIFICATION_DATA {
  DWORD NotificationSource;
  DWORD NotificationCode;
  GUID  InterfaceGuid;
  DWORD dwDataSize;
  PVOID pData;
} WLAN_NOTIFICATION_DATA, *PWLAN_NOTIFICATION_DATA;

#define WLAN_MAX_PHY_TYPE_NUMBER 8

typedef struct _WLAN_AVAILABLE_NETWORK {
  WCHAR                  strProfileName[256];
  DOT11_SSID             dot11Ssid;
  DOT11_BSS_TYPE         dot11BssType;
  ULONG                  uNumberOfBssids;
  WINBOOL                bNetworkConnectable;
  WLAN_REASON_CODE       wlanNotConnectableReason;
  ULONG                  uNumberOfPhyTypes;
  DOT11_PHY_TYPE         dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER];
  WINBOOL                bMorePhyTypes;
  WLAN_SIGNAL_QUALITY    wlanSignalQuality;
  WINBOOL                bSecurityEnabled;
  DOT11_AUTH_ALGORITHM   dot11DefaultAuthAlgorithm;
  DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;
  DWORD                  dwFlags;
  DWORD                  dwReserved;
} WLAN_AVAILABLE_NETWORK, *PWLAN_AVAILABLE_NETWORK;

typedef struct _WLAN_AVAILABLE_NETWORK_LIST {
  DWORD                  dwNumberOfItems;
  DWORD                  dwIndex;
  WLAN_AVAILABLE_NETWORK Network[1];
} WLAN_AVAILABLE_NETWORK_LIST, *PWLAN_AVAILABLE_NETWORK_LIST;

typedef struct _WLAN_SECURITY_ATTRIBUTES {
  WINBOOL                bSecurityEnabled;
  WINBOOL                bOneXEnabled;
  DOT11_AUTH_ALGORITHM   dot11AuthAlgorithm;
  DOT11_CIPHER_ALGORITHM dot11CipherAlgorithm;
} WLAN_SECURITY_ATTRIBUTES, *PWLAN_SECURITY_ATTRIBUTES;

typedef struct _WLAN_CONNECTION_ATTRIBUTES {
  WLAN_INTERFACE_STATE        isState;
  WLAN_CONNECTION_MODE        wlanConnectionMode;
  WCHAR                       strProfileName[256];
  WLAN_ASSOCIATION_ATTRIBUTES wlanAssociationAttributes;
  WLAN_SECURITY_ATTRIBUTES    wlanSecurityAttributes;
} WLAN_CONNECTION_ATTRIBUTES, *PWLAN_CONNECTION_ATTRIBUTES;

/* Assuming stdcall */
typedef VOID (CALLBACK *WLAN_NOTIFICATION_CALLBACK)(
  PWLAN_NOTIFICATION_DATA ,
  PVOID 
);

#define WLAN_MAX_NAME_LENGTH 256

typedef struct _WLAN_CONNECTION_NOTIFICATION_DATA {
  WLAN_CONNECTION_MODE wlanConnectionMode;
  WCHAR                strProfileName[WLAN_MAX_NAME_LENGTH];
  DOT11_SSID           dot11Ssid;
  DOT11_BSS_TYPE       dot11BssType;
  BOOL                 bSecurityEnabled;
  WLAN_REASON_CODE     wlanReasonCode;
  DWORD                dwFlags;
  WCHAR                strProfileXml[1];
} WLAN_CONNECTION_NOTIFICATION_DATA, *PWLAN_CONNECTION_NOTIFICATION_DATA;

#define WLAN_CONNECTION_HIDDEN_NETWORK 0x00000001
#define WLAN_CONNECTION_ADHOC_JOIN_ONLY 0x00000002
#define WLAN_CONNECTION_IGNORE_PRIVACY_BIT 0x00000004
#define WLAN_CONNECTION_EAPOL_PASSTHROUGH 0x00000008

typedef struct _WLAN_CONNECTION_PARAMETERS {
  WLAN_CONNECTION_MODE wlanConnectionMode;
  LPCWSTR              strProfile;
  PDOT11_SSID          pDot11Ssid;
  PDOT11_BSSID_LIST    pDesiredBssidList;
  DOT11_BSS_TYPE       dot11BssType;
  DWORD                dwFlags;
} WLAN_CONNECTION_PARAMETERS, *PWLAN_CONNECTION_PARAMETERS;

typedef struct _WLAN_INTERFACE_INFO {
  GUID                 InterfaceGuid;
  WCHAR                strInterfaceDescription[256];
  WLAN_INTERFACE_STATE isState;
} WLAN_INTERFACE_INFO, *PWLAN_INTERFACE_INFO;

typedef struct _WLAN_INTERFACE_INFO_LIST {
  DWORD               dwNumberOfItems;
  DWORD               dwIndex;
  WLAN_INTERFACE_INFO InterfaceInfo[];
} WLAN_INTERFACE_INFO_LIST, *PWLAN_INTERFACE_INFO_LIST;

typedef struct _WLAN_PROFILE_INFO {
  WCHAR strProfileName[256];
  DWORD dwFlags;
} WLAN_PROFILE_INFO, *PWLAN_PROFILE_INFO;

typedef struct _WLAN_PROFILE_INFO_LIST {
  DWORD             dwNumberOfItems;
  DWORD             dwIndex;
  WLAN_PROFILE_INFO ProfileInfo[1];
} WLAN_PROFILE_INFO_LIST, *PWLAN_PROFILE_INFO_LIST;

PVOID WINAPI WlanAllocateMemory(
  DWORD dwMemorySize
);

DWORD WINAPI WlanCloseHandle(
  HANDLE hClientHandle,
  PVOID pReserved
);

DWORD WINAPI WlanConnect(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  const PWLAN_CONNECTION_PARAMETERS pConnectionParameters,
  PVOID pReserved
);

DWORD WINAPI WlanDeleteProfile(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  PVOID pReserved
);

DWORD WINAPI WlanDisconnect(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  PVOID pReserved
);

DWORD WINAPI WlanEnumInterfaces(
  HANDLE hClientHandle,
  PVOID pReserved,
  PWLAN_INTERFACE_INFO_LIST *ppInterfaceList
);

VOID WINAPI WlanFreeMemory(
  PVOID pMemory
);

DWORD WINAPI WlanGetAvailableNetworkList(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  DWORD dwFlags,
  PVOID pReserved,
  PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList
);

DWORD WINAPI WlanGetProfile(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  PVOID pReserved,
  LPWSTR *pstrProfileXml,
  DWORD *pdwFlags,
  PDWORD pdwGrantedAccess
);

DWORD WINAPI WlanGetProfileList(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  PVOID pReserved,
  PWLAN_PROFILE_INFO_LIST *ppProfileList
);

DWORD WINAPI WlanOpenHandle(
  DWORD dwClientVersion,
  PVOID pReserved,
  PDWORD pdwNegotiatedVersion,
  PHANDLE phClientHandle
);

DWORD WINAPI WlanQueryInterface(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  WLAN_INTF_OPCODE OpCode,
  PVOID pReserved,
  PDWORD pdwDataSize,
  PVOID *ppData,
  PWLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType
);

DWORD WINAPI WlanReasonCodeToString(
  DWORD dwReasonCode,
  DWORD dwBufferSize,
  PWCHAR pStringBuffer,
  PVOID pReserved
);

DWORD WINAPI WlanRegisterNotification(
  HANDLE hClientHandle,
  DWORD dwNotifSource,
  WINBOOL bIgnoreDuplicate,
  WLAN_NOTIFICATION_CALLBACK  funcCallback,
  PVOID pCallbackContext,
  PVOID pReserved,
  PDWORD pdwPrevNotifSource
);

DWORD WINAPI WlanSetInterface(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  WLAN_INTF_OPCODE OpCode,
  DWORD dwDataSize,
  const PVOID pData,
  PVOID pReserved
);

DWORD WINAPI WlanSetProfile(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  DWORD dwFlags,
  LPCWSTR strProfileXml,
  LPCWSTR strAllUserProfileSecurity,
  WINBOOL bOverwrite,
  PVOID pReserved,
  DWORD *pdwReasonCode
);

DWORD WINAPI WlanSetProfileEapXmlUserData(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  DWORD dwFlags,
  LPCWSTR strEapXmlUserData,
  PVOID pReserved
);

DWORD WINAPI WlanSetProfileList(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  DWORD dwItems,
  LPCWSTR *strProfileNames,
  PVOID pReserved
);

DWORD WINAPI WlanSetProfilePosition(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  DWORD dwPosition,
  PVOID pReserved
);

typedef char DOT11_COUNTRY_OR_REGION_STRING[3];

typedef enum _WLAN_AUTOCONF_OPCODE {
  wlan_autoconf_opcode_start                                       = 0,
  wlan_autoconf_opcode_show_denied_networks                        = 1,
  wlan_autoconf_opcode_power_setting                               = 2,
  wlan_autoconf_opcode_only_use_gp_profiles_for_allowed_networks   = 3,
  wlan_autoconf_opcode_allow_explicit_creds                        = 4,
  wlan_autoconf_opcode_block_period                                = 5,
  wlan_autoconf_opcode_allow_virtual_station_extensibility         = 6,
  wlan_autoconf_opcode_end                                         = 7 
} WLAN_AUTOCONF_OPCODE, *PWLAN_AUTOCONF_OPCODE;

typedef enum _WL_DISPLAY_PAGES {
  WLConnectionPage,
  WLSecurityPage 
} WL_DISPLAY_PAGES, *PWL_DISPLAY_PAGES;

typedef enum _WLAN_ADHOC_NETWORK_STATE {
  wlan_adhoc_network_state_formed      = 0,
  wlan_adhoc_network_state_connected   = 1 
} WLAN_ADHOC_NETWORK_STATE;

typedef enum _WLAN_IHV_CONTROL_TYPE {
  wlan_ihv_control_type_service,
  wlan_ihv_control_type_driver 
} WLAN_IHV_CONTROL_TYPE, *PWLAN_IHV_CONTROL_TYPE;

typedef enum _WLAN_FILTER_LIST_TYPE {
  wlan_filter_list_type_gp_permit,
  wlan_filter_list_type_gp_deny,
  wlan_filter_list_type_user_permit,
  wlan_filter_list_type_user_deny 
} WLAN_FILTER_LIST_TYPE, *PWLAN_FILTER_LIST_TYPE;

typedef enum _WLAN_SECURABLE_OBJECT {
  wlan_secure_permit_list                      = 0,
  wlan_secure_deny_list                        = 1,
  wlan_secure_ac_enabled                       = 2,
  wlan_secure_bc_scan_enabled                  = 3,
  wlan_secure_bss_type                         = 4,
  wlan_secure_show_denied                      = 5,
  wlan_secure_interface_properties             = 6,
  wlan_secure_ihv_control                      = 7,
  wlan_secure_all_user_profiles_order          = 8,
  wlan_secure_add_new_all_user_profiles        = 9,
  wlan_secure_add_new_per_user_profiles        = 10,
  wlan_secure_media_streaming_mode_enabled     = 11,
  wlan_secure_current_operation_mode           = 12,
  wlan_secure_get_plaintext_key                = 13,
  wlan_secure_hosted_network_elevated_access   = 14 
} WLAN_SECURABLE_OBJECT, *PWLAN_SECURABLE_OBJECT;

typedef struct _DOT11_NETWORK_LIST {
  DWORD         dwNumberOfItems;
  DWORD         dwIndex;
  DOT11_NETWORK Network[1];
} DOT11_NETWORK_LIST, *PDOT11_NETWORK_LIST;

#define DOT11_RATE_SET_MAX_LENGTH 126

typedef struct _WLAN_RATE_SET {
  ULONG  uRateSetLength;
  USHORT usRateSet[DOT11_RATE_SET_MAX_LENGTH];
} WLAN_RATE_SET, *PWLAN_RATE_SET;

typedef struct _WLAN_BSS_ENTRY {
  DOT11_SSID        dot11Ssid;
  ULONG             uPhyId;
  DOT11_MAC_ADDRESS dot11Bssid;
  DOT11_BSS_TYPE    dot11BssType;
  DOT11_PHY_TYPE    dot11BssPhyType;
  LONG              lRssi;
  ULONG             uLinkQuality;
  BOOLEAN           bInRegDomain;
  USHORT            usBeaconPeriod;
  ULONGLONG         ullTimestamp;
  ULONGLONG         ullHostTimestamp;
  USHORT            usCapabilityInformation;
  ULONG             ulChCenterFrequency;
  WLAN_RATE_SET     wlanRateSet;
  ULONG             ulIeOffset;
  ULONG             ulIeSize;
} WLAN_BSS_ENTRY, *PWLAN_BSS_ENTRY;

typedef struct _WLAN_BSS_LIST {
  DWORD          dwTotalSize;
  DWORD          dwNumberOfItems;
  WLAN_BSS_ENTRY wlanBssEntries[1];
} WLAN_BSS_LIST, *PWLAN_BSS_LIST;

typedef struct _WLAN_COUNTRY_OR_REGION_STRING_LIST {
  DWORD                          dwNumberOfItems;
  DOT11_COUNTRY_OR_REGION_STRING pCountryOrRegionStringList[1];
} WLAN_COUNTRY_OR_REGION_STRING_LIST, *PWLAN_COUNTRY_OR_REGION_STRING_LIST;

#define WLAN_MAX_PHY_INDEX 64

typedef struct _WLAN_INTERFACE_CAPABILITY {
  WLAN_INTERFACE_TYPE interfaceType;
  WINBOOL             bDot11DSupported;
  DWORD               dwMaxDesiredSsidListSize;
  DWORD               dwMaxDesiredBssidListSize;
  DWORD               dwNumberOfSupportedPhys;
  DOT11_PHY_TYPE      dot11PhyTypes[WLAN_MAX_PHY_INDEX];
} WLAN_INTERFACE_CAPABILITY, *PWLAN_INTERFACE_CAPABILITY;

typedef struct _WLAN_MAC_FRAME_STATISTICS {
  ULONGLONG ullTransmittedFrameCount;
  ULONGLONG ullReceivedFrameCount;
  ULONGLONG ullWEPExcludedCount;
  ULONGLONG ullTKIPLocalMICFailures;
  ULONGLONG ullTKIPReplays;
  ULONGLONG ullTKIPICVErrorCount;
  ULONGLONG ullCCMPReplays;
  ULONGLONG ullCCMPDecryptErrors;
  ULONGLONG ullWEPUndecryptableCount;
  ULONGLONG ullWEPICVErrorCount;
  ULONGLONG ullDecryptSuccessCount;
  ULONGLONG ullDecryptFailureCount;
} WLAN_MAC_FRAME_STATISTICS, *PWLAN_MAC_FRAME_STATISTICS;

typedef struct _WLAN_MSM_NOTIFICATION_DATA {
  WLAN_CONNECTION_MODE wlanConnectionMode;
  WCHAR                strProfileName[WLAN_MAX_NAME_LENGTH];
  DOT11_SSID           dot11Ssid;
  DOT11_BSS_TYPE       dot11BssType;
  DOT11_MAC_ADDRESS    dot11MacAddr;
  BOOL                 bSecurityEnabled;
  BOOL                 bFirstPeer;
  BOOL                 bLastPeer;
  WLAN_REASON_CODE     wlanReasonCode;
} WLAN_MSM_NOTIFICATION_DATA, *PWLAN_MSM_NOTIFICATION_DATA;

typedef struct _WLAN_PHY_FRAME_STATISTICS {
  ULONGLONG ullTransmittedFrameCount;
  ULONGLONG ullMulticastTransmittedFrameCount;
  ULONGLONG ullFailedCount;
  ULONGLONG ullRetryCount;
  ULONGLONG ullMultipleRetryCount;
  ULONGLONG ullMaxTXLifetimeExceededCount;
  ULONGLONG ullTransmittedFragmentCount;
  ULONGLONG ullRTSSuccessCount;
  ULONGLONG ullRTSFailureCount;
  ULONGLONG ullACKFailureCount;
  ULONGLONG ullReceivedFrameCount;
  ULONGLONG ullMulticastReceivedFrameCount;
  ULONGLONG ullPromiscuousReceivedFrameCount;
  ULONGLONG ullMaxRXLifetimeExceededCount;
  ULONGLONG ullFrameDuplicateCount;
  ULONGLONG ullReceivedFragmentCount;
  ULONGLONG ullPromiscuousReceivedFragmentCount;
  ULONGLONG ullFCSErrorCount;
} WLAN_PHY_FRAME_STATISTICS, *PWLAN_PHY_FRAME_STATISTICS;

typedef struct _WLAN_PHY_RADIO_STATE {
  DWORD             dwPhyIndex;
  DOT11_RADIO_STATE dot11SoftwareRadioState;
  DOT11_RADIO_STATE dot11HardwareRadioState;
} WLAN_PHY_RADIO_STATE, *PWLAN_PHY_RADIO_STATE;

typedef struct _WLAN_RADIO_STATE {
  DWORD                dwNumberOfPhys;
  WLAN_PHY_RADIO_STATE PhyRadioState[64];
} WLAN_RADIO_STATE, *PWLAN_RADIO_STATE;

#define DOT11_PSD_IE_MAX_DATA_SIZE 240
#define DOT11_PSD_IE_MAX_ENTRY_NUMBER 5

typedef struct _WLAN_RAW_DATA {
  DWORD dwDataSize;
  BYTE  DataBlob[1];
} WLAN_RAW_DATA, *PWLAN_RAW_DATA;

typedef struct _WLAN_RAW_DATA_LIST {
  DWORD dwTotalSize;
  DWORD dwNumberOfItems;
  struct {
    DWORD dwDataOffset;
    DWORD dwDataSize;
  } DataList[1];
} WLAN_RAW_DATA_LIST, *PWLAN_RAW_DATA_LIST;

typedef struct _WLAN_STATISTICS {
  ULONGLONG                 ullFourWayHandshakeFailures;
  ULONGLONG                 ullTKIPCounterMeasuresInvoked;
  ULONGLONG                 ullReserved;
  WLAN_MAC_FRAME_STATISTICS MacUcastCounters;
  WLAN_MAC_FRAME_STATISTICS MacMcastCounters;
  DWORD                     dwNumberOfPhys;
  WLAN_PHY_FRAME_STATISTICS PhyCounters[1];
} WLAN_STATISTICS, *PWLAN_STATISTICS;

DWORD WINAPI WlanExtractPsdIEDataList(
  HANDLE hClientHandle,
  DWORD dwIeDataSize,
  const PBYTE pRawIeData,
  LPCWSTR strFormat,
  PVOID pReserved,
  PWLAN_RAW_DATA_LIST *ppPsdIEDataList
);

DWORD WINAPI WlanGetFilterList(
  HANDLE hClientHandle,
  WLAN_FILTER_LIST_TYPE wlanFilterListType,
  PVOID pReserved,
  PDOT11_NETWORK_LIST *ppNetworkList
);

DWORD WINAPI WlanGetInterfaceCapability(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  PVOID pReserved,
  PWLAN_INTERFACE_CAPABILITY *ppCapability
);

DWORD WINAPI WlanGetNetworkBssList(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  const  PDOT11_SSID pDot11Ssid,
  DOT11_BSS_TYPE dot11BssType,
  WINBOOL bSecurityEnabled,
  PVOID pReserved,
  PWLAN_BSS_LIST *ppWlanBssList
);

DWORD WINAPI WlanGetProfileCustomUserData(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  PVOID pReserved,
  DWORD *pdwDataSize,
  PBYTE *ppData
);

DWORD WINAPI WlanGetSecuritySettings(
  HANDLE hClientHandle,
  WLAN_SECURABLE_OBJECT SecurableObject,
  PWLAN_OPCODE_VALUE_TYPE pValueType,
  LPWSTR *pstrCurrentSDDL,
  PDWORD pdwGrantedAccess
);

DWORD WINAPI WlanIhvControl(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  WLAN_IHV_CONTROL_TYPE Type,
  DWORD dwInBufferSize,
  PVOID pInBuffer,
  DWORD dwOutBufferSize,
  PVOID pOutBuffer,
  PDWORD pdwBytesReturned
);

DWORD WINAPI WlanQueryAutoConfigParameter(
  HANDLE hClientHandle,
  WLAN_AUTOCONF_OPCODE OpCode,
  PVOID pReserved,
  PDWORD pdwDataSize,
  PVOID ppData,
  PWLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType
);

DWORD WINAPI WlanRenameProfile(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strOldProfileName,
  LPCWSTR strNewProfileName,
  PVOID pReserved
);

#define WLAN_PROFILE_USER 0x00000002
#define WLAN_PROFILE_CONNECTION_MODE_SET_BY_CLIENT 0x00010000
#define WLAN_PROFILE_CONNECTION_MODE_AUTO 0x00020000

DWORD WINAPI WlanSaveTemporaryProfile(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  LPCWSTR strAllUserProfileSecurity,
  DWORD dwFlags,
  WINBOOL bOverWrite,
  PVOID pReserved
);

DWORD WINAPI WlanScan(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  const PDOT11_SSID pDot11Ssid,
  const PWLAN_RAW_DATA pIeData,
  PVOID pReserved
);

DWORD WINAPI WlanSetAutoConfigParameter(
  HANDLE hClientHandle,
  WLAN_AUTOCONF_OPCODE OpCode,
  DWORD dwDataSize,
  const PVOID pData,
  PVOID pReserved
);

DWORD WINAPI WlanSetFilterList(
  HANDLE hClientHandle,
  WLAN_FILTER_LIST_TYPE wlanFilterListType,
  const PDOT11_NETWORK_LIST pNetworkList,
  PVOID pReserved
);

DWORD WINAPI WlanSetProfileCustomUserData(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  DWORD dwDataSize,
  const PBYTE pData,
  PVOID pReserved
);

DWORD WlanSetProfileEapUserData(
  HANDLE hClientHandle,
  const GUID *pInterfaceGuid,
  LPCWSTR strProfileName,
  EAP_METHOD_TYPE eapType,
  DWORD dwFlags,
  DWORD dwEapUserDataSize,
  const LPBYTE pbEapUserData,
  PVOID pReserved
);

DWORD WINAPI WlanSetPsdIEDataList(
  HANDLE hClientHandle,
  LPCWSTR strFormat,
  const PWLAN_RAW_DATA_LIST pPsdIEDataList,
  PVOID pReserved
);

DWORD WINAPI WlanSetSecuritySettings(
  HANDLE hClientHandle,
  WLAN_SECURABLE_OBJECT SecurableObject,
  LPCWSTR strModifiedSDDL
);

DWORD WINAPI WlanUIEditProfile(
  DWORD dwClientVersion,
  LPCWSTR wstrProfileName,
  GUID *pInterfaceGuid,
  HWND hWnd,
  WL_DISPLAY_PAGES wlStartPage,
  PVOID pReserved,
  PWLAN_REASON_CODE *pWlanReasonCode
);

#ifdef __cplusplus
}
#endif

#endif /*_INC_WLANAPI*/
