|
@@ -1,48 +1,90 @@
|
|
|
-using Ryujinx.Common.Logging;
|
|
|
|
|
using System;
|
|
using System;
|
|
|
|
|
+using System.Globalization;
|
|
|
using System.Management;
|
|
using System.Management;
|
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.InteropServices;
|
|
|
using System.Runtime.Versioning;
|
|
using System.Runtime.Versioning;
|
|
|
|
|
+using Ryujinx.Common.Logging;
|
|
|
|
|
|
|
|
namespace Ryujinx.Common.SystemInfo
|
|
namespace Ryujinx.Common.SystemInfo
|
|
|
{
|
|
{
|
|
|
[SupportedOSPlatform("windows")]
|
|
[SupportedOSPlatform("windows")]
|
|
|
- internal class WindowsSystemInfo : SystemInfo
|
|
|
|
|
|
|
+ class WindowsSystemInfo : SystemInfo
|
|
|
{
|
|
{
|
|
|
- public override string CpuName { get; }
|
|
|
|
|
- public override ulong RamSize { get; }
|
|
|
|
|
|
|
+ internal WindowsSystemInfo()
|
|
|
|
|
+ {
|
|
|
|
|
+ CpuName = $"{GetCpuidCpuName() ?? GetCpuNameWMI()} ; {LogicalCoreCount} logical"; // WMI is very slow
|
|
|
|
|
+ (RamTotal, RamAvailable) = GetMemoryStats();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- public WindowsSystemInfo()
|
|
|
|
|
|
|
+ private static (ulong Total, ulong Available) GetMemoryStats()
|
|
|
{
|
|
{
|
|
|
- bool wmiNotAvailable = false;
|
|
|
|
|
|
|
+ MemoryStatusEx memStatus = new MemoryStatusEx();
|
|
|
|
|
+ if (GlobalMemoryStatusEx(memStatus))
|
|
|
|
|
+ {
|
|
|
|
|
+ return (memStatus.TotalPhys, memStatus.AvailPhys); // Bytes
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ Logger.Error?.Print(LogClass.Application, $"GlobalMemoryStatusEx failed. Error {Marshal.GetLastWin32Error():X}");
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- try
|
|
|
|
|
|
|
+ return (0, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static string GetCpuNameWMI()
|
|
|
|
|
+ {
|
|
|
|
|
+ ManagementObjectCollection cpuObjs = GetWMIObjects("root\\CIMV2", "SELECT * FROM Win32_Processor");
|
|
|
|
|
+
|
|
|
|
|
+ if (cpuObjs != null)
|
|
|
{
|
|
{
|
|
|
- foreach (ManagementBaseObject mObject in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor").Get())
|
|
|
|
|
|
|
+ foreach (var cpuObj in cpuObjs)
|
|
|
{
|
|
{
|
|
|
- CpuName = mObject["Name"].ToString();
|
|
|
|
|
|
|
+ return cpuObj["Name"].ToString().Trim();
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- foreach (ManagementBaseObject mObject in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem").Get())
|
|
|
|
|
- {
|
|
|
|
|
- RamSize = ulong.Parse(mObject["TotalVisibleMemorySize"].ToString()) * 1024;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").Trim();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
|
|
|
|
|
+ private class MemoryStatusEx
|
|
|
|
|
+ {
|
|
|
|
|
+ public uint Length;
|
|
|
|
|
+ public uint MemoryLoad;
|
|
|
|
|
+ public ulong TotalPhys;
|
|
|
|
|
+ public ulong AvailPhys;
|
|
|
|
|
+ public ulong TotalPageFile;
|
|
|
|
|
+ public ulong AvailPageFile;
|
|
|
|
|
+ public ulong TotalVirtual;
|
|
|
|
|
+ public ulong AvailVirtual;
|
|
|
|
|
+ public ulong AvailExtendedVirtual;
|
|
|
|
|
+
|
|
|
|
|
+ public MemoryStatusEx()
|
|
|
|
|
+ {
|
|
|
|
|
+ Length = (uint)Marshal.SizeOf(typeof(MemoryStatusEx));
|
|
|
}
|
|
}
|
|
|
- catch (PlatformNotSupportedException)
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ [return: MarshalAs(UnmanagedType.Bool)]
|
|
|
|
|
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
|
|
|
+ private static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatusEx lpBuffer);
|
|
|
|
|
+
|
|
|
|
|
+ private static ManagementObjectCollection GetWMIObjects(string scope, string query)
|
|
|
|
|
+ {
|
|
|
|
|
+ try
|
|
|
{
|
|
{
|
|
|
- wmiNotAvailable = true;
|
|
|
|
|
|
|
+ return new ManagementObjectSearcher(scope, query).Get();
|
|
|
}
|
|
}
|
|
|
- catch (COMException)
|
|
|
|
|
|
|
+ catch (PlatformNotSupportedException ex)
|
|
|
{
|
|
{
|
|
|
- wmiNotAvailable = true;
|
|
|
|
|
|
|
+ Logger.Error?.Print(LogClass.Application, $"WMI isn't available : {ex.Message}");
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- if (wmiNotAvailable)
|
|
|
|
|
|
|
+ catch (COMException ex)
|
|
|
{
|
|
{
|
|
|
- Logger.Error?.Print(LogClass.Application, "WMI isn't available, system informations will use default values.");
|
|
|
|
|
-
|
|
|
|
|
- CpuName = "Unknown";
|
|
|
|
|
|
|
+ Logger.Error?.Print(LogClass.Application, $"WMI isn't available : {ex.Message}");
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ return null;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|