Wifi: removes driver detection support

This commit is contained in:
Carter Li
2026-08-19 16:10:11 +08:00
committed by 李通洲
parent cafe82b462
commit 2a269bfd4c
11 changed files with 170 additions and 283 deletions
-1
View File
@@ -6,7 +6,6 @@
struct FFWifiInterface {
FFstrbuf description;
FFstrbuf status;
FFstrbuf driver;
};
struct FFWifiConnection {
-1
View File
@@ -33,7 +33,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInit(&item->inf.description);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
+15 -29
View File
@@ -26,7 +26,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInit(&item->inf.description);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
@@ -42,34 +41,6 @@ const char* ffDetectWifi(FFlist* result) {
ffStrbufSetS(&item->inf.description, inf.interfaceName.UTF8String);
ffStrbufSetStatic(&item->inf.status, inf.powerOn ? "Power On" : "Power Off");
FF_IOOBJECT_AUTO_RELEASE io_object_t service = IOServiceGetMatchingService(MACH_PORT_NULL, IOBSDNameMatching(MACH_PORT_NULL, 0, item->inf.description.chars));
FF_IOOBJECT_AUTO_RELEASE io_object_t parentService = IO_OBJECT_NULL;
FF_CFTYPE_AUTO_RELEASE CFNumberRef frequency;
// Note: IO80211ChannelFrequency is only available when the interface is connected
while (!(frequency = IORegistryEntryCreateCFProperty(service, CFSTR("IO80211ChannelFrequency"), nullptr, kNilOptions))) {
if (IORegistryEntryGetParentEntry(service, kIOServicePlane, &parentService) == KERN_SUCCESS) {
IOObjectRelease(service);
service = parentService;
parentService = IO_OBJECT_NULL;
} else {
IOObjectRelease(service);
service = IO_OBJECT_NULL;
break;
}
}
if (service != IO_OBJECT_NULL) {
if (IORegistryEntryGetParentEntry(service, kIOServicePlane, &parentService) == KERN_SUCCESS) { // AppleBCMWLANCore
FF_CFTYPE_AUTO_RELEASE CFStringRef driverName = nullptr; // Chipsets other than Broadcom?
if ((driverName = IORegistryEntryCreateCFProperty(parentService, CFSTR("AppleBCMWLAN.BuildTag"), nullptr, kNilOptions)) || (driverName = IORegistryEntryCreateCFProperty(parentService, CFSTR("IO80211Family.BuildTag"), nullptr, kNilOptions))) {
ffCfStrGetString(driverName, &item->inf.driver);
ffStrbufReplaceAllC(&item->inf.driver, '-', ' ');
} else if ((driverName = IORegistryEntryCreateCFProperty(parentService, CFSTR("CFBundleIdentifier"), nullptr, kNilOptions))) {
ffCfStrGetString(driverName, &item->inf.driver);
}
}
}
if (!inf.powerOn) {
continue;
}
@@ -195,6 +166,21 @@ const char* ffDetectWifi(FFlist* result) {
case kCWChannelWidth160MHz: item->conn.channelWidth = 160; break;
default: item->conn.channelWidth = 0; break;
}
FF_IOOBJECT_AUTO_RELEASE io_object_t service = IOServiceGetMatchingService(MACH_PORT_NULL, IOBSDNameMatching(MACH_PORT_NULL, 0, item->inf.description.chars));
FF_CFTYPE_AUTO_RELEASE CFNumberRef frequency;
// Note: IO80211ChannelFrequency is only available when the interface is connected
while (!(frequency = IORegistryEntryCreateCFProperty(service, CFSTR("IO80211ChannelFrequency"), nullptr, kNilOptions))) {
io_object_t parentService = IO_OBJECT_NULL;
if (IORegistryEntryGetParentEntry(service, kIOServicePlane, &parentService) == KERN_SUCCESS) {
IOObjectRelease(service);
service = parentService;
} else {
IOObjectRelease(service);
service = IO_OBJECT_NULL;
break;
}
}
if (frequency) {
int64_t value;
if (ffCfNumGetInt64(frequency, &value) == nil) {
-1
View File
@@ -27,7 +27,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInitS(&item->inf.description, i->if_name);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
+1 -2
View File
@@ -9,7 +9,6 @@ extern "C" {
static void initWifiResult(FFWifiResult* item, const char* name) {
ffStrbufInitS(&item->inf.description, name);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
@@ -92,7 +91,7 @@ const char* ffDetectWifi(FFlist* result) {
continue;
}
ffStrbufSetNS(&item->conn.ssid, strnlen(network.name, sizeof(network.name)), network.name);
ffStrbufSetNS(&item->conn.ssid, (uint32_t) strnlen(network.name, sizeof(network.name)), network.name);
setWifiBssid(&item->conn.bssid, network);
item->conn.signalQuality = network.signal_strength > 100 ? 100 : network.signal_strength;
setWifiSecurity(&item->conn.security, network);
-15
View File
@@ -1067,7 +1067,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInitS(&item->inf.description, i->if_name);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
@@ -1080,20 +1079,6 @@ const char* ffDetectWifi(FFlist* result) {
item->conn.channelWidth = 0;
item->conn.frequency = 0;
{
ffStrbufSetF(&buffer, "/sys/class/net/%s/device/driver", i->if_name);
char pathBuf[PATH_MAX];
ssize_t resultLength = readlink(buffer.chars, pathBuf, ARRAY_SIZE(pathBuf));
if (resultLength > 0) {
const char* p = memrchr(pathBuf, '/', (size_t) resultLength);
if (p) {
++p;
ffStrbufSetNS(&item->inf.driver, (uint32_t) (resultLength - (p - pathBuf)), p);
}
}
}
char operstate;
ffStrbufSetF(&buffer, "/sys/class/net/%s/operstate", i->if_name);
if (!ffReadFileData(buffer.chars, 1, &operstate)) {
-1
View File
@@ -38,7 +38,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInitS(&item->inf.description, i->if_name);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
-1
View File
@@ -28,7 +28,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInitS(&item->inf.description, i->if_name);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
+154 -170
View File
@@ -10,201 +10,185 @@
#include <inet/wifi_ioctl.h>
static bool getWifiParam(int fd, uint32_t id, size_t minLength, wldp_t* buffer) {
memset(buffer, 0, MAX_BUF_LEN);
buffer->wldp_type = NET_802_11;
buffer->wldp_id = id;
struct strioctl request = {
.ic_cmd = WLAN_GET_PARAM,
.ic_timout = 0,
.ic_len = MAX_BUF_LEN,
.ic_dp = (char*) buffer,
};
return ioctl(fd, I_STR, &request) == 0
&& buffer->wldp_result == WL_SUCCESS
&& buffer->wldp_length >= WIFI_BUF_OFFSET + minLength
&& buffer->wldp_length <= MAX_BUF_LEN;
}
static bool getWifiValue(int fd, uint32_t id, void* value, size_t valueSize, wldp_t* buffer) {
if (!getWifiParam(fd, id, valueSize, buffer)) {
return false;
}
memset(buffer, 0, MAX_BUF_LEN);
buffer->wldp_type = NET_802_11;
buffer->wldp_id = id;
memcpy(value, buffer->wldp_buf, valueSize);
return true;
struct strioctl request = {
.ic_cmd = WLAN_GET_PARAM,
.ic_timout = 0,
.ic_len = MAX_BUF_LEN,
.ic_dp = (char*) buffer,
};
if (ioctl(fd, I_STR, &request) != 0 || buffer->wldp_result != WL_SUCCESS || buffer->wldp_length < WIFI_BUF_OFFSET + valueSize || buffer->wldp_length > MAX_BUF_LEN) {
return false;
}
memcpy(value, buffer->wldp_buf, valueSize);
return true;
}
static void initWifiResult(FFWifiResult* item, const char* name) {
ffStrbufInitS(&item->inf.description, name);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
ffStrbufInit(&item->conn.protocol);
ffStrbufInit(&item->conn.security);
item->conn.signalQuality = -DBL_MAX;
item->conn.rxRate = -DBL_MAX;
item->conn.txRate = -DBL_MAX;
item->conn.channel = 0;
item->conn.channelWidth = 0;
item->conn.frequency = 0;
ffStrbufInitS(&item->inf.description, name);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
ffStrbufInit(&item->conn.protocol);
ffStrbufInit(&item->conn.security);
item->conn.signalQuality = -DBL_MAX;
item->conn.rxRate = -DBL_MAX;
item->conn.txRate = -DBL_MAX;
item->conn.channel = 0;
item->conn.channelWidth = 0;
item->conn.frequency = 0;
}
static void setWifiProtocol(FFstrbuf* protocol, uint32_t subtype, bool htEnabled) {
switch (subtype) {
case WL_FHSS: ffStrbufSetStatic(protocol, "802.11 (FHSS)"); break;
case WL_DSSS: ffStrbufSetStatic(protocol, "802.11 (DSSS)"); break;
case WL_IRBASE: ffStrbufSetStatic(protocol, "802.11 (IR)"); break;
case WL_OFDM: ffStrbufSetStatic(protocol, "802.11a"); break;
case WL_HRDS: ffStrbufSetStatic(protocol, "802.11b"); break;
case WL_ERP: ffStrbufSetStatic(protocol, htEnabled ? "802.11n (Wi-Fi 4)" : "802.11g"); break;
default: break;
}
switch (subtype) {
case WL_FHSS:
ffStrbufSetStatic(protocol, "802.11 (FHSS)");
break;
case WL_DSSS:
ffStrbufSetStatic(protocol, "802.11 (DSSS)");
break;
case WL_IRBASE:
ffStrbufSetStatic(protocol, "802.11 (IR)");
break;
case WL_OFDM:
ffStrbufSetStatic(protocol, htEnabled ? "802.11n (Wi-Fi 4)" : "802.11a");
break;
case WL_HRDS:
ffStrbufSetStatic(protocol, "802.11b");
break;
case WL_ERP:
ffStrbufSetStatic(protocol, htEnabled ? "802.11n (Wi-Fi 4)" : "802.11g");
break;
default:
break;
}
}
static void setWifiSecurity(FFstrbuf* security, uint32_t encryption, bool haveAuthMode, uint32_t authMode) {
switch (encryption) {
case WL_NOENCRYPTION:
ffStrbufSetStatic(security, "Insecure");
break;
case WL_ENC_WEP:
ffStrbufSetStatic(security, "WEP");
break;
case WL_ENC_WPA:
ffStrbufSetStatic(security, haveAuthMode && authMode == WL_SHAREDKEY ? "WPA Shared Key" : "WPA");
break;
default:
break;
}
switch (encryption) {
case WL_NOENCRYPTION:
ffStrbufSetStatic(security, "Insecure");
break;
case WL_ENC_WEP:
ffStrbufSetStatic(security, "WEP");
break;
case WL_ENC_WPA:
ffStrbufSetStatic(security, haveAuthMode && authMode == WL_SHAREDKEY ? "WPA Shared Key" : "WPA");
break;
default:
ffStrbufSetStatic(security, "Unknown");
break;
}
}
const char* ffDetectWifi(FFlist* result) {
FF_AUTO_CLOSE_DIR DIR* directory = opendir("/dev/wifi");
if (!directory) {
return nullptr;
}
FF_AUTO_CLOSE_DIR DIR* directory = opendir("/dev/wifi");
if (!directory) {
return nullptr;
}
FF_AUTO_FREE void* bufferMemory = malloc(MAX_BUF_LEN);
if (!bufferMemory) {
return "malloc() failed";
}
wldp_t* buffer = (wldp_t*) bufferMemory;
FF_AUTO_FREE void* bufferMemory = malloc(MAX_BUF_LEN);
if (!bufferMemory) {
return "malloc() failed";
}
wldp_t* buffer = (wldp_t*) bufferMemory;
struct dirent* entry;
while ((entry = readdir(directory)) != nullptr) {
size_t nameLength = strlen(entry->d_name);
if (nameLength == 0 || entry->d_name[nameLength - 1] < '0' || entry->d_name[nameLength - 1] > '9') {
continue;
}
struct dirent* entry;
while ((entry = readdir(directory)) != nullptr) {
size_t nameLength = strlen(entry->d_name);
if (nameLength == 0 || entry->d_name[nameLength - 1] < '0' || entry->d_name[nameLength - 1] > '9') {
continue;
}
char devicePath[PATH_MAX];
int pathLength = snprintf(devicePath, sizeof(devicePath), "/dev/wifi/%s", entry->d_name);
if (pathLength < 0 || (size_t) pathLength >= sizeof(devicePath)) {
continue;
}
char devicePath[PATH_MAX];
int pathLength = snprintf(devicePath, sizeof(devicePath), "/dev/wifi/%s", entry->d_name);
if (pathLength < 0 || (size_t) pathLength >= sizeof(devicePath)) {
continue;
}
FF_AUTO_CLOSE_FD int fd = open(devicePath, O_RDWR);
if (fd < 0) {
continue;
}
FF_AUTO_CLOSE_FD int fd = open(devicePath, O_RDWR);
if (fd < 0) {
continue;
}
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
initWifiResult(item, entry->d_name);
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
initWifiResult(item, entry->d_name);
wl_vendor_t vendor = {};
wl_product_t product = {};
if (getWifiParam(fd, WL_VENDOR_ID, sizeof(vendor), buffer)) {
memcpy(vendor, buffer->wldp_buf, sizeof(vendor));
vendor[sizeof(vendor) - 1] = '\0';
}
if (getWifiParam(fd, WL_PRODUCT_ID, sizeof(product), buffer)) {
memcpy(product, buffer->wldp_buf, sizeof(product));
product[sizeof(product) - 1] = '\0';
}
if (vendor[0]) {
ffStrbufSetS(&item->inf.driver, vendor);
}
if (product[0]) {
if (item->inf.driver.length) {
ffStrbufAppendC(&item->inf.driver, ' ');
}
ffStrbufAppendS(&item->inf.driver, product);
}
wl_radio_t radio;
if (getWifiValue(fd, WL_RADIO, &radio, sizeof(radio), buffer)) {
ffStrbufSetStatic(&item->inf.status, radio ? "Up" : "Down");
} else {
ffStrbufSetStatic(&item->inf.status, "Unknown");
}
wl_radio_t radio;
if (getWifiValue(fd, WL_RADIO, &radio, sizeof(radio), buffer)) {
ffStrbufSetStatic(&item->inf.status, radio ? "Up" : "Down");
} else {
ffStrbufSetStatic(&item->inf.status, "Unknown");
}
wl_linkstatus_t linkStatus;
if (!getWifiValue(fd, WL_LINKSTATUS, &linkStatus, sizeof(linkStatus), buffer)) {
ffStrbufSetStatic(&item->conn.status, "Unknown");
continue;
}
if (linkStatus != WL_CONNECTED) {
ffStrbufSetStatic(&item->conn.status, "Not connected");
continue;
}
ffStrbufSetStatic(&item->conn.status, "Connected");
wl_linkstatus_t linkStatus;
if (!getWifiValue(fd, WL_LINKSTATUS, &linkStatus, sizeof(linkStatus), buffer)) {
ffStrbufSetStatic(&item->conn.status, "Unknown");
continue;
}
if (linkStatus != WL_CONNECTED) {
ffStrbufSetStatic(&item->conn.status, "Not connected");
continue;
}
ffStrbufSetStatic(&item->conn.status, "Connected");
wl_essid_t essid;
if (getWifiValue(fd, WL_ESSID, &essid, sizeof(essid), buffer) && essid.wl_essid_length < sizeof(essid.wl_essid_essid) && essid.wl_essid_length <= MAX_ESSID_LENGTH - 1) {
ffStrbufSetNS(&item->conn.ssid, essid.wl_essid_length, essid.wl_essid_essid);
}
wl_essid_t essid;
if (getWifiValue(fd, WL_ESSID, &essid, sizeof(essid), buffer)
&& essid.wl_essid_length < sizeof(essid.wl_essid_essid)
&& essid.wl_essid_length <= MAX_ESSID_LENGTH - 1) {
ffStrbufSetNS(&item->conn.ssid, essid.wl_essid_length, essid.wl_essid_essid);
}
wl_bssid_t bssid;
if (getWifiValue(fd, WL_BSSID, bssid, sizeof(bssid), buffer)) {
ffStrbufSetF(&item->conn.bssid, "%02X:%02X:%02X:%02X:%02X:%02X", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
}
wl_bssid_t bssid;
if (getWifiValue(fd, WL_BSSID, bssid, sizeof(bssid), buffer)) {
ffStrbufSetF(&item->conn.bssid, "%02X:%02X:%02X:%02X:%02X:%02X", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
}
wl_rssi_t rssi;
if (getWifiValue(fd, WL_RSSI, &rssi, sizeof(rssi), buffer)) {
item->conn.signalQuality = rssi >= MAX_RSSI ? 100.0 : ((double) rssi / MAX_RSSI) * 100.0;
}
wl_rssi_t rssi;
if (getWifiValue(fd, WL_RSSI, &rssi, sizeof(rssi), buffer)) {
item->conn.signalQuality = rssi >= MAX_RSSI ? 100.0 : ((double) rssi / MAX_RSSI) * 100.0;
}
wl_phy_conf_t phy;
if (getWifiValue(fd, WL_PHY_CONFIG, &phy, sizeof(phy), buffer)) {
uint32_t subtype = phy.wl_phy_dsss_conf.wl_dsss_subtype;
switch (subtype) {
case WL_FHSS:
item->conn.channel = (uint16_t) phy.wl_phy_fhss_conf.wl_fhss_channel;
setWifiProtocol(&item->conn.protocol, subtype, false);
break;
case WL_DSSS:
item->conn.channel = (uint16_t) phy.wl_phy_dsss_conf.wl_dsss_channel;
setWifiProtocol(&item->conn.protocol, subtype, false);
break;
case WL_OFDM:
item->conn.frequency = (uint16_t) phy.wl_phy_ofdm_conf.wl_ofdm_frequency;
item->conn.channel = ffWifiFreqToChannel(item->conn.frequency);
setWifiProtocol(&item->conn.protocol, subtype, phy.wl_phy_ofdm_conf.wl_ofdm_ht_enabled);
break;
case WL_ERP:
item->conn.channel = (uint16_t) phy.wl_phy_erp_conf.wl_erp_channel;
setWifiProtocol(&item->conn.protocol, subtype, phy.wl_phy_erp_conf.wl_erp_ht_enabled);
break;
default:
setWifiProtocol(&item->conn.protocol, subtype, false);
break;
}
}
wl_phy_conf_t phy;
if (getWifiValue(fd, WL_PHY_CONFIG, &phy, sizeof(phy), buffer)) {
uint32_t subtype = phy.wl_phy_dsss_conf.wl_dsss_subtype;
switch (subtype) {
case WL_FHSS:
item->conn.channel = (uint16_t) phy.wl_phy_fhss_conf.wl_fhss_channel;
setWifiProtocol(&item->conn.protocol, subtype, false);
break;
case WL_DSSS:
item->conn.channel = (uint16_t) phy.wl_phy_dsss_conf.wl_dsss_channel;
setWifiProtocol(&item->conn.protocol, subtype, false);
break;
case WL_OFDM:
item->conn.frequency = (uint16_t) phy.wl_phy_ofdm_conf.wl_ofdm_frequency;
item->conn.channel = ffWifiFreqToChannel(item->conn.frequency);
setWifiProtocol(&item->conn.protocol, subtype, phy.wl_phy_ofdm_conf.wl_ofdm_ht_enabled);
break;
case WL_ERP:
item->conn.channel = (uint16_t) phy.wl_phy_erp_conf.wl_erp_channel;
setWifiProtocol(&item->conn.protocol, subtype, phy.wl_phy_erp_conf.wl_erp_ht_enabled);
break;
default:
setWifiProtocol(&item->conn.protocol, subtype, false);
break;
}
}
wl_encryption_t encryption;
wl_authmode_t authMode;
bool haveEncryption = getWifiValue(fd, WL_ENCRYPTION, &encryption, sizeof(encryption), buffer);
bool haveAuthMode = getWifiValue(fd, WL_AUTH_MODE, &authMode, sizeof(authMode), buffer);
if (haveEncryption) {
setWifiSecurity(&item->conn.security, encryption, haveAuthMode, authMode);
}
}
wl_encryption_t encryption;
wl_authmode_t authMode;
bool haveEncryption = getWifiValue(fd, WL_ENCRYPTION, &encryption, sizeof(encryption), buffer);
bool haveAuthMode = getWifiValue(fd, WL_AUTH_MODE, &authMode, sizeof(authMode), buffer);
if (haveEncryption) {
setWifiSecurity(&item->conn.security, encryption, haveAuthMode, authMode);
}
}
return nullptr;
return nullptr;
}
-57
View File
@@ -1,7 +1,6 @@
#include "wifi.h"
#include "common/library.h"
#include "common/windows/unicode.h"
#include "common/windows/registry.h"
#include <windows.h>
#include <wlanapi.h>
@@ -59,60 +58,6 @@ typedef struct _WLAN_REALTIME_CONNECTION_QUALITY {
enum { wlan_intf_opcode_realtime_connection_quality = 19 };
#define WIFI_DRIVER_REG_PATH L"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
static bool detectWifiDriver(const GUID* interfaceGuid, FFstrbuf* driver) {
char interfaceGuidA[64];
snprintf(interfaceGuidA, sizeof(interfaceGuidA),
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
(unsigned) interfaceGuid->Data1,
(unsigned) interfaceGuid->Data2,
(unsigned) interfaceGuid->Data3,
(unsigned) interfaceGuid->Data4[0], (unsigned) interfaceGuid->Data4[1],
(unsigned) interfaceGuid->Data4[2], (unsigned) interfaceGuid->Data4[3],
(unsigned) interfaceGuid->Data4[4], (unsigned) interfaceGuid->Data4[5],
(unsigned) interfaceGuid->Data4[6], (unsigned) interfaceGuid->Data4[7]);
FF_AUTO_CLOSE_FD HANDLE hClassKey = nullptr;
if (!ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, WIFI_DRIVER_REG_PATH, &hClassKey, nullptr)) {
return false;
}
wchar_t subKeyW[16];
for (uint32_t i = 0;; ++i) {
_snwprintf(subKeyW, ARRAY_SIZE(subKeyW), L"%04u", i);
FF_AUTO_CLOSE_FD HANDLE hDeviceKey = nullptr;
if (!ffRegOpenSubkeyForRead(hClassKey, subKeyW, &hDeviceKey, nullptr)) {
return false;
}
FF_STRBUF_AUTO_DESTROY netCfgInstanceId = ffStrbufCreate();
if (!ffRegReadStrbuf(hDeviceKey, L"NetCfgInstanceId", &netCfgInstanceId, nullptr)) {
continue;
}
if (!ffStrbufEqualS(&netCfgInstanceId, interfaceGuidA)) {
continue;
}
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
if (ffRegReadStrbuf(hDeviceKey, L"ProviderName", &buffer, nullptr)) {
ffStrbufSet(driver, &buffer);
}
if (ffRegReadStrbuf(hDeviceKey, L"DriverVersion", &buffer, nullptr)) {
if (driver->length) {
ffStrbufAppendC(driver, ' ');
}
ffStrbufAppend(driver, &buffer);
}
return true;
}
}
const char* ffDetectWifi(FFlist* result) {
FF_LIBRARY_LOAD_MESSAGE(wlanapi, "wlanapi" FF_LIBRARY_EXTENSION, 1)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanOpenHandle)
@@ -143,7 +88,6 @@ const char* ffDetectWifi(FFlist* result) {
FFWifiResult* item = FF_LIST_ADD(FFWifiResult, *result);
ffStrbufInitWS(&item->inf.description, ifInfo->strInterfaceDescription);
ffStrbufInit(&item->inf.status);
ffStrbufInit(&item->inf.driver);
ffStrbufInit(&item->conn.status);
ffStrbufInit(&item->conn.ssid);
ffStrbufInit(&item->conn.bssid);
@@ -156,7 +100,6 @@ const char* ffDetectWifi(FFlist* result) {
item->conn.channelWidth = 0;
item->conn.frequency = 0;
detectWifiDriver(&ifInfo->InterfaceGuid, &item->inf.driver);
convertIfStateToString(ifInfo->isState, &item->inf.status);
if (ifInfo->isState != wlan_interface_state_connected) {
-5
View File
@@ -98,7 +98,6 @@ bool ffPrintWifi(FFWifiOptions* options) {
FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(Wifi), moduleIndex, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
FF_ARG(item->inf.description, "inf-desc"),
FF_ARG(item->inf.status, "inf-status"),
FF_ARG(item->inf.driver, "inf-driver"),
FF_ARG(item->conn.status, "status"),
FF_ARG(item->conn.ssid, "ssid"),
FF_ARG(item->conn.bssid, "bssid"),
@@ -118,7 +117,6 @@ bool ffPrintWifi(FFWifiOptions* options) {
FF_LIST_FOR_EACH (FFWifiResult, item, result) {
ffStrbufDestroy(&item->inf.description);
ffStrbufDestroy(&item->inf.status);
ffStrbufDestroy(&item->inf.driver);
ffStrbufDestroy(&item->conn.status);
ffStrbufDestroy(&item->conn.ssid);
ffStrbufDestroy(&item->conn.bssid);
@@ -166,7 +164,6 @@ bool ffGenerateWifiJsonResult([[maybe_unused]] FFWifiOptions* options, yyjson_mu
yyjson_mut_val* inf = yyjson_mut_obj_add_obj(doc, obj, "inf");
yyjson_mut_obj_add_strbuf(doc, inf, "description", &wifi->inf.description);
yyjson_mut_obj_add_strbuf(doc, inf, "status", &wifi->inf.status);
yyjson_mut_obj_add_strbuf(doc, inf, "driver", &wifi->inf.driver);
yyjson_mut_val* conn = yyjson_mut_obj_add_obj(doc, obj, "conn");
yyjson_mut_obj_add_strbuf(doc, conn, "status", &wifi->conn.status);
@@ -197,7 +194,6 @@ bool ffGenerateWifiJsonResult([[maybe_unused]] FFWifiOptions* options, yyjson_mu
FF_LIST_FOR_EACH (FFWifiResult, item, result) {
ffStrbufDestroy(&item->inf.description);
ffStrbufDestroy(&item->inf.status);
ffStrbufDestroy(&item->inf.driver);
ffStrbufDestroy(&item->conn.status);
ffStrbufDestroy(&item->conn.ssid);
ffStrbufDestroy(&item->conn.bssid);
@@ -246,7 +242,6 @@ FFModuleBaseInfo ffWifiModuleInfo = {
.formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
{ "Interface description", "inf-desc" },
{ "Interface status", "inf-status" },
{ "Interface driver", "inf-driver" },
{ "Connection status", "status" },
{ "Connection SSID", "ssid" },
{ "Connection BSSID", "bssid" },