Vanara/PInvoke/WlanApi/WlanApi.Funcs.cs

6015 lines
342 KiB
C#
Raw Normal View History

using System;
using System.Runtime.InteropServices;
using System.Text;
using Vanara.Extensions;
namespace Vanara.PInvoke
{
/// <summary>Functions, structures and constants from wlanapi.h.</summary>
public static partial class WlanApi
{
/// <summary>The highest version of the Wi-Fi Direct API the client supports.</summary>
[PInvokeData("wlanapi.h")]
public const uint WFD_API_VERSION = 1;
/// <summary>Current version of the Wi-Fi Direct API.</summary>
[PInvokeData("wlanapi.h")]
public const uint WLAN_API_VERSION = WLAN_API_VERSION_2_0;
/// <summary>Version 1 of the Wi-Fi Direct API.</summary>
[PInvokeData("wlanapi.h")]
public const uint WLAN_API_VERSION_1_0 = 0x00000001;
/// <summary>Version 2 of the Wi-Fi Direct API.</summary>
[PInvokeData("wlanapi.h")]
public const uint WLAN_API_VERSION_2_0 = 0x00000002;
/// <summary>
/// The <c>WFD_DISPLAY_SINK_NOTIFICATION_CALLBACK</c> function defines the callback function—which you implement in your app—that
/// was specified to the <c>WFDStartDisplaySink</c> function.
/// </summary>
/// <param name="pvContext">An optional context pointer passed to the callback function.</param>
/// <param name="pNotification">A pointer to a struct containing data about the display sink notification.</param>
/// <param name="pNotificationResult">
/// A pointer to a struct containing data that your app can optionally set to indicate the result of processing the display sink notification.
/// </param>
// https://docs.microsoft.com/en-us/windows/win32/nativewifi/wfd-display-sink-notification-callback DWORD CALLBACK
// WFD_DISPLAY_SINK_NOTIFICATION_CALLBACK( _In_opt_ PVOID pvContext, _In_ const PWFD_DISPLAY_SINK_NOTIFICATION pNotification,
// _Inout_opt_ PWFD_DISPLAY_SINK_NOTIFICATION_RESULT pNotificationResult );
[PInvokeData("wlanapi.h", MSDNShortId = "0D4C00FD-4ED6-4F0F-BB72-0A1FCC05DB37")]
public delegate uint WFD_DISPLAY_SINK_NOTIFICATION_CALLBACK([In, Optional] IntPtr pvContext, [In] IntPtr pNotification, [In, Out, Optional] IntPtr pNotificationResult);
/// <summary>
/// The <c>WFD_OPEN_SESSION_COMPLETE_CALLBACK</c> function defines the callback function that is called by the WFDStartOpenSession
/// function when the <c>WFDStartOpenSession</c> operation completes.
/// </summary>
/// <param name="hSessionHandle">
/// A session handle to a Wi-Fi Direct session. This is a session handle previously returned by the WFDStartOpenSession function.
/// </param>
/// <param name="pvContext">An context pointer passed to the callback function from the WFDStartOpenSession function.</param>
/// <param name="guidSessionInterface">
/// The interface GUID of the local network interface on which this Wi-Fi Direct device has an open session. This parameter is
/// useful if higher-layer protocols need to determine which network interface a Wi-Fi Direct session is bound to. This value is
/// only returned if the dwError parameter is ERROR_SUCCESS.
/// </param>
/// <param name="dwError">
/// <para>
/// A value that specifies whether there was an error encountered during the call to the WFDStartOpenSession function. If this value
/// is ERROR_SUCCESS, then no error occurred and the operation to open the session completed successfully.
/// </para>
/// <para>The following other values are possible:</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>The parameter is incorrect. This error is returned if the hClientHandle parameter is NULL or not valid.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The group or resource is not in the correct state to perform the requested operation. This error is returned if the Wi-Fi Direct
/// service is disabled by group policy on a domain.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </param>
/// <param name="dwReasonCode">A value that specifies the more detail if an error occurred during WFDStartOpenSession.</param>
/// <returns>This callback function does not return a value.</returns>
/// <remarks>
/// <para>
/// The <c>WFD_OPEN_SESSION_COMPLETE_CALLBACK</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server
/// 2012. Wi-Fi Direct is based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see
/// Wi-Fi Alliance Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution
/// for Wi-Fi device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the
/// connection or the use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// The WFDStartOpenSession function starts an asynchronous operation to start an on-demand connection to a specific Wi-Fi Direct
/// device. The target Wi-Fi device must previously have been paired through the Windows Pairing experience. When the asynchronous
/// operation to make the Wi-FI Direct connection completes, the callback function specified in the pfnCallback parameter is called.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nc-wlanapi-wfd_open_session_complete_callback
// WFD_OPEN_SESSION_COMPLETE_CALLBACK WfdOpenSessionCompleteCallback; void WfdOpenSessionCompleteCallback( HANDLE hSessionHandle,
// PVOID pvContext, GUID guidSessionInterface, DWORD dwError, DWORD dwReasonCode ) {...}
[PInvokeData("wlanapi.h", MSDNShortId = "2CB91D70-920A-4D97-B96D-B264F59150AC")]
public delegate void WFD_OPEN_SESSION_COMPLETE_CALLBACK(HWFDSESSION hSessionHandle, IntPtr pvContext, Guid guidSessionInterface, uint dwError, uint dwReasonCode);
/// <summary>The <c>WLAN_NOTIFICATION_CALLBACK</c> callback function prototype defines the type of notification callback function.</summary>
/// <param name="Arg1">Contains detailed information on the notification.</param>
/// <param name="Arg2">
/// Contains a pointer to the client context passed in the pCallbackContext parameter to the WlanRegisterNotification function. This
/// client context can be a NULL pointer if that is what was passed to the WlanRegisterNotification function.
/// </param>
/// <returns>This callback function does not return a value.</returns>
/// <remarks>
/// <para>
/// The WlanRegisterNotification function is used by an application to register and unregister notifications on all wireless
/// interfaces. When registering for notifications, an application must provide a callback function pointed to by the funcCallback
/// parameter passed to the <c>WlanRegisterNotification</c> function. The prototype for this callback function is the
/// <c>WLAN_NOTIFICATION_CALLBACK</c>. This callback function will receive notifications that have been registered in the
/// dwNotifSource parameter passed to the <c>WlanRegisterNotification</c> function.
/// </para>
/// <para>
/// The callback function is called with a pointer to a WLAN_NOTIFICATION_DATA structure as the first parameter that contains
/// detailed information on the notification. The callback function also receives a second parameter that contains a pointer to the
/// client context passed in the pCallbackContext parameter to the WlanRegisterNotification function. This client context can be a
/// <c>NULL</c> pointer if that is what was passed to the <c>WlanRegisterNotification</c> function.
/// </para>
/// <para>
/// Once registered, the callback function will be called whenever a notification is available until the client unregisters or
/// closes the handle.
/// </para>
/// <para>
/// Any registration to receive notifications is automatically undone if the calling application closes its calling handle (by
/// calling WlanCloseHandle with the hClientHandle parameter) used to register for notifications with the WlanRegisterNotification
/// function or if the process ends.
/// </para>
/// <para>
/// If the <c>NotificationSource</c> member of the WLAN_NOTIFICATION_DATA structure received by the callback function is
/// <c>WLAN_NOTIFICATION_SOURCE_ACM</c>, then the received notification is an auto configuration module notification. The
/// <c>NotificationCode</c> member of the <c>WLAN_NOTIFICATION_DATA</c> structure passed to the <c>WLAN_NOTIFICATION_CALLBACK</c>
/// function determines the interpretation of the pData member of <c>WLAN_NOTIFICATION_DATA</c> structure. For more information on
/// these notifications, see the WLAN_NOTIFICATION_ACM enumeration reference.
/// </para>
/// <para>
/// If the <c>NotificationSource</c> member of the WLAN_NOTIFICATION_DATA structure received by the callback function is
/// <c>WLAN_NOTIFICATION_SOURCE_HNWK</c>, then the received notification is a wireless Hosted Network notification supported on
/// Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed. The <c>NotificationCode</c> member of the
/// <c>WLAN_NOTIFICATION_DATA</c> structure passed to the <c>WLAN_NOTIFICATION_CALLBACK</c> function determines the interpretation
/// of the pData member of <c>WLAN_NOTIFICATION_DATA</c> structure. For more information on these notifications, see the
/// WLAN_HOSTED_NETWORK_NOTIFICATION_CODE enumeration reference.
/// </para>
/// <para>
/// If the <c>NotificationSource</c> member of the WLAN_NOTIFICATION_DATA structure received by the callback function is
/// <c>WLAN_NOTIFICATION_SOURCE_IHV</c>, then the received notification is an indepent hardware vendor (IHV) notification. The
/// <c>NotificationCode</c> member of the <c>WLAN_NOTIFICATION_DATA</c> structure passed to the <c>WLAN_NOTIFICATION_CALLBACK</c>
/// function determines the interpretation of the pData member of <c>WLAN_NOTIFICATION_DATA</c> structure, which is specific to the IHV.
/// </para>
/// <para>
/// If the <c>NotificationSource</c> member of the WLAN_NOTIFICATION_DATA structure received by the callback function is
/// <c>WLAN_NOTIFICATION_SOURCE_ONEX</c>, then the received notification is an 802.1X module notification. The
/// <c>NotificationCode</c> member of the <c>WLAN_NOTIFICATION_DATA</c> structure passed to the <c>WLAN_NOTIFICATION_CALLBACK</c>
/// function determines the interpretation of the pData member of <c>WLAN_NOTIFICATION_DATA</c> structure. For more information on
/// these notifications, see the ONEX_NOTIFICATION_TYPE enumeration reference.
/// </para>
/// <para>
/// If the <c>NotificationSource</c> member of the WLAN_NOTIFICATION_DATA structure received by the callback function is
/// <c>WLAN_NOTIFICATION_SOURCE_MSM</c>, then the received notification is a media specific module (MSM) notification. The
/// <c>NotificationCode</c> member of the <c>WLAN_NOTIFICATION_DATA</c> structure passed to the <c>WLAN_NOTIFICATION_CALLBACK</c>
/// function determines the interpretation of the pData member of <c>WLAN_NOTIFICATION_DATA</c> structure. For more information on
/// these notifications, see the WLAN_NOTIFICATION_MSM enumeration reference.
/// </para>
/// <para>
/// If the <c>NotificationSource</c> member of the WLAN_NOTIFICATION_DATA structure received by the callback function is
/// <c>WLAN_NOTIFICATION_SOURCE_SECURITY</c>, then the received notification is a security notification. No notifications are
/// currently defined for <c>WLAN_NOTIFICATION_SOURCE_SECURITY</c>.
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Notifications are handled by the Netman service. If the
/// Netman service is disabled or unavailable, notifications will not be received. If a notification is not received within a
/// reasonable period of time, an application should time out and query the current interface state.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nc-wlanapi-wlan_notification_callback WLAN_NOTIFICATION_CALLBACK
// WlanNotificationCallback; void WlanNotificationCallback( PWLAN_NOTIFICATION_DATA Arg1, PVOID Arg2 ) {...}
[PInvokeData("wlanapi.h", MSDNShortId = "df721e77-3285-442b-aabd-2dccae85fda5")]
public delegate void WLAN_NOTIFICATION_CALLBACK(ref WLAN_NOTIFICATION_DATA Arg1, IntPtr Arg2);
/// <summary>
/// The <c>WFDCancelOpenSession</c> function indicates that the application wants to cancel a pending WFDStartOpenSession function
/// that has not completed.
/// </summary>
/// <param name="hSessionHandle">
/// A session handle to a Wi-Fi Direct session to cancel. This is a session handle previously returned by the WFDStartOpenSession function.
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// The handle is invalid. This error is returned if the handle specified in the hSessionHandle parameter was not found in the
/// handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>The parameter is incorrect. This error is returned if the hSessionHandle parameter is NULL or not valid.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WFDCancelOpenSession</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server 2012. Wi-Fi
/// Direct is based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see Wi-Fi
/// Alliance Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution for
/// Wi-Fi device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the connection or
/// the use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// A call to the <c>WFDCancelOpenSession</c> function notifies the Wi-Fi Direct service that the client requests a cancellation of
/// this session. The <c>WFDCancelOpenSession</c> function does not modify the expected WFDStartOpenSession behavior. The callback
/// function specified to the <c>WFDStartOpenSession</c> function will still be called, and the <c>WFDStartOpenSession</c> function
/// may not be completed immediately.
/// </para>
/// <para>
/// It is the responsibility of the caller to pass the <c>WFDCancelOpenSession</c> function a handle in the hSessionHandle parameter
/// that was returned from call to the WFDStartOpenSession function.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wfdcancelopensession DWORD WFDCancelOpenSession( HANDLE
// hSessionHandle );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "0BE3DAED-C9B1-492B-BDFC-CB32BE23E700")]
public static extern Win32Error WFDCancelOpenSession(HWFDSESSION hSessionHandle);
/// <summary>The <c>WFDCloseHandle</c> function closes a handle to the Wi-Fi Direct service.</summary>
/// <param name="hClientHandle">
/// A client handle to the Wi-Fi Direct service. This handle was obtained by a previous call to the WFDOpenHandle function.
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// The handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>The parameter is incorrect. This error is returned if the hClientHandle parameter is NULL or not valid.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WFDCloseHandle</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server 2012. Wi-Fi Direct is
/// based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see Wi-Fi Alliance
/// Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution for Wi-Fi
/// device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the connection or the
/// use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// In order to use Wi-Fi Direct, an application must first obtain a handle to the Wi-Fi Direct service by calling the WFDOpenHandle
/// function. The Wi-Fi Direct (WFD) handle returned by the <c>WFDOpenHandle</c> function is used for subsequent calls made to the
/// Wi-Fi Direct service. Once an application is done using the Wi-Fi Direct service, the application should call the
/// <c>WFDCloseHandle</c> function to signal to the Wi-Fi Direct service that the application is done using the service. This allows
/// the Wi-Fi Direct service to release resources used by the application.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wfdclosehandle DWORD WFDCloseHandle( HANDLE hClientHandle );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "A27C0AE1-1C51-4CAC-8929-63870ADB15A7")]
public static extern Win32Error WFDCloseHandle(HWFDSERVICE hClientHandle);
/// <summary>
/// The <c>WFDOpenHandle</c> function opens a handle to the Wi-Fi Direct service and negotiates a version of the Wi-FI Direct API to use.
/// </summary>
/// <param name="dwClientVersion">
/// <para>The highest version of the Wi-Fi Direct API the client supports.</para>
/// <para>
/// For Windows 8 and Windows Server 2012, this parameter should be set to <c>WFD_API_VERSION</c>, constant defined in the Wlanapi.h
/// header file.
/// </para>
/// </param>
/// <param name="pdwNegotiatedVersion">
/// <para>A pointer to a <c>DWORD</c> to received the negotiated version.</para>
/// <para>
/// If the <c>WFDOpenHandle</c> function is successful, the version negotiated with the Wi-Fi Direct Service to be used by this
/// session is returned. This value is usually the highest version supported by both the client and Wi-Fi Direct service.
/// </para>
/// </param>
/// <param name="phClientHandle">
/// <para>A pointer to a <c>HANDLE</c> to receive the handle to the Wi-Fi Direct service for this session.</para>
/// <para>If the <c>WFDOpenHandle</c> function is successful, a handle to the Wi-Fi Direct service to use in this session is returned.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// The parameter is incorrect. This error is returned if the pdwNegotiatedVersion parameter is NULL or the phClientHandle parameter
/// is NULL. This value is also returned if the dwClientVersion parameter is not equal to WFD_API_VERSION.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>
/// Not enough storage is available to process this command. This error is returned if the system was unable to allocate memory to
/// create the client context.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_REMOTE_SESSION_LIMIT_EXCEEDED</term>
/// <term>
/// An attempt was made to establish a session to a network server, but there are already too many sessions established to that
/// server. This error is returned if too many handles have been issued by the Wi-Fi Direct service.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WFDOpenHandle</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server 2012. Wi-Fi Direct is
/// based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see Wi-Fi Alliance
/// Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution for Wi-Fi
/// device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the connection or the
/// use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// In order to use Wi-Fi Direct, an application must first obtain a handle to the Wi-Fi Direct service by calling the
/// <c>WFDOpenHandle</c> function. The Wi-Fi Direct (WFD) handle returned by the <c>WFDOpenHandle</c> function is used for
/// subsequent calls made to the Wi-Fi Direct service. Once an application is done using the Wi-Fi Direct service, the application
/// should call the WFDCloseHandle function to signal to the Wi-Fi Direct service that the application is done using the service.
/// This allows the Wi-Fi Direct service to release resources used by the application.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wfdopenhandle DWORD WFDOpenHandle( DWORD dwClientVersion,
// PDWORD pdwNegotiatedVersion, PHANDLE phClientHandle );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "D89FAC10-BC33-44BE-ABC8-962241949281")]
public static extern Win32Error WFDOpenHandle(uint dwClientVersion, out uint pdwNegotiatedVersion, out SafeHWFDSERVICE phClientHandle);
/// <summary>The <c>WFDOpenLegacySession</c> function retrieves and applies a stored profile for a Wi-Fi Direct legacy device.</summary>
/// <param name="hClientHandle">
/// A <c>HANDLE</c> to the Wi-Fi Direct service for this session. This parameter is retrieved using the WFDOpenHandle function.
/// </param>
/// <param name="pLegacyMacAddress">A pointer to Wi-Fi Direct device address of the legacy client device.</param>
/// <param name="phSessionHandle">
/// <para>A pointer to a <c>HANDLE</c> to receive the handle to the Wi-Fi Direct service for this session.</para>
/// <para>
/// If the <c>WFDOpenLegacySession</c> function is successful, a handle to the Wi-Fi Direct service to use in this session is returned.
/// </para>
/// </param>
/// <param name="pGuidSessionInterface">
/// <para>A pointer to the GUID of the network interface for this session.</para>
/// <para>
/// If the <c>WFDOpenLegacySession</c> function is successful, a GUID of the network interface on which Wi-Fi Direct session is returned.
/// </para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>The parameter is incorrect. This error is returned if the phClientHandle or the pLegacyMacAddress parameter is NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>
/// Not enough storage is available to process this command. This error is returned if the system was unable to allocate memory to
/// create the client context.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WFDOpenLegacySession</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server 2012. Wi-Fi
/// Direct is based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see Wi-Fi
/// Alliance Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution for
/// Wi-Fi device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the connection or
/// the use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// In order to use Wi-Fi Direct, an application must first obtain a handle to the Wi-Fi Direct service by calling the
/// <c>WFDOpenLegacySession</c> or WFDOpenHandle function. The Wi-Fi Direct (WFD) handle returned by the <c>WFDOpenHandle</c>
/// function is used for subsequent calls made to the Wi-Fi Direct service. The <c>WFDOpenLegacySession</c> function is used to
/// retrieve and apply a stored profile for a Wi-Fi Direct legacy device.
/// </para>
/// <para>
/// The <c>WFDOpenLegacySession</c> function retrieves the stored legacy profile for device from the profile store for the specified
/// legacy device address. This device address must be obtained from a Device Node created as a result of the Inbox pairing
/// experience (Legacy WPS Pairing).
/// </para>
/// <para>
/// Once an application is done using the Wi-Fi Direct service, the application should call the WFDCloseSession function to close
/// the session and call the WFDCloseHandle function to signal to the Wi-Fi Direct service that the application is done using the
/// service. This allows the Wi-Fi Direct service to release resources used by the application.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wfdopenlegacysession DWORD WFDOpenLegacySession( HANDLE
// hClientHandle, PDOT11_MAC_ADDRESS pLegacyMacAddress, HANDLE *phSessionHandle, GUID *pGuidSessionInterface );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "D7BE8108-EF18-49FC-8B14-CED45B6C682B")]
public static extern Win32Error WFDOpenLegacySession(HWFDSERVICE hClientHandle, in DOT11_MAC_ADDRESS pLegacyMacAddress, out SafeHWFDSESSION phSessionHandle, out Guid pGuidSessionInterface);
/// <summary>
/// The <c>WFDStartOpenSession</c> function starts an on-demand connection to a specific Wi-Fi Direct device, which has been
/// previously paired through the Windows Pairing experience.
/// </summary>
/// <param name="hClientHandle">
/// A client handle to the Wi-Fi Direct service. This handle was obtained by a previous call to the WFDOpenHandle function.
/// </param>
/// <param name="pDeviceAddress">
/// A pointer to the target devices Wi-Fi Direct device address. This is the MAC address of the target Wi-Fi device.
/// </param>
/// <param name="pvContext">An optional context pointer which is passed to the callback function specified in the pfnCallback parameter.</param>
/// <param name="pfnCallback">A pointer to the callback function to be called once the <c>WFDStartOpenSession</c> request has completed.</param>
/// <param name="phSessionHandle">A handle to this specific Wi-Fi Direct session.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// The handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// The parameter is incorrect. This error is returned if the hClientHandle parameter is NULL or not valid. This error is also
/// returned if the pDeviceAddress parameter is NULL, the pfnCallback parameter is NULL, or the phSessionHandle parameter is NULL.
/// This value is also returned if the dwClientVersion parameter is not equal to WFD_API_VERSION.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The group or resource is not in the correct state to perform the requested operation. This error is returned if the Wi-Fi Direct
/// service is disabled by group policy on a domain.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WFDStartOpenSession</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server 2012. Wi-Fi
/// Direct is based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see Wi-Fi
/// Alliance Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution for
/// Wi-Fi device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the connection or
/// the use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// The <c>WFDStartOpenSession</c> function starts an asynchronous operation to start an on-demand connection to a specific Wi-Fi
/// Direct device. The target Wi-Fi device must previously have been paired through the Windows Pairing experience. When the
/// asynchronous operation completes, the callback function specified in the pfnCallback parameter is called.
/// </para>
/// <para>
/// If the application attempts to close the handle to the Wi-Fi Direct service by calling the WFDCloseHandle function before the
/// <c>WFDStartOpenSession</c> function completes asynchronously, the <c>WFDCloseHandle</c> function will wait until the
/// <c>WFDStartOpenSession</c> call is completed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wfdstartopensession DWORD WFDStartOpenSession( HANDLE
// hClientHandle, PDOT11_MAC_ADDRESS pDeviceAddress, PVOID pvContext, WFD_OPEN_SESSION_COMPLETE_CALLBACK pfnCallback, PHANDLE
// phSessionHandle );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "CF1FF7C2-31CD-4FAB-9891-0A72BEA3E9F1")]
public static extern Win32Error WFDStartOpenSession(HWFDSERVICE hClientHandle, in DOT11_MAC_ADDRESS pDeviceAddress, [In, Optional] IntPtr pvContext,
[MarshalAs(UnmanagedType.FunctionPtr)] WFD_OPEN_SESSION_COMPLETE_CALLBACK pfnCallback, out SafeHWFDSESSION phSessionHandle);
/// <summary>
/// The <c>WFDUpdateDeviceVisibility</c> function updates device visibility for the Wi-Fi Direct device address for a given
/// installed Wi-Fi Direct device node.
/// </summary>
/// <param name="pDeviceAddress">
/// <para>A pointer to the Wi-Fi Direct device address of the client device.</para>
/// <para>This device address must be obtained from a Device Node created as a result of the Inbox pairing experience.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>The parameter is incorrect. This error is returned if the pDeviceAddress parameter is NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough storage is available to process this command.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WFDUpdateDeviceVisibility</c> function is part of Wi-Fi Direct, a new feature in Windows 8 and Windows Server 2012. Wi-Fi
/// Direct is based on the development of the Wi-Fi Peer-to-Peer Technical Specification v1.1 by the Wi-Fi Alliance (see Wi-Fi
/// Alliance Published Specifications). The goal of the Wi-Fi Peer-to-Peer Technical Specification is to provide a solution for
/// Wi-Fi device-to-device connectivity without the need for either a Wireless Access Point (wireless AP) to setup the connection or
/// the use of the existing Wi-Fi adhoc (IBSS) mechanism.
/// </para>
/// <para>
/// The <c>WFDUpdateDeviceVisibility</c> function will perform a targeted Wi-Fi Direct discovery, and will update the
/// DEVPKEY_WiFiDirect_IsVisibile property key on the device node for the given device.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wfdupdatedevicevisibility DWORD WFDUpdateDeviceVisibility(
// PDOT11_MAC_ADDRESS pDeviceAddress );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "696B7466-5ED0-4202-9AAF-CE2544C5A5B8")]
public static extern Win32Error WFDUpdateDeviceVisibility(in DOT11_MAC_ADDRESS pDeviceAddress);
/// <summary>Makes a WLAN version from major and minor parts..</summary>
/// <param name="_major">The major version part.</param>
/// <param name="_minor">The minor version part.</param>
/// <returns>The version.</returns>
public static uint WLAN_API_MAKE_VERSION(ushort _major, ushort _minor) => ((uint)_minor) << 16 | (_major);
/// <summary>Gets the WLAN major API version.</summary>
/// <param name="_v">The version.</param>
/// <returns>The major value of the version.</returns>
public static uint WLAN_API_VERSION_MAJOR(uint _v) => (_v) & 0xffff;
/// <summary>Gets the WLAN minor API version.</summary>
/// <param name="_v">The version.</param>
/// <returns>The minor value of the version.</returns>
public static uint WLAN_API_VERSION_MINOR(uint _v) => (_v) >> 16;
/// <summary>
/// The <c>WlanAllocateMemory</c> function allocates memory. Any memory passed to other Native Wifi functions must be allocated with
/// this function.
/// </summary>
/// <param name="dwMemorySize">Amount of memory being requested, in bytes.</param>
/// <returns>
/// <para>If the call is successful, the function returns a pointer to the allocated memory.</para>
/// <para>If the memory could not be allocated for any reason or if the dwMemorySize parameter is 0, the returned pointer is <c>NULL</c>.</para>
/// <para>An application can call GetLastError to obtain extended error information.</para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanallocatememory PVOID WlanAllocateMemory( DWORD
// dwMemorySize );
[DllImport(Lib.Wlanapi, SetLastError = true, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "29200450-4ec8-418d-b633-1ea688755711")]
public static extern SafeHWLANMEM WlanAllocateMemory(uint dwMemorySize);
/// <summary>The <c>WlanCloseHandle</c> function closes a connection to the server.</summary>
/// <param name="hClientHandle">
/// The client's session handle, which identifies the connection to be closed. This handle was obtained by a previous call to the
/// WlanOpenHandle function.
/// </param>
/// <param name="pReserved">Reserved for future use. Set this parameter to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// After a connection has been closed, any attempted use of the closed handle can cause unexpected errors. Upon closing, all
/// outstanding notifications are discarded.
/// </para>
/// <para>
/// Do not call <c>WlanCloseHandle</c> from a callback function. If the client is in the middle of a notification callback when
/// <c>WlanCloseHandle</c> is called, the function waits for the callback to finish before returning a value. Calling this function
/// inside a callback function will result in the call never completing. If both the callback function and the thread that closes
/// the handle try to acquire the same lock, a deadlock may occur. In addition, do not call <c>WlanCloseHandle</c> from the
/// <c>DllMain</c> function in an application DLL. This could also cause a deadlock.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanclosehandle DWORD WlanCloseHandle( HANDLE
// hClientHandle, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "8e944133-2616-4e17-ac38-c17e8d25ccec")]
public static extern Win32Error WlanCloseHandle(HWLANSESSION hClientHandle, IntPtr pReserved = default);
/// <summary>The <c>WlanConnect</c> function attempts to connect to a specific network.</summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface to use for the connection.</param>
/// <param name="pConnectionParameters">
/// <para>
/// Pointer to a WLAN_CONNECTION_PARAMETERS structure that specifies the connection type, mode, network profile, SSID that
/// identifies the network, and other parameters.
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> There are some constraints on the
/// WLAN_CONNECTION_PARAMETERS members. This means that structures that are valid for Windows Server 2008 and Windows Vista may not
/// be valid for Windows XP with SP3 or Wireless LAN API for Windows XP with SP2. For a list of constraints, see <c>WLAN_CONNECTION_PARAMETERS</c>.
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>One of the following conditions occurred:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanConnect</c> function returns immediately. To be notified when a connection is established or when no further
/// connections will be attempted, a client must register for notifications by calling WlanRegisterNotification.
/// </para>
/// <para>
/// The <c>strProfile</c> member of the WLAN_CONNECTION_PARAMETERS structure pointed to by pConnectionParameters specifies the
/// profile to use for connection. If this profile is an all-user profile, the <c>WlanConnect</c> caller must have execute access on
/// the profile. Otherwise, the <c>WlanConnect</c> call will fail with return value ERROR_ACCESS_DENIED. The permissions on an
/// all-user profile are established when the profile is created or saved using WlanSetProfile or WlanSaveTemporaryProfile.
/// </para>
/// <para>
/// To perform a connection operation at the command line, use the <c>netsh wlan connect</c> command. For more information, see
/// Netsh Commands for Wireless Local Area Network (wlan).
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> You can only use <c>WlanConnect</c> to connect to
/// networks on the preferred network list. To add a network to the preferred network list, call WlanSetProfile.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanconnect DWORD WlanConnect( HANDLE hClientHandle, const
// GUID *pInterfaceGuid, const PWLAN_CONNECTION_PARAMETERS pConnectionParameters, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "24ab2024-e786-454f-860f-cf2431f001bb")]
public static extern Win32Error WlanConnect(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, in WLAN_CONNECTION_PARAMETERS pConnectionParameters, IntPtr pReserved = default);
/// <summary>The <c>WlanDeleteProfile</c> function deletes a wireless profile for a wireless interface on the local computer.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface from which to delete the profile.</param>
/// <param name="strProfileName">
/// <para>The name of the profile to be deleted. Profile names are case-sensitive. This string must be NULL-terminated.</para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The supplied name must match the profile name derived
/// automatically from the SSID of the network. For an infrastructure network profile, the SSID must be supplied for the profile
/// name. For an ad hoc network profile, the supplied name must be the SSID of the ad hoc network followed by .
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// The hClientHandle parameter is NULL or not valid, the pInterfaceGuid parameter is NULL, the strProfileName parameter is NULL, or
/// pReserved is not NULL.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle specified in the hClientHandle parameter was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_FOUND</term>
/// <term>The wireless profile specified by strProfileName was not found in the profile store.</term>
/// </item>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions to delete the profile.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>WlanDeleteProfile</c> function deletes a wireless profile for a wireless interface on the local computer.</para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanDeleteProfile</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface specified in the
/// pInterfaceGuid parameter for the wireless LAN profile has been removed from the system (a USB wireless adapter that has been
/// removed, for example).
/// </para>
/// <para>
/// To delete a profile at the command line, use the <c>netsh wlan delete profile</c> command. For more information, see Netsh
/// Commands for Wireless Local Area Network (wlan).
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer and tries to delete a specific wireless
/// profile on each wireless LAN interface.
/// </para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlandeleteprofile DWORD WlanDeleteProfile( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "2d1152ad-8106-4b8f-9856-9e6e36daa063")]
public static extern Win32Error WlanDeleteProfile(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName, IntPtr pReserved = default);
/// <summary>
/// Allows an original equipment manufacturer (OEM) or independent hardware vendor (IHV) component to communicate with a device
/// service on a particular wireless LAN interface.
/// </summary>
/// <param name="hClientHandle">
/// <para>Type: <c>HANDLE</c></para>
/// <para>The client's session handle, obtained by a previous call to the WlanOpenHandle function.</para>
/// </param>
/// <param name="pInterfaceGuid">
/// <para>Type: <c>CONST GUID*</c></para>
/// <para>
/// A pointer to the <c>GUID</c> of the wireless LAN interface to be queried. You can determine the <c>GUID</c> of each wireless LAN
/// interface enabled on a local computer by using the WlanEnumInterfaces function.
/// </para>
/// </param>
/// <param name="pDeviceServiceGuid">
/// <para>Type: <c>GUID*</c></para>
/// <para>The <c>GUID</c> identifying the device service for this command.</para>
/// </param>
/// <param name="dwOpCode">
/// <para>Type: <c>DWORD</c></para>
/// <para>The operational code identifying the operation to be performed on the device service.</para>
/// </param>
/// <param name="dwInBufferSize">
/// <para>Type: <c>DWORD</c></para>
/// <para>The size, in bytes, of the input buffer.</para>
/// </param>
/// <param name="pInBuffer">
/// <para>Type: <c>PVOID</c></para>
/// <para>A generic buffer for command input.</para>
/// </param>
/// <param name="dwOutBufferSize">
/// <para>Type: <c>DWORD</c></para>
/// <para>The size, in bytes, of the output buffer.</para>
/// </param>
/// <param name="pOutBuffer">
/// <para>Type: <c>PVOID</c></para>
/// <para>A generic buffer for command output.</para>
/// </param>
/// <param name="pdwBytesReturned">
/// <para>Type: <c>PDWORD</c></para>
/// <para>The number of bytes returned.</para>
/// </param>
/// <returns>
/// <para>Type: <c>HRESULT</c></para>
/// <para>
/// If the function succeeds, the return value is <c>ERROR_SUCCESS</c>. If the function fails with <c>ERROR_ACCESS_DENIED</c>, then
/// the caller doesn't have sufficient permissions to perform this operation. The caller needs to either have admin privilege, or
/// needs to be a UMDF driver.
/// </para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlandeviceservicecommand DWORD WlanDeviceServiceCommand(
// HANDLE hClientHandle, const GUID *pInterfaceGuid, LPGUID pDeviceServiceGuid, DWORD dwOpCode, DWORD dwInBufferSize, PVOID
// pInBuffer, DWORD dwOutBufferSize, PVOID pOutBuffer, PDWORD pdwBytesReturned );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h")]
public static extern Win32Error WlanDeviceServiceCommand(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, in Guid pDeviceServiceGuid, uint dwOpCode,
uint dwInBufferSize, [In, Optional] IntPtr pInBuffer, uint dwOutBufferSize, [In, Out, Optional] IntPtr pOutBuffer, out uint pdwBytesReturned);
/// <summary>The <c>WlanDisconnect</c> function disconnects an interface from its current network.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface to be disconnected.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pInterfaceGuid is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Failed to allocate memory for the query results.</term>
/// </item>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// When the connection was established using WlanConnect, a profile was specified by the <c>strProfile</c> member of the
/// WLAN_CONNECTION_PARAMETERS structure pointed to by pConnectionParameters. If that profile was an all-user profile, the
/// <c>WlanDisconnect</c> caller must have execute access on the profile. Otherwise, the <c>WlanDisconnect</c> call will fail with
/// return value ERROR_ACCESS_DENIED. The permissions on an all-user profile are established when the profile is created or saved
/// using WlanSetProfile or WlanSaveTemporaryProfile.
/// </para>
/// <para>
/// To perform a disconnection operation at the command line, use the <c>netsh wlan disconnect</c> command. For more information,
/// see Netsh Commands for Wireless Local Area Network (wlan).
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c><c>WlanDisconnect</c> has the side effect of modifying
/// the profile associated with the disconnected network. A network profile becomes an on-demand profile after a
/// <c>WlanDisconnect</c> call. The Wireless Zero Configuration service will not connect automatically to a network with an
/// on-demand profile when the network is in range. Do not call <c>WlanDisconnect</c> before calling WlanConnect unless you want to
/// change a profile to an on-demand profile. When you call <c>WlanConnect</c> to establish a network connection, any existing
/// network connection is dropped automatically.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlandisconnect DWORD WlanDisconnect( HANDLE hClientHandle,
// const GUID *pInterfaceGuid, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "cc48ee72-3125-45a0-ac16-0c520ee3cd44")]
public static extern Win32Error WlanDisconnect(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, IntPtr pReserved = default);
/// <summary>
/// The <c>WlanEnumInterfaces</c> function enumerates all of the wireless LAN interfaces currently enabled on the local computer.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pReserved">Reserved for future use. This parameter must be set to <c>NULL</c>.</param>
/// <param name="ppInterfaceList">
/// <para>
/// A pointer to storage for a pointer to receive the returned list of wireless LAN interfaces in a WLAN_INTERFACE_INFO_LIST structure.
/// </para>
/// <para>
/// The buffer for the WLAN_INTERFACE_INFO_LIST returned is allocated by the <c>WlanEnumInterfaces</c> function if the call succeeds.
/// </para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// A parameter is incorrect. This error is returned if the hClientHandle or ppInterfaceList parameter is NULL. This error is
/// returned if the pReserved is not NULL. This error is also returned if the hClientHandle parameter is not valid.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough memory is available to process this request and allocate memory for the query results.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanEnumInterfaces</c> function allocates memory for the list of returned interfaces that is returned in the buffer
/// pointed to by the ppInterfaceList parameter when the function succeeds. The memory used for the buffer pointed to by
/// ppInterfaceList parameter should be released by calling the WlanFreeMemory function after the buffer is no longer needed.
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer and prints values from the retrieved
/// WLAN_INTERFACE_INFO_LIST structure and the enumerated WLAN_INTERFACE_INFO structures.
/// </para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanenuminterfaces DWORD WlanEnumInterfaces( HANDLE
// hClientHandle, PVOID pReserved, PWLAN_INTERFACE_INFO_LIST *ppInterfaceList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "7f817edf-1b1d-495c-afd9-d97e3ae0caab")]
public static extern Win32Error WlanEnumInterfaces(HWLANSESSION hClientHandle, [Optional] IntPtr pReserved,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<WLAN_INTERFACE_INFO_LIST>))] out WLAN_INTERFACE_INFO_LIST ppInterfaceList);
/// <summary>
/// The <c>WlanExtractPsdIEDataList</c> function extracts the proximity service discovery (PSD) information element (IE) data list
/// from raw IE data included in a beacon.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="dwIeDataSize">The size, in bytes, of the pRawIeData parameter.</param>
/// <param name="pRawIeData">The raw IE data for all IEs in the list.</param>
/// <param name="strFormat">Describes the format of a PSD IE. Only IEs with a matching format are returned.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="ppPsdIEDataList">A pointer to a PWLAN_RAW_DATA_LIST structure that contains the formatted data list.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, dwIeDataSize is 0, pRawIeData is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>For more information about PSD IEs, including a discussion of the format of an IE, see WlanSetPsdIEDataList.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanextractpsdiedatalist DWORD WlanExtractPsdIEDataList(
// HANDLE hClientHandle, DWORD dwIeDataSize, const PBYTE pRawIeData, LPCWSTR strFormat, PVOID pReserved, PWLAN_RAW_DATA_LIST
// *ppPsdIEDataList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "7fb6707f-c229-4386-9058-e290693a20ce")]
public static extern Win32Error WlanExtractPsdIEDataList(HWLANSESSION hClientHandle, uint dwIeDataSize, [In] IntPtr pRawIeData,
[MarshalAs(UnmanagedType.LPWStr)] string strFormat, [Optional] IntPtr pReserved, out SafeHWLANMEM ppPsdIEDataList);
/// <summary>
/// The <c>WlanExtractPsdIEDataList</c> function extracts the proximity service discovery (PSD) information element (IE) data list
/// from raw IE data included in a beacon.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="dwIeDataSize">The size, in bytes, of the pRawIeData parameter.</param>
/// <param name="pRawIeData">The raw IE data for all IEs in the list.</param>
/// <param name="strFormat">Describes the format of a PSD IE. Only IEs with a matching format are returned.</param>
/// <param name="ppPsdIEDataList">An array of byte arrays, each containing a blob in the data list.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, dwIeDataSize is 0, pRawIeData is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>For more information about PSD IEs, including a discussion of the format of an IE, see WlanSetPsdIEDataList.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanextractpsdiedatalist DWORD WlanExtractPsdIEDataList(
// HANDLE hClientHandle, DWORD dwIeDataSize, const PBYTE pRawIeData, LPCWSTR strFormat, PVOID pReserved, PWLAN_RAW_DATA_LIST
// *ppPsdIEDataList );
[PInvokeData("wlanapi.h", MSDNShortId = "7fb6707f-c229-4386-9058-e290693a20ce")]
public static Win32Error WlanExtractPsdIEDataList(HWLANSESSION hClientHandle, uint dwIeDataSize, [In] IntPtr pRawIeData,
[MarshalAs(UnmanagedType.LPWStr)] string strFormat, out byte[][] ppPsdIEDataList)
{
var ret = WlanExtractPsdIEDataList(hClientHandle, dwIeDataSize, pRawIeData, strFormat, default, out var mem);
if (ret.Succeeded)
{
var l = mem.DangerousGetHandle().ToStructure<WLAN_RAW_DATA_LIST>();
ppPsdIEDataList = new byte[(int)l.dwNumberOfItems][];
for (int i = 0; i < l.dwNumberOfItems; i++)
ppPsdIEDataList[i] = mem.DangerousGetHandle().Offset((8 * (i + 1)) + l.DataList[i].dwDataOffset).ToArray<byte>((int)l.DataList[i].dwDataSize);
mem?.Dispose();
}
else
ppPsdIEDataList = null;
return ret;
}
/// <summary>The <c>WlanFreeMemory</c> function frees memory. Any memory returned from Native Wifi functions must be freed.</summary>
/// <param name="pMemory">Pointer to the memory to be freed.</param>
/// <returns>None.</returns>
/// <remarks>
/// <para>If pMemory points to memory that has already been freed, an access violation or heap corruption may occur.</para>
/// <para>
/// There is a hotfix available for Wireless LAN API for Windows XP with Service Pack 2 (SP2) that can help improve the performance
/// of applications that call <c>WlanFreeMemory</c> and WlanGetAvailableNetworkList many times. For more information, see Help and
/// Knowledge Base article 940541, entitled "FIX: The private bytes of the application continuously increase when an application
/// calls the WlanGetAvailableNetworkList function and the WlanFreeMemory function on a Windows XP Service Pack 2-based computer",
/// in the Help and Support Knowledge Base at https://go.microsoft.com/fwlink/p/?linkid=102216.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanfreememory void WlanFreeMemory( PVOID pMemory );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "241afb9d-8b16-4d76-b311-302b5492853e")]
public static extern void WlanFreeMemory(IntPtr pMemory);
/// <summary>The <c>WlanGetAvailableNetworkList</c> function retrieves the list of available networks on a wireless LAN interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>A pointer to the GUID of the wireless LAN interface to be queried.</para>
/// <para>The GUID of each wireless LAN interface enabled on a local computer can be determined using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="dwFlags">
/// <para>
/// A set of flags that control the type of networks returned in the list. This parameter can be a combination of these possible values.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES 0x00000001</term>
/// <term>Include all ad hoc network profiles in the available network list, including profiles that are not visible.</term>
/// </item>
/// <item>
/// <term>WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES 0x00000002</term>
/// <term>Include all hidden network profiles in the available network list, including profiles that are not visible.</term>
/// </item>
/// </list>
/// </param>
/// <param name="pReserved">Reserved for future use. This parameter must be set to <c>NULL</c>.</param>
/// <param name="ppAvailableNetworkList">
/// <para>A pointer to storage for a pointer to receive the returned list of visible networks in a WLAN_AVAILABLE_NETWORK_LIST structure.</para>
/// <para>
/// The buffer for the WLAN_AVAILABLE_NETWORK_LIST returned is allocated by the <c>WlanGetAvailableNetworkList</c> function if the
/// call succeeds.
/// </para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// A parameter is incorrect. This error is returned if the hClientHandle, pInterfaceGuid, or ppAvailableNetworkList parameter is
/// NULL. This error is returned if the pReserved is not NULL. This error is also returned if the dwFlags parameter value is set to
/// value that is not valid or the hClientHandle parameter is not valid.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NDIS_DOT11_POWER_STATE_INVALID</term>
/// <term>The radio associated with the interface is turned off. There are no available networks when the radio is off.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough memory is available to process this request and allocate memory for the query results.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanGetAvailableNetworkList</c> function allocates memory for the list of available networks returned in the buffer
/// pointed to by the ppAvailableNetworkList parameter when the function succeeds. The memory used for the buffer pointed to by
/// ppAvailableNetworkList parameter should be released by calling the WlanFreeMemory function after the buffer is no longer needed.
/// </para>
/// <para>
/// There is a hotfix available for Wireless LAN API for Windows XP with SP2 that can help improve the performance of applications
/// that call WlanFreeMemory and <c>WlanGetAvailableNetworkList</c> many times. For more information, see Help and Knowledge Base
/// article 940541, entitled "FIX: The private bytes of the application continuously increase when an application calls the
/// WlanGetAvailableNetworkList function and the WlanFreeMemory function on a Windows XP Service Pack 2-based computer", in the Help
/// and Support Knowledge Base at https://go.microsoft.com/fwlink/p/?linkid=102216.
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer, retrieves the list of available networks on
/// each wireless LAN interface, and prints values from the retrieved WLAN_AVAILABLE_NETWORK_LIST that contains the
/// WLAN_AVAILABLE_NETWORK entries.
/// </para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetavailablenetworklist DWORD
// WlanGetAvailableNetworkList( HANDLE hClientHandle, const GUID *pInterfaceGuid, DWORD dwFlags, PVOID pReserved,
// PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "27353a1b-2a3c-4c3b-b512-917d010ee8dd")]
public static extern Win32Error WlanGetAvailableNetworkList(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, uint dwFlags, [Optional] IntPtr pReserved,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<WLAN_AVAILABLE_NETWORK_LIST>))] out WLAN_AVAILABLE_NETWORK_LIST ppAvailableNetworkList);
/// <summary>The <c>WlanGetFilterList</c> function retrieves a group policy or user permission list.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="wlanFilterListType">
/// A WLAN_FILTER_LIST_TYPE value that specifies the type of filter list. All user defined and group policy filter lists can be queried.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="ppNetworkList">Pointer to a DOT11_NETWORK_LIST structure that contains the list of permitted or denied networks.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to get the filter list. When called with wlanFilterListType set to
/// wlan_filter_list_type_user_permit, WlanGetFilterList retrieves the discretionary access control list (DACL) stored with the
/// wlan_secure_permit_list object. When called with wlanFilterListType set to wlan_filter_list_type_user_deny, WlanGetFilterList
/// retrieves the DACL stored with the wlan_secure_deny_list object. In either of these cases, if the DACL does not contain an
/// access control entry (ACE) that grants WLAN_READ_ACCESS permission to the access token of the calling thread, then
/// WlanGetFilterList returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, ppNetworkList is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>User permission lists can be set by calling WlanSetFilterList.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetfilterlist DWORD WlanGetFilterList( HANDLE
// hClientHandle, WLAN_FILTER_LIST_TYPE wlanFilterListType, PVOID pReserved, PDOT11_NETWORK_LIST *ppNetworkList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "3ea88e52-34bb-47a6-b345-c789d1d8047d")]
public static extern Win32Error WlanGetFilterList(HWLANSESSION hClientHandle, WLAN_FILTER_LIST_TYPE wlanFilterListType, [Optional] IntPtr pReserved,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<DOT11_NETWORK_LIST>))] out DOT11_NETWORK_LIST ppNetworkList);
/// <summary>The <c>WlanGetInterfaceCapability</c> function retrieves the capabilities of an interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of this interface.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="ppCapability">
/// A WLAN_INTERFACE_CAPABILITY structure that contains information about the capabilities of the specified interface.
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pInterfaceGuid is NULL, pReserved is not NULL, or ppCapability is NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>The caller is responsible for calling the WlanFreeMemory function to free the memory allocated to ppCapability.</remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetinterfacecapability DWORD
// WlanGetInterfaceCapability( HANDLE hClientHandle, const GUID *pInterfaceGuid, PVOID pReserved, PWLAN_INTERFACE_CAPABILITY
// *ppCapability );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "09f8273a-5259-44fa-b55e-af3282735c0b")]
public static extern Win32Error WlanGetInterfaceCapability(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [Optional] IntPtr pReserved,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<WLAN_INTERFACE_CAPABILITY>))] out WLAN_INTERFACE_CAPABILITY ppCapability);
/// <summary>
/// The <c>WlanGetNetworkBssList</c> function retrieves a list of the basic service set (BSS) entries of the wireless network or
/// networks on a given wireless LAN interface.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>A pointer to the GUID of the wireless LAN interface to be queried.</para>
/// <para>The GUID of each wireless LAN interface enabled on a local computer can be determined using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="pDot11Ssid">
/// <para>
/// A pointer to a DOT11_SSID structure that specifies the SSID of the network from which the BSS list is requested. This parameter
/// is optional. When set to <c>NULL</c>, the returned list contains all of available BSS entries on a wireless LAN interface.
/// </para>
/// <para>
/// If a pointer to a DOT11_SSID structure is specified, the SSID length specified in the <c>uSSIDLength</c> member of
/// <c>DOT11_SSID</c> structure must be less than or equal to <c>DOT11_SSID_MAX_LENGTH</c> defined in the Wlantypes.h header file.
/// In addition, the dot11BssType parameter must be set to either <c>dot11_BSS_type_infrastructure</c> or
/// <c>dot11_BSS_type_independent</c> and the bSecurityEnabled parameter must be specified.
/// </para>
/// </param>
/// <param name="dot11BssType">
/// <para>
/// The BSS type of the network. This parameter is ignored if the SSID of the network for the BSS list is unspecified (the
/// pDot11Ssid parameter is <c>NULL</c>).
/// </para>
/// <para>
/// This parameter can be one of the following values defined in the DOT11_BSS_TYPE enumeration defined in the Wlantypes.h header file.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>dot11_BSS_type_infrastructure</term>
/// <term>An infrastructure BSS network.</term>
/// </item>
/// <item>
/// <term>dot11_BSS_type_independent</term>
/// <term>An independent BSS (IBSS) network (an ad hoc network).</term>
/// </item>
/// <item>
/// <term>dot11_BSS_type_any</term>
/// <term>Any BSS network.</term>
/// </item>
/// </list>
/// </param>
/// <param name="bSecurityEnabled">
/// A value that indicates whether security is enabled on the network. This parameter is only valid when the SSID of the network for
/// the BSS list is specified (the pDot11Ssid parameter is not <c>NULL</c>).
/// </param>
/// <param name="pReserved">Reserved for future use. This parameter must be set to <c>NULL</c>.</param>
/// <param name="ppWlanBssList">
/// <para>A pointer to storage for a pointer to receive the returned list of of BSS entries in a WLAN_BSS_LIST structure.</para>
/// <para>The buffer for the WLAN_BSS_LIST returned is allocated by the <c>WlanGetNetworkBssList</c> function if the call succeeds.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// A parameter is incorrect. This error is returned if the hClientHandle, pInterfaceGuid, or ppWlanBssList parameter is NULL. This
/// error is returned if the pReserved is not NULL. This error is also returned if the hClientHandle, the SSID specified in the
/// pDot11Ssid parameter, or the BSS type specified in the dot11BssType parameter is not valid.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NDIS_DOT11_POWER_STATE_INVALID</term>
/// <term>The radio associated with the interface is turned off. The BSS list is not available when the radio is off.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough memory is available to process this request and allocate memory for the query results.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_FOUND</term>
/// <term>
/// The element was not found. This error is returned if the GUID of the interface to be queried that was specified in the
/// pInterfaceGuid parameter could not be found.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// The request is not supported. This error is returned if this function was called from a Windows XP with SP3 or Wireless LAN API
/// for Windows XP with SP2 client. This error is also returned if the WLAN AutoConfig service is disabled.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The WLAN AutoConfig service has not been started.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanGetNetworkBssList</c> function retrieves the basic service set list for each wireless network or networks accessible
/// on a given interface. The list of information returned for each wireless network also contains a list of information elements
/// returned by each access point for an infrastructure BSS network or a network peer for an independent BSS network (ad hoc
/// network). The information is returned as a pointer to an WLAN_BSS_LIST structure in the ppWlanBssList parameter. The
/// <c>WLAN_BSS_LIST</c> structure contains an item count followed by an array of WLAN_BSS_ENTRY structure entries.
/// </para>
/// <para>
/// Since the information returned by the <c>WlanGetNetworkBssList</c> function is sent by an access point for an infrastructure BSS
/// network or by a network peer for an independent BSS network (ad hoc network), the information returned should not be trusted.
/// The <c>ulIeOffset</c> and <c>ulIeSize</c> members in the WLAN_BSS_ENTRY structure should be used to determine the size of the
/// information element data blob in the <c>WLAN_BSS_ENTRY</c> structure, not the data in the information element data blob itself.
/// The <c>WlanGetNetworkBssList</c> function does not validate that any information returned in the information element data blob
/// pointed to by the <c>ulIeOffset</c> member is a valid information element as defined by the IEEE 802.11 standards for wireless LANs.
/// </para>
/// <para>
/// If the pDot11Ssid parameter is specified (not <c>NULL</c>), then the dot11BssType parameter specified must be set to either
/// <c>dot11_BSS_type_infrastructure</c> for an infrastructure BSS network or <c>dot11_BSS_type_independent</c> for an independent
/// BSS network (ad hoc network). If the dot11BssType parameter is set to <c>dot11_BSS_type_any</c>, then the
/// <c>WlanGetNetworkBssList</c> function returns ERROR_SUCCESS but no BSS entries will be returned.
/// </para>
/// <para>
/// To return a list of all the infrastructure BSS networks and independent BSS networks (ad hoc networks) on a wireless LAN
/// interface, set the pDot11Ssid parameter to <c>NULL</c>. When the wireless LAN interface is also operating as a Wireless Hosted
/// Network , the BSS list will contain an entry for the BSS created for the Wireless Hosted Network.
/// </para>
/// <para>
/// The <c>WlanGetNetworkBssList</c> function returns ERROR_SUCCESS when an empty BSS list is returned by the WLAN AutoConfig
/// Service. An application that calls the <c>WlanGetNetworkBssList</c> function must check that the <c>dwNumberOfItems</c> member
/// of the WLAN_BSS_LIST pointed to by the ppWlanBssList parameter is not zero before accessing the <c>wlanBssEntries[0]</c> member
/// in <c>WLAN_BSS_LIST</c> structure.
/// </para>
/// <para>
/// The <c>WlanGetNetworkBssList</c> function allocates memory for the basic service set list that is returned in a buffer pointed
/// to by the ppWlanBssList parameter when the function succeeds. The memory used for the buffer pointed to by ppWlanBssList
/// parameter should be released by calling the WlanFreeMemory function after the buffer is no longer needed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetnetworkbsslist DWORD WlanGetNetworkBssList( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, const PDOT11_SSID pDot11Ssid, DOT11_BSS_TYPE dot11BssType, BOOL bSecurityEnabled,
// PVOID pReserved, PWLAN_BSS_LIST *ppWlanBssList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "62f51b6e-3db1-48cd-8853-0dbe522c5e82")]
public static extern Win32Error WlanGetNetworkBssList(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, in DOT11_SSID pDot11Ssid,
DOT11_BSS_TYPE dot11BssType, [MarshalAs(UnmanagedType.Bool)] bool bSecurityEnabled, [Optional] IntPtr pReserved,
out SafeHWLANMEM ppWlanBssList);
/// <summary>
/// The <c>WlanGetNetworkBssList</c> function retrieves a list of the basic service set (BSS) entries of the wireless network or
/// networks on a given wireless LAN interface.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>A pointer to the GUID of the wireless LAN interface to be queried.</para>
/// <para>The GUID of each wireless LAN interface enabled on a local computer can be determined using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="pDot11Ssid">
/// <para>
/// A pointer to a DOT11_SSID structure that specifies the SSID of the network from which the BSS list is requested. This parameter
/// is optional. When set to <c>NULL</c>, the returned list contains all of available BSS entries on a wireless LAN interface.
/// </para>
/// <para>
/// If a pointer to a DOT11_SSID structure is specified, the SSID length specified in the <c>uSSIDLength</c> member of
/// <c>DOT11_SSID</c> structure must be less than or equal to <c>DOT11_SSID_MAX_LENGTH</c> defined in the Wlantypes.h header file.
/// In addition, the dot11BssType parameter must be set to either <c>dot11_BSS_type_infrastructure</c> or
/// <c>dot11_BSS_type_independent</c> and the bSecurityEnabled parameter must be specified.
/// </para>
/// </param>
/// <param name="dot11BssType">
/// <para>
/// The BSS type of the network. This parameter is ignored if the SSID of the network for the BSS list is unspecified (the
/// pDot11Ssid parameter is <c>NULL</c>).
/// </para>
/// <para>
/// This parameter can be one of the following values defined in the DOT11_BSS_TYPE enumeration defined in the Wlantypes.h header file.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>dot11_BSS_type_infrastructure</term>
/// <term>An infrastructure BSS network.</term>
/// </item>
/// <item>
/// <term>dot11_BSS_type_independent</term>
/// <term>An independent BSS (IBSS) network (an ad hoc network).</term>
/// </item>
/// <item>
/// <term>dot11_BSS_type_any</term>
/// <term>Any BSS network.</term>
/// </item>
/// </list>
/// </param>
/// <param name="bSecurityEnabled">
/// A value that indicates whether security is enabled on the network. This parameter is only valid when the SSID of the network for
/// the BSS list is specified (the pDot11Ssid parameter is not <c>NULL</c>).
/// </param>
/// <param name="pReserved">Reserved for future use. This parameter must be set to <c>NULL</c>.</param>
/// <param name="ppWlanBssList">
/// <para>A pointer to storage for a pointer to receive the returned list of of BSS entries in a WLAN_BSS_LIST structure.</para>
/// <para>The buffer for the WLAN_BSS_LIST returned is allocated by the <c>WlanGetNetworkBssList</c> function if the call succeeds.</para>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// A parameter is incorrect. This error is returned if the hClientHandle, pInterfaceGuid, or ppWlanBssList parameter is NULL. This
/// error is returned if the pReserved is not NULL. This error is also returned if the hClientHandle, the SSID specified in the
/// pDot11Ssid parameter, or the BSS type specified in the dot11BssType parameter is not valid.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NDIS_DOT11_POWER_STATE_INVALID</term>
/// <term>The radio associated with the interface is turned off. The BSS list is not available when the radio is off.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough memory is available to process this request and allocate memory for the query results.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_FOUND</term>
/// <term>
/// The element was not found. This error is returned if the GUID of the interface to be queried that was specified in the
/// pInterfaceGuid parameter could not be found.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// The request is not supported. This error is returned if this function was called from a Windows XP with SP3 or Wireless LAN API
/// for Windows XP with SP2 client. This error is also returned if the WLAN AutoConfig service is disabled.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The WLAN AutoConfig service has not been started.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanGetNetworkBssList</c> function retrieves the basic service set list for each wireless network or networks accessible
/// on a given interface. The list of information returned for each wireless network also contains a list of information elements
/// returned by each access point for an infrastructure BSS network or a network peer for an independent BSS network (ad hoc
/// network). The information is returned as a pointer to an WLAN_BSS_LIST structure in the ppWlanBssList parameter. The
/// <c>WLAN_BSS_LIST</c> structure contains an item count followed by an array of WLAN_BSS_ENTRY structure entries.
/// </para>
/// <para>
/// Since the information returned by the <c>WlanGetNetworkBssList</c> function is sent by an access point for an infrastructure BSS
/// network or by a network peer for an independent BSS network (ad hoc network), the information returned should not be trusted.
/// The <c>ulIeOffset</c> and <c>ulIeSize</c> members in the WLAN_BSS_ENTRY structure should be used to determine the size of the
/// information element data blob in the <c>WLAN_BSS_ENTRY</c> structure, not the data in the information element data blob itself.
/// The <c>WlanGetNetworkBssList</c> function does not validate that any information returned in the information element data blob
/// pointed to by the <c>ulIeOffset</c> member is a valid information element as defined by the IEEE 802.11 standards for wireless LANs.
/// </para>
/// <para>
/// If the pDot11Ssid parameter is specified (not <c>NULL</c>), then the dot11BssType parameter specified must be set to either
/// <c>dot11_BSS_type_infrastructure</c> for an infrastructure BSS network or <c>dot11_BSS_type_independent</c> for an independent
/// BSS network (ad hoc network). If the dot11BssType parameter is set to <c>dot11_BSS_type_any</c>, then the
/// <c>WlanGetNetworkBssList</c> function returns ERROR_SUCCESS but no BSS entries will be returned.
/// </para>
/// <para>
/// To return a list of all the infrastructure BSS networks and independent BSS networks (ad hoc networks) on a wireless LAN
/// interface, set the pDot11Ssid parameter to <c>NULL</c>. When the wireless LAN interface is also operating as a Wireless Hosted
/// Network , the BSS list will contain an entry for the BSS created for the Wireless Hosted Network.
/// </para>
/// <para>
/// The <c>WlanGetNetworkBssList</c> function returns ERROR_SUCCESS when an empty BSS list is returned by the WLAN AutoConfig
/// Service. An application that calls the <c>WlanGetNetworkBssList</c> function must check that the <c>dwNumberOfItems</c> member
/// of the WLAN_BSS_LIST pointed to by the ppWlanBssList parameter is not zero before accessing the <c>wlanBssEntries[0]</c> member
/// in <c>WLAN_BSS_LIST</c> structure.
/// </para>
/// <para>
/// The <c>WlanGetNetworkBssList</c> function allocates memory for the basic service set list that is returned in a buffer pointed
/// to by the ppWlanBssList parameter when the function succeeds. The memory used for the buffer pointed to by ppWlanBssList
/// parameter should be released by calling the WlanFreeMemory function after the buffer is no longer needed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetnetworkbsslist DWORD WlanGetNetworkBssList( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, const PDOT11_SSID pDot11Ssid, DOT11_BSS_TYPE dot11BssType, BOOL bSecurityEnabled,
// PVOID pReserved, PWLAN_BSS_LIST *ppWlanBssList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "62f51b6e-3db1-48cd-8853-0dbe522c5e82")]
public static extern Win32Error WlanGetNetworkBssList(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [Optional] IntPtr pDot11Ssid,
DOT11_BSS_TYPE dot11BssType, [MarshalAs(UnmanagedType.Bool)] bool bSecurityEnabled, [Optional] IntPtr pReserved,
out SafeHWLANMEM ppWlanBssList);
/// <summary>The <c>WlanGetProfile</c> function retrieves all information about a specified wireless profile.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>The GUID of the wireless interface.</para>
/// <para>A list of the GUIDs for wireless interfaces on the local computer can be retrieved using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="strProfileName">
/// <para>
/// The name of the profile. Profile names are case-sensitive. This string must be NULL-terminated. The maximum length of the
/// profile name is 255 characters. This means that the maximum length of this string, including the NULL terminator, is 256 characters.
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The name of the profile is derived automatically from
/// the SSID of the network. For infrastructure network profiles, the name of the profile is the SSID of the network. For ad hoc
/// network profiles, the name of the profile is the SSID of the ad hoc network followed by .
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pstrProfileXml">
/// A string that is the XML representation of the queried profile. There is no predefined maximum string length.
/// </param>
/// <param name="pdwFlags">
/// <para>
/// On input, a pointer to the address location used to provide additional information about the request. If this parameter is
/// <c>NULL</c> on input, then no information on profile flags will be returned. On output, a pointer to the address location used
/// to receive profile flags.
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Per-user profiles are not supported. Set this parameter
/// to <c>NULL</c>.
/// </para>
/// <para>The pdwFlags parameter can point to an address location that contains the following values:</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_PROFILE_GET_PLAINTEXT_KEY</term>
/// <term>
/// On input, this flag indicates that the caller wants to retrieve the plain text key from a wireless profile. If the calling
/// thread has the required permissions, the WlanGetProfile function returns the plain text key in the keyMaterial element of the
/// profile returned in the buffer pointed to by the pstrProfileXml parameter. For the WlanGetProfile call to return the plain text
/// key, the wlan_secure_get_plaintext_key permissions from the WLAN_SECURABLE_OBJECT enumerated type must be set on the calling
/// thread. The DACL must also contain an ACE that grants WLAN_READ_ACCESS permission to the access token of the calling thread. By
/// default, the permissions for retrieving the plain text key is allowed only to the members of the Administrators group on a local
/// machine. If the calling thread lacks the required permissions, the WlanGetProfile function returns the encrypted key in the
/// keyMaterial element of the profile returned in the buffer pointed to by the pstrProfileXml parameter. No error is returned if
/// the calling thread lacks the required permissions. Windows 7: This flag passed on input is an extension to native wireless APIs
/// added on Windows 7 and later. The pdwFlags parameter is an __inout_opt parameter on Windows 7 and later.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_GROUP_POLICY</term>
/// <term>
/// On output when the WlanGetProfile call is successful, this flag indicates that this profile was created by group policy. A group
/// policy profile is read-only. Neither the content nor the preference order of the profile can be changed.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_USER</term>
/// <term>
/// On output when the WlanGetProfile call is successful, this flag indicates that the profile is a user profile for the specific
/// user in whose context the calling thread resides. If not set, this profile is an all-user profile.
/// </term>
/// </item>
/// </list>
/// </param>
/// <param name="pdwGrantedAccess">
/// <para>The access mask of the all-user profile.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_READ_ACCESS</term>
/// <term>The user can view the contents of the profile.</term>
/// </item>
/// <item>
/// <term>WLAN_EXECUTE_ACCESS</term>
/// <term>
/// The user has read access, and the user can also connect to and disconnect from a network using the profile. If a user has
/// WLAN_EXECUTE_ACCESS, then the user also has WLAN_READ_ACCESS.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_WRITE_ACCESS</term>
/// <term>
/// The user has execute access and the user can also modify the content of the profile or delete the profile. If a user has
/// WLAN_WRITE_ACCESS, then the user also has WLAN_EXECUTE_ACCESS and WLAN_READ_ACCESS.
/// </term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions. This error is returned if the pstrProfileXml parameter specifies an all-user
/// profile, but the caller does not have read access on the profile.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>
/// Not enough storage is available to process this command. This error is returned if the system was unable to allocate memory for
/// the profile.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NOT_FOUND</term>
/// <term>The profile specified by strProfileName was not found.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// If the <c>WlanGetProfile</c> function succeeds, the wireless profile is returned in the buffer pointed to by the pstrProfileXml
/// parameter. The buffer contains a string that is the XML representation of the queried profile. For a description of the XML
/// representation of the wireless profile, see WLAN_profile Schema.
/// </para>
/// <para>
/// The caller is responsible for calling the WlanFreeMemory function to free the memory allocated for the buffer pointer to by the
/// pstrProfileXml parameter when the buffer is no longer needed.
/// </para>
/// <para>
/// If pstrProfileXml specifies an all-user profile, the <c>WlanGetProfile</c> caller must have read access on the profile.
/// Otherwise, the <c>WlanGetProfile</c> call will fail with a return value of <c>ERROR_ACCESS_DENIED</c>. The permissions on an
/// all-user profile are established when the profile is created or saved using WlanSetProfile or WlanSaveTemporaryProfile.
/// </para>
/// <para><c>Windows 7:</c></para>
/// <para>
/// The keyMaterial element returned in the profile schema pointed to by the pstrProfileXml may be requested as plaintext if the
/// <c>WlanGetProfile</c> function is called with the <c>WLAN_PROFILE_GET_PLAINTEXT_KEY</c> flag set in the value pointed to by the
/// pdwFlags parameter on input.
/// </para>
/// <para>
/// For a WEP key, both 5 ASCII characters or 10 hexadecimal characters can be used to set the plaintext key when the profile is
/// created or updated. However, a WEP profile will be saved with 10 hexadecimal characters in the key no matter what the original
/// input was used to create the profile. So in the profile returned by the <c>WlanGetProfile</c> function, the plaintext WEP key is
/// always returned as 10 hexadecimal characters.
/// </para>
/// <para>
/// For the <c>WlanGetProfile</c> call to return the plain text key, the <c>wlan_secure_get_plaintext_key</c> permissions from the
/// WLAN_SECURABLE_OBJECT enumerated type must be set on the calling thread. The DACL must also contain an ACE that grants
/// <c>WLAN_READ_ACCESS</c> permission to the access token of the calling thread. By default, the permissions for retrieving the
/// plain text key is allowed only to the members of the Administrators group on a local machine.
/// </para>
/// <para>
/// If the calling thread lacks the required permissions, the <c>WlanGetProfile</c> function returns the encrypted key in the
/// keyMaterial element of the profile returned in the buffer pointed to by the pstrProfileXml parameter. No error is returned if
/// the calling thread lacks the required permissions.
/// </para>
/// <para>
/// By default, the keyMaterial element returned in the profile pointed to by the pstrProfileXml is encrypted. If your process runs
/// in the context of the LocalSystem account on the same computer, then you can unencrypt key material by calling the
/// CryptUnprotectData function.
/// </para>
/// <para>
/// <c>Windows Server 2008 and Windows Vista:</c> The keyMaterial element returned in the profile schema pointed to by the
/// pstrProfileXml is always encrypted. If your process runs in the context of the LocalSystem account, then you can unencrypt key
/// material by calling the CryptUnprotectData function.
/// </para>
/// <para><c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The key material is never encrypted.</para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer, retrieves information for a specific
/// wireless profile on each wireless LAN interface, and prints the values retrieved. The string that is the XML representation of
/// the queried profile is also printed.
/// </para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetprofile DWORD WlanGetProfile( HANDLE hClientHandle,
// const GUID *pInterfaceGuid, LPCWSTR strProfileName, PVOID pReserved, LPWSTR *pstrProfileXml, DWORD *pdwFlags, DWORD
// *pdwGrantedAccess );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "6486e961-402f-45c8-a806-ab91a4f0f156")]
public static extern Win32Error WlanGetProfile(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName, [Optional] IntPtr pReserved,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<string>))] out string pstrProfileXml, ref WLAN_PROFILE_FLAGS pdwFlags, out WLAN_ACCCESS pdwGrantedAccess);
/// <summary>The <c>WlanGetProfileCustomUserData</c> function gets the custom user data associated with a wireless profile.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">A pointer to the GUID of the wireless LAN interface.</param>
/// <param name="strProfileName">
/// The name of the profile with which the custom user data is associated. Profile names are case-sensitive. This string must be NULL-terminated.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pdwDataSize">The size, in bytes, of the user data buffer pointed to by the ppDataparameter.</param>
/// <param name="ppData">A pointer to the user data.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_FILE_NOT_FOUND</term>
/// <term>The system cannot find the file specified. This error is returned if no user custom data exists for the profile specified.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// The hClientHandle parameter is NULL or not valid, the pInterfaceGuid parameter is NULL, the strProfileName parameter is NULL,
/// the pReserved parameter is not NULL, the pdwDataSize parameter is 0, or the ppData parameter is NULL.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_FILE_NOT_FOUND</term>
/// <term>The system cannot find the file specified. This error is returned if no custom user data exists for the profile specified.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// For every wireless WLAN profile used by the Native Wifi AutoConfig service, Windows maintains the concept of custom user data.
/// This custom user data is initially non-existent, but can be set by calling the WlanSetProfileCustomUserData function. The custom
/// user data gets reset to empty any time the profile is modified by calling the WlanSetProfile function.
/// </para>
/// <para>Once custom user data has been set, this data can be accessed using the <c>WlanGetProfileCustomUserData</c> function.</para>
/// <para>
/// The caller is responsible for freeing the memory allocated for the buffer pointed to by the ppData parameter using the
/// WlanFreeMemory function.
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer, and then tries to retrieve any custom user
/// data information for a specific wireless profile on each wireless LAN interface. The size of the user custom data is printed.
/// </para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetprofilecustomuserdata DWORD
// WlanGetProfileCustomUserData( HANDLE hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, PVOID pReserved, DWORD
// *pdwDataSize, PBYTE *ppData );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "5973be2f-8267-496b-827b-778f705accdc")]
public static extern Win32Error WlanGetProfileCustomUserData(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName,
[Optional] IntPtr pReserved, out uint pdwDataSize, out SafeHWLANMEM ppData);
/// <summary>The <c>WlanGetProfileList</c> function retrieves the list of profiles in preference order.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>The GUID of the wireless interface.</para>
/// <para>A list of the GUIDs for wireless interfaces on the local computer can be retrieved using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="ppProfileList">A PWLAN_PROFILE_INFO_LIST structure that contains the list of profile information.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough memory is available to process this request and allocate memory for the query results.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanGetProfileList</c> function returns only the basic information on the wireless profiles on a wireless interface. The
/// list of wireless profiles on a wireless interface are retrieved in the preference order. The WlanSetProfilePosition can be used
/// to change the preference order for the wireless profiles on a wireless interface.
/// </para>
/// <para>
/// More detailed information for a wireless profile on a wireless interface can be retrieved by using the WlanGetProfile function.
/// The WlanGetProfileCustomUserData function can be used to retrieve custom user data for a wireless profile on a wireless
/// interface. A list of the wireless interfaces and associated GUIDs on the local computer can be retrieved using the
/// WlanEnumInterfaces function.
/// </para>
/// <para>
/// The <c>WlanGetProfileList</c> function allocates memory for the list of profiles returned in the buffer pointed to by the
/// ppProfileList parameter. The caller is responsible for freeing this memory using the WlanFreeMemory function when this buffer is
/// no longer needed.
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Guest profiles, profiles with Wireless Provisioning
/// Service (WPS) authentication, and profiles with Wi-Fi Protected Access-None (WPA-None) authentication are not supported. These
/// types of profiles are not returned by <c>WlanGetProfileList</c>, even if a profile of this type appears on the preferred profile list.
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer, retrieves the list of profiles on each
/// wireless LAN interface, and prints values from the retrieved WLAN_PROFILE_INFO_LIST that contains the WLAN_PROFILE_INFO entries.
/// </para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetprofilelist DWORD WlanGetProfileList( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, PVOID pReserved, PWLAN_PROFILE_INFO_LIST *ppProfileList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "f4336113-538f-4161-a71f-64a432e31f1c")]
public static extern Win32Error WlanGetProfileList(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [Optional] IntPtr pReserved,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<WLAN_PROFILE_INFO_LIST>))] out WLAN_PROFILE_INFO_LIST ppProfileList);
/// <summary>The <c>WlanGetSecuritySettings</c> function gets the security settings associated with a configurable object.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="SecurableObject">A WLAN_SECURABLE_OBJECT value that specifies the object to which the security settings apply.</param>
/// <param name="pValueType">
/// <para>A pointer to a WLAN_OPCODE_VALUE_TYPE value that specifies the source of the security settings.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>wlan_opcode_value_type_set_by_group_policy</term>
/// <term>The security settings were set by group policy.</term>
/// </item>
/// <item>
/// <term>wlan_opcode_value_type_set_by_user</term>
/// <term>The security settings were set by the user. A user can set security settings by calling WlanSetSecuritySettings.</term>
/// </item>
/// </list>
/// </param>
/// <param name="pstrCurrentSDDL">
/// <para>On input, this parameter must be <c>NULL</c>.</para>
/// <para>
/// On output, this parameter receives a pointer to the security descriptor string that specifies the security settings for the
/// object if the function call succeeds. For more information about this string, see WlanSetSecuritySettings function.
/// </para>
/// </param>
/// <param name="pdwGrantedAccess">
/// <para>The access mask of the object.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_READ_ACCESS</term>
/// <term>The caller can view the object's permissions.</term>
/// </item>
/// <item>
/// <term>WLAN_EXECUTE_ACCESS</term>
/// <term>
/// The caller can read from and execute the object. WLAN_EXECUTE_ACCESS has the same value as the bitwise OR combination
/// WLAN_READ_ACCESS | WLAN_EXECUTE_ACCESS.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_WRITE_ACCESS</term>
/// <term>
/// The caller can read from, execute, and write to the object. WLAN_WRITE_ACCESS has the same value as the bitwise OR combination
/// WLAN_READ_ACCESS | WLAN_EXECUTE_ACCESS | WLAN_WRITE_ACCESS.
/// </term>
/// </item>
/// </list>
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// The caller is responsible for freeing the memory allocated to the security descriptor string pointed to by the pstrCurrentSDDL
/// parameter if the function succeeds. When no longer needed, the memory for the security descriptor string should be freed by
/// calling WlanFreeMemory function and passing in the pstrCurrentSDDL parameter.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetsecuritysettings DWORD WlanGetSecuritySettings(
// HANDLE hClientHandle, WLAN_SECURABLE_OBJECT SecurableObject, PWLAN_OPCODE_VALUE_TYPE pValueType, LPWSTR *pstrCurrentSDDL, PDWORD
// pdwGrantedAccess );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "5e14a70c-c049-4cd1-8675-2b01ed11463f")]
public static extern Win32Error WlanGetSecuritySettings(HWLANSESSION hClientHandle, WLAN_SECURABLE_OBJECT SecurableObject, out WLAN_OPCODE_VALUE_TYPE pValueType,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<string>))] out string pstrCurrentSDDL, out WLAN_ACCCESS pdwGrantedAccess);
/// <summary>Retrieves a list of the supported device services on a given wireless LAN interface.</summary>
/// <param name="hClientHandle">
/// <para>Type: <c>HANDLE</c></para>
/// <para>The client's session handle, obtained by a previous call to the WlanOpenHandle function.</para>
/// </param>
/// <param name="pInterfaceGuid">
/// <para>Type: <c>CONST GUID*</c></para>
/// <para>
/// A pointer to the <c>GUID</c> of the wireless LAN interface to be queried. You can determine the <c>GUID</c> of each wireless LAN
/// interface enabled on a local computer by using the WlanEnumInterfaces function.
/// </para>
/// </param>
/// <param name="ppDevSvcGuidList">
/// <para>Type: <c>PWLAN_DEVICE_SERVICE_GUID_LIST*</c></para>
/// <para>
/// A pointer to storage for a pointer to receive the returned list of device service <c>GUID</c> s in a
/// WLAN_DEVICE_SERVICE_GUID_LIST structure.
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>HRESULT</c></para>
/// <para>
/// If the function succeeds, the return value is <c>ERROR_SUCCESS</c>. If the function fails with <c>ERROR_ACCESS_DENIED</c>, then
/// the caller doesn't have sufficient permissions to perform this operation. The caller needs to either have admin privilege, or
/// needs to be a UMDF driver.
/// </para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlangetsupporteddeviceservices DWORD
// WlanGetSupportedDeviceServices( HANDLE hClientHandle, const GUID *pInterfaceGuid, PWLAN_DEVICE_SERVICE_GUID_LIST
// *ppDevSvcGuidList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h")]
public static extern Win32Error WlanGetSupportedDeviceServices(HWLANSESSION hClientHandle, in Guid pInterfaceGuid,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<WLAN_DEVICE_SERVICE_GUID_LIST>))] out WLAN_DEVICE_SERVICE_GUID_LIST ppDevSvcGuidList);
/// <summary>
/// The <c>WlanHostedNetworkForceStart</c> function transitions the wireless Hosted Network to the <c>wlan_hosted_network_active
/// state</c> without associating the request with the application's calling handle.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason if the call to the <c>WlanHostedNetworkForceStart</c> function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This error is returned if the wireless Hosted
/// Network is disabled by group policy on a domain.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkForceStart</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkForceStart</c> function to force the start of the wireless Hosted Network by
/// transitioning the wireless Hosted Network to the <c>wlan_hosted_network_active state</c> without associating the request with
/// the application's calling handle. A successful call to the <c>WlanHostedNetworkForceStart</c> function should eventually be
/// matched by a call to WlanHostedNetworkForceStop function. Any Hosted Network state change caused by this function would not be
/// automatically undone if the calling application closes its calling handle (by calling WlanCloseHandle with the hClientHandle
/// parameter) or if the process ends.
/// </para>
/// <para>
/// The cost of calling the <c>WlanHostedNetworkForceStart</c> function over calling WlanHostedNetworkStartUsing is the associated
/// privilege required. An application might call the <c>WlanHostedNetworkForceStart</c> function after ensuring that an elevated
/// system user accepts the increased power requirements involved in running the wireless Hosted Network for extended durations.
/// </para>
/// <para>
/// The <c>WlanHostedNetworkForceStart</c> function could fail if Hosted Network state is <c>wlan_hosted_network_unavailable</c> or
/// the caller does not have sufficient privileges.
/// </para>
/// <para>
/// This function to force the start of the Hosted Network can only be called if the user has the appropriate associated privilege.
/// Permissions are stored in a discretionary access control list (DACL) associated with a WLAN_SECURABLE_OBJECT. To call the
/// <c>WlanHostedNetworkForceStart</c>, the client access token of the caller must have elevated privileges exposed by the following
/// enumeration in <c>WLAN_SECURABLE_OBJECT</c>:
/// </para>
/// <list type="bullet">
/// <item>
/// <term><c>wlan_secure_hosted_network_elevated_access</c></term>
/// </item>
/// </list>
/// <para>The ability to enable the wireless Hosted Network may also be restricted by group policy in a domain.</para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkforcestart DWORD
// WlanHostedNetworkForceStart( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "d3e3b44f-ff52-4062-b54d-a0e3f2cf7785")]
public static extern Win32Error WlanHostedNetworkForceStart(HWLANSESSION hClientHandle, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanHostedNetworkForceStop</c> function transitions the wireless Hosted Network to the <c>wlan_hosted_network_idle</c>
/// without associating the request with the application's calling handle.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason, if the call to the <c>WlanHostedNetworkForceStop</c> function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>The resource is not in the correct state to perform the requested operation.</term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkForceStop</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkForceStop</c> function to force the stop the Hosted Network and transition
/// the wireless Hosted Network to the <c>wlan_hosted_network_idle</c> without associating the request with the application's
/// calling handle. A client typically calls the <c>WlanHostedNetworkForceStop</c> function to match an earlier successful call to
/// the WlanHostedNetworkForceStart function.
/// </para>
/// <para>The <c>WlanHostedNetworkForceStop</c> function could fail if Hosted Network state is not <c>wlan_hosted_network_active</c>.</para>
/// <para>
/// Any Hosted Network state change caused by this function would not be automatically undone if the calling application closes its
/// calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// An application might call the <c>WlanHostedNetworkForceStop</c> function to stop the Hosted Network after a previous call to the
/// WlanHostedNetworkForceStart by an elevated system user that accepted the increased power requirements involved in running the
/// wireless Hosted Network for extended durations.
/// </para>
/// <para>
/// Any user can call the <c>WlanHostedNetworkForceStop</c> function to force the stop of the Hosted Network. However, the ability
/// to enable the wireless Hosted Network may be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkforcestop DWORD
// WlanHostedNetworkForceStop( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "abcfc33d-0310-46d2-a543-5c9529c2b851")]
public static extern Win32Error WlanHostedNetworkForceStop(HWLANSESSION hClientHandle, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanHostedNetworkInitSettings</c> function configures and persists to storage the network connection settings (SSID and
/// maximum number of peers, for example) on the wireless Hosted Network if these settings are not already configured.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason if the call to the <c>WlanHostedNetworkInitSettings</c> function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>The resource is not in the correct state to perform the requested operation.</term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkInitSettings</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkInitSettings</c> function to configure and persist to storage the network
/// connection settings (SSID and maximum number of peers, for example) on the wireless Hosted Network, if the connections settings
/// are not already configured. If the network settings on the wireless Hosted Network settings are already configured (the
/// WlanHostedNetworkQueryProperty function does not return <c>ERROR_BAD_CONFIGURATION</c> for the station profile or connection
/// settings), then this function call returns <c>ERROR_SUCCESS</c> without changing the configuration of the network connection settings.
/// </para>
/// <para>
/// A client application should always call the <c>WlanHostedNetworkInitSettings</c> function before using other Hosted Network
/// features on the local computer. This function initializes settings that are required when the wireless Hosted Network is used
/// for the first time on a local computer. The <c>WlanHostedNetworkInitSettings</c> function does not change any configuration if
/// the configuration has already been persisted. So it is safe to call the <c>WlanHostedNetworkInitSettings</c> function if the
/// configuration has already been persisted. It is recommended that applications that use Hosted Network call the
/// <c>WlanHostedNetworkInitSettings</c> function before using other Hosted Network functions.
/// </para>
/// <para>
/// The <c>WlanHostedNetworkInitSettings</c> function computes a random and readable SSID from the host name and computes a random
/// primary key. This function also uses sets a value for the maximum number of peers allowed that defaults to 100. If an
/// application wants to use a different SSID or a different maximum number of peers, then the application should call the
/// WlanHostedNetworkSetProperty function to specifically set these properties used by the wireless Hosted Network.
/// </para>
/// <para>
/// Any Hosted Network state change caused by this function would not be automatically undone if the calling application closes its
/// calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// Any user can call the <c>WlanHostedNetworkInitSettings</c> function to configure and persist to storage network connection
/// settings on the Hosted Network. If the wireless Hosted Network has already been configured, this function does nothing and
/// returns <c>ERROR_SUCCESS</c>.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkinitsettings DWORD
// WlanHostedNetworkInitSettings( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "aed4db5d-9740-43ee-bf09-7a4a5abae953")]
public static extern Win32Error WlanHostedNetworkInitSettings(HWLANSESSION hClientHandle, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanHostedNetworkQueryProperty</c> function queries the current static properties of the wireless Hosted Network.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="OpCode">
/// The identifier for property to be queried. This identifier can be any of the values in the WLAN_HOSTED_NETWORK_OPCODE
/// enumeration defined in the Wlanapi.h header file.
/// </param>
/// <param name="pdwDataSize">
/// A pointer to a value that specifies the size, in bytes, of the buffer returned in the ppvData parameter, if the call to the
/// <c>WlanHostedNetworkQueryProperty</c> function succeeds.
/// </param>
/// <param name="ppvData">
/// <para>On input, this parameter must be <c>NULL</c>.</para>
/// <para>
/// On output, this parameter receives a pointer to a buffer returned with the static property requested, if the call to the
/// <c>WlanHostedNetworkQueryProperty</c> function succeeds. The data type associated with this buffer depends upon the value of
/// OpCode parameter.
/// </para>
/// </param>
/// <param name="pWlanOpcodeValueType">
/// A pointer to a value that receives the value type of the wireless Hosted Network property, if the call to the
/// <c>WlanHostedNetworkQueryProperty</c> function succeeds. The returned value is an enumerated type in the WLAN_OPCODE_VALUE_TYPE
/// enumeration defined in the Wlanapi.h header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_BAD_CONFIGURATION</term>
/// <term>
/// The configuration data for the wireless Hosted Network is unconfigured. This error is returned if the application calls the
/// WlanHostedNetworkQueryProperty function with the OpCode parameter set to wlan_hosted_network_opcode_station_profile or
/// wlan_hosted_network_opcode_connection_settings before a SSID is configured in the wireless Hosted Network.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This can occur if the wireless Hosted Network was
/// in the process of shutting down.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_OUTOFMEMORY</term>
/// <term>Not enough storage is available to complete this operation.</term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkQueryProperty</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkQueryProperty</c> function to query the current static properties of the
/// wireless Hosted Network. This function does not change the state or properties of the wireless Hosted Network.
/// </para>
/// <para>
/// If the function succeeds, the ppvData parameter points to a buffer that contains the requested property. The size of this buffer
/// is returned in a pointer returned in the pwdDataSizeparameter. The WLAN_OPCODE_VALUE_TYPE is returned in a pointer returned in
/// the pWlanOpcodeValueType parameter. The memory used for the buffer in the ppvData parameter that is returned should be released
/// by calling the WlanFreeMemory function after the buffer is no longer needed.
/// </para>
/// <para>
/// The data type associated with the buffer pointed to by the ppvData parameter depends upon the value of OpCode parameter as follows:
/// </para>
/// <list type="table">
/// <listheader>
/// <term>OpCode</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>wlan_hosted_network_opcode_connection_settings</term>
/// <term>A pointer to a WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS structure is returned.</term>
/// </item>
/// <item>
/// <term>wlan_hosted_network_opcode_security_settings</term>
/// <term>A pointer to a WLAN_HOSTED_NETWORK_SECURITY_SETTINGS structure is returned.</term>
/// </item>
/// <item>
/// <term>wlan_hosted_network_opcode_station_profile</term>
/// <term>A PWSTR to contains an XML WLAN profile for connecting to the wireless Hosted Network is returned.</term>
/// </item>
/// <item>
/// <term>wlan_hosted_network_opcode_enable</term>
/// <term>A PBOOL that indicates if wireless Hosted Network is enabled is returned.</term>
/// </item>
/// </list>
/// <para>
/// If the <c>WlanHostedNetworkQueryProperty</c> function is passed any of the following values in the OpCode parameter before a
/// SSID is configured in the wireless Hosted Network, the function will fail with <c>ERROR_BAD_CONFIGURATION</c>:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>wlan_hosted_network_opcode_station_profile</term>
/// </item>
/// <item>
/// <term>wlan_hosted_network_opcode_connection_settings</term>
/// </item>
/// </list>
/// <para>Any user can call the <c>WlanHostedNetworkQueryProperty</c> function to query the Hosted Network properties.</para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkqueryproperty DWORD
// WlanHostedNetworkQueryProperty( HANDLE hClientHandle, WLAN_HOSTED_NETWORK_OPCODE OpCode, PDWORD pdwDataSize, PVOID *ppvData,
// PWLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "bab05629-c921-4639-94db-25f77742dbd3")]
public static extern Win32Error WlanHostedNetworkQueryProperty(HWLANSESSION hClientHandle, WLAN_HOSTED_NETWORK_OPCODE OpCode, out uint pdwDataSize,
out SafeHWLANMEM ppvData, out WLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType, IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanHostedNetworkQuerySecondaryKey</c> function queries the secondary security key that is configured to be used by the
/// wireless Hosted Network.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pdwKeyLength">
/// <para>
/// A pointer to a value that specifies number of valid data bytes in the key data array pointed to by the ppucKeyData parameter, if
/// the call to the <c>WlanHostedNetworkQuerySecondaryKey</c> function succeeds.
/// </para>
/// <para>This key length includes the terminating \0 if the key is a passphrase.</para>
/// </param>
/// <param name="ppucKeyData">
/// A pointer to a value that receives a pointer to the buffer returned with the secondary security key data, if the call to the
/// <c>WlanHostedNetworkQuerySecondaryKey</c> function succeeds.
/// </param>
/// <param name="pbIsPassPhrase">
/// <para>
/// A pointer to a Boolean value that indicates if the key data array pointed to by the ppucKeyData parameter is in passphrase format.
/// </para>
/// <para>
/// If this parameter is <c>TRUE</c>, the key data array is in passphrase format. If this parameter is <c>FALSE</c>, the key data
/// array is not in passphrase format.
/// </para>
/// </param>
/// <param name="pbPersistent">
/// <para>
/// A pointer to a Boolean value that indicates if the key data array pointed to by the ppucKeyData parameter is to be stored and
/// reused later or is for one-time use only.
/// </para>
/// <para>
/// If this parameter is <c>TRUE</c>, the key data array is to be stored and reused later. If this parameter is <c>FALSE</c>, the
/// key data array is for one-time use only.
/// </para>
/// </param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason, if the call to the WlanHostedNetworkSetSecondaryKey function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This can occur if the wireless Hosted Network was
/// in the process of shutting down.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_OUTOFMEMORY</term>
/// <term>Not enough storage is available to complete this operation.</term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkQuerySecondaryKey</c> function is an extension to native wireless APIs added to support the wireless
/// Hosted Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkQuerySecondaryKey</c> function to query the secondary security key that will
/// be used by the wireless Hosted Network. This function will return the key information including key data, key length, whether it
/// is a passphrase, and whether it is persistent or for one-time use. This function does not change the state or properties of the
/// wireless Hosted Network.
/// </para>
/// <para>
/// The secondary security key is a passphrase if the value pointed to by the pbIsPassPhrase parameter is <c>TRUE</c>. The secondary
/// security key is a binary key if the value pointed to by the pbIsPassPhrase parameter is <c>FALSE</c>.
/// </para>
/// <para>
/// The secondary security key returned in the buffer pointed to by the ppucKeyData parameter is used with WPA2-Personal
/// authentication and is in one of the following formats:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// A key passphrase that consists of an array of ASCII characters from 8 to 63 characters. The value pointed to by the pdwKeyLength
/// parameter includes the terminating \0 in the passphrase. The value pointed to by the pdwKeyLength parameter should be in the
/// range of 9 to 64.
/// </term>
/// </item>
/// <item>
/// <term>
/// A binary key that conists of 32 bytes of binary key data. The value pointed to by the pdwKeyLength parameter should be 32 for
/// binary key.
/// </term>
/// </item>
/// </list>
/// <para>
/// The secondary security key is persistent if the value pointed to by the pbPersistent parameter is <c>TRUE</c>. When persistent,
/// the secondary security key would be used immediately if the Hosted Network is already started, and also reused whenever Hosted
/// Network is started in the future.
/// </para>
/// <para>
/// If secondary security key is not specified as persistent, it will be used immediately if the Hosted Network is already started,
/// or only for the next time when the Hosted Network is started. After the Hosted Network is stopped, this secondary security key
/// will never be used again and will be removed from the system.
/// </para>
/// <para>
/// If there is no secondary security key currently configured, the returned value pointed to by the pdwKeyLength parameter will be
/// zero, and the value returned in the ppucKeyData parameter will be <c>NULL</c>. In such case, the value returned in the
/// pbIsPassPhrase and pbPersistent parameters will be meaningless.
/// </para>
/// <para>
/// If the <c>WlanHostedNetworkQuerySecondaryKey</c> function succeeds, the memory used for the buffer in the ppucKeyData parameter
/// that is returned should be freed after use by calling the WlanFreeMemory function.
/// </para>
/// <para>
/// Any user can call the <c>WlanHostedNetworkQuerySecondaryKey</c> function to query the secondary security key used in the Hosted
/// Network. However, the ability to enable the wireless Hosted Network may be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkquerysecondarykey DWORD
// WlanHostedNetworkQuerySecondaryKey( HANDLE hClientHandle, PDWORD pdwKeyLength, PUCHAR *ppucKeyData, PBOOL pbIsPassPhrase, PBOOL
// pbPersistent, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "5989977a-7a2f-43b8-a958-058db01fd24f")]
public static extern Win32Error WlanHostedNetworkQuerySecondaryKey(HWLANSESSION hClientHandle, out uint pdwKeyLength, out SafeHWLANMEM ppucKeyData,
[MarshalAs(UnmanagedType.Bool)] out bool pbIsPassPhrase, [MarshalAs(UnmanagedType.Bool)] out bool pbPersistent, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>The <c>WlanHostedNetworkQueryStatus</c> function queries the current status of the wireless Hosted Network.</summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="ppWlanHostedNetworkStatus">
/// <para>On input, this parameter must be <c>NULL</c>.</para>
/// <para>
/// On output, this parameter receives a pointer to the current status of the wireless Hosted Network, if the call to the
/// <c>WlanHostedNetworkQueryStatus</c> function succeeds. The current status is returned in a WLAN_HOSTED_NETWORK_STATUS structure.
/// </para>
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This can occur if the wireless Hosted Network was
/// in the process of shutting down.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkQueryStatus</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkQueryStatus</c> function to query the current status of the wireless Hosted
/// Network. This function does not change the state of the wireless Hosted Network.
/// </para>
/// <para>
/// If the function succeeds, the ppWlanHostedNetworkStatus parameter points to a WLAN_HOSTED_NETWORK_STATUS structure with the
/// current status. The memory used for the <c>WLAN_HOSTED_NETWORK_STATUS</c> structure that is returned should be freed after use
/// by calling the WlanFreeMemory function.
/// </para>
/// <para>
/// Any user can call the <c>WlanHostedNetworkQueryStatus</c> function to query the Hosted Network. However, the ability to enable
/// the wireless Hosted Network may be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkquerystatus DWORD
// WlanHostedNetworkQueryStatus( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "896cff65-74ec-41d5-89e3-95fa85fd54cd")]
public static extern Win32Error WlanHostedNetworkQueryStatus(HWLANSESSION hClientHandle,
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(WlanMarshaler<WLAN_HOSTED_NETWORK_STATUS>))] out WLAN_HOSTED_NETWORK_STATUS ppWlanHostedNetworkStatus,
IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanHostedNetworkRefreshSecuritySettings</c> function refreshes the configurable and auto-generated parts of the wireless
/// Hosted Network security settings.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason, if the call to the
/// <c>WlanHostedNetworkRefreshSecuritySettings</c> function fails. Possible values for the failure reason are from the
/// WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>The resource is not in the correct state to perform the requested operation.</term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkRefreshSecuritySettings</c> function is an extension to native wireless APIs added to support the
/// wireless Hosted Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkRefreshSecuritySettings</c> function to force a refresh of the configurable
/// and auto-generated parts of the security settings (the primary key) on the wireless Hosted Network.
/// </para>
/// <para>
/// An application might call the <c>WlanHostedNetworkRefreshSecuritySettings</c> function after ensuring that the user accepts the
/// impact of updating the security settings. In order to succeed, this function must persist the new settings which would require
/// that Hosted Network state be transitioned to wlan_hosted_network_idle if it was currently running (wlan_hosted_network_active).
/// </para>
/// <para>
/// <c>Note</c> Any network clients (PCs or devices) on the wireless Hosted Network would have to be re-configured after calling the
/// <c>WlanHostedNetworkRefreshSecuritySettings</c> function if their continued usage is a goal. An application would typically call
/// this function in situations where the user feels that the security of the previous primary key used for security by the wireless
/// Hosted Network has been violated. Note that the <c>WlanHostedNetworkRefreshSecuritySettings</c> function does not change or
/// reset the secondary key.
/// </para>
/// <para>
/// Any Hosted Network state change caused by this function would not be automatically undone if the calling application closes its
/// calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// Any user can call the <c>WlanHostedNetworkRefreshSecuritySettings</c> function to refresh the security settings on the Hosted
/// Network. However, the ability to enable the wireless Hosted Network may be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkrefreshsecuritysettings DWORD
// WlanHostedNetworkRefreshSecuritySettings( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "9589e3a6-6e7a-4186-bfd0-a942a39ecafb")]
public static extern Win32Error WlanHostedNetworkRefreshSecuritySettings(HWLANSESSION hClientHandle, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>The <c>WlanHostedNetworkSetProperty</c> function sets static properties of the wireless Hosted Network.</summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="OpCode">
/// <para>
/// The identifier for the property to be set. This identifier can only be the following values in the WLAN_HOSTED_NETWORK_OPCODE
/// enumeration defined in the Wlanapi.h header file:
/// </para>
/// <para>)</para>
/// <para>)</para>
/// </param>
/// <param name="dwDataSize">A value that specifies the size, in bytes, of the buffer pointed to by the pvData parameter.</param>
/// <param name="pvData">
/// A pointer to a buffer with the static property to set. The data type associated with this buffer depends upon the value of
/// OpCode parameter.
/// </param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason, if the call to the <c>WlanHostedNetworkSetProperty</c> function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions. This error is also returned if the OpCode parameter was
/// wlan_hosted_network_opcode_enable and the wireless Hosted Network is disabled by group policy on a domain.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_BAD_PROFILE</term>
/// <term>The network connection profile used by the wireless Hosted Network is corrupted.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This can occur if the wireless Hosted Network was
/// in the process of shutting down.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// The request is not supported. This error is returned if the application calls the WlanHostedNetworkSetProperty function with the
/// OpCode parameter set to wlan_hosted_network_opcode_station_profile or wlan_hosted_network_opcode_security_settings.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkSetProperty</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkSetProperty</c> function to set the current static properties of the wireless
/// Hosted Network. Any Hosted Network property change caused by this function would not be automatically undone if the calling
/// application closes its calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// The data type associated with the buffer pointed to by the pvData parameter depends upon the value of OpCode parameter as follows:
/// </para>
/// <list type="table">
/// <listheader>
/// <term>OpCode</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>wlan_hosted_network_opcode_connection_settings</term>
/// <term>A pointer to a WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS structure is passed in the pvData parameter.</term>
/// </item>
/// <item>
/// <term>wlan_hosted_network_opcode_enable</term>
/// <term>A pointer to BOOL is passed in the pvData parameter.</term>
/// </item>
/// </list>
/// <para>
/// If the <c>WlanHostedNetworkSetProperty</c> function is called with the OpCode parameter set to
/// <c>wlan_hosted_network_opcode_enable</c>, the user must have the appropriate associated privilege. Permissions are stored in a
/// discretionary access control list (DACL) associated with a WLAN_SECURABLE_OBJECT. To call the
/// <c>WlanHostedNetworkSetProperty</c> function with the OpCode parameter of <c>wlan_hosted_network_opcode_enable</c>, the client
/// access token of the caller must have elevated privileges exposed by the following enumeration in <c>WLAN_SECURABLE_OBJECT</c>:
/// </para>
/// <list type="bullet">
/// <item>
/// <term><c>wlan_secure_hosted_network_elevated_access</c></term>
/// </item>
/// </list>
/// <para>
/// If the <c>WlanHostedNetworkSetProperty</c> function is passed any of the following values in the OpCode parameter, the function
/// will fail with <c>ERROR_NOT_SUPPORTED</c>:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>wlan_hosted_network_opcode_station_profile</term>
/// </item>
/// <item>
/// <term>wlan_hosted_network_opcode_connection_settings</term>
/// </item>
/// </list>
/// <para>
/// In order to succeed, the <c>WlanHostedNetworkSetProperty</c> function must persist the new settings which requires that the
/// Hosted Network state be transitioned to <c>wlan_hosted_network_idle</c> if it was currently running (wlan_hosted_network_active).
/// </para>
/// <para>
/// Any user can call this function to set the Hosted Network properties. However, to set the
/// <c>wlan_hosted_network_opcode_enable</c> flag requires elevated privileges. The ability to enable the wireless Hosted Network
/// may also be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworksetproperty DWORD
// WlanHostedNetworkSetProperty( HANDLE hClientHandle, WLAN_HOSTED_NETWORK_OPCODE OpCode, DWORD dwDataSize, PVOID pvData,
// PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "88139383-f5d5-4e42-b41e-ea754a89356d")]
public static extern Win32Error WlanHostedNetworkSetProperty(HWLANSESSION hClientHandle, WLAN_HOSTED_NETWORK_OPCODE OpCode, uint dwDataSize, [In] IntPtr pvData, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanHostedNetworkSetSecondaryKey</c> function configures the secondary security key that will be used by the wireless
/// Hosted Network.
/// </summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="dwKeyLength">
/// The number of valid data bytes in the key data array pointed to by the pucKeyData parameter. This key length should include the
/// terminating \0 if the key is a passphrase.
/// </param>
/// <param name="pucKeyData">
/// A pointer to a buffer that contains the key data. The number of valid data bytes in the buffer must be at least the value
/// specified in dwKeyLength parameter.
/// </param>
/// <param name="bIsPassPhrase">
/// <para>A Boolean value that indicates if the key data array pointed to by the pucKeyData parameter is in passphrase format.</para>
/// <para>
/// If this parameter is <c>TRUE</c>, the key data array is in passphrase format. If this parameter is <c>FALSE</c>, the key data
/// array is not in passphrase format.
/// </para>
/// </param>
/// <param name="bPersistent">
/// <para>
/// A Boolean value that indicates if the key data array pointed to by the pucKeyData parameter is to be stored and reused later or
/// is for one-time use only.
/// </para>
/// <para>
/// If this parameter is <c>TRUE</c>, the key data array is to be stored and reused later. If this parameter is <c>FALSE</c>, the
/// key data array is to be used for one session (either the current session or the next session if the Hosted Network is not started).
/// </para>
/// </param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason, if the call to the <c>WlanHostedNetworkSetSecondaryKey</c>
/// function fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the
/// Wlanapi.h header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This can occur if the wireless Hosted Network was
/// in the process of shutting down.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkSetSecondaryKey</c> function is an extension to native wireless APIs added to support the wireless
/// Hosted Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkSetSecondaryKey</c> function to configure the secondary security key that
/// will be used by the wireless Hosted Network. Any Hosted Network change caused by this function would not be automatically undone
/// if the calling application closes its calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the
/// process ends.
/// </para>
/// <para>
/// Once started, the wireless Hosted Network will allow wireless peers to associate with this secondary security key in addition to
/// the primary security key. The secondary security key is always specified by the user as needed, while the primary security key
/// is generated by the operating system with greater security strength.
/// </para>
/// <para>
/// The secondary security key passed in the buffer pointed to by the pucKeyData parameter is used with WPA2-Personal authentication
/// and should be in one of the following formats:
/// </para>
/// <list type="bullet">
/// <item>
/// <term>
/// A key passphrase that consists of an array of ASCII characters from 8 to 63 characters. The dwKeyLength parameter should include
/// the terminating \0 in the passphrase. The value of the dwKeyLength parameter should be in the range of 9 to 64.
/// </term>
/// </item>
/// <item>
/// <term>A binary key that consists of 32 bytes of binary key data. The dwKeyLength parameter should be 32 for binary key.</term>
/// </item>
/// </list>
/// <para>
/// To configure a valid secondary security key, the dwKeyLength parameter should be in the correct range and the pucKeyData
/// parameter should point to a valid memory buffer containing the specified bytes of data. To remove the currently configured
/// secondary security key from the system, the application should call the <c>WlanHostedNetworkSetSecondaryKey</c> function with
/// zero in dwKeyLength parameter and <c>NULL</c> in the pucKeyData parameter.
/// </para>
/// <para>
/// The <c>WlanHostedNetworkSetSecondaryKey</c> function will return <c>ERROR_INVALID_PARAMETER</c> if the pucKeyData parameter is
/// <c>NULL</c>, but the dwKeyLength parameter is not zero. The <c>WlanHostedNetworkSetSecondaryKey</c> function will also return
/// <c>ERROR_INVALID_PARAMETER</c> if the dwKeyLength parameter is zero, but pucKeyData parameter is not <c>NULL</c>.
/// </para>
/// <para>
/// The secondary security key is usually set before the wireless Hosted Network is started. Then it will be used the next time when
/// the Hosted Network is started.
/// </para>
/// <para>
/// A secondary security key can also be set after the Hosted Network has been started. In this case, the secondary security key
/// will be used immediately. Any clients using the previous secondary security key will remain connected, but they will be unable
/// to reconnect if they get disconnected for any reason or if the wireless Hosted Network is restarted.
/// </para>
/// <para>
/// The secondary security key can be specified as persistent if the bPersistent parameter is set to <c>TRUE</c>. When specified as
/// persistent, the secondary security key would be used immediately if the Hosted Network is already started, and also reused
/// whenever Hosted Network is started in the future.
/// </para>
/// <para>
/// If secondary security key is not specified as persistent, it will be used immediately if the Hosted Network is already started,
/// or only for the next time when Hosted Network is started. After the Hosted Network is stopped, this secondary security key will
/// never be used again and will be removed from the system.
/// </para>
/// <para>
/// Any user can call this function to configure the secondary security key to be used in the Hosted Network. However, the ability
/// to enable the wireless Hosted Network may be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworksetsecondarykey DWORD
// WlanHostedNetworkSetSecondaryKey( HANDLE hClientHandle, DWORD dwKeyLength, PUCHAR pucKeyData, BOOL bIsPassPhrase, BOOL
// bPersistent, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "385148fd-b5cd-4221-be25-077f484e93e9")]
public static extern Win32Error WlanHostedNetworkSetSecondaryKey(HWLANSESSION hClientHandle, uint dwKeyLength, [In] IntPtr pucKeyData, [MarshalAs(UnmanagedType.Bool)] bool bIsPassPhrase,
[MarshalAs(UnmanagedType.Bool)] bool bPersistent, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>The <c>WlanHostedNetworkStartUsing</c> function starts the wireless Hosted Network.</summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason, if the call to the <c>WlanHostedNetworkStartUsing</c> function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This error is returned if the wireless Hosted
/// Network is disabled by group policy on a domain.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkStartUsing</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanHostedNetworkStartUsing</c> function to start the wireless Hosted Network. Successful
/// calls must be matched by calls to WlanHostedNetworkStopUsing function. This call could fail if Hosted Network state is <c>wlan_hosted_network_unavailable</c>.
/// </para>
/// <para>
/// Any Hosted Network state change caused by this function would be automatically undone if the calling application closes its
/// calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// Any user can call the <c>WlanHostedNetworkStartUsing</c> function to start the Hosted Network. However, the ability to enable
/// the wireless Hosted Network may be restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkstartusing DWORD
// WlanHostedNetworkStartUsing( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "923ffc09-f378-442c-a891-34b0c0d04c41")]
public static extern Win32Error WlanHostedNetworkStartUsing(HWLANSESSION hClientHandle, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>The <c>WlanHostedNetworkStopUsing</c> function stops the wireless Hosted Network.</summary>
/// <param name="hClientHandle">The client's session handle, returned by a previous call to the WlanOpenHandle function.</param>
/// <param name="pFailReason">
/// An optional pointer to a value that receives the failure reason if the call to the <c>WlanHostedNetworkStopUsing</c> function
/// fails. Possible values for the failure reason are from the WLAN_HOSTED_NETWORK_REASON enumeration type defined in the Wlanapi.h
/// header file.
/// </param>
/// <param name="pvReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This can occur if the wireless Hosted Network was
/// in the process of shutting down.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanHostedNetworkStopUsing</c> function is an extension to native wireless APIs added to support the wireless Hosted
/// Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// An application calls the <c>WlanHostedNetworkStopUsing</c> function to stop the Hosted Network. A application calls the
/// <c>WlanHostedNetworkStopUsing</c> function to match earlier successful calls to the WlanHostedNetworkStartUsing function. The
/// wireless Hosted Network will remain active until all applications have called the <c>WlanHostedNetworkStopUsing</c> function or
/// the WlanHostedNetworkForceStop function is called to force a stop. When the wireless Hosted Network has stopped, the state
/// switches to <c>wlan_hosted_network_idle</c>. This call could also fail if the Hosted Network state changed because of external
/// events (for example, if the miniport driver for the wireless interface card becomes unavailable).
/// </para>
/// <para>
/// Any user can call this function to stop the Hosted Network. However, the ability to enable the wireless Hosted Network may be
/// restricted by group policy in a domain.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanhostednetworkstopusing DWORD
// WlanHostedNetworkStopUsing( HANDLE hClientHandle, PWLAN_HOSTED_NETWORK_REASON pFailReason, PVOID pvReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "36b5ed93-33c4-4ade-a6d9-0d240854a5ef")]
public static extern Win32Error WlanHostedNetworkStopUsing(HWLANSESSION hClientHandle, out WLAN_HOSTED_NETWORK_REASON pFailReason, IntPtr pvReserved = default);
/// <summary>
/// The <c>WlanIhvControl</c> function provides a mechanism for independent hardware vendor (IHV) control of WLAN drivers or services.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="Type">A WLAN_IHV_CONTROL_TYPE structure that specifies the type of software bypassed by the IHV control function.</param>
/// <param name="dwInBufferSize">The size, in bytes, of the input buffer.</param>
/// <param name="pInBuffer">A generic buffer for driver or service interface input.</param>
/// <param name="dwOutBufferSize">The size, in bytes, of the output buffer.</param>
/// <param name="pOutBuffer">A generic buffer for driver or service interface output.</param>
/// <param name="pdwBytesReturned">The number of bytes returned.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to perform this operation. When called, WlanIhvControl retrieves the
/// discretionary access control list (DACL) stored with the wlan_secure_ihv_control object. If the DACL does not contain an access
/// control entry (ACE) that grants WLAN_WRITE_ACCESS permission to the access token of the calling thread, then WlanIhvControl
/// returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pInterfaceGuid is NULL, or pdwBytesReturned is NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanihvcontrol DWORD WlanIhvControl( HANDLE hClientHandle,
// const GUID *pInterfaceGuid, WLAN_IHV_CONTROL_TYPE Type, DWORD dwInBufferSize, PVOID pInBuffer, DWORD dwOutBufferSize, PVOID
// pOutBuffer, PDWORD pdwBytesReturned );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "3fc32119-0f92-4939-8125-812f45584d45")]
public static extern Win32Error WlanIhvControl(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, WLAN_IHV_CONTROL_TYPE Type, uint dwInBufferSize,
[In] IntPtr pInBuffer, uint dwOutBufferSize, [In, Out] IntPtr pOutBuffer, out uint pdwBytesReturned);
/// <summary>The <c>WlanOpenHandle</c> function opens a connection to the server.</summary>
/// <param name="dwClientVersion">
/// <para>The highest version of the WLAN API that the client supports.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>1</term>
/// <term>Client version for Windows XP with SP3 and Wireless LAN API for Windows XP with SP2.</term>
/// </item>
/// <item>
/// <term>2</term>
/// <term>Client version for Windows Vista and Windows Server 2008</term>
/// </item>
/// </list>
/// </param>
/// <returns>A handle for the client to use in this session. This handle is used by other functions throughout the session.</returns>
/// <remarks>
/// <para>
/// The version number specified by dwClientVersion and pdwNegotiatedVersion is a composite version number made up of both major and
/// minor versions. The major version is specified by the low-order word, and the minor version is specified by the high-order word.
/// The macros and return the major and minor version numbers respectively. You can construct a version number using the macro .
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c><c>WlanOpenHandle</c> will return an error message if
/// the Wireless Zero Configuration (WZC) service has not been started or if the WZC service is not responsive.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanopenhandle DWORD WlanOpenHandle( DWORD dwClientVersion,
// PVOID pReserved, PDWORD pdwNegotiatedVersion, PHANDLE phClientHandle );
[PInvokeData("wlanapi.h", MSDNShortId = "27bfa0c1-4443-47a4-a374-326f553fa3bb")]
public static SafeHWLANSESSION WlanOpenHandle(uint dwClientVersion = 2) => WlanOpenHandle(dwClientVersion, default, out _, out var h).Succeeded ? h : new SafeHWLANSESSION(default);
/// <summary>The <c>WlanOpenHandle</c> function opens a connection to the server.</summary>
/// <param name="dwClientVersion">
/// <para>The highest version of the WLAN API that the client supports.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>1</term>
/// <term>Client version for Windows XP with SP3 and Wireless LAN API for Windows XP with SP2.</term>
/// </item>
/// <item>
/// <term>2</term>
/// <term>Client version for Windows Vista and Windows Server 2008</term>
/// </item>
/// </list>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pdwNegotiatedVersion">
/// The version of the WLAN API that will be used in this session. This value is usually the highest version supported by both the
/// client and server.
/// </param>
/// <param name="phClientHandle">
/// A handle for the client to use in this session. This handle is used by other functions throughout the session.
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>pdwNegotiatedVersion is NULL, phClientHandle is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Failed to allocate memory to create the client context.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_REMOTE_SESSION_LIMIT_EXCEEDED</term>
/// <term>Too many handles have been issued by the server.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The version number specified by dwClientVersion and pdwNegotiatedVersion is a composite version number made up of both major and
/// minor versions. The major version is specified by the low-order word, and the minor version is specified by the high-order word.
/// The macros and return the major and minor version numbers respectively. You can construct a version number using the macro .
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c><c>WlanOpenHandle</c> will return an error message if
/// the Wireless Zero Configuration (WZC) service has not been started or if the WZC service is not responsive.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanopenhandle DWORD WlanOpenHandle( DWORD dwClientVersion,
// PVOID pReserved, PDWORD pdwNegotiatedVersion, PHANDLE phClientHandle );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "27bfa0c1-4443-47a4-a374-326f553fa3bb")]
public static extern Win32Error WlanOpenHandle(uint dwClientVersion, [Optional] IntPtr pReserved, out uint pdwNegotiatedVersion, out SafeHWLANSESSION phClientHandle);
/// <summary>The <c>WlanQueryAutoConfigParameter</c> function queries for the parameters of the auto configuration service.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="OpCode">
/// <para>A value that specifies the configuration parameter to be queried.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>wlan_autoconf_opcode_show_denied_networks</term>
/// <term>
/// When set, the ppData parameter will contain a BOOL value indicating whether user and group policy-denied networks will be
/// included in the available networks list. If the function returns ERROR_SUCCESS and ppData points to TRUE, then user and group
/// policy-denied networks will be included in the available networks list; if FALSE, user and group policy-denied networks will not
/// be included in the available networks list.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_power_setting</term>
/// <term>When set, the ppData parameter will contain a WLAN_POWER_SETTING value specifying the power settings.</term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_only_use_gp_profiles_for_allowed_networks</term>
/// <term>
/// When set, the ppData parameter will contain a BOOL value indicating whether profiles not created by group policy can be used to
/// connect to an allowed network with a matching group policy profile. If the function returns ERROR_SUCCESS and ppData points to
/// TRUE, then only profiles created by group policy can be used; if FALSE, any profile can be used.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_allow_explicit_creds</term>
/// <term>
/// When set, the ppData parameter will contain a BOOL value indicating whether the current wireless interface has shared user
/// credentials allowed. If the function returns ERROR_SUCCESS and ppData points to TRUE, then the current wireless interface has
/// shared user credentials allowed; if FALSE, the current wireless interface does not allow shared user credentials.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_block_period</term>
/// <term>
/// When set, the ppData parameter will contain a DWORD value that indicates the blocked period setting for the current wireless
/// interface. The blocked period is the amount of time, in seconds, for which automatic connection to a wireless network will not
/// be attempted after a previous failure.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_allow_virtual_station_extensibility</term>
/// <term>
/// When set, the ppData parameter will contain a BOOL value indicating whether extensibility on a virtual station is allowed. By
/// default, extensibility on a virtual station is allowed. The value for this opcode is persisted across restarts. If the function
/// returns ERROR_SUCCESS and ppData points to TRUE, then extensibility on a virtual station is allowed; if FALSE, extensibility on
/// a virtual station is not allowed.
/// </term>
/// </item>
/// </list>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pdwDataSize">Specifies the size of the ppData parameter, in bytes.</param>
/// <param name="ppData">
/// <para>Pointer to the memory that contains the queried value for the parameter specified in OpCode.</para>
/// <para>
/// <c>Note</c> If OpCode is set to <c>wlan_autoconf_opcode_show_denied_networks</c>, then the pointer referenced by ppData may
/// point to an integer value. If the pointer referenced by ppData points to 0, then the integer value should be converted to the
/// boolean value <c>FALSE</c>. If the pointer referenced by ppData points to a nonzero integer, then the integer value should be
/// converted to the boolean value <c>TRUE</c>.
/// </para>
/// </param>
/// <param name="pWlanOpcodeValueType">A WLAN_OPCODE_VALUE_TYPE value.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to get configuration parameters. When called with OpCode set to
/// wlan_autoconf_opcode_show_denied_networks, WlanQueryAutoConfigParameter retrieves the discretionary access control list (DACL)
/// stored with the wlan_secure_show_denied object. If the DACL does not contain an access control entry (ACE) that grants
/// WLAN_READ_ACCESS permission to the access token of the calling thread, then WlanQueryAutoConfigParameter returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pReserved is not NULL, ppData is NULL, or pdwDataSize is NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// The <c>WlanQueryAutoConfigParameter</c> function queries for the parameters used by Auto Configuration Module (ACM), the
/// wireless configuration component supported on Windows Vista and later.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanqueryautoconfigparameter DWORD
// WlanQueryAutoConfigParameter( HANDLE hClientHandle, WLAN_AUTOCONF_OPCODE OpCode, PVOID pReserved, PDWORD pdwDataSize, PVOID
// *ppData, PWLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "30fcfcf1-0784-4f20-b8c7-311227d0cfca")]
public static extern Win32Error WlanQueryAutoConfigParameter(HWLANSESSION hClientHandle, WLAN_AUTOCONF_OPCODE OpCode, [Optional] IntPtr pReserved,
out uint pdwDataSize, out SafeHWLANMEM ppData, out WLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType);
/// <summary>The <c>WlanQueryInterface</c> function queries various parameters of a specified interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface to be queried.</param>
/// <param name="OpCode">
/// <para>
/// A WLAN_INTF_OPCODE value that specifies the parameter to be queried. The following table lists the valid constants along with
/// the data type of the parameter in ppData.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>WLAN_INTF_OPCODE value</term>
/// <term>ppData data type</term>
/// </listheader>
/// <item>
/// <term>wlan_intf_opcode_autoconf_enabled</term>
/// <term>BOOL</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_background_scan_enabled</term>
/// <term>BOOL</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_radio_state</term>
/// <term>WLAN_RADIO_STATE</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_bss_type</term>
/// <term>DOT11_BSS_TYPE</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_interface_state</term>
/// <term>WLAN_INTERFACE_STATE</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_current_connection</term>
/// <term>WLAN_CONNECTION_ATTRIBUTES</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_channel_number</term>
/// <term>ULONG</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_supported_infrastructure_auth_cipher_pairs</term>
/// <term>WLAN_AUTH_CIPHER_PAIR_LIST</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_supported_adhoc_auth_cipher_pairs</term>
/// <term>WLAN_AUTH_CIPHER_PAIR_LIST</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_supported_country_or_region_string_list</term>
/// <term>WLAN_COUNTRY_OR_REGION_STRING_LIST</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_media_streaming_mode</term>
/// <term>BOOL</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_statistics</term>
/// <term>WLAN_STATISTICS</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_rssi</term>
/// <term>LONG</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_current_operation_mode</term>
/// <term>ULONG</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_supported_safe_mode</term>
/// <term>BOOL</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_certified_safe_mode</term>
/// <term>BOOL</term>
/// </item>
/// </list>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Only the <c>wlan_intf_opcode_autoconf_enabled</c>,
/// <c>wlan_intf_opcode_bss_type</c>, <c>wlan_intf_opcode_interface_state</c>, and <c>wlan_intf_opcode_current_connection</c>
/// constants are valid.
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pdwDataSize">The size of the ppData parameter, in bytes.</param>
/// <param name="ppData">
/// <para>Pointer to the memory location that contains the queried value of the parameter specified by the OpCode parameter.</para>
/// <para>
/// <c>Note</c> If OpCode is set to <c>wlan_intf_opcode_autoconf_enabled</c>, <c>wlan_intf_opcode_background_scan_enabled</c>, or
/// <c>wlan_intf_opcode_media_streaming_mode</c>, then the pointer referenced by ppData may point to an integer value. If the
/// pointer referenced by ppData points to 0, then the integer value should be converted to the boolean value <c>FALSE</c>. If the
/// pointer referenced by ppData points to a nonzero integer, then the integer value should be converted to the boolean value <c>TRUE</c>.
/// </para>
/// </param>
/// <param name="pWlanOpcodeValueType">
/// If passed a non- <c>NULL</c> value, points to a WLAN_OPCODE_VALUE_TYPE value that specifies the type of opcode returned. This
/// parameter may be <c>NULL</c>.
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// </returns>
/// <remarks>
/// <para>The caller is responsible for using WlanFreeMemory to free the memory allocated for ppData.</para>
/// <para>
/// When OpCode is set to <c>wlan_intf_opcode_current_operation_mode</c>, <c>WlanQueryInterface</c> queries the current operation
/// mode of the wireless interface. For more information about operation modes, see Native 802.11 Operation Modes. Two operation
/// modes are supported: <c>DOT11_OPERATION_MODE_EXTENSIBLE_STATION</c> and <c>DOT11_OPERATION_MODE_NETWORK_MONITOR</c>. The
/// operation mode constants are defined in the header file Windot11.h. ppData will point to one of these two values.
/// </para>
/// <para>Examples</para>
/// <para>
/// The following example enumerates the wireless LAN interfaces on the local computer, queries each interface for the
/// WLAN_CONNECTION_ATTRIBUTES on the interface, and prints values from the retrieved <c>WLAN_CONNECTION_ATTRIBUTES</c> structure.
/// </para>
/// <para>For another example using the <c>WlanQueryInterface</c> function, see the WLAN_RADIO_STATE structure.</para>
/// <para>
/// <c>Note</c> This example will fail to load on Windows Server 2008 and Windows Server 2008 R2 if the Wireless LAN Service is not
/// installed and started.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanqueryinterface DWORD WlanQueryInterface( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, WLAN_INTF_OPCODE OpCode, PVOID pReserved, PDWORD pdwDataSize, PVOID *ppData,
// PWLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "e20eb9a3-5824-48ee-b13e-b0252bbf495e")]
public static extern Win32Error WlanQueryInterface(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, WLAN_INTF_OPCODE OpCode, [Optional] IntPtr pReserved,
out uint pdwDataSize, out SafeHWLANMEM ppData, out WLAN_OPCODE_VALUE_TYPE pWlanOpcodeValueType);
/// <summary>The <c>WlanReasonCodeToString</c> function retrieves a string that describes a specified reason code.</summary>
/// <param name="dwReasonCode">A WLAN_REASON_CODE value of which the string description is requested.</param>
/// <param name="dwBufferSize">
/// The size of the buffer used to store the string, in <c>WCHAR</c>. If the reason code string is longer than the buffer, it will
/// be truncated and NULL-terminated. If dwBufferSize is larger than the actual amount of memory allocated to pStringBuffer, then an
/// access violation will occur in the calling program.
/// </param>
/// <param name="pStringBuffer">
/// Pointer to a buffer that will receive the string. The caller must allocate memory to pStringBuffer before calling <c>WlanReasonCodeToString</c>.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is a pointer to a constant string.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanreasoncodetostring DWORD WlanReasonCodeToString( DWORD
// dwReasonCode, DWORD dwBufferSize, PWCHAR pStringBuffer, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "2a02e2d2-91d0-4b54-ad02-a76442edcff8")]
public static extern Win32Error WlanReasonCodeToString(WLAN_REASON_CODE dwReasonCode, uint dwBufferSize, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder pStringBuffer, IntPtr pReserved = default);
/// <summary>
/// Allows user mode clients with admin privileges, or User-Mode Driver Framework (UMDF) drivers, to register for unsolicited
/// notifications corresponding to device services that they're interested in.
/// </summary>
/// <param name="hClientHandle">
/// <para>Type: <c>HANDLE</c></para>
/// <para>The client's session handle, obtained by a previous call to the WlanOpenHandle function.</para>
/// </param>
/// <param name="pDevSvcGuidList">
/// <para>Type: <c>CONST PWLAN_DEVICE_SERVICE_GUID_LIST</c></para>
/// <para>
/// An optional pointer to a constant WLAN_DEVICE_SERVICE_GUID_LIST structure representing the device service <c>GUID</c> s for
/// which you're interested in receiving notifications. The dwIndex member of the structure must have a value less than the value of
/// its dwNumberOfItems member; otherwise, an access violation may occur. Every time you call this API, the previous device services
/// list is replaced by the new one.
/// </para>
/// <para>
/// To unregister, set pDevSvcGuidList to , or pass a pointer to a <c>WLAN_DEVICE_SERVICE_GUID_LIST</c> structure that has the
/// member set to 0.
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>HRESULT</c></para>
/// <para>
/// If the function succeeds, the return value is <c>ERROR_SUCCESS</c>. If the function fails with <c>ERROR_ACCESS_DENIED</c>, then
/// the caller doesn't have sufficient permissions to perform this operation. The caller needs to either have admin privilege, or
/// needs to be a UMDF driver.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanRegisterDeviceServiceNotification</c> function is an extension to existing native Wi-Fi APIs for WLAN device services.
/// </para>
/// <para>
/// A client application calls this function to register and unregister notifications for device services that it is interested in.
/// </para>
/// <para>
/// Any registration to receive notifications for device services caused by this function would be automatically undone if the
/// calling application closes its calling handle (by calling WlanCloseHandle with the hClientHandle parameter), or if the process ends.
/// </para>
/// <para>
/// In order to receive these notifications, a client needs to call this function with a valid pDevSvcGuidList parameter, and must
/// also call the WlanRegisterNotification function with a dwNotifSource argument of <c>WLAN_NOTIFICATION_SOURCE_DEVICE_SERVICE</c>
/// (which is defined in ). The registration to receive notifications for device services is in effect until the application closes
/// the client handle (by calling WlanCloseHandle with the hClientHandle parameter), or the process ends, or
/// <c>WlanRegisterDeviceServiceNotification</c> is called with a pDevSvcGuidList argument of , or else has dwNumberOfItems set to 0.
/// </para>
/// <para>
/// When the operating system (OS) receives a device service notification from an independent hardware vendor (IHV) driver, and a
/// client has registered for these notifications using <c>WlanRegisterDeviceServiceNotification</c>, the client will receive them
/// via the WLAN_NOTIFICATION_CALLBACK that it had registered through its call to WlanRegisterNotification. This callback will be
/// called for every notification that the client has received (with a separate buffer for every notification).
/// </para>
/// <para>
/// The NotificationSource member of the WLAN_NOTIFICATION_DATA structure received by the callback function (that is, the data
/// member) will be set to <c>WLAN_NOTIFICATION_SOURCE_DEVICE_SERVICE</c>. The data blob, the device service <c>GUID</c>, and the
/// opcode associated with this notification will be present in the pData member of the <c>WLAN_NOTIFICATION_DATA</c>, which will
/// point to a structure of type WLAN_DEVICE_SERVICE_NOTIFICATION_DATA.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanregisterdeviceservicenotification DWORD
// WlanRegisterDeviceServiceNotification( HANDLE hClientHandle, const PWLAN_DEVICE_SERVICE_GUID_LIST pDevSvcGuidList );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h")]
public static extern Win32Error WlanRegisterDeviceServiceNotification(HWLANSESSION hClientHandle, [Optional] WLAN_DEVICE_SERVICE_GUID_LIST pDevSvcGuidList);
/// <summary>The <c>WlanRegisterNotification</c> function is used to register and unregister notifications on all wireless interfaces.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="dwNotifSource">
/// <para>
/// The notification sources to be registered. These flags may be combined. When this parameter is set to
/// <c>WLAN_NOTIFICATION_SOURCE_NONE</c>, <c>WlanRegisterNotification</c> unregisters notifications on all wireless interfaces.
/// </para>
/// <para>The possible values for this parameter are defined in the Wlanapi.h and L2cmn.h header files.</para>
/// <para>The following table shows possible values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_NONE</term>
/// <term>Unregisters notifications.</term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_ALL</term>
/// <term>
/// Registers for all notifications available on the version of the operating system, including those generated by the 802.1X
/// module. For Windows XP with SP3 and Wireless LAN API for Windows XP with SP2, setting dwNotifSource to
/// WLAN_NOTIFICATION_SOURCE_ALL is functionally equivalent to setting dwNotifSource to WLAN_NOTIFICATION_SOURCE_ACM.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_ACM</term>
/// <term>
/// Registers for notifications generated by the auto configuration module. Windows XP with SP3 and Wireless LAN API for Windows XP
/// with SP2: Only the wlan_notification_acm_connection_complete and wlan_notification_acm_disconnected notifications are available.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_HNWK</term>
/// <term>
/// Registers for notifications generated by the wireless Hosted Network. This notification source is available on Windows 7 and on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_ONEX</term>
/// <term>Registers for notifications generated by 802.1X.</term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_MSM</term>
/// <term>
/// Registers for notifications generated by MSM. Windows XP with SP3 and Wireless LAN API for Windows XP with SP2: This value is
/// not supported.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_SECURITY</term>
/// <term>
/// Registers for notifications generated by the security module. No notifications are currently defined for
/// WLAN_NOTIFICATION_SOURCE_SECURITY. Windows XP with SP3 and Wireless LAN API for Windows XP with SP2: This value is not supported.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_IHV</term>
/// <term>
/// Registers for notifications generated by independent hardware vendors (IHV). Windows XP with SP3 and Wireless LAN API for
/// Windows XP with SP2: This value is not supported.
/// </term>
/// </item>
/// <item>
/// <term>WLAN_NOTIFICATION_SOURCE_IHV</term>
/// <term>Registers for notifications generated by device services.</term>
/// </item>
/// </list>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> This parameter must be set to
/// WLAN_NOTIFICATION_SOURCE_NONE, WLAN_NOTIFICATION_SOURCE_ALL, or WLAN_NOTIFICATION_SOURCE_ACM.
/// </para>
/// </param>
/// <param name="bIgnoreDuplicate">
/// <para>
/// Specifies whether duplicate notifications will be ignored. If set to <c>TRUE</c>, a notification will not be sent to the client
/// if it is identical to the previous one.
/// </para>
/// <para><c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> This parameter is ignored.</para>
/// </param>
/// <param name="funcCallback">
/// <para>A WLAN_NOTIFICATION_CALLBACK type that defines the type of notification callback function.</para>
/// <para>
/// This parameter can be <c>NULL</c> if the dwNotifSource parameter is set to <c>WLAN_NOTIFICATION_SOURCE_NONE</c> to unregister
/// notifications on all wireless interfaces,
/// </para>
/// </param>
/// <param name="pCallbackContext">A pointer to the client context that will be passed to the callback function with the notification.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pdwPrevNotifSource">A pointer to the previously registered notification sources.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if hClientHandle is NULL or not valid or if pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Failed to allocate memory for the query results.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanRegisterNotification</c> is used by an application to register and unregister notifications on all wireless
/// interfaces. When registering for notifications, an application must provide a callback function pointed to by the funcCallback
/// parameter. The prototype for this callback function is the WLAN_NOTIFICATION_CALLBACK. This callback function will receive
/// notifications that have been registered for in the dwNotifSource parameter passed to the <c>WlanRegisterNotification</c>
/// function. The callback function is called with a pointer to a WLAN_NOTIFICATION_DATA structure as the first parameter that
/// contains detailed information on the notification. The callback function also receives a second parameter that contains a
/// pointer to the client context passed in the pCallbackContext parameter to the <c>WlanRegisterNotification</c> function.
/// </para>
/// <para>
/// The <c>WlanRegisterNotification</c> function will return an error if dwNotifSource is a value other than
/// <c>WLAN_NOTIFICATION_SOURCE_NONE</c> and the client fails to provide a callback function.
/// </para>
/// <para>
/// Once registered, the callback function will be called whenever a notification is available until the client unregisters or
/// closes the handle.
/// </para>
/// <para>
/// Any registration to receive notifications caused by this function would be automatically undone if the calling application
/// closes its calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// Do not call <c>WlanRegisterNotification</c> from a callback function. If the client is in the middle of a notification callback
/// when <c>WlanRegisterNotification</c> is called with dwNotifSource set to <c>WLAN_NOTIFICATION_SOURCE_NONE</c> (that is, when the
/// client is unregistering from notifications), <c>WlanRegisterNotification</c> will wait for the callback to finish before
/// returning a value. Calling this function inside a callback function will result in the call never completing. If both the
/// callback function and the thread that unregisters from notifications try to acquire the same lock, a deadlock may occur. In
/// addition, do not call <c>WlanRegisterNotification</c> from the <c>DllMain</c> function in an application DLL. This could also
/// cause a deadlock.
/// </para>
/// <para>An application can time out and query the current interface state instead of waiting for a notification.</para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Notifications are handled by the Netman service. If the
/// Netman service is disabled or unavailable, notifications will not be received. If a notification is not received within a
/// reasonable period of time, an application should time out and query the current interface state.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanregisternotification DWORD WlanRegisterNotification(
// HANDLE hClientHandle, DWORD dwNotifSource, BOOL bIgnoreDuplicate, WLAN_NOTIFICATION_CALLBACK funcCallback, PVOID
// pCallbackContext, PVOID pReserved, PDWORD pdwPrevNotifSource );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "e24810da-ed3b-41c4-b7b1-290b01e26cd5")]
public static extern Win32Error WlanRegisterNotification(HWLANSESSION hClientHandle, WLAN_NOTIFICATION_SOURCE dwNotifSource, [MarshalAs(UnmanagedType.Bool)] bool bIgnoreDuplicate,
WLAN_NOTIFICATION_CALLBACK funcCallback, [In, Optional] IntPtr pCallbackContext, [In, Optional] IntPtr pReserved, out uint pdwPrevNotifSource);
/// <summary>
/// The <c>WlanRegisterVirtualStationNotification</c> function is used to register and unregister notifications on a virtual station.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="bRegister">A value that specifies whether to receive notifications on a virtual station.</param>
/// <param name="pReserved">Reserved for future use. This parameter must be <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>
/// The resource is not in the correct state to perform the requested operation. This error is returned if the wireless Hosted
/// Network is disabled by group policy on a domain.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This error is returned if the WLAN AutoConfig Service is not running.</term>
/// </item>
/// <item>
/// <term>Other</term>
/// <term>Various RPC and other error codes. Use FormatMessage to obtain the message string for the returned error.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanRegisterVirtualStationNotification</c> function is an extension to native wireless APIs added to support the wireless
/// Hosted Network on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// <para>
/// A client application calls the <c>WlanRegisterVirtualStationNotification</c> function is used to register and unregister
/// notifications on virtual station.
/// </para>
/// <para>
/// Any registration to receive notifications from a virtual station caused by this function would be automatically undone if the
/// calling application closes its calling handle (by calling WlanCloseHandle with the hClientHandle parameter) or if the process ends.
/// </para>
/// <para>
/// By default, a application client will not receive notifications on a virtual station. In order to receive these notifications, a
/// client needs to call the <c>WlanRegisterVirtualStationNotification</c> function with the bRegister parameter set to <c>TRUE</c>
/// and must also call the WlanRegisterNotification function with the dwNotifSource parameter set to notification sources to be
/// registered. The registration to receive notifications from a virtual station is in effect until the application closes the
/// client handle (by calling WlanCloseHandle with the hClientHandle parameter), the process ends, or the
/// <c>WlanRegisterVirtualStationNotification</c> function is called with the bRegister parameter set to <c>FALSE</c>.
/// </para>
/// <para>
/// On Windows 7 and later, the operating system installs a virtual device if a Hosted Network capable wireless adapter is present
/// on the machine. This virtual device normally shows up in the “Network Connections Folder” as Wireless Network Connection 2
/// with a Device Name of Microsoft Virtual WiFi Miniport adapter if the computer has a single wireless network adapter. This
/// virtual device is used exclusively for performing software access point (SoftAP) connections and is not present in the list
/// returned by the WlanEnumInterfaces function. The lifetime of this virtual device is tied to the physical wireless adapter. If
/// the physical wireless adapter is disabled, this virtual device will be removed as well. This feature is also available on
/// Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanregistervirtualstationnotification DWORD
// WlanRegisterVirtualStationNotification( HANDLE hClientHandle, BOOL bRegister, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "b86ac160-ee81-43aa-86bb-cf5d3eeb2234")]
public static extern Win32Error WlanRegisterVirtualStationNotification(HWLANSESSION hClientHandle, [MarshalAs(UnmanagedType.Bool)] bool bRegister, IntPtr pReserved = default);
/// <summary>The <c>WlanRenameProfile</c> function renames the specified profile.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="strOldProfileName">The profile name to be changed.</param>
/// <param name="strNewProfileName">The new name of the profile.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID PARAMETER</term>
/// <term>
/// hClientHandle is NULL or not valid, pInterfaceGuid is NULL, strOldProfileName is NULL, strNewProfileName is NULL, or pReserved
/// is not NULL.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_FOUND</term>
/// <term>The profile specified by strOldProfileName was not found in the profile store.</term>
/// </item>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions to rename the profile.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanrenameprofile DWORD WlanRenameProfile( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strOldProfileName, LPCWSTR strNewProfileName, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "488e9f87-8b98-48c6-81d5-d7237cdf5bd5")]
public static extern Win32Error WlanRenameProfile(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strOldProfileName,
[MarshalAs(UnmanagedType.LPWStr)] string strNewProfileName, IntPtr pReserved = default);
/// <summary>The <c>WlanSaveTemporaryProfile</c> function saves a temporary profile to the profile store.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="strProfileName">The name of the profile to be saved. Profile names are case-sensitive. This string must be NULL-terminated.</param>
/// <param name="strAllUserProfileSecurity">
/// <para>
/// Sets the security descriptor string on the all-user profile. By default, for a new all-user profile, all users have write access
/// on the profile. For more information about profile permissions, see the Remarks section.
/// </para>
/// <para>If dwFlags is set to WLAN_PROFILE_USER, this parameter is ignored.</para>
/// <para>If this parameter is set to <c>NULL</c> for an all-user profile, the default permissions are used.</para>
/// <para>
/// If this parameter is not <c>NULL</c> for an all-user profile, the security descriptor string associated with the profile is
/// created or modified after the security descriptor object is created and parsed as a string.
/// </para>
/// </param>
/// <param name="dwFlags">
/// <para>Specifies the flags to set on the profile. The flags can be combined.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0</term>
/// <term>The profile is an all-user profile.</term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_USER 0x00000002</term>
/// <term>The profile is a per-user profile.</term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_CONNECTION_MODE_SET_BY_CLIENT 0x00010000</term>
/// <term>The profile was created by the client.</term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_CONNECTION_MODE_AUTO 0x00020000</term>
/// <term>The profile was created by the automatic configuration module.</term>
/// </item>
/// </list>
/// </param>
/// <param name="bOverWrite">
/// Specifies whether this profile is overwriting an existing profile. If this parameter is <c>FALSE</c> and the profile already
/// exists, the existing profile will not be overwritten and an error will be returned.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>One of the following conditions occurred:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_STATE</term>
/// <term>The interface is not currently connected using a temporary profile.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// A temporary profile is the one passed to WlanConnect or generated by the discovery engine. A network connection can be
/// established using a temporary profile. Using this API saves the temporary profile and associated user data to the profile store.
/// </para>
/// <para>
/// A new profile is added at the top of the list after the group policy profiles. A profile's position in the list is not changed
/// if an existing profile is overwritten.
/// </para>
/// <para>
/// All-user profiles have three associated permissions: read, write, and execute. If a user has read access, the user can view
/// profile permissions. If a user has execute access, the user has read access and the user can also connect to and disconnect from
/// a network using the profile. If a user has write access, the user has execute access and the user can also modify and delete
/// permissions associated with a profile.
/// </para>
/// <para>The following describes the procedure for creating a security descriptor object and parsing it as a string.</para>
/// <list type="number">
/// <item>
/// <term>Call InitializeSecurityDescriptor to create a security descriptor in memory.</term>
/// </item>
/// <item>
/// <term>Call SetSecurityDescriptorOwner.</term>
/// </item>
/// <item>
/// <term>Call InitializeAcl to create a discretionary access control list (DACL) in memory.</term>
/// </item>
/// <item>
/// <term>
/// Call AddAccessAllowedAce or AddAccessDeniedAce to add access control entries (ACEs) to the DACL. Set the AccessMask parameter to
/// one of the following bitwise OR combinations as appropriate:
/// </term>
/// </item>
/// <item>
/// <term>Call SetSecurityDescriptorDacl to add the DACL to the security descriptor.</term>
/// </item>
/// <item>
/// <term>Call ConvertSecurityDescriptorToStringSecurityDescriptor to convert the descriptor to string.</term>
/// </item>
/// </list>
/// <para>
/// The string returned by ConvertSecurityDescriptorToStringSecurityDescriptor can then be used as the strAllUserProfileSecurity
/// parameter value when calling <c>WlanSaveTemporaryProfile</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansavetemporaryprofile DWORD WlanSaveTemporaryProfile(
// HANDLE hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, LPCWSTR strAllUserProfileSecurity, DWORD dwFlags, BOOL
// bOverWrite, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "e409fd30-eddd-4cc7-acb7-35af6ef51a10")]
public static extern Win32Error WlanSaveTemporaryProfile(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName,
[Optional, MarshalAs(UnmanagedType.LPWStr)] string strAllUserProfileSecurity, WLAN_PROFILE_FLAGS dwFlags, [MarshalAs(UnmanagedType.Bool)] bool bOverWrite, IntPtr pReserved = default);
/// <summary>The <c>WlanScan</c> function requests a scan for available networks on the indicated interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>The GUID of the interface to be queried.</para>
/// <para>The GUID of each wireless LAN interface enabled on a local computer can be determined using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="pDot11Ssid">
/// A pointer to a DOT11_SSID structure that specifies the SSID of the network to be scanned. This parameter is optional. When set
/// to <c>NULL</c>, the returned list contains all available networks. <c>Windows XP with SP3 and Wireless LAN API for Windows XP
/// with SP2:</c> This parameter must be <c>NULL</c>.
/// </param>
/// <param name="pIeData">
/// A pointer to an information element to include in probe requests. This parameter points to a WLAN_RAW_DATA structure that may
/// include client provisioning availability information and 802.1X authentication requirements. <c>Windows XP with SP3 and Wireless
/// LAN API for Windows XP with SP2:</c> This parameter must be <c>NULL</c>.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pInterfaceGuid is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Failed to allocate memory for the query results.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanScan</c> function requests that the native 802.11 Wireless LAN driver scan for available wireless networks. The
/// driver may or may not send probe requests (an active scan) depending on its implementation and the values passed in the
/// pDot11Ssid and pIeData parameters.
/// </para>
/// <para>
/// If the pIeData parameter is not <c>NULL</c>, the driver will send probe requests during the scan. The probe requests include the
/// information element (IE) pointed to by the pIeData parameter. For instance, the Wi-Fi Protected Setup (WPS) IE can be included
/// in the probe requests to discover WPS-capable access points. The buffer pointed to by the pIeData parameter must contain the
/// complete IE starting from the Element ID.
/// </para>
/// <para>
/// The pIeData parameter passed to the <c>WlanScan</c> function can contain a pointer to an optional WLAN_RAW_DATA structure that
/// contains a proximity service discovery (PSD) IE data entry.
/// </para>
/// <para>
/// When used to store a PSD IE, the <c>DOT11_PSD_IE_MAX_DATA_SIZE</c> constant defined in the Wlanapi.h header file is the maximum
/// value of the <c>dwDataSize</c> member.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Constant</term>
/// <term>Value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>DOT11_PSD_IE_MAX_DATA_SIZE</term>
/// <term>240</term>
/// <term>The maximum data size, in bytes, of a PSD IE data entry.</term>
/// </item>
/// </list>
/// <para>For more information about PSD IEs, including a discussion of the format of a PSD IE, see the WlanSetPsdIEDataList function.</para>
/// <para>
/// When the <c>WlanScan</c> function is called, the native 802.11 Wireless LAN driver may flush the current list of available
/// wireless networks before the scan is initiated. Applications should not assume that calling the <c>WlanScan</c> function will
/// add to the existing list of available wireless networks returned by the WlanGetNetworkBssList or WlanGetAvailableNetworkList
/// functions from previous scans.
/// </para>
/// <para>
/// The <c>WlanScan</c> function returns immediately. To be notified when the network scan is complete, a client on Windows Vista
/// and later must register for notifications by calling WlanRegisterNotification. The dwNotifSource parameter passed to the
/// <c>WlanRegisterNotification</c> function must have the WLAN_NOTIFICATION_SOURCE_ACM bit set to register for notifications
/// generated by the auto configuration module. Wireless network drivers that meet Windows logo requirements are required to
/// complete a <c>WlanScan</c> function request in 4 seconds.
/// </para>
/// <para>
/// The Wireless LAN Service does not send notifications when available wireless networks change. The Wireless LAN Service does not
/// track changes to the list of available networks across multiple scans. The current default behavior is that the Wireless LAN
/// Service only asks the wireless interface driver to scan for wireless networks every 60 seconds, and in some cases (when already
/// connected to wireless network) the Wireless LAN Service does not ask for scans at all. The <c>WlanScan</c> function can be used
/// by an application to track wireless network changes. The application should first register for WLAN_NOTIFICATION_SOURCE_ACM
/// notifications. The <c>WlanScan</c> function can then be called to initiate a scan. The application should then wait to receive
/// the wlan_notification_acm_scan_complete notification or timeout after 4 seconds. Then the application can call the
/// WlanGetNetworkBssList or WlanGetAvailableNetworkList function to retrieve a list of available wireless networks. This process
/// can be repeated periodically with the application keeping tracking of changes to available wireless networks.
/// </para>
/// <para>
/// The <c>WlanScan</c> function returns immediately and does not provide a notification when the scan is complete on Windows XP
/// with SP3 or the Wireless LAN API for Windows XP with SP2.
/// </para>
/// <para>
/// Since it becomes more difficult for a wireless interface to send and receive data packets while a scan is occurring, the
/// <c>WlanScan</c> function may increase latency until the network scan is complete.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanscan DWORD WlanScan( HANDLE hClientHandle, const GUID
// *pInterfaceGuid, const PDOT11_SSID pDot11Ssid, const PWLAN_RAW_DATA pIeData, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "cf30b285-9694-4ab0-ad13-c1ec4d8cb6e1")]
public static extern Win32Error WlanScan(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, in DOT11_SSID pDot11Ssid, in WLAN_RAW_DATA pIeData, IntPtr pReserved = default);
/// <summary>The <c>WlanScan</c> function requests a scan for available networks on the indicated interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">
/// <para>The GUID of the interface to be queried.</para>
/// <para>The GUID of each wireless LAN interface enabled on a local computer can be determined using the WlanEnumInterfaces function.</para>
/// </param>
/// <param name="pDot11Ssid">
/// A pointer to a DOT11_SSID structure that specifies the SSID of the network to be scanned. This parameter is optional. When set
/// to <c>NULL</c>, the returned list contains all available networks. <c>Windows XP with SP3 and Wireless LAN API for Windows XP
/// with SP2:</c> This parameter must be <c>NULL</c>.
/// </param>
/// <param name="pIeData">
/// A pointer to an information element to include in probe requests. This parameter points to a WLAN_RAW_DATA structure that may
/// include client provisioning availability information and 802.1X authentication requirements. <c>Windows XP with SP3 and Wireless
/// LAN API for Windows XP with SP2:</c> This parameter must be <c>NULL</c>.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pInterfaceGuid is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Failed to allocate memory for the query results.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanScan</c> function requests that the native 802.11 Wireless LAN driver scan for available wireless networks. The
/// driver may or may not send probe requests (an active scan) depending on its implementation and the values passed in the
/// pDot11Ssid and pIeData parameters.
/// </para>
/// <para>
/// If the pIeData parameter is not <c>NULL</c>, the driver will send probe requests during the scan. The probe requests include the
/// information element (IE) pointed to by the pIeData parameter. For instance, the Wi-Fi Protected Setup (WPS) IE can be included
/// in the probe requests to discover WPS-capable access points. The buffer pointed to by the pIeData parameter must contain the
/// complete IE starting from the Element ID.
/// </para>
/// <para>
/// The pIeData parameter passed to the <c>WlanScan</c> function can contain a pointer to an optional WLAN_RAW_DATA structure that
/// contains a proximity service discovery (PSD) IE data entry.
/// </para>
/// <para>
/// When used to store a PSD IE, the <c>DOT11_PSD_IE_MAX_DATA_SIZE</c> constant defined in the Wlanapi.h header file is the maximum
/// value of the <c>dwDataSize</c> member.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Constant</term>
/// <term>Value</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>DOT11_PSD_IE_MAX_DATA_SIZE</term>
/// <term>240</term>
/// <term>The maximum data size, in bytes, of a PSD IE data entry.</term>
/// </item>
/// </list>
/// <para>For more information about PSD IEs, including a discussion of the format of a PSD IE, see the WlanSetPsdIEDataList function.</para>
/// <para>
/// When the <c>WlanScan</c> function is called, the native 802.11 Wireless LAN driver may flush the current list of available
/// wireless networks before the scan is initiated. Applications should not assume that calling the <c>WlanScan</c> function will
/// add to the existing list of available wireless networks returned by the WlanGetNetworkBssList or WlanGetAvailableNetworkList
/// functions from previous scans.
/// </para>
/// <para>
/// The <c>WlanScan</c> function returns immediately. To be notified when the network scan is complete, a client on Windows Vista
/// and later must register for notifications by calling WlanRegisterNotification. The dwNotifSource parameter passed to the
/// <c>WlanRegisterNotification</c> function must have the WLAN_NOTIFICATION_SOURCE_ACM bit set to register for notifications
/// generated by the auto configuration module. Wireless network drivers that meet Windows logo requirements are required to
/// complete a <c>WlanScan</c> function request in 4 seconds.
/// </para>
/// <para>
/// The Wireless LAN Service does not send notifications when available wireless networks change. The Wireless LAN Service does not
/// track changes to the list of available networks across multiple scans. The current default behavior is that the Wireless LAN
/// Service only asks the wireless interface driver to scan for wireless networks every 60 seconds, and in some cases (when already
/// connected to wireless network) the Wireless LAN Service does not ask for scans at all. The <c>WlanScan</c> function can be used
/// by an application to track wireless network changes. The application should first register for WLAN_NOTIFICATION_SOURCE_ACM
/// notifications. The <c>WlanScan</c> function can then be called to initiate a scan. The application should then wait to receive
/// the wlan_notification_acm_scan_complete notification or timeout after 4 seconds. Then the application can call the
/// WlanGetNetworkBssList or WlanGetAvailableNetworkList function to retrieve a list of available wireless networks. This process
/// can be repeated periodically with the application keeping tracking of changes to available wireless networks.
/// </para>
/// <para>
/// The <c>WlanScan</c> function returns immediately and does not provide a notification when the scan is complete on Windows XP
/// with SP3 or the Wireless LAN API for Windows XP with SP2.
/// </para>
/// <para>
/// Since it becomes more difficult for a wireless interface to send and receive data packets while a scan is occurring, the
/// <c>WlanScan</c> function may increase latency until the network scan is complete.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanscan DWORD WlanScan( HANDLE hClientHandle, const GUID
// *pInterfaceGuid, const PDOT11_SSID pDot11Ssid, const PWLAN_RAW_DATA pIeData, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "cf30b285-9694-4ab0-ad13-c1ec4d8cb6e1")]
public static extern Win32Error WlanScan(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, IntPtr pDot11Ssid = default, IntPtr pIeData = default, IntPtr pReserved = default);
/// <summary>The <c>WlanSetAutoConfigParameter</c> function sets parameters for the automatic configuration service.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="OpCode">
/// <para>
/// A WLAN_AUTOCONF_OPCODE value that specifies the parameter to be set. Only some of the opcodes in the <c>WLAN_AUTOCONF_OPCODE</c>
/// enumeration support set operations.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>wlan_autoconf_opcode_show_denied_networks</term>
/// <term>
/// When set, the pData parameter will contain a BOOL value indicating whether user and group policy-denied networks will be
/// included in the available networks list.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_allow_explicit_creds</term>
/// <term>
/// When set, the pData parameter will contain a BOOL value indicating whether the current wireless interface has shared user
/// credentials allowed.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_block_period</term>
/// <term>
/// When set, the pData parameter will contain a DWORD value for the blocked period setting for the current wireless interface. The
/// blocked period is the amount of time, in seconds, for which automatic connection to a wireless network will not be attempted
/// after a previous failure.
/// </term>
/// </item>
/// <item>
/// <term>wlan_autoconf_opcode_allow_virtual_station_extensibility</term>
/// <term>
/// When set, the pData parameter will contain a BOOL value indicating whether extensibility on a virtual station is allowed. By
/// default, extensibility on a virtual station is allowed. The value for this opcode is persisted across restarts. This enumeration
/// value is supported on Windows 7 and on Windows Server 2008 R2 with the Wireless LAN Service installed.
/// </term>
/// </item>
/// </list>
/// </param>
/// <param name="dwDataSize">
/// The size of the pData parameter, in bytes. This parameter must be set to for a BOOL or for a DWORD, depending on the value of
/// the OpCode parameter.
/// </param>
/// <param name="pData">
/// <para>
/// The value to be set for the parameter specified in OpCode parameter. The pData parameter must point to a boolean or DWORD value,
/// depending on the value of the OpCode parameter. The pData parameter must not be <c>NULL</c>.
/// </para>
/// <para>
/// <c>Note</c> The pData parameter may point to an integer value when a boolean is required. If pData points to 0, then the value
/// is converted to <c>FALSE</c>. If pData points to a nonzero integer, then the value is converted to <c>TRUE</c>.
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// Access is denied. This error is returned if the caller does not have sufficient permissions to set the configuration parameter
/// when the OpCode parameter is wlan_autoconf_opcode_show_denied_networks or
/// wlan_autoconf_opcode_allow_virtual_station_extensibility. When the OpCode parameter is set to one of these values, the
/// WlanSetAutoConfigParameter function retrieves the discretionary access control list (DACL) stored for opcode object. If the DACL
/// does not contain an access control entry (ACE) that grants WLAN_WRITE_ACCESS permission to the access token of the calling
/// thread, then WlanSetAutoConfigParameter returns ERROR_ACCESS_DENIED. This error is also returned if the configuration parameter
/// is set by group policy on a domain. When group policy is set for an opcode, applications are prevented from making changes. For
/// the following OpCode parameters may be set by group policy: wlan_autoconf_opcode_show_denied_networks,
/// wlan_autoconf_opcode_allow_explicit_creds, and wlan_autoconf_opcode_block_period
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// A parameter was bad. This error is returned if the hClientHandle parameter is NULL, the pData parameter is NULL, or the
/// pReserved parameter is not NULL. This error is also returned if OpCode parameter specified is not one of the
/// WLAN_AUTOCONF_OPCODE values for a configuration parameter that can be set. This error is also returned if the dwDataSize
/// parameter is not set to , or the dwDataSize is not set to depending on the value of the OpCode parameter.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanSetAutoConfigParameter</c> function sets parameters used by Auto Configuration Module (ACM), the wireless
/// configuration component supported on Windows Vista and later.
/// </para>
/// <para>
/// Depending on the value of the OpCode parameter, the data pointed to by pData will be converted to a boolean value before the
/// automatic configuration parameter is set. If pData points to 0, then the parameter is set to <c>FALSE</c>; otherwise, the
/// parameter is set to <c>TRUE</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetautoconfigparameter DWORD
// WlanSetAutoConfigParameter( HANDLE hClientHandle, WLAN_AUTOCONF_OPCODE OpCode, DWORD dwDataSize, const PVOID pData, PVOID
// pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "4f2514be-f05e-4be6-8c74-ef7a9ffe1c53")]
public static extern Win32Error WlanSetAutoConfigParameter(HWLANSESSION hClientHandle, WLAN_AUTOCONF_OPCODE OpCode, uint dwDataSize, [In] IntPtr pData, IntPtr pReserved = default);
/// <summary>The <c>WlanSetFilterList</c> function sets the permit/deny list.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="wlanFilterListType">
/// A WLAN_FILTER_LIST_TYPE value that specifies the type of filter list. The value must be either
/// <c>wlan_filter_list_type_user_permit</c> or <c>wlan_filter_list_type_user_deny</c>. Group policy-defined lists cannot be set
/// using this function.
/// </param>
/// <param name="pNetworkList">
/// Pointer to a DOT11_NETWORK_LIST structure that contains the list of networks to permit or deny. The <c>dwIndex</c> member of the
/// structure must have a value less than the value of the <c>dwNumberOfItems</c> member of the structure; otherwise, an access
/// violation may occur.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to set the filter list. When called with wlanFilterListType set to
/// wlan_filter_list_type_user_permit, WlanSetFilterList retrieves the discretionary access control list (DACL) stored with the
/// wlan_secure_permit_list object. When called with wlanFilterListType set to wlan_filter_list_type_user_deny, WlanSetFilterList
/// retrieves the DACL stored with the wlan_secure_deny_list object. In either of these cases, if the DACL does not contain an
/// access control entry (ACE) that grants WLAN_WRITE_ACCESS permission to the access token of the calling thread, then
/// WlanSetFilterList returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The group policy permit and deny lists take precedence over the user's permit and deny lists. That means access to a network on
/// the user's permit list will be denied if the network appears on the group policy deny list. Similarly, access to a network on
/// the user's deny list will be permitted if the network appears on the group policy permit list. Networks that are not on a user
/// list or a group policy list will be permitted.
/// </para>
/// <para>
/// Denied networks cannot be connected by means of auto config and will not be included on the visible networks list. New user
/// permit and deny lists overwrite previous versions of the user lists.
/// </para>
/// <para>
/// To clear a filter list, set the pNetworkList parameter to <c>NULL</c>, or pass a pointer to a DOT11_NETWORK_LIST structure that
/// has the <c>dwNumberOfItems</c> member set to 0.
/// </para>
/// <para>
/// To add all SSIDs to a filter list, pass a pointer to a DOT11_NETWORK_LIST structure with an associated DOT11_NETWORK structure
/// that has the <c>uSSIDLength</c> member of its DOT11_SSID structure set to 0.
/// </para>
/// <para>
/// To add all BSS types to a filter list, pass a pointer to a DOT11_NETWORK_LIST with an associated DOT11_NETWORK structure that
/// has its <c>dot11BssType</c> member set to <c>dot11_BSS_type_any</c>.
/// </para>
/// <para>
/// The <c>netsh wlan add filter</c> and <c>netsh wlan delete filter</c> commands provide similar functionality at the command line.
/// For more information, see Netsh Commands for Wireless Local Area Network (wlan).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetfilterlist DWORD WlanSetFilterList( HANDLE
// hClientHandle, WLAN_FILTER_LIST_TYPE wlanFilterListType, const PDOT11_NETWORK_LIST pNetworkList, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "697682c9-cb26-42d6-86b5-d7adebcedc68")]
public static extern Win32Error WlanSetFilterList(HWLANSESSION hClientHandle, WLAN_FILTER_LIST_TYPE wlanFilterListType, [Optional] DOT11_NETWORK_LIST pNetworkList, IntPtr pReserved = default);
/// <summary>The <c>WlanSetInterface</c> function sets user-configurable parameters for a specified interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface to be configured.</param>
/// <param name="OpCode">
/// <para>
/// A WLAN_INTF_OPCODE value that specifies the parameter to be set. The following table lists the valid constants along with the
/// data type of the parameter in pData.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>WLAN_INTF_OPCODE value</term>
/// <term>pData data type</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>wlan_intf_opcode_autoconf_enabled</term>
/// <term>BOOL</term>
/// <term>Enables or disables auto config for the indicated interface.</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_background_scan_enabled</term>
/// <term>BOOL</term>
/// <term>Enables or disables background scan for the indicated interface.</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_radio_state</term>
/// <term>WLAN_PHY_RADIO_STATE</term>
/// <term>Sets the software radio state of a specific physical layer (PHY) for the interface.</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_bss_type</term>
/// <term>DOT11_BSS_TYPE</term>
/// <term>Sets the BSS type.</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_media_streaming_mode</term>
/// <term>BOOL</term>
/// <term>Sets media streaming mode for the driver.</term>
/// </item>
/// <item>
/// <term>wlan_intf_opcode_current_operation_mode</term>
/// <term>ULONG</term>
/// <term>Sets the current operation mode for the interface. For more information, see Remarks.</term>
/// </item>
/// </list>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Only the <c>wlan_intf_opcode_autoconf_enabled</c> and
/// <c>wlan_intf_opcode_bss_type</c> constants are valid.
/// </para>
/// </param>
/// <param name="dwDataSize">
/// The size of the pData parameter, in bytes. If dwDataSize is larger than the actual amount of memory allocated to pData, then an
/// access violation will occur in the calling program.
/// </param>
/// <param name="pData">
/// <para>
/// The value to be set as specified by the OpCode parameter. The type of data pointed to by pData must be appropriate for the
/// specified OpCode. Use the table above to determine the type of data to use.
/// </para>
/// <para>
/// <c>Note</c> If OpCode is set to <c>wlan_intf_opcode_autoconf_enabled</c>, <c>wlan_intf_opcode_background_scan_enabled</c>, or
/// <c>wlan_intf_opcode_media_streaming_mode</c>, then pData may point to an integer value. If pData points to 0, then the value is
/// converted to <c>FALSE</c>. If pData points to a nonzero integer, then the value is converted to <c>TRUE</c>.
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// </returns>
/// <remarks>
/// <para>
/// When OpCode is set to <c>wlan_intf_opcode_current_operation_mode</c>, the <c>WlanSetInterface</c> function sets the current
/// operation mode of the wireless interface. For more information about operation modes, see Native 802.11 Operation Modes. Two
/// operation modes are supported: <c>DOT11_OPERATION_MODE_EXTENSIBLE_STATION</c> and <c>DOT11_OPERATION_MODE_NETWORK_MONITOR</c>.
/// The operation mode constants are defined in the header file Windot11.h. If pData does not point to one of these values when
/// OpCode is set to <c>wlan_intf_opcode_current_operation_mode</c>, the <c>WlanSetInterface</c> function will fail with an error.
/// </para>
/// <para>
/// To enable or disable the automatic configuration service at the command line, which is functionally equivalent to calling
/// <c>WlanSetInterface</c> with OpCode set to <c>wlan_intf_opcode_autoconf_enabled</c>, use the <c>netsh wlan setautoconfig</c>
/// command. For more information, see Netsh Commands for Wireless Local Area Network (wlan).
/// </para>
/// <para>
/// The software radio state can be changed by calling the <c>WlanSetInterface</c> function. The hardware radio state cannot be
/// changed by calling the <c>WlanSetInterface</c> function. When the OpCode parameter is set to
/// <c>wlan_intf_opcode_radio_state</c>, the <c>WlanSetInterface</c> function sets the software radio state of a specific PHY. The
/// pData parameter must point to a WLAN_PHY_RADIO_STATE structure with the new radio state values to use. The
/// <c>dot11HardwareRadioState</c> member of the <c>WLAN_PHY_RADIO_STATE</c> structure is ignored when the <c>WlanSetInterface</c>
/// function is called with the OpCode parameter set to <c>wlan_intf_opcode_radio_state</c> and the pData parameter points to a
/// <c>WLAN_PHY_RADIO_STATE</c> structure. The radio state of a PHY is off if either the software radio state (
/// <c>dot11SoftwareRadioState</c> member of the <c>WLAN_PHY_RADIO_STATE</c> structure) or the hardware radio state (
/// <c>dot11HardwareRadioState</c> member of the <c>WLAN_PHY_RADIO_STATE</c> structure) is off.
/// </para>
/// <para>
/// Changing the software radio state of a physical network interface could cause related changes in the state of the wireless
/// Hosted Network or virtual wireless adapter radio states. The PHYs of every virtual wireless adapter are linked. For more
/// information, see the About the Wireless Hosted Network.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetinterface DWORD WlanSetInterface( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, WLAN_INTF_OPCODE OpCode, DWORD dwDataSize, const PVOID pData, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "114a2a71-babd-4cd7-860a-fea523bcc865")]
public static extern Win32Error WlanSetInterface(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, WLAN_INTF_OPCODE OpCode, uint dwDataSize, [In] IntPtr pData, IntPtr pReserved = default);
/// <summary>The <c>WlanSetProfile</c> function sets the content of a specific profile.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="dwFlags">
/// <para>The flags to set on the profile.</para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> dwFlags must be 0. Per-user profiles are not supported.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>0</term>
/// <term>The profile is an all-user profile.</term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_GROUP_POLICY 0x00000001</term>
/// <term>The profile is a group policy profile.</term>
/// </item>
/// <item>
/// <term>WLAN_PROFILE_USER 0x00000002</term>
/// <term>The profile is a per-user profile.</term>
/// </item>
/// </list>
/// </param>
/// <param name="strProfileXml">
/// <para>
/// Contains the XML representation of the profile. The WLANProfile element is the root profile element. To view sample profiles,
/// see Wireless Profile Samples. There is no predefined maximum string length.
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The supplied profile must meet the compatibility
/// criteria described in Wireless Profile Compatibility.
/// </para>
/// </param>
/// <param name="strAllUserProfileSecurity">
/// <para>
/// Sets the security descriptor string on the all-user profile. For more information about profile permissions, see the Remarks section.
/// </para>
/// <para>If dwFlags is set to WLAN_PROFILE_USER, this parameter is ignored.</para>
/// <para>
/// If this parameter is set to <c>NULL</c> for a new all-user profile, the security descriptor associated with the
/// wlan_secure_add_new_all_user_profiles object is used. If the security descriptor has not been modified by a
/// WlanSetSecuritySettings call, all users have default permissions on a new all-user profile. Call WlanGetSecuritySettings to get
/// the default permissions associated with the wlan_secure_add_new_all_user_profiles object.
/// </para>
/// <para>If this parameter is set to <c>NULL</c> for an existing all-user profile, the permissions of the profile are not changed.</para>
/// <para>
/// If this parameter is not <c>NULL</c> for an all-user profile, the security descriptor string associated with the profile is
/// created or modified after the security descriptor object is created and parsed as a string.
/// </para>
/// <para><c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> This parameter must be <c>NULL</c>.</para>
/// </param>
/// <param name="bOverwrite">
/// Specifies whether this profile is overwriting an existing profile. If this parameter is <c>FALSE</c> and the profile already
/// exists, the existing profile will not be overwritten and an error will be returned.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pdwReasonCode">A WLAN_REASON_CODE value that indicates why the profile is not valid.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to set the profile. When called with dwFlags set to 0 - that is, when setting an
/// all-user profile - WlanSetProfile retrieves the discretionary access control list (DACL) stored with the
/// wlan_secure_add_new_all_user_profiles object. When called with dwFlags set to WLAN_PROFILE_USER - that is, when setting a
/// per-user profile - WlanSetProfile retrieves the discretionary access control list (DACL) stored with the
/// wlan_secure_add_new_per_user_profiles object. In either case, if the DACL does not contain an access control entry (ACE) that
/// grants WLAN_WRITE_ACCESS permission to the access token of the calling thread, then WlanSetProfile returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_ALREADY_EXISTS</term>
/// <term>
/// strProfileXml specifies a network that already exists. Typically, this return value is used when bOverwrite is FALSE; however,
/// if bOverwrite is TRUE and dwFlags specifies a different profile type than the one used by the existing profile, then the
/// existing profile will not be overwritten and ERROR_ALREADY_EXISTS will be returned.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_BAD_PROFILE</term>
/// <term>
/// The profile specified by strProfileXml is not valid. If this value is returned, pdwReasonCode specifies the reason the profile
/// is invalid.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>One of the following conditions occurred:</term>
/// </item>
/// <item>
/// <term>ERROR_NO_MATCH</term>
/// <term>
/// The interface does not support one or more of the capabilities specified in the profile. For example, if a profile specifies the
/// use of WPA2 when the NIC only supports WPA, then this error code is returned. Also, if a profile specifies the use of FIPS mode
/// when the NIC does not support FIPS mode, then this error code is returned.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>WlanSetProfile</c> function can be used to add a new wireless LAN profile or replace an existing wireless LAN profile.</para>
/// <para>
/// A new profile is added at the top of the list after the group policy profiles. A profile's position in the list is not changed
/// if an existing profile is overwritten. <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c>
/// </para>
/// <para>
/// Ad hoc profiles appear after the infrastructure profiles in the profile list. If you create a new ad hoc profile, it is placed
/// at the top of the ad hoc list, after the group policy and infrastructure profiles.
/// </para>
/// <para>
/// 802.1X guest profiles, Wireless Provisioning Service (WPS) profiles, and profiles with Wi-Fi Protected Access-None (WPA-None)
/// authentication are not supported. That means such a profile cannot be created, deleted, enumerated, or accessed using Native
/// Wifi functions. Any such profile already in the preferred profile list will remain in the list, and its position in the list
/// relative to other profiles is fixed unless the position of the other profiles change.
/// </para>
/// <para>
/// You can call <c>WlanSetProfile</c> on a profile that contains a plaintext key (that is, a profile with the protected element
/// present and set to <c>FALSE</c>). Before the profile is saved in the profile store, the key material is automatically encrypted.
/// When the profile is subsequently retrieved from the profile store by calling WlanGetProfile, the encrypted key material is
/// returned. <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The key material is never encrypted.
/// </para>
/// <para>
/// All-user profiles have three associated permissions: read, write, and execute. If a user has read access, the user can view
/// profile permissions. If a user has execute access, the user has read access and the user can also connect to and disconnect from
/// a network using the profile. If a user has write access, the user has execute access and the user can also modify and delete
/// permissions associated with a profile.
/// </para>
/// <para>The following describes the procedure for creating a security descriptor object and parsing it as a string.</para>
/// <list type="number">
/// <item>
/// <term>Call InitializeSecurityDescriptor to create a security descriptor in memory.</term>
/// </item>
/// <item>
/// <term>Call SetSecurityDescriptorOwner.</term>
/// </item>
/// <item>
/// <term>Call InitializeAcl to create a discretionary access control list (DACL) in memory.</term>
/// </item>
/// <item>
/// <term>
/// Call AddAccessAllowedAce or AddAccessDeniedAce to add access control entries (ACEs) to the DACL. Set the AccessMask parameter to
/// one of the following as appropriate:
/// </term>
/// </item>
/// <item>
/// <term>Call SetSecurityDescriptorDacl to add the DACL to the security descriptor.</term>
/// </item>
/// <item>
/// <term>Call ConvertSecurityDescriptorToStringSecurityDescriptor to convert the descriptor to string.</term>
/// </item>
/// </list>
/// <para>
/// The string returned by ConvertSecurityDescriptorToStringSecurityDescriptor can then be used as the strAllUserProfileSecurity
/// parameter value when calling <c>WlanSetProfile</c>.
/// </para>
/// <para>
/// For every wireless LAN profile used by the Native Wifi AutoConfig service, Windows maintains the concept of custom user data.
/// This custom user data is initially non-existent, but can be set by calling the WlanSetProfileCustomUserData function. The custom
/// user data gets reset to empty any time the profile is modified by calling the <c>WlanSetProfile</c> function. Once custom user
/// data has been set, this data can be accessed using the WlanGetProfileCustomUserData function.
/// </para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanSetProfile</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface specified in the
/// pInterfaceGuid parameter has been removed from the system (a USB wireless adapter that has been removed, for example).
/// </para>
/// <para>
/// The <c>netsh wlan add profile</c> command provides similar functionality at the command line. For more information, see Netsh
/// Commands for Wireless Local Area Network (wlan).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetprofile DWORD WlanSetProfile( HANDLE hClientHandle,
// const GUID *pInterfaceGuid, DWORD dwFlags, LPCWSTR strProfileXml, LPCWSTR strAllUserProfileSecurity, BOOL bOverwrite, PVOID
// pReserved, DWORD *pdwReasonCode );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "3f8dca2e-6fe5-4c7d-a135-a33c61ba3dd5")]
public static extern Win32Error WlanSetProfile(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, WLAN_PROFILE_FLAGS dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string strProfileXml,
[Optional, MarshalAs(UnmanagedType.LPWStr)] string strAllUserProfileSecurity, [MarshalAs(UnmanagedType.Bool)] bool bOverwrite, [Optional] IntPtr pReserved, out WLAN_REASON_CODE pdwReasonCode);
/// <summary>The <c>WlanSetProfileCustomUserData</c> function sets the custom user data associated with a profile.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="strProfileName">
/// The name of the profile associated with the custom user data. Profile names are case-sensitive. This string must be NULL-terminated.
/// </param>
/// <param name="dwDataSize">The size of pData, in bytes.</param>
/// <param name="pData">A pointer to the user data to be set.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>One of the following conditions occurred:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// For every wireless WLAN profile used by the Native Wifi AutoConfig service, Windows maintains the concept of custom user data.
/// This custom user data is initially non-existent, but can be set by calling the <c>WlanSetProfileCustomUserData</c> function. The
/// custom user data gets reset to empty any time the profile is modified by calling the WlanSetProfile function.
/// </para>
/// <para>Once custom user data has been set, this data can be accessed using the WlanGetProfileCustomUserData function.</para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanSetProfileCustomUserData</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface
/// specified in the pInterfaceGuid parameter has been removed from the system (a USB wireless adapter that has been removed, for example).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetprofilecustomuserdata DWORD
// WlanSetProfileCustomUserData( HANDLE hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, DWORD dwDataSize, const
// PBYTE pData, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "3b37ff29-4c9b-42c8-b00a-a9dfca1d3fed")]
public static extern Win32Error WlanSetProfileCustomUserData(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName,
uint dwDataSize, [In] IntPtr pData, IntPtr pReserved = default);
/// <summary>
/// The <c>WlanSetProfileEapUserData</c> function sets the Extensible Authentication Protocol (EAP) user credentials as specified by
/// raw EAP data. The user credentials apply to a profile on an interface.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="strProfileName">
/// The name of the profile associated with the EAP user data. Profile names are case-sensitive. This string must be NULL-terminated.
/// </param>
/// <param name="eapType">An EAP_METHOD_TYPE structure that contains the method for which the caller is supplying EAP user credentials.</param>
/// <param name="dwFlags">
/// <para>A set of flags that modify the behavior of the function.</para>
/// <para>On Windows Vista and Windows Server 2008, this parameter is reserved and should be set to zero.</para>
/// <para>On Windows 7, Windows Server 2008 R2, and later, this parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_SET_EAPHOST_DATA_ALL_USERS 0x00000001</term>
/// <term>Set EAP host data for all users of this profile.</term>
/// </item>
/// </list>
/// </param>
/// <param name="dwEapUserDataSize">The size, in bytes, of the data pointed to by pbEapUserData.</param>
/// <param name="pbEapUserData">
/// <para>A pointer to the raw EAP data used to set the user credentials.</para>
/// <para>On Windows Vista and Windows Server 2008, this parameter must not be <c>NULL</c>.</para>
/// <para>
/// On Windows 7, Windows Server 2008 R2, and later, this parameter can be set to <c>NULL</c> to delete the stored credentials for
/// this profile if the dwFlags parameter contains <c>WLAN_SET_EAPHOST_DATA_ALL_USERS</c> and the dwEapUserDataSize parameter is 0.
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>Access is denied. This value is returned if the caller does not have write access to the profile.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>
/// A parameter is incorrect. This value is returned if any of the following conditions occur: On Windows Vista and Windows Server
/// 2008, this value is returned if the pbEapUserData parameter is NULL. On Windows 7, Windows Server 2008 R2 , and later, this
/// error is returned if the pbEapUserData parameter is NULL, but the dwEapUserDataSize parameter is not 0 or the dwFlags parameter
/// does not contain WLAN_SET_EAPHOST_DATA_ALL_USERS.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>A handle is invalid. This error is returned if the handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough storage is available to process this command.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// The request is not supported. This value is returned when profile settings do not permit storage of user data. This can occur
/// when single signon (SSO) is enabled or when the request was to delete the stored credentials for this profile (the pbEapUserData
/// parameter was NULL, the dwFlags parameter contains WLAN_SET_EAPHOST_DATA_ALL_USERS, and the dwEapUserDataSize parameter is 0).
/// On Windows 7, Windows Server 2008 R2 , and later, this value is returned if the WlanSetProfileEapUserData function was called on
/// a profile that uses a method other than 802.1X for authentication. This value is also returned if this function was called from
/// a Windows XP with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This value is returned if the Wireless LAN service is not running.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanSetProfileEapUserData</c> function sets the EAP user credentials to use on a profile. On Windows Vista and Windows
/// Server 2008, these credentials can only be used by the caller.
/// </para>
/// <para>
/// The eapType parameter is an EAP_METHOD_TYPE structure that contains type, identification, and author information about an EAP
/// method. The <c>eapType</c> member of the <c>EAP_METHOD_TYPE</c> structure is an EAP_TYPE structure that contains the type and
/// vendor identification information for an EAP method.
/// </para>
/// <para>For more information on the allocation of EAP method types, see section 6.2 of RFC 3748 published by the IETF.</para>
/// <para>
/// On Windows 7, Windows Server 2008 R2, and later, the <c>WlanSetProfileEapUserData</c> function is enhanced. EAP user credentials
/// can be set for all users of a profile if the dwFlags parameter contains <c>WLAN_SET_EAPHOST_DATA_ALL_USERS</c>. The EAP user
/// credentials on a profile can also be deleted. To delete the EAP user credentials on a profile, the pbEapUserData parameter must
/// be <c>NULL</c>, the dwFlags parameter must equal <c>WLAN_SET_EAPHOST_DATA_ALL_USERS</c>, and the dwEapUserDataSize parameter
/// must be 0.
/// </para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanSetProfileEapUserData</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface specified
/// in the pInterfaceGuid parameter has been removed from the system (a USB wireless adapter that has been removed, for example).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetprofileeapuserdata DWORD WlanSetProfileEapUserData(
// HANDLE hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, EAP_METHOD_TYPE eapType, DWORD dwFlags, DWORD
// dwEapUserDataSize, const LPBYTE pbEapUserData, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "2bef0f2f-165d-446a-afa8-735658048152")]
public static extern Win32Error WlanSetProfileEapUserData(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName,
EAP_METHOD_TYPE eapType, WLAN_SET_EAPHOST dwFlags, uint dwEapUserDataSize, [In] IntPtr pbEapUserData, IntPtr pReserved = default);
/// <summary>
/// The <c>WlanSetProfileEapXmlUserData</c> function sets the Extensible Authentication Protocol (EAP) user credentials as specified
/// by an XML string. The user credentials apply to a profile on an adapter. These credentials can only be used by the caller.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="strProfileName">
/// <para>The name of the profile associated with the EAP user data. Profile names are case-sensitive. This string must be NULL-terminated.</para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The supplied name must match the profile name derived
/// automatically from the SSID of the network. For an infrastructure network profile, the SSID must be supplied for the profile
/// name. For an ad hoc network profile, the supplied name must be the SSID of the ad hoc network followed by .
/// </para>
/// </param>
/// <param name="dwFlags">
/// <para>A set of flags that modify the behavior of the function.</para>
/// <para>
/// On Wireless LAN API for Windows XP with SP2, Windows XP with SP3,Windows Vista, and Windows Server 2008, this parameter is
/// reserved and should be set to zero.
/// </para>
/// <para>On Windows 7, Windows Server 2008 R2, and later, this parameter can be one of the following values.</para>
/// <list type="table">
/// <listheader>
/// <term>Value</term>
/// <term>Meaning</term>
/// </listheader>
/// <item>
/// <term>WLAN_SET_EAPHOST_DATA_ALL_USERS 0x00000001</term>
/// <term>Set EAP host data for all users of this profile.</term>
/// </item>
/// </list>
/// </param>
/// <param name="strEapXmlUserData">
/// <para>A pointer to XML data used to set the user credentials.</para>
/// <para>
/// The XML data must be based on the EAPHost User Credentials schema. To view sample user credential XML data, see EAPHost User Properties.
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>Access is denied. This value is returned if the caller does not have write access to the profile.</term>
/// </item>
/// <item>
/// <term>ERROR_BAD_PROFILE</term>
/// <term>
/// The network connection profile is corrupted. This error is returned if the profile specified in the strProfileName parameter
/// could not be parsed.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This value is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>A handle is invalid. This error is returned if the handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_ENOUGH_MEMORY</term>
/// <term>Not enough storage is available to process this command.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// The request is not supported. This value is returned when profile settings do not permit storage of user data. This can occur
/// when single signon (SSO) is enabled. On Windows 7, Windows Server 2008 R2 , and later, this value is returned if the
/// WlanSetProfileEapXmlUserData function was called on a profile that uses a method other than 802.1X for authentication.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_SERVICE_NOT_ACTIVE</term>
/// <term>The service has not been started. This value is returned if the Wireless LAN service is not running.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The <c>WlanSetProfileEapXmlUserData</c> function sets the EAP user credentials to use on a profile. This function can only be
/// called on a profile that uses 802.1X for authentication. On Windows Vista and Windows Server 2008, these credentials can only be
/// used by the caller.
/// </para>
/// <para>
/// The eapType parameter is an EAP_METHOD_TYPE structure that contains type, identification, and author information about an EAP
/// method. The <c>eapType</c> member of the <c>EAP_METHOD_TYPE</c> structure is an EAP_TYPE structure that contains the type and
/// vendor identification information for an EAP method.
/// </para>
/// <para>For more information on the allocation of EAP method types, see section 6.2 of RFC 3748 published by the IETF.</para>
/// <para>
/// On Windows 7, Windows Server 2008 R2, and later, the <c>WlanSetProfileEapXmlUserData</c> function is enhanced. EAP user
/// credentials can be set for all users of a profile if the dwFlags parameter contains <c>WLAN_SET_EAPHOST_DATA_ALL_USERS</c>.
/// </para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanSetProfileEapXmlUserData</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface
/// specified in the pInterfaceGuid parameter has been removed from the system (a USB wireless adapter that has been removed, for example).
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> This function can only be used for Protected EAP (PEAP)
/// credentials. It cannot be used for other EAP types.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetprofileeapxmluserdata DWORD
// WlanSetProfileEapXmlUserData( HANDLE hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, DWORD dwFlags, LPCWSTR
// strEapXmlUserData, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "c34c39c0-8200-438a-8353-238225aea5cb")]
public static extern Win32Error WlanSetProfileEapXmlUserData(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName,
WLAN_SET_EAPHOST dwFlags, [MarshalAs(UnmanagedType.LPWStr)] string strEapXmlUserData, IntPtr pReserved = default);
/// <summary>The <c>WlanSetProfileList</c> function sets the preference order of profiles for a given interface.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="dwItems">The number of profiles in the strProfileNames parameter.</param>
/// <param name="strProfileNames">
/// <para>The names of the profiles in the desired order. Profile names are case-sensitive. This string must be NULL-terminated.</para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The supplied names must match the profile names derived
/// automatically from the SSID of the network. For infrastructure network profiles, the SSID must be supplied for the profile name.
/// For ad hoc network profiles, the supplied name must be the SSID of the ad hoc network followed by .
/// </para>
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to change the profile list. Before WlanSetProfileList performs an operation that
/// changes the relative order of all-user profiles in the profile list or moves an all-user profile to a lower position in the
/// profile list, WlanSetProfileList retrieves the discretionary access control list (DACL) stored with the
/// wlan_secure_all_user_profiles_order object. If the DACL does not contain an access control entry (ACE) that grants
/// WLAN_WRITE_ACCESS permission to the access token of the calling thread, then WlanSetProfileList returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>One of the following conditions occurred:</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_FOUND</term>
/// <term>strProfileNames contains the name of a profile that is not present in the profile store.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The <c>WlanSetProfileList</c> function sets the preference order of wireless LAN profiles for a given wireless interface.</para>
/// <para>
/// The profiles in the list must be a one-to-one match with the current profiles returned by the WlanGetProfileList function. The
/// position of group policy profiles cannot be changed.
/// </para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanSetProfileList</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface specified in the
/// pInterfaceGuid parameter has been removed from the system (a USB wireless adapter that has been removed, for example).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetprofilelist DWORD WlanSetProfileList( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, DWORD dwItems, LPCWSTR *strProfileNames, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "980c7920-a25e-4e05-a742-77178a7f000a")]
public static extern Win32Error WlanSetProfileList(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, uint dwItems,
[In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] strProfileNames, IntPtr pReserved = default);
/// <summary>The <c>WlanSetProfilePosition</c> function sets the position of a single, specified profile in the preference list.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="strProfileName">
/// <para>The name of the profile. Profile names are case-sensitive. This string must be NULL-terminated.</para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> The supplied name must match the profile name derived
/// automatically from the SSID of the network. For an infrastructure network profile, the SSID must be supplied for the profile
/// name. For an ad hoc network profile, the supplied name must be the SSID of the ad hoc network followed by .
/// </para>
/// </param>
/// <param name="dwPosition">
/// Indicates the position in the preference list that the profile should be shifted to. 0 (zero) corresponds to the first profile
/// in the list that is returned by the WlanGetProfileList function.
/// </param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>
/// The caller does not have sufficient permissions to change the profile position. Before WlanSetProfilePosition performs an
/// operation that changes the relative order of all-user profiles in the profile list or moves an all-user profile to a lower
/// position in the profile list, WlanSetProfilePosition retrieves the discretionary access control list (DACL) stored with the
/// wlan_secure_all_user_profiles_order object. If the DACL does not contain an access control entry (ACE) that grants
/// WLAN_WRITE_ACCESS permission to the access token of the calling thread, then WlanSetProfilePosition returns ERROR_ACCESS_DENIED.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>hClientHandle is NULL or invalid, pInterfaceGuid is NULL, strProfileName is NULL, or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>The position of group policy profiles cannot be changed.</para>
/// <para>
/// By default, only a user logged on as a member of the Administrators group can change the position of an all-user profile. Call
/// WlanGetSecuritySettings to determine the actual user rights required to change the position of an all-user profile.
/// </para>
/// <para>
/// To set the profile position at the command line, use the <c>netsh wlan set profileorder</c> command. For more information, see
/// Netsh Commands for Wireless Local Area Network (wlan).
/// </para>
/// <para>
/// <c>Windows XP with SP3 and Wireless LAN API for Windows XP with SP2:</c> Ad hoc profiles appear after the infrastructure
/// profiles in the profile list. If you try to position an ad hoc profile before an infrastructure profile using
/// <c>WlanSetProfilePosition</c>, the <c>WlanSetProfilePosition</c> call will succeed but the Wireless Zero Configuration service
/// will reorder the profile list such that the ad hoc profile is positioned after all infrastructure network profiles.
/// </para>
/// <para>
/// Guest profiles, profiles with Wireless Provisioning Service (WPS) authentication, and profiles with Wi-Fi Protected Access-None
/// (WPA-None) authentication are not supported. Any such profile that appears in the preferred profile list has a fixed position in
/// the profile list. That means its position cannot be changed using <c>WlanSetProfilePosition</c> and that its position is not
/// affected by position changes of other profiles.
/// </para>
/// <para>
/// All wireless LAN functions require an interface GUID for the wireless interface when performing profile operations. When a
/// wireless interface is removed, its state is cleared from Wireless LAN Service (WLANSVC) and no profile operations are possible.
/// </para>
/// <para>
/// The <c>WlanSetProfilePosition</c> function can fail with <c>ERROR_INVALID_PARAMETER</c> if the wireless interface specified in
/// the pInterfaceGuid parameter has been removed from the system (a USB wireless adapter that has been removed, for example).
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetprofileposition DWORD WlanSetProfilePosition( HANDLE
// hClientHandle, const GUID *pInterfaceGuid, LPCWSTR strProfileName, DWORD dwPosition, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "06ef9f55-b425-4f61-9b9e-3c27cc3796f6")]
public static extern Win32Error WlanSetProfilePosition(HWLANSESSION hClientHandle, in Guid pInterfaceGuid, [MarshalAs(UnmanagedType.LPWStr)] string strProfileName,
uint dwPosition, IntPtr pReserved = default);
/// <summary>
/// The <c>WlanSetPsdIeDataList</c> function sets the proximity service discovery (PSD) information element (IE) data list.
/// </summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="strFormat">
/// The format of a PSD IE in the PSD IE data list passed in the pPsdIEDataList parameter. This is a NULL-terminated URI string that
/// specifies the namespace of the protocol used for discovery.
/// </param>
/// <param name="pPsdIEDataList">A pointer to a WLAN_RAW_DATA_LIST structure that contains the PSD IE data list to be set.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if the hClientHandle is NULL or not valid or pReserved is not NULL.</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>The handle hClientHandle was not found in the handle table.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value is returned if the function was called from a Windows XP with
/// SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// The Proximity Service Discovery Protocol is a Microsoft proprietary protocol that allows a client to discover services in its
/// physical proximity, which is defined by the radio range. The purpose of the Proximity Service Discovery Protocol is to convey
/// service discovery information, such as service advertisements, as part of Beacon frames. Access points (APs) and stations (STAs)
/// that operate in ad hoc mode periodically broadcast beacon frames. The beacon frame can contain single or multiple proprietary
/// information elements that carry discovery information pertaining to the services that the device offers.
/// </para>
/// <para>
/// A PSD IE is used to transmit compressed information provided by higher-level discovery protocols for the purpose of passive
/// discovery. One such higher-level protocol used for discovery is the WS-Discovery protocol. Any protocol can be used for discovery.
/// </para>
/// <para>
/// Windows Vista and Windows Server 2008 with the Wireless LAN Service installed support passive discovery for ad hoc clients, ad
/// hoc services, and infrastructure clients. This means an ad hoc service can advertise an available resource or service by
/// transmitting a PSD IE in one or more beacons. There is no guarantee that this beacon is received by an ad hoc or infrastructure client.
/// </para>
/// <para>
/// Windows 7 and Windows Server 2008 R2 with the Wireless LAN Service installed support passive discovery for ad hoc clients, ad
/// hoc services, and infrastructure clients in the same way as in Windows Vista. In addition, the PSD IE is also supported for the
/// wireless Hosted Network, a software-based wireless access point (AP). Applications on the local computer where the wireless
/// Hosted Network is to be run may use the <c>WlanSetPsdIeDataList</c> function to set the PSD IE before starting the wireless
/// Hosted Network. Once set, the PSD IE will be included in the beacon and probe response after the wireless Hosted Network is started.
/// </para>
/// <para>
/// Each application sending or receiving beacons maintains its own PSD IE data list. The pPsdIEDataList parameter points to a list
/// of PSD IEs generated by the application. Each PSD IE has the following format.
/// </para>
/// <para>
/// Element ID 221 specifies the Vendor-Specific information element defined in the IEEE 802.11 standards. The Organizational Unique
/// Identifier (OUI) contains a 3-byte, IEEE-assigned OUI of the vendor that defined the content of the information element in the
/// same order that the OUI would be transmitted in an IEEE 802.11 address field. The Element ID, Length, OUI, and OUI Type fields
/// are controlled by the automatic configuration service, while the application controls the rest of the fields.
/// </para>
/// <para>
/// The Format identifier hash field describes the format of the information carried in the PSD IE. To ensure uniqueness while
/// circumventing the need for central administration of format identifiers, a string in the form of a Uniform Resource Identifier
/// (URI), as specified in RFC 3986, is used to distinguish the format. However, because the transmission must be efficient and
/// space in the information element is limited, the string is not actually transmitted, but, instead, its hash is transmitted. On
/// the client, which is the receiving side of the beacon, the hash is matched against a known set of format identifiers.
/// </para>
/// <para>
/// The Format identifier hash field is represented by bits 0…31 of a hash-based message authentication code (HMAC) over the format
/// identifier string specified in the strFormat parameter. The HMAC is used to specify the format of the Data field of the PSD IE.
/// The formula used to calculate the HMAC is described in RFC 2104. Sample code for the calculation of the HMAC is as specified in
/// RFC 4634. When calculating the HMAC, use SHA-256 for the hash function. The key used is the "null" key ( <c>NULL</c> pointer to
/// the authentication key, and zero length authentication key per the source code in RFC 4634). Use the value of strFormat
/// parameter (including any spaces but excluding the NULL-termination character) as the input text encoded as Unicode UTF-16 in
/// little-endian format.
/// </para>
/// <para>For example, if the strFormat parameter is , then the first four octets of the corresponding HMAC is .</para>
/// <para>If the strFormat parameter is , then the four octets of the corresponding HMAC are .</para>
/// <para>When sending the first 4 octets of an HMAC over the network, send the first (left-most) octet first.</para>
/// <para>
/// Note that there may be collisions in the truncated HMACs, which means that it may be impossible to uniquely determine the
/// discovery protocol corresponding to the payload of a PSD IE from the given bits of an HMAC. An application receiving a PSD IE
/// must take a best guess at the discovery protocol used from a given HMAC, then re-run the higher-level discovery protocol once a
/// connection has been established.
/// </para>
/// <para>
/// At most, five PSD IEs can be passed in a list. Also, the total length, in bytes, of the PSD IE list may be restricted by
/// hardware limitations on the length of a beacon.
/// </para>
/// <para>
/// An application can call <c>WlanSetPsdIeDataList</c> many times. When <c>WlanSetPsdIeDataList</c> is called twice with the same
/// strFormat, the contents of the WLAN_RAW_DATA_LIST populated by the first function call are overwritten by the second call's
/// <c>WLAN_RAW_DATA_LIST</c> payload. When <c>WlanSetPsdIeDataList</c> is called with the pPsdIEDataList parameter set to
/// <c>NULL</c>, the PSD IE list associated with strFormat is cleared. When <c>WlanSetPsdIeDataList</c> is called with both the
/// pPsdIEDataList and strFormat parameters set to <c>NULL</c>, all PSD IE lists set by the application are cleared.
/// </para>
/// <para>
/// The wireless service processes PSD IE data lists set by different applications and generates raw IE data blobs. When a machine
/// creates or joins an ad-hoc network on any wireless adapter, it sends beacons that include a PSD IE data blob associated with the
/// network to other machines.
/// </para>
/// <para>Stations can call WlanExtractPsdIEDataList function to get the PSD IE data list after receiving a beacon from a machine.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetpsdiedatalist DWORD WlanSetPsdIEDataList( HANDLE
// hClientHandle, LPCWSTR strFormat, const PWLAN_RAW_DATA_LIST pPsdIEDataList, PVOID pReserved );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "eea402d3-9a5f-4446-bf6c-9ab8430f9c60")]
public static extern Win32Error WlanSetPsdIEDataList(HWLANSESSION hClientHandle, [Optional, MarshalAs(UnmanagedType.LPWStr)] string strFormat,
[In, Optional] IntPtr pPsdIEDataList, IntPtr pReserved = default);
/// <summary>The WlanGetProfileList function sets the security settings for a configurable object.</summary>
/// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
/// <param name="SecurableObject">
/// A WLAN_SECURABLE_OBJECT value that specifies the object to which the security settings will be applied.
/// </param>
/// <param name="strModifiedSDDL">
/// A security descriptor string that specifies the new security settings for the object. This string must be NULL-terminated. For
/// more information, see the Remarks section.
/// </param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>A parameter is incorrect. This error is returned if any of the following conditions occur:</term>
/// </item>
/// <item>
/// <term>ERROR_INVALID_HANDLE</term>
/// <term>
/// A handle is invalid. This error is returned if the handle specified in the hClientHandle parameter was not found in the handle table.
/// </term>
/// </item>
/// <item>
/// <term>ERROR_ACCESS_DENIED</term>
/// <term>The caller does not have sufficient permissions.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// <para>
/// A successful call to the <c>WlanSetSecuritySettings</c> function overrides the default permissions associated with an object.
/// For more information about default permissions, see Native Wifi API Permissions.
/// </para>
/// <para>The following describes the procedure for creating a security descriptor object and parsing it as a string.</para>
/// <list type="number">
/// <item>
/// <term>Call InitializeSecurityDescriptor to create a security descriptor in memory.</term>
/// </item>
/// <item>
/// <term>Call SetSecurityDescriptorOwner to set the owner information for the security descriptor.</term>
/// </item>
/// <item>
/// <term>Call InitializeAcl to create a discretionary access control list (DACL) in memory.</term>
/// </item>
/// <item>
/// <term>
/// Call AddAccessAllowedAce or AddAccessDeniedAce to add access control entries (ACEs) to the DACL. Set the AccessMask parameter to
/// one of the following bitwise OR combinations as appropriate:
/// </term>
/// </item>
/// <item>
/// <term>Call SetSecurityDescriptorDacl to add the DACL to the security descriptor.</term>
/// </item>
/// <item>
/// <term>Call ConvertSecurityDescriptorToStringSecurityDescriptor to convert the descriptor to string.</term>
/// </item>
/// </list>
/// <para>
/// The string returned by ConvertSecurityDescriptorToStringSecurityDescriptor can then be used as the strModifiedSDDL parameter
/// value when calling <c>WlanSetSecuritySettings</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlansetsecuritysettings DWORD WlanSetSecuritySettings(
// HANDLE hClientHandle, WLAN_SECURABLE_OBJECT SecurableObject, LPCWSTR strModifiedSDDL );
[DllImport(Lib.Wlanapi, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "6038e4bc-7f07-4148-ac34-e290c8c40e99")]
public static extern Win32Error WlanSetSecuritySettings(HWLANSESSION hClientHandle, WLAN_SECURABLE_OBJECT SecurableObject, [MarshalAs(UnmanagedType.LPWStr)] string strModifiedSDDL);
/// <summary>
/// Displays the wireless profile user interface (UI). This UI is used to view and edit advanced settings of a wireless network profile.
/// </summary>
/// <param name="dwClientVersion">
/// Specifies the highest version of the WLAN API that the client supports. Values other than WLAN_UI_API_VERSION will be ignored.
/// </param>
/// <param name="wstrProfileName">
/// <para>Contains the name of the profile to be viewed or edited. Profile names are case-sensitive. This string must be NULL-terminated.</para>
/// <para>
/// The supplied profile must be present on the interface pInterfaceGuid. That means the profile must have been previously created
/// and saved in the profile store and that the profile must be valid for the supplied interface.
/// </para>
/// </param>
/// <param name="pInterfaceGuid">The GUID of the interface.</param>
/// <param name="hWnd">The handle of the application window requesting the UI display.</param>
/// <param name="wlStartPage">A WL_DISPLAY_PAGES value that specifies the active tab when the UI dialog box appears.</param>
/// <param name="pReserved">Reserved for future use. Must be set to <c>NULL</c>.</param>
/// <param name="pWlanReasonCode">A pointer to a WLAN_REASON_CODE value that indicates why the UI display failed.</param>
/// <returns>
/// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
/// <para>If the function fails, the return value may be one of the following return codes.</para>
/// <list type="table">
/// <listheader>
/// <term>Return code</term>
/// <term>Description</term>
/// </listheader>
/// <item>
/// <term>ERROR_INVALID_PARAMETER</term>
/// <term>One of the supplied parameters is not valid.</term>
/// </item>
/// <item>
/// <term>ERROR_NOT_SUPPORTED</term>
/// <term>
/// This function was called from an unsupported platform. This value will be returned if this function was called from a Windows XP
/// with SP3 or Wireless LAN API for Windows XP with SP2 client.
/// </term>
/// </item>
/// <item>
/// <term>RPC_STATUS</term>
/// <term>Various error codes.</term>
/// </item>
/// </list>
/// </returns>
/// <remarks>
/// If <c>WlanUIEditProfile</c> returns ERROR_SUCCESS, any changes to the profile made in the UI will be saved in the profile store.
/// </remarks>
// https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanuieditprofile DWORD WlanUIEditProfile( DWORD
// dwClientVersion, LPCWSTR wstrProfileName, GUID *pInterfaceGuid, HWND hWnd, WL_DISPLAY_PAGES wlStartPage, PVOID pReserved,
// PWLAN_REASON_CODE pWlanReasonCode );
[DllImport(Lib.Wlanui, SetLastError = false, ExactSpelling = true)]
[PInvokeData("wlanapi.h", MSDNShortId = "e6453a70-2a11-4f01-adc1-67346a5856b2")]
public static extern Win32Error WlanUIEditProfile(uint dwClientVersion, [MarshalAs(UnmanagedType.LPWStr)] string wstrProfileName, in Guid pInterfaceGuid,
HWND hWnd, WL_DISPLAY_PAGES wlStartPage, [Optional] IntPtr pReserved, out WLAN_REASON_CODE pWlanReasonCode);
/// <summary>Provides a handle to a Wi-Fi Direct service.</summary>
[StructLayout(LayoutKind.Sequential)]
public struct HWFDSERVICE : IHandle
{
private IntPtr handle;
/// <summary>Initializes a new instance of the <see cref="HWFDSERVICE"/> struct.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
public HWFDSERVICE(IntPtr preexistingHandle) => handle = preexistingHandle;
/// <summary>Returns an invalid handle by instantiating a <see cref="HWFDSERVICE"/> object with <see cref="IntPtr.Zero"/>.</summary>
public static HWFDSERVICE NULL => new HWFDSERVICE(IntPtr.Zero);
/// <summary>Gets a value indicating whether this instance is a null handle.</summary>
public bool IsNull => handle == IntPtr.Zero;
/// <summary>Performs an explicit conversion from <see cref="HWFDSERVICE"/> to <see cref="IntPtr"/>.</summary>
/// <param name="h">The handle.</param>
/// <returns>The result of the conversion.</returns>
public static explicit operator IntPtr(HWFDSERVICE h) => h.handle;
/// <summary>Performs an implicit conversion from <see cref="IntPtr"/> to <see cref="HWFDSERVICE"/>.</summary>
/// <param name="h">The pointer to a handle.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator HWFDSERVICE(IntPtr h) => new HWFDSERVICE(h);
/// <summary>Implements the operator !=.</summary>
/// <param name="h1">The first handle.</param>
/// <param name="h2">The second handle.</param>
/// <returns>The result of the operator.</returns>
public static bool operator !=(HWFDSERVICE h1, HWFDSERVICE h2) => !(h1 == h2);
/// <summary>Implements the operator ==.</summary>
/// <param name="h1">The first handle.</param>
/// <param name="h2">The second handle.</param>
/// <returns>The result of the operator.</returns>
public static bool operator ==(HWFDSERVICE h1, HWFDSERVICE h2) => h1.Equals(h2);
/// <inheritdoc/>
2020-09-01 16:01:09 -04:00
public override bool Equals(object obj) => obj is HWFDSERVICE h && handle == h.handle;
/// <inheritdoc/>
public override int GetHashCode() => handle.GetHashCode();
/// <inheritdoc/>
public IntPtr DangerousGetHandle() => handle;
}
/// <summary>Provides a handle to a WFD session.</summary>
[StructLayout(LayoutKind.Sequential)]
public struct HWFDSESSION : IHandle
{
private IntPtr handle;
/// <summary>Initializes a new instance of the <see cref="HWFDSESSION"/> struct.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
public HWFDSESSION(IntPtr preexistingHandle) => handle = preexistingHandle;
/// <summary>Returns an invalid handle by instantiating a <see cref="HWFDSESSION"/> object with <see cref="IntPtr.Zero"/>.</summary>
public static HWFDSESSION NULL => new HWFDSESSION(IntPtr.Zero);
/// <summary>Gets a value indicating whether this instance is a null handle.</summary>
public bool IsNull => handle == IntPtr.Zero;
/// <summary>Performs an explicit conversion from <see cref="HWFDSESSION"/> to <see cref="IntPtr"/>.</summary>
/// <param name="h">The handle.</param>
/// <returns>The result of the conversion.</returns>
public static explicit operator IntPtr(HWFDSESSION h) => h.handle;
/// <summary>Performs an implicit conversion from <see cref="IntPtr"/> to <see cref="HWFDSESSION"/>.</summary>
/// <param name="h">The pointer to a handle.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator HWFDSESSION(IntPtr h) => new HWFDSESSION(h);
/// <summary>Implements the operator !=.</summary>
/// <param name="h1">The first handle.</param>
/// <param name="h2">The second handle.</param>
/// <returns>The result of the operator.</returns>
public static bool operator !=(HWFDSESSION h1, HWFDSESSION h2) => !(h1 == h2);
/// <summary>Implements the operator ==.</summary>
/// <param name="h1">The first handle.</param>
/// <param name="h2">The second handle.</param>
/// <returns>The result of the operator.</returns>
public static bool operator ==(HWFDSESSION h1, HWFDSESSION h2) => h1.Equals(h2);
/// <inheritdoc/>
2020-09-01 16:01:09 -04:00
public override bool Equals(object obj) => obj is HWFDSESSION h && handle == h.handle;
/// <inheritdoc/>
public override int GetHashCode() => handle.GetHashCode();
/// <inheritdoc/>
public IntPtr DangerousGetHandle() => handle;
}
/// <summary>Provides a handle to a WLAN session.</summary>
[StructLayout(LayoutKind.Sequential)]
public struct HWLANSESSION : IHandle
{
private IntPtr handle;
/// <summary>Initializes a new instance of the <see cref="HWLANSESSION"/> struct.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
public HWLANSESSION(IntPtr preexistingHandle) => handle = preexistingHandle;
/// <summary>Returns an invalid handle by instantiating a <see cref="HWLANSESSION"/> object with <see cref="IntPtr.Zero"/>.</summary>
public static HWLANSESSION NULL => new HWLANSESSION(IntPtr.Zero);
/// <summary>Gets a value indicating whether this instance is a null handle.</summary>
public bool IsNull => handle == IntPtr.Zero;
/// <summary>Performs an explicit conversion from <see cref="HWLANSESSION"/> to <see cref="IntPtr"/>.</summary>
/// <param name="h">The handle.</param>
/// <returns>The result of the conversion.</returns>
public static explicit operator IntPtr(HWLANSESSION h) => h.handle;
/// <summary>Performs an implicit conversion from <see cref="IntPtr"/> to <see cref="HWLANSESSION"/>.</summary>
/// <param name="h">The pointer to a handle.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator HWLANSESSION(IntPtr h) => new HWLANSESSION(h);
/// <summary>Implements the operator !=.</summary>
/// <param name="h1">The first handle.</param>
/// <param name="h2">The second handle.</param>
/// <returns>The result of the operator.</returns>
public static bool operator !=(HWLANSESSION h1, HWLANSESSION h2) => !(h1 == h2);
/// <summary>Implements the operator ==.</summary>
/// <param name="h1">The first handle.</param>
/// <param name="h2">The second handle.</param>
/// <returns>The result of the operator.</returns>
public static bool operator ==(HWLANSESSION h1, HWLANSESSION h2) => h1.Equals(h2);
/// <inheritdoc/>
2020-09-01 16:01:09 -04:00
public override bool Equals(object obj) => obj is HWLANSESSION h && handle == h.handle;
/// <inheritdoc/>
public override int GetHashCode() => handle.GetHashCode();
/// <inheritdoc/>
public IntPtr DangerousGetHandle() => handle;
}
/// <summary>Provides a <see cref="SafeHandle"/> for <see cref="HWFDSERVICE"/> that is disposed using <see cref="WFDCloseHandle"/>.</summary>
public class SafeHWFDSERVICE : SafeHANDLE
{
/// <summary>Initializes a new instance of the <see cref="SafeHWFDSERVICE"/> class and assigns an existing handle.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
/// <param name="ownsHandle">
/// <see langword="true"/> to reliably release the handle during the finalization phase; otherwise, <see langword="false"/> (not recommended).
/// </param>
public SafeHWFDSERVICE(IntPtr preexistingHandle, bool ownsHandle = true) : base(preexistingHandle, ownsHandle) { }
/// <summary>Initializes a new instance of the <see cref="SafeHWFDSERVICE"/> class.</summary>
private SafeHWFDSERVICE() : base() { }
/// <summary>Performs an implicit conversion from <see cref="SafeHWFDSERVICE"/> to <see cref="HWFDSERVICE"/>.</summary>
/// <param name="h">The safe handle instance.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator HWFDSERVICE(SafeHWFDSERVICE h) => h.handle;
/// <inheritdoc/>
protected override bool InternalReleaseHandle() => WFDCloseHandle(handle).Succeeded;
}
/// <summary>Provides a <see cref="SafeHandle"/> for <see cref="HWFDSESSION"/> that is disposed using <see cref="WFDCancelOpenSession"/>.</summary>
public class SafeHWFDSESSION : SafeHANDLE
{
/// <summary>Initializes a new instance of the <see cref="SafeHWFDSESSION"/> class and assigns an existing handle.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
/// <param name="ownsHandle">
/// <see langword="true"/> to reliably release the handle during the finalization phase; otherwise, <see langword="false"/> (not recommended).
/// </param>
public SafeHWFDSESSION(IntPtr preexistingHandle, bool ownsHandle = true) : base(preexistingHandle, ownsHandle) { }
/// <summary>Initializes a new instance of the <see cref="SafeHWFDSESSION"/> class.</summary>
private SafeHWFDSESSION() : base() { }
/// <summary>Performs an implicit conversion from <see cref="SafeHWFDSESSION"/> to <see cref="HWFDSESSION"/>.</summary>
/// <param name="h">The safe handle instance.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator HWFDSESSION(SafeHWFDSESSION h) => h.handle;
/// <inheritdoc/>
protected override bool InternalReleaseHandle() => WFDCancelOpenSession(handle).Succeeded;
}
///// <summary>
///// The <c>WlanEnumInterfaces</c> function enumerates all of the wireless LAN interfaces currently enabled on the local computer.
///// </summary>
///// <param name="hClientHandle">The client's session handle, obtained by a previous call to the WlanOpenHandle function.</param>
///// <param name="ppInterfaceList">
///// <para>
///// The returned list of wireless LAN interfaces in an array of WLAN_INTERFACE_INFO structures.
///// </para>
///// </param>
///// <returns>
///// <para>If the function succeeds, the return value is ERROR_SUCCESS.</para>
///// <para>If the function fails, the return value may be one of the following return codes.</para>
///// <list type="table">
///// <listheader>
///// <term>Return code</term>
///// <term>Description</term>
///// </listheader>
///// <item>
///// <term>ERROR_INVALID_PARAMETER</term>
///// <term>
///// A parameter is incorrect. This error is returned if the hClientHandle or ppInterfaceList parameter is NULL. This error is
///// returned if the pReserved is not NULL. This error is also returned if the hClientHandle parameter is not valid.
///// </term>
///// </item>
///// <item>
///// <term>ERROR_INVALID_HANDLE</term>
///// <term>The handle hClientHandle was not found in the handle table.</term>
///// </item>
///// <item>
///// <term>RPC_STATUS</term>
///// <term>Various error codes.</term>
///// </item>
///// <item>
///// <term>ERROR_NOT_ENOUGH_MEMORY</term>
///// <term>Not enough memory is available to process this request and allocate memory for the query results.</term>
///// </item>
///// </list>
///// </returns>
//[PInvokeData("wlanapi.h", MSDNShortId = "7f817edf-1b1d-495c-afd9-d97e3ae0caab")]
//public static Win32Error WlanEnumInterfaces(HWLANSESSION hClientHandle, out WLAN_INTERFACE_INFO[] ppInterfaceList)
//{
// var ret = WlanEnumInterfaces(hClientHandle, default, out var mem);
// ppInterfaceList = ret.Succeeded ? mem.DangerousGetHandle().ToStructure<WLAN_INTERFACE_INFO_LIST>().InterfaceInfo : null;
// mem?.Dispose();
// return ret;
//}
/// <summary>Provides a <see cref="SafeHandle"/> for WLAN API memory that is disposed using <see cref="WlanFreeMemory"/>.</summary>
public class SafeHWLANMEM : SafeHANDLE
{
/// <summary>Initializes a new instance of the <see cref="SafeHWLANMEM"/> class and assigns an existing handle.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
/// <param name="ownsHandle">
/// <see langword="true"/> to reliably release the handle during the finalization phase; otherwise, <see langword="false"/> (not recommended).
/// </param>
public SafeHWLANMEM(IntPtr preexistingHandle, bool ownsHandle = true) : base(preexistingHandle, ownsHandle) { }
/// <summary>Initializes a new instance of the <see cref="SafeHWLANMEM"/> class.</summary>
private SafeHWLANMEM() : base() { }
/// <summary>Performs an implicit conversion from <see cref="SafeHWLANMEM"/> to <see cref="IntPtr"/>.</summary>
/// <param name="h">The safe handle instance.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator IntPtr(SafeHWLANMEM h) => h.handle;
/// <inheritdoc/>
protected override bool InternalReleaseHandle() { WlanFreeMemory(handle); return true; }
}
/// <summary>Provides a <see cref="SafeHandle"/> for <see cref="HWLANSESSION"/> that is disposed using <see cref="WlanCloseHandle"/>.</summary>
public class SafeHWLANSESSION : SafeHANDLE
{
/// <summary>Initializes a new instance of the <see cref="SafeHWLANSESSION"/> class and assigns an existing handle.</summary>
/// <param name="preexistingHandle">An <see cref="IntPtr"/> object that represents the pre-existing handle to use.</param>
/// <param name="ownsHandle">
/// <see langword="true"/> to reliably release the handle during the finalization phase; otherwise, <see langword="false"/> (not recommended).
/// </param>
public SafeHWLANSESSION(IntPtr preexistingHandle, bool ownsHandle = true) : base(preexistingHandle, ownsHandle) { }
/// <summary>Initializes a new instance of the <see cref="SafeHWLANSESSION"/> class.</summary>
private SafeHWLANSESSION() : base() { }
/// <summary>Performs an implicit conversion from <see cref="SafeHWLANSESSION"/> to <see cref="HWLANSESSION"/>.</summary>
/// <param name="h">The safe handle instance.</param>
/// <returns>The result of the conversion.</returns>
public static implicit operator HWLANSESSION(SafeHWLANSESSION h) => h.handle;
/// <inheritdoc/>
protected override bool InternalReleaseHandle() => WlanCloseHandle(handle).Succeeded;
}
internal class WlanMarshaler<T> : ICustomMarshaler
{
private WlanMarshaler(string _)
{
}
/// <summary>Gets the instance.</summary>
/// <param name="cookie">The cookie.</param>
/// <returns></returns>
public static ICustomMarshaler GetInstance(string cookie) => new WlanMarshaler<T>(cookie);
void ICustomMarshaler.CleanUpManagedData(object ManagedObj) => throw new NotImplementedException();
void ICustomMarshaler.CleanUpNativeData(IntPtr pNativeData) => WlanFreeMemory(pNativeData);
int ICustomMarshaler.GetNativeDataSize() => -1;
IntPtr ICustomMarshaler.MarshalManagedToNative(object ManagedObj) => throw new NotImplementedException();
object ICustomMarshaler.MarshalNativeToManaged(IntPtr pNativeData) => typeof(T) == typeof(string) ? StringHelper.GetString(pNativeData, CharSet.Unicode) : (object)pNativeData.ToStructure<T>();
}
}
}