mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-23 15:41:21 -08:00
0fbcd630bc
* Replace usage of `DllImport` with `LibraryImport` * Mark methods as `partial` * Marshalling * More `partial` & marshalling * More `partial` and marshalling * More partial and marshalling * Update GdiPlusHelper to LibraryImport * Unicorn * More Partial * Marshal * Specify EntryPoint * Specify EntryPoint * Change GlobalMemoryStatusEx to LibraryImport * Change RegisterClassEx to LibraryImport * Define EntryPoints * Update Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Move return mashal * Remove calling convention specification * Remove calling conventions * Update Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Update Ryujinx/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan <thog@protonmail.com> * Update Ryujinx.Ava/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan <thog@protonmail.com> Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Co-authored-by: Mary-nyan <thog@protonmail.com>
89 lines
2.8 KiB
C#
89 lines
2.8 KiB
C#
using System;
|
|
using System.Management;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.Versioning;
|
|
using Ryujinx.Common.Logging;
|
|
|
|
namespace Ryujinx.Common.SystemInfo
|
|
{
|
|
[SupportedOSPlatform("windows")]
|
|
partial class WindowsSystemInfo : SystemInfo
|
|
{
|
|
internal WindowsSystemInfo()
|
|
{
|
|
CpuName = $"{GetCpuidCpuName() ?? GetCpuNameWMI()} ; {LogicalCoreCount} logical"; // WMI is very slow
|
|
(RamTotal, RamAvailable) = GetMemoryStats();
|
|
}
|
|
|
|
private static (ulong Total, ulong Available) GetMemoryStats()
|
|
{
|
|
MemoryStatusEx memStatus = new MemoryStatusEx();
|
|
if (GlobalMemoryStatusEx(ref memStatus))
|
|
{
|
|
return (memStatus.TotalPhys, memStatus.AvailPhys); // Bytes
|
|
}
|
|
else
|
|
{
|
|
Logger.Error?.Print(LogClass.Application, $"GlobalMemoryStatusEx failed. Error {Marshal.GetLastWin32Error():X}");
|
|
}
|
|
|
|
return (0, 0);
|
|
}
|
|
|
|
private static string GetCpuNameWMI()
|
|
{
|
|
ManagementObjectCollection cpuObjs = GetWMIObjects("root\\CIMV2", "SELECT * FROM Win32_Processor");
|
|
|
|
if (cpuObjs != null)
|
|
{
|
|
foreach (var cpuObj in cpuObjs)
|
|
{
|
|
return cpuObj["Name"].ToString().Trim();
|
|
}
|
|
}
|
|
|
|
return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").Trim();
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct 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<MemoryStatusEx>();
|
|
}
|
|
}
|
|
|
|
[LibraryImport("kernel32.dll", SetLastError = true)]
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
private static partial bool GlobalMemoryStatusEx(ref MemoryStatusEx lpBuffer);
|
|
|
|
private static ManagementObjectCollection GetWMIObjects(string scope, string query)
|
|
{
|
|
try
|
|
{
|
|
return new ManagementObjectSearcher(scope, query).Get();
|
|
}
|
|
catch (PlatformNotSupportedException ex)
|
|
{
|
|
Logger.Error?.Print(LogClass.Application, $"WMI isn't available : {ex.Message}");
|
|
}
|
|
catch (COMException ex)
|
|
{
|
|
Logger.Error?.Print(LogClass.Application, $"WMI isn't available : {ex.Message}");
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
} |