Vanara/PInvoke/WlanApi/WlanApi.Funcs.cs

6015 lines
342 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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/>
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/>
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/>
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>();
}
}
}