internal void OnWlanAdhocNetwork(Wlan.WlanNotificationData notifyData, Wlan.WlanAdhocNetworkState adhocNetworkState)
 {
     if (WlanAdhocNetworkNotification != null)
     {
         WlanAdhocNetworkNotification(notifyData, adhocNetworkState);
     }
     if (queueEvents)
     {
         WlanAdhocNetworkNotificationData queuedEvent = new WlanAdhocNetworkNotificationData();
         queuedEvent.notifyData        = notifyData;
         queuedEvent.adhocNetworkState = adhocNetworkState;
         EnqueueEvent(queuedEvent);
     }
 }
        private void OnWlanNotification(ref Wlan.WlanNotificationData notifyData, IntPtr context)
        {
            WlanInterface wlanIface = ifaces.ContainsKey(notifyData.interfaceGuid) ? ifaces[notifyData.interfaceGuid] : null;

            switch (notifyData.notificationSource)
            {
            case Wlan.WlanNotificationSource.ACM:
                switch ((Wlan.WlanNotificationCodeAcm)notifyData.notificationCode)
                {
                case Wlan.WlanNotificationCodeAcm.AdhocNetworkStateChange:
                    //int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanAdhocNetworkState));
                    //if (notifyData.dataSize >= expectedSize)
                    //{
                    Wlan.WlanAdhocNetworkState adhocNetworkState = (Wlan.WlanAdhocNetworkState)Marshal.ReadInt32(notifyData.dataPtr);
                    if (wlanIface != null)
                    {
                        wlanIface.OnWlanAdhocNetwork(notifyData, adhocNetworkState);
                    }
                    //}
                    break;

                case Wlan.WlanNotificationCodeAcm.ConnectionStart:
                case Wlan.WlanNotificationCodeAcm.ConnectionComplete:
                case Wlan.WlanNotificationCodeAcm.ConnectionAttemptFail:
                case Wlan.WlanNotificationCodeAcm.Disconnecting:
                case Wlan.WlanNotificationCodeAcm.Disconnected:
                    Wlan.WlanConnectionNotificationData?connNotifyData = ParseWlanConnectionNotification(ref notifyData);
                    if (connNotifyData.HasValue)
                    {
                        if (wlanIface != null)
                        {
                            wlanIface.OnWlanConnection(notifyData, connNotifyData.Value);
                        }
                    }
                    break;

                case Wlan.WlanNotificationCodeAcm.ScanFail:
                    try
                    {
                        int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanReasonCode));
                        if (notifyData.dataSize >= expectedSize)
                        {
                            Wlan.WlanReasonCode reasonCode = (Wlan.WlanReasonCode)Marshal.ReadInt32(notifyData.dataPtr);
                            if (wlanIface != null)
                            {
                                wlanIface.OnWlanReason(notifyData, reasonCode);
                            }
                        }
                    }
                    catch (Exception)
                    {
                    }

                    break;
                }
                break;

            case Wlan.WlanNotificationSource.MSM:
                switch ((Wlan.WlanNotificationCodeMsm)notifyData.notificationCode)
                {
                case Wlan.WlanNotificationCodeMsm.Associating:
                case Wlan.WlanNotificationCodeMsm.Associated:
                case Wlan.WlanNotificationCodeMsm.Authenticating:
                case Wlan.WlanNotificationCodeMsm.Connected:
                case Wlan.WlanNotificationCodeMsm.RoamingStart:
                case Wlan.WlanNotificationCodeMsm.RoamingEnd:
                case Wlan.WlanNotificationCodeMsm.Disassociating:
                case Wlan.WlanNotificationCodeMsm.Disconnected:
                case Wlan.WlanNotificationCodeMsm.PeerJoin:
                case Wlan.WlanNotificationCodeMsm.PeerLeave:
                case Wlan.WlanNotificationCodeMsm.AdapterRemoval:
                    Wlan.WlanConnectionNotificationData?connNotifyData = ParseWlanConnectionNotification(ref notifyData);
                    if (connNotifyData.HasValue)
                    {
                        if (wlanIface != null)
                        {
                            wlanIface.OnWlanConnection(notifyData, connNotifyData.Value);
                        }
                    }
                    break;
                }
                break;
            }

            if (wlanIface != null)
            {
                wlanIface.OnWlanNotification(notifyData);
            }
        }
        /// <summary>
        /// Se gatilla para recibir notificaciones en el cambio del estado de la red adhoc (Windows Vista)
        /// Si ocurre un error se informa en informationNetworkingHandler
        /// </summary>
        /// <param name="notifyData">Los datos de notificación</param>
        /// <param name="adhocNetworkState">El estado de la red adhoc que esta siendo notificado</param>
        private void WlanAdhocNetworkAction(Wlan.WlanNotificationData notifyData, Wlan.WlanAdhocNetworkState adhocNetworkState)
        {
            lock (syncPoint)
            {
                try
                {
                    if ((notifyData.notificationSource.Equals(Wlan.WlanNotificationSource.ACM) &&
                         notifyData.NotificationCode.Equals(Wlan.WlanNotificationCodeAcm.AdhocNetworkStateChange)))
                    {
                        if (adhocNetworkState.Equals(Wlan.WlanAdhocNetworkState.Connected))
                        {
                            if (netData.OpSystem.Equals(OpSystemType.WIN7))
                            {
                                wifiInformation("connection");
                                switch (connectionState)
                                {
                                case WifiConnectionState.CONNECTED:
                                {
                                    break;
                                }

                                case WifiConnectionState.DISCONNECTED:
                                {
                                    connectionState = WifiConnectionState.CONNECTED;
                                    break;
                                }

                                case WifiConnectionState.WAINTING:
                                {
                                    connectionState = WifiConnectionState.CONNECTED;
                                    break;
                                }
                                }
                            }
                        }
                        else if (adhocNetworkState.Equals(Wlan.WlanAdhocNetworkState.Formed))
                        {
                            if (netData.OpSystem.Equals(OpSystemType.WIN7))
                            {
                                wifiInformation("alone connection");
                                switch (connectionState)
                                {
                                case WifiConnectionState.CONNECTED:
                                {
                                    //connectionState = WifiConnectionState.WAINTING;
                                    break;
                                }

                                case WifiConnectionState.DISCONNECTED:
                                {
                                    connectionState = WifiConnectionState.WAINTING;
                                    break;
                                }

                                case WifiConnectionState.WAINTING:
                                {
                                    break;
                                }
                                }
                            }
                        }
                    }
                }
                catch (ThreadAbortException e)
                {
                    throw e;
                }
                catch (Exception e)
                {
                    wifiInformation("error " + e.Message);
                }
            }
        }