⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wifi.cpp

📁 Wince下通过ndisuio使用wifi卡的示例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "Windev.h"
#include "Wifi.h"

//-----------------------------[ CAvailableAPList ]------------------------------

wifi::CAvailableAPList::CAvailableAPList(void)
{
    this->Clear();
}

wifi::CAvailableAPList::CAvailableAPList(const LPBYTE lpByte)
{
    this->ParseFrom(lpByte);
}

wifi::CAvailableAPList::CAvailableAPList(const wifi::CAvailableAPList &wlan)
{
    this->m_bssidList.NumberOfItems = wlan.m_bssidList.NumberOfItems;
    this->m_vectBssid = wlan.m_vectBssid;
}

wifi::CAvailableAPList  wifi::CAvailableAPList::operator = (const wifi::CAvailableAPList &wlan)
{
    this->m_bssidList.NumberOfItems = wlan.m_bssidList.NumberOfItems;
    this->m_vectBssid = wlan.m_vectBssid;

    return *this;
}

void            wifi::CAvailableAPList::Clear()
{
    this->m_bssidList.NumberOfItems = 0;
    this->m_vectBssid.clear();
}

BOOL            wifi::CAvailableAPList::ParseFrom(const LPBYTE lpByte)
{
    this->Clear();
    if (lpByte)
    {
        this->m_bssidList.NumberOfItems = *(DWORD*)lpByte;
        int nOffset = LengthOffset;
        for (UINT i = 0; i < this->m_bssidList.NumberOfItems; i++)
        {
            NDIS_WLAN_BSSID bssid;
            if (get_NDIS_WLAN_BSSID(&lpByte[nOffset], &bssid))
            {
                nOffset += bssid.Length;
                this->m_vectBssid.push_back(bssid);
            }
            else break;
        }
    }

    return TRUE;
}

BOOL            wifi::CAvailableAPList::get_NDIS_WLAN_BSSID(const LPBYTE lpByte, PNDIS_WLAN_BSSID pBssid)
{
    BOOL    bRet = TRUE;

    if (lpByte == NULL || pBssid == NULL)
    {
        this->m_strErr.assign(_T("[CAvailableAPList] lpByte is null or pBssid is null."));
        return FALSE;
    }

    pBssid->Length = *(DWORD*)lpByte;
    memcpy(pBssid->MacAddress, &lpByte[MacAddressOffset], 6);
    memcpy(pBssid->Reserved, &lpByte[ReservedOffset], 2);
    pBssid->Ssid.SsidLength = *(DWORD*)&lpByte[SsidOffset];
    memcpy(pBssid->Ssid.Ssid, &lpByte[SsidOffset + 4], 32);
    if (pBssid->Ssid.SsidLength < 32) pBssid->Ssid.Ssid[pBssid->Ssid.SsidLength] = 0;
    pBssid->Privacy = *(DWORD*)&lpByte[PrivacyOffset];
    pBssid->NetworkTypeInUse = (NDIS_802_11_NETWORK_TYPE)*(DWORD*)&lpByte[NetworkTypeInUseOffset];
    if (!this->get_NDIS_802_11_CONFIGURATION(&lpByte[ConfigurationOffset], &pBssid->Configuration))
        return FALSE;
    pBssid->InfrastructureMode = (NDIS_802_11_NETWORK_INFRASTRUCTURE)*(DWORD*)&lpByte[InfrastructureModeOffset];
    memcpy(pBssid->SupportedRates, &lpByte[SupportedRatesOffset], 8);

    return  bRet;
}

BOOL            wifi::CAvailableAPList::get_NDIS_802_11_CONFIGURATION(const LPBYTE lpByte, PNDIS_802_11_CONFIGURATION pConfig)
{
    BOOL    bRet = TRUE;

    if (lpByte == NULL || pConfig == NULL)
    {
        this->m_strErr.assign(_T("[CAvailableAPList] lpByte is null or pConfig is null."));
        return FALSE;
    }

    pConfig->Length = *(DWORD*)lpByte;
    pConfig->BeaconPeriod = *(DWORD*)&lpByte[4];
    pConfig->ATIMWindow = *(DWORD*)&lpByte[8];
    pConfig->DSConfig = *(DWORD*)&lpByte[12];
    bRet = this->get_NDIS_802_11_CONFIGURATION_FH(&lpByte[16], &pConfig->FHConfig);

    return  bRet;
}

