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

📄 wifi.cpp

📁 Wince下通过ndisuio使用wifi卡的示例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
} // IsDeviceWireless

long            wifi::CWirelessUtil::MapWirelessSignalStrengthToRSSI(IN  ULONG ulWss) 
{
    long    lRSSI;
    	
    switch (ulWss) 
    {
        case 0:
            lRSSI = -91;
            break;
        case 1:
            lRSSI = -82;
            break;
        case 2:
        	lRSSI = -72;
        	break;
        case 3:
        	lRSSI = - 68;
        	break;
        case 4:
            lRSSI = -58;
            break;
        case 5:
        	lRSSI = -56;
        	break;
        default:
            lRSSI = -92;
            break;
    }

    return (lRSSI);
}

BOOL            wifi::CWirelessUtil::GetSignalStrength(LPCTSTR ptcDeviceName, INT* piSignalStrength)
{
    BOOL                fRetVal         = TRUE;
    BOOL                bRet            = FALSE;
    PNDISUIO_QUERY_OID  pQueryOid       = NULL;
    DWORD               dwBytesReturned = 0;
    UCHAR               QueryBuffer[sizeof(NDISUIO_QUERY_OID) + sizeof(DWORD)];

    ASSERT(piSignalStrength);

    if (IsNativeWifiDevice(ptcDeviceName, piSignalStrength))
    {
        //
        //  Use Nativewifi API to get the RSSI.
        //

        RETAILMSG (1, (TEXT("SignalStrength = [%d]\r\n"),
            *piSignalStrength));
        
        bRet = TRUE;
    }
    else
    {        
        // Get Signal strength
        memset(QueryBuffer, 0, 8);
        pQueryOid = (PNDISUIO_QUERY_OID)&QueryBuffer[0];
        pQueryOid->ptcDeviceName = (PTCHAR)ptcDeviceName;
        pQueryOid->Oid = OID_802_11_RSSI;

        fRetVal = DeviceIoControl(
                    m_hNdisUio,
                    IOCTL_NDISUIO_QUERY_OID_VALUE,
                    (LPVOID) pQueryOid,
                    sizeof(NDISUIO_QUERY_OID) + sizeof(DWORD),
                    (LPVOID) pQueryOid,
                    sizeof(NDISUIO_QUERY_OID) + sizeof(DWORD),
                    &dwBytesReturned,
                    NULL);
        if (fRetVal == TRUE && piSignalStrength)
        {
            bRet = TRUE;
            *piSignalStrength = *(DWORD *)&pQueryOid->Data;
            if (*piSignalStrength == 0) *piSignalStrength = -92;
        }
        else
        {
            DWORD   dwErr = GetLastError();
            TCHAR   szErr[100] = _T("");
            _stprintf(szErr, _T("[CWirelessUtil:GetSignalStrength] DeviceIoControl failed, ErrorCode : %d"), dwErr);
            this->m_strErr.assign(szErr);
            bRet = FALSE;
        }
    }

    return bRet;
} // GetSignalStrength

std::wstring    wifi::CWirelessUtil::SignalStrengthToString(INT nSignalStrength)
{
    std::wstring    strSignal;

    if (nSignalStrength < -90)
        strSignal.assign(_T("No Signal"));
    else if (nSignalStrength < -81)
        strSignal.assign(_T("Very Low"));
    else if (nSignalStrength < -71)
        strSignal.assign(_T("Low"));
    else if (nSignalStrength < -67)
        strSignal.assign(_T("Good"));
    else if (nSignalStrength < -57)
        strSignal.assign(_T("Very Good"));
    else
        strSignal.assign(_T("Excellent"));

    return strSignal;
}

BOOL            wifi::CWirelessUtil::GetSsid(LPCTSTR ptcDeviceName, LPBYTE lpSsid, size_t nMaxLen)
{
    BOOL                fRetVal         = TRUE;
    BOOL                bRet            = FALSE;
    PNDISUIO_QUERY_OID  pQueryOid       = NULL;
    DWORD               dwBytesReturned = 0;
    UCHAR               QueryBuffer[sizeof(NDISUIO_QUERY_OID) + 32];

    ASSERT(lpSsid);

    // Get SSID
    memset(QueryBuffer, 0, 36);
    pQueryOid = (PNDISUIO_QUERY_OID)&QueryBuffer[0];
    pQueryOid->ptcDeviceName = (PTCHAR)ptcDeviceName;
    pQueryOid->Oid = OID_802_11_SSID;

    fRetVal = DeviceIoControl(
                m_hNdisUio,
                IOCTL_NDISUIO_QUERY_OID_VALUE,
                (LPVOID) pQueryOid,
                sizeof(NDISUIO_QUERY_OID) + 32,
                (LPVOID) pQueryOid,
                sizeof(NDISUIO_QUERY_OID) + 32,
                &dwBytesReturned,
                NULL);
    if (fRetVal == TRUE && lpSsid)
    {
        bRet = TRUE;
        DWORD   dwLen = *(DWORD *)&pQueryOid->Data;
        if (dwLen > 0)
        {
            size_t nLen = (dwLen > nMaxLen)?nMaxLen:dwLen;
            memcpy(lpSsid, &pQueryOid->Data[4], nLen);
            lpSsid[nLen] = 0;
            bRet = (BOOL)dwLen;
        }
        else bRet = 0;
    }
    else
    {
        DWORD   dwErr = GetLastError();
        TCHAR   szErr[100] = _T("");
        _stprintf(szErr, _T("[CWirelessUtil:GetSsid] DeviceIoControl failed, ErrorCode : %d"), dwErr);
        this->m_strErr.assign(szErr);
        bRet = FALSE;
    }

    return bRet;
}

std::wstring    wifi::CWirelessUtil::SsidToString(LPBYTE lpByte, int nLen)
{
    std::wstring    strSsid;

    if (lpByte == NULL)
    {
        strSsid.assign(_T("Not connected"));
    }
    else
    {
        int i = 0;
        TCHAR   szTmp[2] = _T("");
        szTmp[1] = 0;
        while (lpByte[i] > 0 && (nLen < 0 || i < nLen))
        {
            szTmp[0] = (TCHAR)lpByte[i];
            strSsid.append(szTmp);
            i++;
        }
    }

    return strSsid;
}

BOOL            wifi::CWirelessUtil::GetBSSIDList(LPCTSTR ptcDeviceName, CAvailableAPList* pWlan)
{
    BOOL                bRet            = FALSE;
    PNDISUIO_QUERY_OID  pQueryOid       = NULL;
    DWORD               dwBytesReturned = 0;
    UCHAR               QueryBuffer[sizeof(NDISUIO_QUERY_OID) + 3000];

    // Get BSSID List
    memset(QueryBuffer, 0, 4);
    pQueryOid = (PNDISUIO_QUERY_OID)&QueryBuffer[0];
    pQueryOid->ptcDeviceName = (PTCHAR)ptcDeviceName;
    pQueryOid->Oid = OID_802_11_BSSID_LIST;

    BOOL fRetVal = DeviceIoControl(
                m_hNdisUio,
                IOCTL_NDISUIO_QUERY_OID_VALUE,
                (LPVOID) pQueryOid,
                sizeof(NDISUIO_QUERY_OID) + 3000,
                (LPVOID) pQueryOid,
                sizeof(NDISUIO_QUERY_OID) + 3000,
                &dwBytesReturned,
                NULL);
    if (fRetVal == TRUE && pWlan)
    {
        bRet = pWlan->ParseFrom(pQueryOid->Data);
        if (!bRet)
        {
            this->m_strErr.assign(pWlan->GetLastErrorMsg());
        }
    }
    else
    {
        DWORD   dwErr = GetLastError();
        TCHAR   szErr[100] = _T("");
        _stprintf(szErr, _T("[CWirelessUtil:GetBSSIDList] DeviceIoControl failed, ErrorCode : %d"), dwErr);
        this->m_strErr.assign(szErr);
    }

    return bRet;
}

