From e925fafd7ba5fde2073446b1a903090317d67a4b Mon Sep 17 00:00:00 2001 From: henrygd Date: Wed, 30 Sep 2026 12:46:00 -0400 Subject: [PATCH] refactor(agent): label windows wifi interfaces by adapter name instead of GUID --- agent/wifi/README.md | 3 ++- agent/wifi/wifi_windows.go | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/agent/wifi/README.md b/agent/wifi/README.md index 192c02628..d8dd83446 100644 --- a/agent/wifi/README.md +++ b/agent/wifi/README.md @@ -7,5 +7,6 @@ interval only; real-time requests reuse the last snapshot. - Linux: nl80211 via `github.com/mdlayher/wifi`. Docker needs `network_mode: host`. - macOS: CoreWLAN via `osascript` (JXA). SSID may be redacted by privacy settings. -- Windows: native WLAN API, keyed by interface GUID. +- Windows: native WLAN API, keyed by adapter alias (e.g. `Wi-Fi`), falling back + to interface GUID. - Other platforms: unsupported. diff --git a/agent/wifi/wifi_windows.go b/agent/wifi/wifi_windows.go index 803621ab7..8ac48187b 100644 --- a/agent/wifi/wifi_windows.go +++ b/agent/wifi/wifi_windows.go @@ -17,6 +17,10 @@ var wlanEnum = wlan.NewProc("WlanEnumInterfaces") var wlanQuery = wlan.NewProc("WlanQueryInterface") var wlanFree = wlan.NewProc("WlanFreeMemory") +var iphlpapi = windows.NewLazySystemDLL("iphlpapi.dll") +var guidToLuid = iphlpapi.NewProc("ConvertInterfaceGuidToLuid") +var luidToAlias = iphlpapi.NewProc("ConvertInterfaceLuidToAlias") + type wlanInterface struct { GUID windows.GUID Description [256]uint16 @@ -84,7 +88,7 @@ func collect(ctx context.Context) map[string]system.WiFi { } wlanFree.Call(uintptr(data)) } - result[iface.GUID.String()] = reading + result[interfaceName(&iface.GUID)] = reading } return result } @@ -97,3 +101,20 @@ func queryWLAN(handle windows.Handle, guid *windows.GUID, opcode uintptr) (unsaf } return data, size } + +// interfaceName returns the adapter alias ("Wi-Fi"), matching the names used by +// network interface stats. Falls back to the GUID if the alias is unavailable. +func interfaceName(guid *windows.GUID) string { + if guidToLuid.Find() == nil && luidToAlias.Find() == nil { + var luid uint64 + if rc, _, _ := guidToLuid.Call(uintptr(unsafe.Pointer(guid)), uintptr(unsafe.Pointer(&luid))); rc == 0 { + var alias [windows.IF_MAX_STRING_SIZE + 1]uint16 + if rc, _, _ := luidToAlias.Call(uintptr(unsafe.Pointer(&luid)), uintptr(unsafe.Pointer(&alias[0])), uintptr(len(alias))); rc == 0 { + if name := windows.UTF16ToString(alias[:]); name != "" { + return name + } + } + } + } + return guid.String() +}