BOOL            wifi::CAvailableAPList::get_NDIS_802_11_CONFIGURATION_FH(const LPBYTE lpByte, PNDIS_802_11_CONFIGURATION_FH pConfigFH)
{
    BOOL    bRet = TRUE;

    if (lpByte == NULL || pConfigFH)
    {
        this->m_strErr.assign(_T("[CAvailableAPList] lpByte is null or pConfigFH is null."));
        return FALSE;
    }

    pConfigFH->Length = *(DWORD*)lpByte;
    pConfigFH->HopPattern = *(DWORD*)&lpByte[4];
    pConfigFH->HopSet = *(DWORD*)&lpByte[8];
    pConfigFH->DwellTime = *(DWORD*)&lpByte[12];

    return  bRet;
}

wifi::CAvailableAPList::~CAvailableAPList(void)
{
}

//-------------------------------------------------------------------------------
//-----------------------------[ CPreferredAPList ]------------------------------

wifi::CPreferredAPList::CPreferredAPList(void)
{
    this->Clear();
}

wifi::CPreferredAPList::CPreferredAPList(const LPBYTE lpByte)
{
    this->ParseFrom(lpByte);
}

wifi::CPreferredAPList::CPreferredAPList(const wifi::CPreferredAPList &wlan)
{
    this->m_stSsidList.NumberOfItems = wlan.m_stSsidList.NumberOfItems;
    this->m_vectStSsid = wlan.m_vectStSsid;
}

wifi::CPreferredAPList  wifi::CPreferredAPList::operator = (const wifi::CPreferredAPList &wlan)
{
    this->m_stSsidList.NumberOfItems = wlan.m_stSsidList.NumberOfItems;
    this->m_vectStSsid = wlan.m_vectStSsid;

    return *this;
}

void            wifi::CPreferredAPList::Clear()
{
    this->m_stSsidList.NumberOfItems = 0;
    this->m_vectStSsid.clear();
}

BOOL            wifi::CPreferredAPList::ParseFrom(const LPBYTE lpByte)
{
    this->Clear();
    if (lpByte)
    {
        AfxMessageBox(_T("[ParseFrom] OK-001"));
        this->m_stSsidList.NumberOfItems = *(DWORD*)lpByte;
        AfxMessageBox(_T("[ParseFrom] OK-002"));
        this->m_stSsidList.Index = *(DWORD*)&lpByte[BaseIndexOffset];
        int nOffset = ConfigOffset;
        for (UINT i = 0; i < this->m_stSsidList.NumberOfItems; i++)
        {
            AfxMessageBox(_T("[ParseFrom] OK-002-01"));
            WZC_WLAN_CONFIG wzc;
            if (get_WZC_WLAN_CONFIG(&lpByte[nOffset], &wzc))
            {
                nOffset += wzc.Length;
                this->m_vectStSsid.push_back(wzc);
            }
            else break;
        }
        AfxMessageBox(_T("[ParseFrom] OK-003"));
    }

    return TRUE;
}

BOOL            wifi::CPreferredAPList::get_WZC_WLAN_CONFIG(const LPBYTE lpByte, PWZC_WLAN_CONFIG pConfig)
{
    BOOL    bRet = TRUE;

    if (lpByte == NULL || pConfig == NULL)
    {
        this->m_strErr.assign(_T("[CPreferredAPList] lpByte is null or pConfig is null[%d]."));
        return FALSE;
    }

    AfxMessageBox(_T("[get_WZC_WLAN_CONFIG] OK-001"));
    pConfig->Length = *(DWORD*)lpByte;
    pConfig->dwCtlFlags = *(DWORD*)&lpByte[4];
    memcpy(pConfig->MacAddress, &lpByte[8], 6);
    memcpy(pConfig->Reserved, &lpByte[14], 2);
    pConfig->Ssid.SsidLength = *(DWORD*)&lpByte[16];
    memcpy(pConfig->Ssid.Ssid, &lpByte[20], 32);
    AfxMessageBox(_T("[get_WZC_WLAN_CONFIG] OK-002"));
    UINT nLen = (pConfig->Ssid.SsidLength > 31) ? 31 : pConfig->Ssid.SsidLength; 
    pConfig->Ssid.Ssid[nLen] = 0;
    pConfig->Privacy = *(DWORD*)&lpByte[52];
    pConfig->Rssi = *(DWORD*)&lpByte[56];
    pConfig->NetworkTypeInUse = (NDIS_802_11_NETWORK_TYPE)*(DWORD*)&lpByte[60];
    pConfig->InfrastructureMode = (NDIS_802_11_NETWORK_INFRASTRUCTURE)*(DWORD*)&lpByte[96];
    AfxMessageBox(_T("[get_WZC_WLAN_CONFIG] OK-003"));
    memcpy(pConfig->SupportedRates, &lpByte[100], 8);
    pConfig->KeyIndex = *(DWORD*)&lpByte[108];
    pConfig->KeyLength = *(DWORD*)&lpByte[112];
    memcpy(pConfig->KeyMaterial, &lpByte[116], pConfig->KeyLength);
    pConfig->KeyMaterial[pConfig->KeyLength] = 0;
    pConfig->AuthenticationMode = (NDIS_802_11_AUTHENTICATION_MODE)*(DWORD*)&lpByte[148];
    AfxMessageBox(_T("[get_WZC_WLAN_CONFIG] OK-004"));

    return  bRet;
}