BOOL            wifi::CWirelessUtil::ScanForBSSIDList(LPCTSTR ptcDeviceName)
{
    BOOL                bRet            = FALSE;
    PNDISUIO_QUERY_OID  pQueryOid       = NULL;
    DWORD               dwBytesReturned = 0;
    UCHAR               QueryBuffer[sizeof(NDISUIO_QUERY_OID) + 4];

    // Send message to driver to refresh BSSID List
    pQueryOid = (PNDISUIO_QUERY_OID)&QueryBuffer[0];
    pQueryOid->ptcDeviceName = (PTCHAR)ptcDeviceName;
    pQueryOid->Oid = OID_802_11_BSSID_LIST_SCAN;

    BOOL fRetVal = DeviceIoControl(
                m_hNdisUio,
                IOCTL_NDISUIO_SET_OID_VALUE,
                (LPVOID) pQueryOid,
                sizeof(NDISUIO_QUERY_OID) + sizeof(DWORD),
                (LPVOID) pQueryOid,
                sizeof(NDISUIO_QUERY_OID) + sizeof(DWORD),
                &dwBytesReturned,
                NULL);
    if (fRetVal == TRUE)
    {
        bRet = TRUE;
    }
    else
    {
        DWORD   dwErr = GetLastError();
        TCHAR   szErr[100] = _T("");
        _stprintf(szErr, _T("[CWirelessUtil:ScanForBSSIDList] DeviceIoControl failed, ErrorCode : %d"), dwErr);
        this->m_strErr.assign(szErr);
    }

    return bRet;
}

BOOL            wifi::CWirelessUtil::GetStSSIDList(LPCTSTR ptcDeviceName, CPreferredAPList* pWlan)
{
    BOOL        bRet = FALSE;
    DWORD       dwInFlag = INTF_ALL, dwOutFlag = 0;
    INTF_ENTRY  entry;

    entry.wszGuid = (PTCHAR)ptcDeviceName;
    DWORD       dwRet = WZCQueryInterface(NULL, dwInFlag, &entry, &dwOutFlag);
    if (dwRet != ERROR_SUCCESS)
    {
        TCHAR   szErr[100] = _T("");
        _stprintf(szErr, _T("[CWirelessUtil:GetStSSIDList] WZCQueryInterface failed, ErrorCode : %d"), dwRet);
        this->m_strErr.assign(szErr);

        return FALSE;
    }

    // StSSIDList
    AfxMessageBox(_T("OK--000"));
    bRet = pWlan->ParseFrom(entry.rdStSSIDList.pData);
    AfxMessageBox(_T("OK--001"));
    if (!bRet) this->m_strErr.assign(pWlan->GetLastErrorMsg());

    return  bRet;
}

BOOL            wifi::CWirelessUtil::SetInterface(LPCTSTR ptcDeviceName, LPCTSTR szSsid)
{
    BOOL        bRet = FALSE;
    DWORD       dwOutFlag = 0, dwRet = 0;
    INTF_ENTRY  entry;
    BYTE        byteSsid[12] = "COMPASS-NTU";
    entry.rdSSID.dwDataLen = 10;
    entry.wszGuid = (LPWSTR)ptcDeviceName;
    entry.rdSSID.pData = byteSsid;
    dwRet = WZCSetInterface(NULL, INTF_SSID, &entry, &dwOutFlag);
    if (dwRet != ERROR_SUCCESS)
    {
        DWORD   dwErr = GetLastError();
        TCHAR   szErr[100] = _T("");
        _stprintf(szErr, _T("[CWirelessUtil:SetInterface] WZCSetInterface failed, ErrorCode : %d"), dwErr);
        this->m_strErr.assign(szErr);
    }

    return  bRet;
}

void            wifi::CWirelessUtil::DeInit()
{
    if (this->m_hNdisUio)
    {
        ::CloseHandle(this->m_hNdisUio);
        this->m_hNdisUio = NULL;
    }
    if (this->m_keyTable.dwNumIntfs > 0)
    {
        this->m_keyTable.dwNumIntfs = 0;
        delete[] this->m_keyTable.pIntfs;
    }
}

wifi::CWirelessUtil::~CWirelessUtil()
{
    this->DeInit();
}

⌨️ 快捷键说明

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