From 67a379e1a0b99b3e3b5af037e5b097e3dad11e99 Mon Sep 17 00:00:00 2001 From: jimmy Date: Wed, 10 Jun 2026 16:49:04 +0800 Subject: [PATCH] fix: resolve WMI memory leaks and struct alignment issue in SetDisplayConfig --- App.config | 4 +- DisplayProfileManager.csproj | 2 +- src/Helpers/AudioHelper.cs | 32 ++++++++----- src/Helpers/DisplayConfigHelper.cs | 1 + src/Helpers/DisplayHelper.cs | 75 ++++++++++++++++++------------ 5 files changed, 68 insertions(+), 46 deletions(-) diff --git a/App.config b/App.config index 193aecc..c64beff 100644 --- a/App.config +++ b/App.config @@ -1,6 +1,6 @@ - + - + \ No newline at end of file diff --git a/DisplayProfileManager.csproj b/DisplayProfileManager.csproj index 4e467fe..3718856 100644 --- a/DisplayProfileManager.csproj +++ b/DisplayProfileManager.csproj @@ -8,7 +8,7 @@ WinExe DisplayProfileManager DisplayProfileManager - v4.8 + v4.8.1 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 diff --git a/src/Helpers/AudioHelper.cs b/src/Helpers/AudioHelper.cs index e65ce26..5c9a701 100644 --- a/src/Helpers/AudioHelper.cs +++ b/src/Helpers/AudioHelper.cs @@ -557,20 +557,28 @@ private static string GetDeviceNameViaWin32SystemDevicesWMI(IDevice device) { searcher.Options.Timeout = TimeSpan.FromSeconds(5); - ManagementObjectCollection results = searcher.Get(); - - foreach (var wmiDevice in results) - { - var deviceName = wmiDevice["Name"]?.ToString(); - var wmiDeviceId = wmiDevice["DeviceID"]?.ToString(); - - // CRITICAL: Only process devices that could be related to our target device - if (IsBluetoothDeviceFromWmiProperties(deviceName)) + using (ManagementObjectCollection results = searcher.Get()) + { + foreach (ManagementObject wmiDevice in results) { - // Enhanced device-specific correlation - if (IsDeviceSpecificallyRelated(targetDeviceId, wmiDeviceId)) + try + { + var deviceName = wmiDevice["Name"]?.ToString(); + var wmiDeviceId = wmiDevice["DeviceID"]?.ToString(); + + // CRITICAL: Only process devices that could be related to our target device + if (IsBluetoothDeviceFromWmiProperties(deviceName)) + { + // Enhanced device-specific correlation + if (IsDeviceSpecificallyRelated(targetDeviceId, wmiDeviceId)) + { + return deviceName; + } + } + } + finally { - return deviceName; + wmiDevice.Dispose(); } } } diff --git a/src/Helpers/DisplayConfigHelper.cs b/src/Helpers/DisplayConfigHelper.cs index 4c6ca72..55e3c93 100644 --- a/src/Helpers/DisplayConfigHelper.cs +++ b/src/Helpers/DisplayConfigHelper.cs @@ -178,6 +178,7 @@ public struct DISPLAYCONFIG_PATH_TARGET_INFO public uint scaling; public DISPLAYCONFIG_RATIONAL refreshRate; public uint scanLineOrdering; + [MarshalAs(UnmanagedType.Bool)] public bool targetAvailable; public uint statusFlags; } diff --git a/src/Helpers/DisplayHelper.cs b/src/Helpers/DisplayHelper.cs index 771bfb8..70f56a5 100644 --- a/src/Helpers/DisplayHelper.cs +++ b/src/Helpers/DisplayHelper.cs @@ -387,21 +387,28 @@ public static List GetMonitorsFromWin32PnPEntity() { foreach (ManagementObject obj in collection) { - var monitor = new MonitorInfo + try { - Name = obj["Name"]?.ToString() ?? "", - DeviceID = obj["DeviceID"]?.ToString() ?? "", - PnPDeviceID = obj["PNPDeviceID"]?.ToString() ?? "", - Description = obj["Description"]?.ToString() ?? "", - Manufacturer = obj["Manufacturer"]?.ToString() ?? "" - }; - - logger.Debug($"WMI Win32PnPEntity Monitor: Name='{monitor.Name}', DeviceID='{monitor.DeviceID}', PnPDeviceID='{monitor.PnPDeviceID}'"); - - // Filter out non-monitor devices - if (!string.IsNullOrEmpty(monitor.Name)) + var monitor = new MonitorInfo + { + Name = obj["Name"]?.ToString() ?? "", + DeviceID = obj["DeviceID"]?.ToString() ?? "", + PnPDeviceID = obj["PNPDeviceID"]?.ToString() ?? "", + Description = obj["Description"]?.ToString() ?? "", + Manufacturer = obj["Manufacturer"]?.ToString() ?? "" + }; + + logger.Debug($"WMI Win32PnPEntity Monitor: Name='{monitor.Name}', DeviceID='{monitor.DeviceID}', PnPDeviceID='{monitor.PnPDeviceID}'"); + + // Filter out non-monitor devices + if (!string.IsNullOrEmpty(monitor.Name)) + { + monitors.Add(monitor); + } + } + finally { - monitors.Add(monitor); + obj.Dispose(); } } } @@ -435,27 +442,33 @@ public static List GetMonitorIDsFromWmiMonitorID() { foreach (ManagementObject obj in collection) { - var monitorId = new MonitorIdInfo + try { - InstanceName = obj["InstanceName"]?.ToString() ?? "", - // ManufacturerName, ProductCodeID, SerialNumberID are returned as ushort[] (UTF-16 words) - ManufacturerName = ArrayUshortToString(obj["ManufacturerName"] as ushort[]), - ProductCodeID = ArrayUshortToHexString(obj["ProductCodeID"] as ushort[]), - SerialNumberID = ArrayUshortToString(obj["SerialNumberID"] as ushort[]), - }; - - logger.Debug($"WMI WmiMonitorID Monitor: " + - $"InstanceName='{monitorId.InstanceName}', " + - $"ManufacturerName='{monitorId.ManufacturerName}', " + - $"ProductCodeID='{monitorId.ProductCodeID}', " + - $"SerialNumberID='{monitorId.SerialNumberID}'"); - - // Filter out non-monitor devices - if (!string.IsNullOrEmpty(monitorId.InstanceName)) + var monitorId = new MonitorIdInfo + { + InstanceName = obj["InstanceName"]?.ToString() ?? "", + // ManufacturerName, ProductCodeID, SerialNumberID are returned as ushort[] (UTF-16 words) + ManufacturerName = ArrayUshortToString(obj["ManufacturerName"] as ushort[]), + ProductCodeID = ArrayUshortToHexString(obj["ProductCodeID"] as ushort[]), + SerialNumberID = ArrayUshortToString(obj["SerialNumberID"] as ushort[]), + }; + + logger.Debug($"WMI WmiMonitorID Monitor: " + + $"InstanceName='{monitorId.InstanceName}', " + + $"ManufacturerName='{monitorId.ManufacturerName}', " + + $"ProductCodeID='{monitorId.ProductCodeID}', " + + $"SerialNumberID='{monitorId.SerialNumberID}'"); + + // Filter out non-monitor devices + if (!string.IsNullOrEmpty(monitorId.InstanceName)) + { + monitorIDs.Add(monitorId); + } + } + finally { - monitorIDs.Add(monitorId); + obj.Dispose(); } - } } }