Wifi: load wlanapi.dll dynamically

Windows Server doesn't support it
This commit is contained in:
李通洲
2022-11-27 16:00:56 +08:00
parent a55add190c
commit 5e5442426c
7 changed files with 44 additions and 30 deletions
-1
View File
@@ -658,7 +658,6 @@ elseif(WIN32)
PRIVATE "setupapi"
PRIVATE "dxgi"
PRIVATE "wtsapi32"
PRIVATE "wlanapi.lib"
)
if(USE_WIN_NTAPI)
target_compile_definitions(libfastfetch PRIVATE FF_USE_WIN_NTAPI)
+1
View File
@@ -58,6 +58,7 @@ The following libraries are used if present at runtime:
### Windows
* [`libcJSON`](https://github.com/DaveGamble/cJSON): Used for Windows Terminal font detection.
* [`wlanapi`](https://learn.microsoft.com/en-us/windows/win32/api/wlanapi/): A system dll which isn't supported by Windows Server by default. Used for Wifi info detection.
* [`libvulkan`](https://www.vulkan.org/): Vulkan module. Usually has been provided by GPU drivers.
* [`libOpenCL`](https://www.khronos.org/opencl/): OpenCL module
+1 -1
View File
@@ -1 +1 @@
--structure Title:Separator:OS:Host:Kernel:Uptime:Processes:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:CPUUsage:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Song:PublicIP:LocalIP:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Weather:Break:Colors
--structure Title:Separator:OS:Host:Kernel:Uptime:Processes:Packages:Shell:Resolution:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:CPUUsage:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Song:PublicIP:LocalIP:Wifi:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Weather:Break:Colors
+2
View File
@@ -242,6 +242,7 @@ static void defaultConfig(FFinstance* instance)
ffStrbufInitA(&instance->config.libOpenCL, 0);
ffStrbufInitA(&instance->config.libcJSON, 0);
ffStrbufInitA(&instance->config.libfreetype, 0);
ffStrbufInit(&instance->config.libwlanapi);
instance->config.cpuTemp = false;
instance->config.gpuTemp = false;
@@ -470,6 +471,7 @@ static void destroyConfig(FFinstance* instance)
ffStrbufDestroy(&instance->config.libOpenCL);
ffStrbufDestroy(&instance->config.libcJSON);
ffStrbufDestroy(&instance->config.libfreetype);
ffStrbufDestroy(&instance->config.libwlanapi);
ffStrbufDestroy(&instance->config.diskFolders);
ffStrbufDestroy(&instance->config.batteryDir);
+37 -28
View File
@@ -1,19 +1,9 @@
#include "wifi.h"
#include "common/library.h"
#include "util/windows/unicode.h"
#include <wlanapi.h>
static inline void wrapCloseHandle(HANDLE* handle)
{
if(*handle)
CloseHandle(*handle);
}
static inline void wrapWlanFreeMemory(void* memory)
{
if(*(void**)memory)
WlanFreeMemory(*(void**)memory);
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wswitch"
@@ -50,29 +40,37 @@ static void convertIfStateToString(WLAN_INTERFACE_STATE state, FFstrbuf* result)
}
}
void ffDetectWifi(const FFinstance* instance, FFWifiResult* result)
static const char* detectWifiImpl(const FFinstance* instance, FFWifiResult* result)
{
FF_UNUSED(instance);
FF_LIBRARY_LOAD(wlanapi, &instance->config.libcJSON, "dlopen wlanapi"FF_LIBRARY_EXTENSION" failed", "wlanapi"FF_LIBRARY_EXTENSION, 1)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanOpenHandle)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanEnumInterfaces)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanQueryInterface)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanFreeMemory)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(wlanapi, WlanCloseHandle)
DWORD curVersion;
HANDLE __attribute__((__cleanup__(wrapCloseHandle))) hClient = NULL;
if(WlanOpenHandle(1, NULL, &curVersion, &hClient) != ERROR_SUCCESS)
HANDLE hClient = NULL;
WLAN_INTERFACE_INFO_LIST* ifList = NULL;
WLAN_CONNECTION_ATTRIBUTES* connInfo = NULL;
const char* error = NULL;
if(ffWlanOpenHandle(1, NULL, &curVersion, &hClient) != ERROR_SUCCESS)
{
ffStrbufAppendS(&result->error, "WlanOpenHandle() failed");
return;
error = "WlanOpenHandle() failed";
goto exit;
}
WLAN_INTERFACE_INFO_LIST* __attribute__((__cleanup__(wrapWlanFreeMemory))) ifList = NULL;
if(WlanEnumInterfaces(hClient, NULL, &ifList) != ERROR_SUCCESS)
if(ffWlanEnumInterfaces(hClient, NULL, &ifList) != ERROR_SUCCESS)
{
ffStrbufAppendS(&result->error, "WlanEnumInterfaces() failed");
return;
error = "WlanEnumInterfaces() failed";
goto exit;
}
if(ifList->dwNumberOfItems == 0)
{
ffStrbufAppendS(&result->error, "WlanEnumInterfaces() returns empty result");
return;
error = "No wifi interfaces found";
goto exit;
}
WLAN_INTERFACE_INFO* ifInfo = (WLAN_INTERFACE_INFO*)&ifList->InterfaceInfo[0];
@@ -80,13 +78,12 @@ void ffDetectWifi(const FFinstance* instance, FFWifiResult* result)
convertIfStateToString(ifInfo->isState, &result->inf.status);
if(ifInfo->isState != wlan_interface_state_connected)
return;
goto exit;
WLAN_CONNECTION_ATTRIBUTES* __attribute__((__cleanup__(wrapWlanFreeMemory))) connInfo = NULL;
DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES);
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid;
if(WlanQueryInterface(hClient,
if(ffWlanQueryInterface(hClient,
&ifInfo->InterfaceGuid,
wlan_intf_opcode_current_connection,
NULL,
@@ -94,8 +91,8 @@ void ffDetectWifi(const FFinstance* instance, FFWifiResult* result)
(PVOID*)&connInfo,
&opCode) != ERROR_SUCCESS)
{
ffStrbufAppendS(&result->error, "WlanQueryInterface() failed");
return;
error = "WlanQueryInterface() failed";
goto exit;
}
convertIfStateToString(connInfo->isState, &result->conn.status);
@@ -237,6 +234,18 @@ void ffDetectWifi(const FFinstance* instance, FFWifiResult* result)
ffStrbufAppendF(&result->security.cipherAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm);
break;
}
exit:
if(connInfo) ffWlanFreeMemory(connInfo);
if(ifList) ffWlanFreeMemory(ifList);
if(hClient) ffWlanCloseHandle(hClient, NULL);
dlclose(wlanapi);
return error;
}
#pragma GCC diagnostic pop
void ffDetectWifi(const FFinstance* instance, FFWifiResult* result)
{
ffStrbufAppendS(&result->error, detectWifiImpl(instance, result));
}
+2
View File
@@ -1141,6 +1141,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
optionParseString(key, value, &instance->config.libOpenCL);
else if(strcasecmp(subkey, "-cjson") == 0)
optionParseString(key, value, &instance->config.libcJSON);
else if(strcasecmp(subkey, "-wlanapi") == 0)
optionParseString(key, value, &instance->config.libwlanapi);
else
goto error;
}
+1
View File
@@ -161,6 +161,7 @@ typedef struct FFconfig
FFstrbuf libOpenCL;
FFstrbuf libcJSON;
FFstrbuf libfreetype;
FFstrbuf libwlanapi;
bool cpuTemp;
bool gpuTemp;