wifi::CPreferredAPList::~CPreferredAPList(void)
{
}

//-------------------------------------------------------------------------------
//-----------------------------[ CWirelessUtil    ]------------------------------

#define NDISUIO_DEVICE_NAME TEXT("UIO1:")

#define STA_MAX_QUALITY     (255)   ///< From wlclient.h
#define STA_MIN_QUALITY     (0)     ///< From wlclient.h

wifi::CWirelessUtil::CWirelessUtil() : m_hNdisUio(NULL), m_bInit(FALSE)
{
}

BOOL            wifi::CWirelessUtil::Init()
{
    ///< Open NDISUIO Device
    if (m_hNdisUio == NULL)
    {
        m_hNdisUio = ::CreateFile(
                               NDISUIO_DEVICE_NAME,                         // Object name.
                               0x00,                                        // Desired access.
                               0x00,                                        // Share Mode.
                               NULL,                                        // Security Attr
                               OPEN_EXISTING,                               // Creation Disposition.
                               FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,// Flag and Attributes..
                               (HANDLE)INVALID_HANDLE_VALUE);

        if (m_hNdisUio == INVALID_HANDLE_VALUE)
        {
            DWORD   dwErr = GetLastError();
            TCHAR   szErr[100] = _T("");
            _stprintf(szErr, _T("[CWirelessUtil] CreateFile failed, ErrorCode : %d"), dwErr);
            this->m_strErr.assign(szErr);

            return FALSE;
        }
    }

    ///< EnumInterfaces
    DWORD   dwRet = WZCEnumInterfaces(NULL, &m_keyTable);
    if (dwRet != ERROR_SUCCESS)
    {
        DWORD   dwErr = GetLastError();
        TCHAR   szErr[100] = _T("");
        _stprintf(szErr, _T("[CWirelessUtil] WZCEnumInterfaces failed, ErrorCode : %d"), dwErr);
        this->m_strErr.assign(szErr);

        return FALSE;
    }
    if (m_keyTable.dwNumIntfs <= 0)
    {
        this->m_strErr.assign(_T("[CWirelessUtil] There is no wireless NIC interface."));

        return FALSE;
    }
    this->m_bInit = TRUE;

    return TRUE;
}

LPCWSTR         wifi::CWirelessUtil::GetFirstDeviceName()
{
    if (this->m_keyTable.dwNumIntfs > 0)
        return (LPCWSTR)this->m_keyTable.pIntfs[0].wszGuid;

    return  NULL;
}

BOOL            wifi::CWirelessUtil::IsNativeWifiDevice(LPCTSTR ptcDeviceName, INT *piSignalStrength)
{
    NATIVEWIFI_STATISTICS   NwifiStatistics = {0};
    DWORD                   dwBytesWritten = 0;
    BOOL                    fWireless = FALSE;

    NwifiStatistics.ptcDeviceName = (PTCHAR)ptcDeviceName;

    if (DeviceIoControl(
            m_hNdisUio,
            IOCTL_NDISUIO_NATIVEWIFI_STATISTICS,
            NULL,
            0,
            &NwifiStatistics,
            sizeof(NATIVEWIFI_STATISTICS),
            &dwBytesWritten,
            NULL))
    {
        if (NwifiStatistics.PhysicalMediaType == NdisPhysicalMediumNativeWifi && NwifiStatistics.bStationMode)
        {
            DWORD   dwSignalLevel;
            
            fWireless = TRUE;

            RETAILMSG (1, (TEXT("Nwifi Strength = [%d]\r\n"),
                NwifiStatistics.ulRSSI));            

            dwSignalLevel = ((NwifiStatistics.ulRSSI - STA_MIN_QUALITY) * 5 ) / (STA_MAX_QUALITY - STA_MIN_QUALITY);

            if (piSignalStrength)
                *piSignalStrength = MapWirelessSignalStrengthToRSSI(dwSignalLevel);
        }
    }

    return fWireless;
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -