📄 wifi.cpp
字号:
} // 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 + -