diff --git a/.editorconfig b/.editorconfig
index c53ad35..d281947 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -11,7 +11,7 @@ insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
-end_of_line = lf
+end_of_line = crlf
[project.json]
indent_size = 2
diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index 020d6da..544cbfc 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -31,10 +31,10 @@ jobs:
} | Set-Content Directory.Build.props
- name: NuGet restore
- run: nuget restore LibreHardwareMonitor.sln
+ run: dotnet restore LibreHardwareMonitor.sln
- name: Build
- run: msbuild LibreHardwareMonitor.sln -p:Configuration=Release -m
+ run: dotnet build LibreHardwareMonitor.sln --configuration Release --no-restore
- name: Publish net472
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/pull requests.yml b/.github/workflows/pull requests.yml
index b293a12..3f57016 100644
--- a/.github/workflows/pull requests.yml
+++ b/.github/workflows/pull requests.yml
@@ -30,11 +30,11 @@ jobs:
else { $_ -replace $m.Value, ("{0}.{1}.{2}-ci${{ github.run_number }}" -f $m.Groups[1].Value,$m.Groups[2].Value,([convert]::ToInt32($m.Groups[3].Value)+1)); }
} | Set-Content Directory.Build.props
- - name: NuGet restore
- run: nuget restore LibreHardwareMonitor.sln
+ - name: Restore packages
+ run: dotnet restore LibreHardwareMonitor.sln
- name: Build
- run: msbuild LibreHardwareMonitor.sln -p:Configuration=Release -m
+ run: dotnet build LibreHardwareMonitor.sln --configuration Release --no-restore
- name: Publish net472
uses: actions/upload-artifact@v4
diff --git a/Aga.Controls/Aga.Controls.csproj b/Aga.Controls/Aga.Controls.csproj
index 58a2d1e..62f5202 100644
--- a/Aga.Controls/Aga.Controls.csproj
+++ b/Aga.Controls/Aga.Controls.csproj
@@ -1,6 +1,7 @@
true
+ x64
9.0.30729
@@ -13,11 +14,11 @@
true
..\bin\$(Configuration)\
-
+
full
TRACE;DEBUG;PERF_TEST
-
+
pdbonly
diff --git a/LibreHardwareMonitor.sln b/LibreHardwareMonitor.sln
index 4f2c71e..d2fdbaf 100644
--- a/LibreHardwareMonitor.sln
+++ b/LibreHardwareMonitor.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29306.81
+# Visual Studio Version 18
+VisualStudioVersion = 18.0.11018.127 d18.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibreHardwareMonitorLib", "LibreHardwareMonitorLib\LibreHardwareMonitorLib.csproj", "{B0397530-545A-471D-BB74-027AE456DF1A}"
EndProject
@@ -22,22 +22,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B0397530-545A-471D-BB74-027AE456DF1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B0397530-545A-471D-BB74-027AE456DF1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B0397530-545A-471D-BB74-027AE456DF1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B0397530-545A-471D-BB74-027AE456DF1A}.Release|Any CPU.Build.0 = Release|Any CPU
- {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Release|Any CPU.Build.0 = Release|Any CPU
- {E73BB233-D88B-44A7-A98F-D71EE158381D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E73BB233-D88B-44A7-A98F-D71EE158381D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E73BB233-D88B-44A7-A98F-D71EE158381D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E73BB233-D88B-44A7-A98F-D71EE158381D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B0397530-545A-471D-BB74-027AE456DF1A}.Debug|x64.ActiveCfg = Debug|x64
+ {B0397530-545A-471D-BB74-027AE456DF1A}.Debug|x64.Build.0 = Debug|x64
+ {B0397530-545A-471D-BB74-027AE456DF1A}.Release|x64.ActiveCfg = Release|x64
+ {B0397530-545A-471D-BB74-027AE456DF1A}.Release|x64.Build.0 = Release|x64
+ {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Debug|x64.ActiveCfg = Debug|x64
+ {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Debug|x64.Build.0 = Debug|x64
+ {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Release|x64.ActiveCfg = Release|x64
+ {F5E0C1F7-9E9B-46F2-AC88-8C9C1C923880}.Release|x64.Build.0 = Release|x64
+ {E73BB233-D88B-44A7-A98F-D71EE158381D}.Debug|x64.ActiveCfg = Debug|x64
+ {E73BB233-D88B-44A7-A98F-D71EE158381D}.Debug|x64.Build.0 = Debug|x64
+ {E73BB233-D88B-44A7-A98F-D71EE158381D}.Release|x64.ActiveCfg = Release|x64
+ {E73BB233-D88B-44A7-A98F-D71EE158381D}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/LibreHardwareMonitor/LibreHardwareMonitor.csproj b/LibreHardwareMonitor/LibreHardwareMonitor.csproj
index 2976d9d..ea657e4 100644
--- a/LibreHardwareMonitor/LibreHardwareMonitor.csproj
+++ b/LibreHardwareMonitor/LibreHardwareMonitor.csproj
@@ -1,6 +1,7 @@
true
+ x64
WinExe
@@ -15,13 +16,12 @@
true
..\bin\$(Configuration)\
latest
- AnyCPU
true
-
+
full
-
+
none
diff --git a/LibreHardwareMonitorLib/Hardware/Battery/BatteryGroup.cs b/LibreHardwareMonitorLib/Hardware/Battery/BatteryGroup.cs
index fc22616..d353df8 100644
--- a/LibreHardwareMonitorLib/Hardware/Battery/BatteryGroup.cs
+++ b/LibreHardwareMonitorLib/Hardware/Battery/BatteryGroup.cs
@@ -8,6 +8,9 @@ using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
+using Windows.Win32;
+using Windows.Win32.Devices.DeviceAndDriverInstallation;
+using Windows.Win32.Foundation;
using LibreHardwareMonitor.Interop;
using Microsoft.Win32.SafeHandles;
@@ -52,45 +55,48 @@ internal class BatteryGroup : IGroup
if (Software.OperatingSystem.IsUnix)
return;
- IntPtr hdev = SetupApi.SetupDiGetClassDevs(ref SetupApi.GUID_DEVICE_BATTERY, IntPtr.Zero, IntPtr.Zero, SetupApi.DIGCF_PRESENT | SetupApi.DIGCF_DEVICEINTERFACE);
- if (hdev != SetupApi.INVALID_HANDLE_VALUE)
+ SetupDiDestroyDeviceInfoListSafeHandle hdev = PInvoke.SetupDiGetClassDevs(PInvoke.GUID_DEVICE_BATTERY, null, HWND.Null, SETUP_DI_GET_CLASS_DEVS_FLAGS.DIGCF_PRESENT | SETUP_DI_GET_CLASS_DEVS_FLAGS.DIGCF_DEVICEINTERFACE);
+ if (!hdev.IsInvalid)
{
for (uint i = 0; ; i++)
{
- SetupApi.SP_DEVICE_INTERFACE_DATA did = default;
- did.cbSize = (uint)Marshal.SizeOf(typeof(SetupApi.SP_DEVICE_INTERFACE_DATA));
+ SP_DEVICE_INTERFACE_DATA data = default;
+ data.cbSize = (uint)sizeof(SP_DEVICE_INTERFACE_DATA);
- if (!SetupApi.SetupDiEnumDeviceInterfaces(hdev,
- IntPtr.Zero,
- ref SetupApi.GUID_DEVICE_BATTERY,
+ if (!PInvoke.SetupDiEnumDeviceInterfaces(hdev,
+ null,
+ PInvoke.GUID_DEVICE_BATTERY,
i,
- ref did))
+ ref data))
{
- if (Marshal.GetLastWin32Error() == SetupApi.ERROR_NO_MORE_ITEMS)
+ if (Marshal.GetLastWin32Error() == (int) WIN32_ERROR.ERROR_NO_MORE_ITEMS)
break;
}
else
{
- SetupApi.SetupDiGetDeviceInterfaceDetail(hdev,
- did,
- IntPtr.Zero,
+ uint cbRequired = 0;
+
+ PInvoke.SetupDiGetDeviceInterfaceDetail(hdev,
+ data,
+ null,
0,
- out uint cbRequired,
- IntPtr.Zero);
+ &cbRequired,
+ null);
- if (Marshal.GetLastWin32Error() == SetupApi.ERROR_INSUFFICIENT_BUFFER)
+ if (Marshal.GetLastWin32Error() == (int) WIN32_ERROR.ERROR_INSUFFICIENT_BUFFER)
{
- IntPtr pdidd = Kernel32.LocalAlloc(Kernel32.LPTR, cbRequired);
- Marshal.WriteInt32(pdidd, Environment.Is64BitProcess ? 8 : 4 + Marshal.SystemDefaultCharSize); // cbSize.
+ IntPtr buffer = Marshal.AllocHGlobal((int)cbRequired);
+ SP_DEVICE_INTERFACE_DETAIL_DATA_W* pData = (SP_DEVICE_INTERFACE_DETAIL_DATA_W*) buffer;
+ pData->cbSize = (uint)sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);
- if (SetupApi.SetupDiGetDeviceInterfaceDetail(hdev,
- did,
- pdidd,
+ if (PInvoke.SetupDiGetDeviceInterfaceDetail(hdev,
+ data,
+ pData,
cbRequired,
- out _,
- IntPtr.Zero))
+ &cbRequired,
+ null) )
{
- string devicePath = new((char*)(pdidd + 4));
+ string devicePath = pData->DevicePath.ToString();
SafeFileHandle battery = Kernel32.CreateFile(devicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
if (!battery.IsInvalid)
@@ -134,12 +140,12 @@ internal class BatteryGroup : IGroup
}
}
- Kernel32.LocalFree(pdidd);
+ Marshal.FreeHGlobal(buffer);
}
}
}
- SetupApi.SetupDiDestroyDeviceInfoList(hdev);
+ hdev.Dispose();
}
}
diff --git a/LibreHardwareMonitorLib/Hardware/Cpu/Amd10Cpu.cs b/LibreHardwareMonitorLib/Hardware/Cpu/Amd10Cpu.cs
index edcb03c..27984f9 100644
--- a/LibreHardwareMonitorLib/Hardware/Cpu/Amd10Cpu.cs
+++ b/LibreHardwareMonitorLib/Hardware/Cpu/Amd10Cpu.cs
@@ -34,7 +34,6 @@ internal sealed class Amd10Cpu : AmdCpu
_pawnModule = new AmdFamily10();
// AMD family 1Xh processors support only one temperature sensor
- ushort miscellaneousControlDeviceId;
_coreTemperature = new Sensor("CPU Cores", 0, SensorType.Temperature, this, new[] { new ParameterDescription("Offset [°C]", "Temperature offset.", 0) }, settings);
_coreVoltage = new Sensor("CPU Cores", 0, SensorType.Voltage, this, settings);
ActivateSensor(_coreVoltage);
diff --git a/LibreHardwareMonitorLib/Hardware/Cpu/CpuLoad.cs b/LibreHardwareMonitorLib/Hardware/Cpu/CpuLoad.cs
index 8a3beb1..3bb15b2 100644
--- a/LibreHardwareMonitorLib/Hardware/Cpu/CpuLoad.cs
+++ b/LibreHardwareMonitorLib/Hardware/Cpu/CpuLoad.cs
@@ -9,16 +9,18 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
+using Windows.Wdk;
+using Windows.Wdk.System.SystemInformation;
+using Windows.Win32.Foundation;
+using Windows.Win32.System.WindowsProgramming;
namespace LibreHardwareMonitor.Hardware.Cpu;
internal class CpuLoad
{
- private static readonly bool _queryIdleTimeSeparated = QueryIdleTimeSeparated();
-
private readonly double[] _threadLoads;
- private double _totalLoad;
private long[] _idleTimes;
+ private double _totalLoad;
private long[] _totalTimes;
public CpuLoad(CpuId[][] cpuid)
@@ -47,23 +49,49 @@ internal class CpuLoad
return !Software.OperatingSystem.IsUnix ? GetWindowsTimes(out idle, out total) : GetUnixTimes(out idle, out total);
}
- private static bool GetWindowsTimes(out long[] idle, out long[] total)
+ private static unsafe bool GetWindowsTimes(out long[] idle, out long[] total)
{
idle = null;
total = null;
- //use the idle time routine only with a few specific windows 11 versions
- if (_queryIdleTimeSeparated)
- return GetWindowsTimesFromIdleTimes(out idle, out total);
+ int size = sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * 64;
+ uint returnSize = 0;
+ IntPtr handle = Marshal.AllocHGlobal(size);
+ SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[] perfInformation;
- //Query processor performance information
- Interop.NtDll.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[] perfInformation = new Interop.NtDll.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[64];
- int perfSize = Marshal.SizeOf(typeof(Interop.NtDll.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
- if (Interop.NtDll.NtQuerySystemInformation(Interop.NtDll.SYSTEM_INFORMATION_CLASS.SystemProcessorPerformanceInformation, perfInformation, perfInformation.Length * perfSize, out int perfReturn) != 0)
- return false;
+ while (true)
+ {
+ //Query processor performance information
+ NTSTATUS status = PInvoke.NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS.SystemProcessorPerformanceInformation, (void*)handle, (uint)size, &returnSize);
+ if (status == NTSTATUS.STATUS_INFO_LENGTH_MISMATCH)
+ {
+ size = (int)returnSize;
+ handle = Marshal.ReAllocHGlobal(handle, new IntPtr(size));
+ }
+ else
+ {
+ if (status != NTSTATUS.STATUS_SUCCESS)
+ {
+ Marshal.FreeHGlobal(handle);
+ return false;
+ }
- idle = new long[perfReturn / perfSize];
- total = new long[perfReturn / perfSize];
+ SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* perfInformationPtr = (SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION*)handle;
+
+ int perfItemsCount = (int)(returnSize / sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
+ perfInformation = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[perfItemsCount];
+ for (int i = 0; i < perfItemsCount; i++)
+ {
+ perfInformation[i] = perfInformationPtr[i];
+ }
+
+ Marshal.FreeHGlobal(handle);
+ break;
+ }
+ }
+
+ idle = new long[perfInformation.Length];
+ total = new long[perfInformation.Length];
for (int i = 0; i < total.Length; i++)
{
idle[i] = perfInformation[i].IdleTime;
@@ -73,52 +101,13 @@ internal class CpuLoad
return true;
}
- private static bool GetWindowsTimesFromIdleTimes(out long[] idle, out long[] total)
- {
- idle = null;
- total = null;
-
- Interop.NtDll.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[] perfInformation = new Interop.NtDll.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[64];
- int perfSize = Marshal.SizeOf(typeof(Interop.NtDll.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
- Interop.NtDll.SYSTEM_PROCESSOR_IDLE_INFORMATION[] idleInformation = new Interop.NtDll.SYSTEM_PROCESSOR_IDLE_INFORMATION[64];
- int idleSize = Marshal.SizeOf(typeof(Interop.NtDll.SYSTEM_PROCESSOR_IDLE_INFORMATION));
-
- //Query processor performance and idle information
- //these 2 methods must be called as directly as possible one after the other
-
- //Query processor idle information
- if (Interop.NtDll.NtQuerySystemInformation(Interop.NtDll.SYSTEM_INFORMATION_CLASS.SystemProcessorIdleInformation, idleInformation, idleInformation.Length * idleSize, out int idleReturn) != 0)
- return false;
-
- //Query processor performance information
- if (Interop.NtDll.NtQuerySystemInformation(Interop.NtDll.SYSTEM_INFORMATION_CLASS.SystemProcessorPerformanceInformation, perfInformation, perfInformation.Length * perfSize, out int perfReturn) != 0)
- return false;
-
- int perfItemsCount = perfReturn / perfSize;
- int idleItemsCount = idleReturn / idleSize;
-
- if (perfItemsCount != idleItemsCount)
- return false;
-
- idle = new long[perfItemsCount];
- total = new long[perfItemsCount];
-
- for (int i = 0; i < perfItemsCount; i++)
- {
- idle[i] = idleInformation[i].IdleTime;
- total[i] = perfInformation[i].KernelTime + perfInformation[i].UserTime;
- }
-
- return true;
- }
-
private static bool GetUnixTimes(out long[] idle, out long[] total)
{
idle = null;
total = null;
- List idleList = new();
- List totalList = new();
+ List idleList = [];
+ List totalList = [];
if (!File.Exists("/proc/stat"))
return false;
@@ -131,7 +120,7 @@ internal class CpuLoad
// 0=cpu 1=user 2=nice 3=system 4=idle 5=iowait 6=irq 7=softirq 8=steal 9=guest 10=guest_nice
foreach (string cpuInfo in cpuInfos.Where(s => s.StartsWith("cpu") && s.Length > 3 && s[3] != ' '))
{
- string[] overall = cpuInfo.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
+ string[] overall = cpuInfo.Split([' '], StringSplitOptions.RemoveEmptyEntries);
try
{
@@ -214,21 +203,9 @@ internal class CpuLoad
{
total = 0;
}
-
+
_totalLoad = Math.Round(total * 100.0, 2);
_totalTimes = newTotalTimes;
_idleTimes = newIdleTimes;
}
-
- private static bool QueryIdleTimeSeparated()
- {
- if (Software.OperatingSystem.IsUnix)
- return false;
-
- // From Windows 11 22H2 the CPU idle time returned by SystemProcessorPerformanceInformation is invalid, this issue has been fixed with 24H2.
- OperatingSystem os = Environment.OSVersion;
- Version win1122H2 = new Version(10, 0, 22621, 0);
- Version win1124H2 = new Version(10, 0, 26100, 0);
- return os.Version >= win1122H2 && os.Version < win1124H2;
- }
}
diff --git a/LibreHardwareMonitorLib/Hardware/D3DDisplayDevice.cs b/LibreHardwareMonitorLib/Hardware/D3DDisplayDevice.cs
index 4fe02b9..f510089 100644
--- a/LibreHardwareMonitorLib/Hardware/D3DDisplayDevice.cs
+++ b/LibreHardwareMonitorLib/Hardware/D3DDisplayDevice.cs
@@ -7,20 +7,30 @@
using System;
using System.Linq;
using System.Runtime.InteropServices;
-using LibreHardwareMonitor.Interop;
+using Windows.Wdk.Graphics.Direct3D;
+using Windows.Win32;
+using Windows.Win32.Devices.DeviceAndDriverInstallation;
+using Windows.Win32.Foundation;
namespace LibreHardwareMonitor.Hardware;
internal static class D3DDisplayDevice
{
- public static string[] GetDeviceIdentifiers()
+ public static unsafe string[] GetDeviceIdentifiers()
{
- if (CfgMgr32.CM_Get_Device_Interface_List_Size(out uint size, ref CfgMgr32.GUID_DISPLAY_DEVICE_ARRIVAL, null, CfgMgr32.CM_GET_DEVICE_INTERFACE_LIST_PRESENT) != CfgMgr32.CR_SUCCESS)
+ if (PInvoke.CM_Get_Device_Interface_List_Size(out uint size, PInvoke.GUID_DISPLAY_DEVICE_ARRIVAL, null, CM_GET_DEVICE_INTERFACE_LIST_FLAGS.CM_GET_DEVICE_INTERFACE_LIST_PRESENT) !=
+ CONFIGRET.CR_SUCCESS)
return null;
char[] data = new char[size];
- if (CfgMgr32.CM_Get_Device_Interface_List(ref CfgMgr32.GUID_DISPLAY_DEVICE_ARRIVAL, null, data, (uint)data.Length, CfgMgr32.CM_GET_DEVICE_INTERFACE_LIST_PRESENT) == CfgMgr32.CR_SUCCESS)
- return new string(data).Split('\0').Where(m => !string.IsNullOrEmpty(m)).ToArray();
+ fixed (char* pData = data)
+ {
+ if (PInvoke.CM_Get_Device_Interface_List(PInvoke.GUID_DISPLAY_DEVICE_ARRIVAL, null, pData, (uint)data.Length, CM_GET_DEVICE_INTERFACE_LIST_FLAGS.CM_GET_DEVICE_INTERFACE_LIST_PRESENT) ==
+ CONFIGRET.CR_SUCCESS)
+ {
+ return new string(data).Split('\0').Where(m => !string.IsNullOrEmpty(m)).ToArray();
+ }
+ }
return null;
}
@@ -51,21 +61,21 @@ internal static class D3DDisplayDevice
{
deviceInfo = new D3DDeviceInfo();
- OpenAdapterFromDeviceName(out uint status, deviceIdentifier, out D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter);
- if (status != WinNt.STATUS_SUCCESS)
+ OpenAdapterFromDeviceName(out NTSTATUS status, deviceIdentifier, out D3DKMT_OPENADAPTERFROMDEVICENAME adapter);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
- GetAdapterType(out status, adapter, out D3dkmth.D3DKMT_ADAPTERTYPE adapterType);
- if (status != WinNt.STATUS_SUCCESS)
+ GetAdapterType(out status, adapter, out D3DKMT_ADAPTERTYPE adapterType);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
- if (!adapterType.Value.HasFlag(D3dkmth.D3DKMT_ADAPTERTYPE_FLAGS.SoftwareDevice))
+ if (adapterType.Anonymous.Anonymous.SoftwareDevice)
return false;
- deviceInfo.Integrated = !adapterType.Value.HasFlag(D3dkmth.D3DKMT_ADAPTERTYPE_FLAGS.HybridIntegrated);
+ deviceInfo.Integrated = adapterType.Anonymous.Anonymous.HybridIntegrated;
- GetQueryStatisticsAdapterInformation(out status, adapter, out D3dkmth.D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION adapterInformation);
- if (status != WinNt.STATUS_SUCCESS)
+ GetQueryStatisticsAdapterInformation(out status, adapter, out D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION adapterInformation);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
uint segmentCount = adapterInformation.NbSegments;
@@ -77,25 +87,25 @@ internal static class D3DDisplayDevice
for (uint nodeId = 0; nodeId < nodeCount; nodeId++)
{
- GetNodeMetaData(out status, adapter, nodeId, out D3dkmth.D3DKMT_NODEMETADATA nodeMetaData);
- if (status != WinNt.STATUS_SUCCESS)
+ GetNodeMetaData(out status, adapter, nodeId, out D3DKMT_NODEMETADATA nodeMetaData);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
- GetQueryStatisticsNode(out status, adapter, nodeId, out D3dkmth.D3DKMT_QUERYSTATISTICS_NODE_INFORMATION nodeInformation);
- if (status != WinNt.STATUS_SUCCESS)
+ GetQueryStatisticsNode(out status, adapter, nodeId, out D3DKMT_QUERYSTATISTICS_NODE_INFORMATION nodeInformation);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
deviceInfo.Nodes[nodeId] = new D3DDeviceNodeInfo
{
- Id = nodeId,
+ Id = nodeId,
Name = GetNodeEngineTypeString(nodeMetaData),
- RunningTime = nodeInformation.GlobalInformation.RunningTime.QuadPart,
+ RunningTime = nodeInformation.GlobalInformation.RunningTime,
QueryTime = queryTime
};
}
- GetSegmentSize(out status, adapter, out D3dkmth.D3DKMT_SEGMENTSIZEINFO segmentSizeInfo);
- if (status != WinNt.STATUS_SUCCESS)
+ GetSegmentSize(out status, adapter, out D3DKMT_SEGMENTSIZEINFO segmentSizeInfo);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
deviceInfo.GpuSharedLimit = segmentSizeInfo.SharedSystemMemorySize;
@@ -104,8 +114,8 @@ internal static class D3DDisplayDevice
for (uint segmentId = 0; segmentId < segmentCount; segmentId++)
{
- GetQueryStatisticsSegment(out status, adapter, segmentId, out D3dkmth.D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION segmentInformation);
- if (status != WinNt.STATUS_SUCCESS)
+ GetQueryStatisticsSegment(out status, adapter, segmentId, out D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION segmentInformation);
+ if (status != NTSTATUS.STATUS_SUCCESS)
return false;
ulong bytesResident = segmentInformation.BytesResident;
@@ -126,140 +136,138 @@ internal static class D3DDisplayDevice
}
CloseAdapter(out status, adapter);
- return status == WinNt.STATUS_SUCCESS;
+ return status == NTSTATUS.STATUS_SUCCESS;
}
- private static string GetNodeEngineTypeString(D3dkmth.D3DKMT_NODEMETADATA nodeMetaData)
+ private static string GetNodeEngineTypeString(D3DKMT_NODEMETADATA nodeMetaData)
{
return nodeMetaData.NodeData.EngineType switch
{
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_OTHER => "D3D " + (!string.IsNullOrWhiteSpace(nodeMetaData.NodeData.FriendlyName) ? nodeMetaData.NodeData.FriendlyName : "Other"),
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_3D => "D3D 3D",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_VIDEO_DECODE => "D3D Video Decode",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_VIDEO_ENCODE => "D3D Video Encode",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_VIDEO_PROCESSING => "D3D Video Processing",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_SCENE_ASSEMBLY => "D3D Scene Assembly",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_COPY => "D3D Copy",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_OVERLAY => "D3D Overlay",
- D3dkmdt.DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_CRYPTO => "D3D Crypto",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_OTHER => "D3D " + (nodeMetaData.NodeData.FriendlyName.Length > 0 ? nodeMetaData.NodeData.FriendlyName : "Other"),
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_3D => "D3D 3D",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_VIDEO_DECODE => "D3D Video Decode",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_VIDEO_ENCODE => "D3D Video Encode",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_VIDEO_PROCESSING => "D3D Video Processing",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_SCENE_ASSEMBLY => "D3D Scene Assembly",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_COPY => "D3D Copy",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_OVERLAY => "D3D Overlay",
+ DXGK_ENGINE_TYPE.DXGK_ENGINE_TYPE_CRYPTO => "D3D Crypto",
_ => "D3D Unknown"
};
}
- private static void GetSegmentSize
+ private static unsafe void GetSegmentSize
(
- out uint status,
- D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter,
- out D3dkmth.D3DKMT_SEGMENTSIZEINFO sizeInformation)
+ out NTSTATUS status,
+ D3DKMT_OPENADAPTERFROMDEVICENAME adapter,
+ out D3DKMT_SEGMENTSIZEINFO sizeInformation)
{
- IntPtr segmentSizePtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(D3dkmth.D3DKMT_SEGMENTSIZEINFO)));
- sizeInformation = new D3dkmth.D3DKMT_SEGMENTSIZEINFO();
- Marshal.StructureToPtr(sizeInformation, segmentSizePtr, true);
+ IntPtr segmentSizePtr = Marshal.AllocHGlobal(sizeof(D3DKMT_SEGMENTSIZEINFO));
- var queryAdapterInfo = new D3dkmth.D3DKMT_QUERYADAPTERINFO
+ var queryAdapterInfo = new D3DKMT_QUERYADAPTERINFO
{
hAdapter = adapter.hAdapter,
- Type = D3dkmth.KMTQUERYADAPTERINFOTYPE.KMTQAITYPE_GETSEGMENTSIZE,
- pPrivateDriverData = segmentSizePtr,
- PrivateDriverDataSize = Marshal.SizeOf(typeof(D3dkmth.D3DKMT_SEGMENTSIZEINFO))
+ Type = KMTQUERYADAPTERINFOTYPE.KMTQAITYPE_GETSEGMENTSIZE,
+ pPrivateDriverData = (void*)segmentSizePtr,
+ PrivateDriverDataSize = (uint)sizeof(D3DKMT_SEGMENTSIZEINFO)
};
- status = Gdi32.D3DKMTQueryAdapterInfo(ref queryAdapterInfo);
- sizeInformation = Marshal.PtrToStructure(segmentSizePtr);
+ status = Windows.Wdk.PInvoke.D3DKMTQueryAdapterInfo(ref queryAdapterInfo);
+ sizeInformation = *(D3DKMT_SEGMENTSIZEINFO*)segmentSizePtr;
Marshal.FreeHGlobal(segmentSizePtr);
}
- private static void GetNodeMetaData(out uint status, D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter, uint nodeId, out D3dkmth.D3DKMT_NODEMETADATA nodeMetaDataResult)
+ private static unsafe void GetNodeMetaData(out NTSTATUS status, D3DKMT_OPENADAPTERFROMDEVICENAME adapter, uint nodeId, out D3DKMT_NODEMETADATA nodeMetaDataResult)
{
- IntPtr nodeMetaDataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(D3dkmth.D3DKMT_NODEMETADATA)));
- nodeMetaDataResult = new D3dkmth.D3DKMT_NODEMETADATA { NodeOrdinalAndAdapterIndex = nodeId };
- Marshal.StructureToPtr(nodeMetaDataResult, nodeMetaDataPtr, true);
+ IntPtr nodeMetaDataPtr = Marshal.AllocHGlobal(sizeof(D3DKMT_NODEMETADATA));
- var queryAdapterInfo = new D3dkmth.D3DKMT_QUERYADAPTERINFO
+ D3DKMT_NODEMETADATA* pData = (D3DKMT_NODEMETADATA*)nodeMetaDataPtr;
+ pData->NodeOrdinalAndAdapterIndex = nodeId;
+
+ var queryAdapterInfo = new D3DKMT_QUERYADAPTERINFO
{
hAdapter = adapter.hAdapter,
- Type = D3dkmth.KMTQUERYADAPTERINFOTYPE.KMTQAITYPE_NODEMETADATA,
- pPrivateDriverData = nodeMetaDataPtr,
- PrivateDriverDataSize = Marshal.SizeOf(typeof(D3dkmth.D3DKMT_NODEMETADATA))
+ Type = KMTQUERYADAPTERINFOTYPE.KMTQAITYPE_NODEMETADATA,
+ pPrivateDriverData = (void*)nodeMetaDataPtr,
+ PrivateDriverDataSize = (uint)sizeof(D3DKMT_NODEMETADATA)
};
- status = Gdi32.D3DKMTQueryAdapterInfo(ref queryAdapterInfo);
- nodeMetaDataResult = Marshal.PtrToStructure(nodeMetaDataPtr);
+ status = Windows.Wdk.PInvoke.D3DKMTQueryAdapterInfo(ref queryAdapterInfo);
+ nodeMetaDataResult = *(D3DKMT_NODEMETADATA*)nodeMetaDataPtr;
Marshal.FreeHGlobal(nodeMetaDataPtr);
}
- private static void GetQueryStatisticsNode(out uint status, D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter, uint nodeId, out D3dkmth.D3DKMT_QUERYSTATISTICS_NODE_INFORMATION nodeInformation)
+ private static void GetQueryStatisticsNode(out NTSTATUS status, D3DKMT_OPENADAPTERFROMDEVICENAME adapter, uint nodeId, out D3DKMT_QUERYSTATISTICS_NODE_INFORMATION nodeInformation)
{
- var queryElement = new D3dkmth.D3DKMT_QUERYSTATISTICS_QUERY_ELEMENT { QueryNode = { NodeId = nodeId } };
-
- var queryStatistics = new D3dkmth.D3DKMT_QUERYSTATISTICS
+ var queryStatistics = new D3DKMT_QUERYSTATISTICS
{
- AdapterLuid = adapter.AdapterLuid, Type = D3dkmth.D3DKMT_QUERYSTATISTICS_TYPE.D3DKMT_QUERYSTATISTICS_NODE, QueryElement = queryElement
+ AdapterLuid = adapter.AdapterLuid,
+ Type = D3DKMT_QUERYSTATISTICS_TYPE.D3DKMT_QUERYSTATISTICS_NODE,
+ Anonymous = new D3DKMT_QUERYSTATISTICS._Anonymous_e__Union { QueryNode = new D3DKMT_QUERYSTATISTICS_QUERY_NODE { NodeId = nodeId } }
};
- status = Gdi32.D3DKMTQueryStatistics(ref queryStatistics);
-
+ status = Windows.Wdk.PInvoke.D3DKMTQueryStatistics(queryStatistics);
nodeInformation = queryStatistics.QueryResult.NodeInformation;
}
private static void GetQueryStatisticsSegment
(
- out uint status,
- D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter,
+ out NTSTATUS status,
+ D3DKMT_OPENADAPTERFROMDEVICENAME adapter,
uint segmentId,
- out D3dkmth.D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION segmentInformation)
+ out D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION segmentInformation)
{
- var queryElement = new D3dkmth.D3DKMT_QUERYSTATISTICS_QUERY_ELEMENT { QuerySegment = { SegmentId = segmentId } };
-
- var queryStatistics = new D3dkmth.D3DKMT_QUERYSTATISTICS
+ var queryStatistics = new D3DKMT_QUERYSTATISTICS
{
- AdapterLuid = adapter.AdapterLuid, Type = D3dkmth.D3DKMT_QUERYSTATISTICS_TYPE.D3DKMT_QUERYSTATISTICS_SEGMENT, QueryElement = queryElement
+ AdapterLuid = adapter.AdapterLuid,
+ Type = D3DKMT_QUERYSTATISTICS_TYPE.D3DKMT_QUERYSTATISTICS_SEGMENT,
+ Anonymous = new D3DKMT_QUERYSTATISTICS._Anonymous_e__Union { QuerySegment = new D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT { SegmentId = segmentId } }
};
- status = Gdi32.D3DKMTQueryStatistics(ref queryStatistics);
-
+ status = Windows.Wdk.PInvoke.D3DKMTQueryStatistics(queryStatistics);
segmentInformation = queryStatistics.QueryResult.SegmentInformation;
}
private static void GetQueryStatisticsAdapterInformation
(
- out uint status,
- D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter,
- out D3dkmth.D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION adapterInformation)
+ out NTSTATUS status,
+ D3DKMT_OPENADAPTERFROMDEVICENAME adapter,
+ out D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION adapterInformation)
{
- var queryStatistics = new D3dkmth.D3DKMT_QUERYSTATISTICS { AdapterLuid = adapter.AdapterLuid, Type = D3dkmth.D3DKMT_QUERYSTATISTICS_TYPE.D3DKMT_QUERYSTATISTICS_ADAPTER };
+ var queryStatistics = new D3DKMT_QUERYSTATISTICS { AdapterLuid = adapter.AdapterLuid, Type = D3DKMT_QUERYSTATISTICS_TYPE.D3DKMT_QUERYSTATISTICS_ADAPTER };
- status = Gdi32.D3DKMTQueryStatistics(ref queryStatistics);
+ status = Windows.Wdk.PInvoke.D3DKMTQueryStatistics(queryStatistics);
adapterInformation = queryStatistics.QueryResult.AdapterInformation;
}
- private static void GetAdapterType(out uint status, D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter, out D3dkmth.D3DKMT_ADAPTERTYPE adapterTypeResult)
+ private static unsafe void GetAdapterType(out NTSTATUS status, D3DKMT_OPENADAPTERFROMDEVICENAME adapter, out D3DKMT_ADAPTERTYPE adapterTypeResult)
{
- IntPtr adapterTypePtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(D3dkmth.D3DKMT_ADAPTERTYPE)));
- var queryAdapterInfo = new D3dkmth.D3DKMT_QUERYADAPTERINFO
+ IntPtr adapterTypePtr = Marshal.AllocHGlobal(sizeof(D3DKMT_ADAPTERTYPE));
+
+ var queryAdapterInfo = new D3DKMT_QUERYADAPTERINFO
{
- hAdapter = adapter.hAdapter,
- Type = D3dkmth.KMTQUERYADAPTERINFOTYPE.KMTQAITYPE_ADAPTERTYPE,
- pPrivateDriverData = adapterTypePtr,
- PrivateDriverDataSize = Marshal.SizeOf(typeof(D3dkmth.D3DKMT_ADAPTERTYPE))
+ hAdapter = adapter.hAdapter, Type = KMTQUERYADAPTERINFOTYPE.KMTQAITYPE_ADAPTERTYPE, pPrivateDriverData = (void*)adapterTypePtr, PrivateDriverDataSize = (uint)sizeof(D3DKMT_ADAPTERTYPE)
};
- status = Gdi32.D3DKMTQueryAdapterInfo(ref queryAdapterInfo);
- adapterTypeResult = Marshal.PtrToStructure(adapterTypePtr);
+ status = Windows.Wdk.PInvoke.D3DKMTQueryAdapterInfo(ref queryAdapterInfo);
+ adapterTypeResult = *(D3DKMT_ADAPTERTYPE*)adapterTypePtr;
Marshal.FreeHGlobal(adapterTypePtr);
}
- private static void OpenAdapterFromDeviceName(out uint status, string displayDeviceName, out D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter)
+ private static unsafe void OpenAdapterFromDeviceName(out NTSTATUS status, string displayDeviceName, out D3DKMT_OPENADAPTERFROMDEVICENAME adapter)
{
- adapter = new D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME { pDeviceName = displayDeviceName };
- status = Gdi32.D3DKMTOpenAdapterFromDeviceName(ref adapter);
+ fixed (char* pDisplayDeviceName = displayDeviceName)
+ {
+ adapter = new D3DKMT_OPENADAPTERFROMDEVICENAME { pDeviceName = new PCWSTR(pDisplayDeviceName) };
+ status = Windows.Wdk.PInvoke.D3DKMTOpenAdapterFromDeviceName(ref adapter);
+ }
}
- private static void CloseAdapter(out uint status, D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME adapter)
+ private static void CloseAdapter(out NTSTATUS status, D3DKMT_OPENADAPTERFROMDEVICENAME adapter)
{
- var closeAdapter = new D3dkmth.D3DKMT_CLOSEADAPTER { hAdapter = adapter.hAdapter };
- status = Gdi32.D3DKMTCloseAdapter(ref closeAdapter);
+ var closeAdapter = new D3DKMT_CLOSEADAPTER { hAdapter = adapter.hAdapter };
+ status = Windows.Wdk.PInvoke.D3DKMTCloseAdapter(closeAdapter);
}
public struct D3DDeviceNodeInfo
diff --git a/LibreHardwareMonitorLib/Hardware/Memory/MemoryWindows.cs b/LibreHardwareMonitorLib/Hardware/Memory/MemoryWindows.cs
index 15b9998..407ef54 100644
--- a/LibreHardwareMonitorLib/Hardware/Memory/MemoryWindows.cs
+++ b/LibreHardwareMonitorLib/Hardware/Memory/MemoryWindows.cs
@@ -4,34 +4,34 @@
// Partial Copyright (C) Michael Möller and Contributors.
// All Rights Reserved.
-using System.Runtime.InteropServices;
-using LibreHardwareMonitor.Interop;
+using Windows.Win32;
+using Windows.Win32.System.SystemInformation;
namespace LibreHardwareMonitor.Hardware.Memory;
-internal static class MemoryWindows
+internal static unsafe class MemoryWindows
{
public static void Update(TotalMemory memory)
{
- Kernel32.MEMORYSTATUSEX status = new() { dwLength = (uint)Marshal.SizeOf() };
+ MEMORYSTATUSEX status = new() { dwLength = (uint)sizeof(MEMORYSTATUSEX) };
- if (!Kernel32.GlobalMemoryStatusEx(ref status))
+ if (!PInvoke.GlobalMemoryStatusEx(ref status))
return;
- memory.PhysicalMemoryUsed.Value = (float)(status.ullTotalPhys - status.ullAvailPhys) / (1024 * 1024 * 1024);
+ memory.PhysicalMemoryUsed.Value = (float)(status.ullTotalPhys - status.ullAvailPhys) / (1024 * 1024 * 1024);
memory.PhysicalMemoryAvailable.Value = (float)status.ullAvailPhys / (1024 * 1024 * 1024);
- memory.PhysicalMemoryLoad.Value = 100.0f - ((100.0f * status.ullAvailPhys) / status.ullTotalPhys);
+ memory.PhysicalMemoryLoad.Value = 100.0f - ((100.0f * status.ullAvailPhys) / status.ullTotalPhys);
}
public static void Update(VirtualMemory memory)
{
- Kernel32.MEMORYSTATUSEX status = new() { dwLength = (uint)Marshal.SizeOf() };
+ MEMORYSTATUSEX status = new() { dwLength = (uint)sizeof(MEMORYSTATUSEX) };
- if (!Kernel32.GlobalMemoryStatusEx(ref status))
+ if (!PInvoke.GlobalMemoryStatusEx(ref status))
return;
- memory.VirtualMemoryUsed.Value = (float)(status.ullTotalPageFile - status.ullAvailPageFile) / (1024 * 1024 * 1024);
+ memory.VirtualMemoryUsed.Value = (float)(status.ullTotalPageFile - status.ullAvailPageFile) / (1024 * 1024 * 1024);
memory.VirtualMemoryAvailable.Value = (float)status.ullAvailPageFile / (1024 * 1024 * 1024);
- memory.VirtualMemoryLoad.Value = 100.0f - ((100.0f * status.ullAvailPageFile) / status.ullTotalPageFile);
+ memory.VirtualMemoryLoad.Value = 100.0f - ((100.0f * status.ullAvailPageFile) / status.ullTotalPageFile);
}
}
diff --git a/LibreHardwareMonitorLib/Hardware/OpCode.cs b/LibreHardwareMonitorLib/Hardware/OpCode.cs
index 8d5fd5c..28d7121 100644
--- a/LibreHardwareMonitorLib/Hardware/OpCode.cs
+++ b/LibreHardwareMonitorLib/Hardware/OpCode.cs
@@ -31,7 +31,7 @@ internal static class OpCode
// }
private static readonly byte[] CpuId32 =
- {
+ [
0x55, // push ebp
0x8B,
0xEC, // mov ebp, esp
@@ -100,10 +100,10 @@ internal static class OpCode
0xC2,
0x18,
0x00 // ret 18h
- };
+ ];
private static readonly byte[] CpuId64Linux =
- {
+ [
0x49,
0x89,
0xD2, // mov r10, rdx
@@ -131,10 +131,10 @@ internal static class OpCode
0x11, // mov dword ptr [r9], edx
0x5B, // pop rbx
0xC3 // ret
- };
+ ];
private static readonly byte[] CpuId64Windows =
- {
+ [
0x48,
0x89,
0x5C,
@@ -172,21 +172,21 @@ internal static class OpCode
0x89,
0x10, // mov dword ptr [rax], edx
0xC3 // ret
- };
+ ];
// unsigned __int64 __stdcall rdtsc() {
// return __rdtsc();
// }
private static readonly byte[] Rdtsc32 =
- {
+ [
0x0F,
0x31, // rdtsc
0xC3 // ret
- };
+ ];
private static readonly byte[] Rdtsc64 =
- {
+ [
0x0F,
0x31, // rdtsc
0x48,
@@ -197,7 +197,7 @@ internal static class OpCode
0x0B,
0xC2, // or rax, rdx
0xC3 // ret
- };
+ ];
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate bool CpuidDelegate(uint index, uint ecxValue, out uint eax, out uint ebx, out uint ecx, out uint edx);
@@ -245,7 +245,7 @@ internal static class OpCode
(int)mmapFlags.GetField("MAP_PRIVATE").GetValue(null));
if (mmap != null)
- _codeBuffer = (IntPtr)mmap.Invoke(null, new[] { IntPtr.Zero, _size, mmapProtsParam, mmapFlagsParam, -1, 0 });
+ _codeBuffer = (IntPtr)mmap.Invoke(null, [IntPtr.Zero, _size, mmapProtsParam, mmapFlagsParam, -1, 0]);
}
else
{
@@ -272,30 +272,16 @@ internal static class OpCode
#if NETFRAMEWORK
Assembly assembly = Assembly.Load("Mono.Posix, Version=2.0.0.0, Culture=neutral, " + "PublicKeyToken=0738eb9f132ed756");
#else
- Assembly assembly = Assembly.Load("Mono.Posix.NETStandard, Version=1.0.0.0, Culture=neutral");
+ Assembly assembly = Assembly.Load("Mono.Posix.NETStandard, Version=1.0.0.0, Culture=neutral");
#endif
Type sysCall = assembly.GetType("Mono.Unix.Native.Syscall");
MethodInfo method = sysCall.GetMethod("munmap");
- method?.Invoke(null, new object[] { _codeBuffer, _size });
+ method?.Invoke(null, [_codeBuffer, _size]);
}
else
{
Interop.Kernel32.VirtualFree(_codeBuffer, UIntPtr.Zero, Interop.Kernel32.MEM.MEM_RELEASE);
}
}
-
- public static bool CpuIdTx(uint index, uint ecxValue, out uint eax, out uint ebx, out uint ecx, out uint edx, GroupAffinity affinity)
- {
- GroupAffinity previousAffinity = ThreadAffinity.Set(affinity);
- if (previousAffinity == GroupAffinity.Undefined)
- {
- eax = ebx = ecx = edx = 0;
- return false;
- }
-
- CpuId(index, ecxValue, out eax, out ebx, out ecx, out edx);
- ThreadAffinity.Set(previousAffinity);
- return true;
- }
}
diff --git a/LibreHardwareMonitorLib/Hardware/ThreadAffinity.cs b/LibreHardwareMonitorLib/Hardware/ThreadAffinity.cs
index 4c2ebac..d22f99a 100644
--- a/LibreHardwareMonitorLib/Hardware/ThreadAffinity.cs
+++ b/LibreHardwareMonitorLib/Hardware/ThreadAffinity.cs
@@ -5,6 +5,7 @@
// All Rights Reserved.
using System;
+using Windows.Win32;
using LibreHardwareMonitor.Interop;
namespace LibreHardwareMonitor.Hardware;
@@ -16,7 +17,7 @@ internal static class ThreadAffinity
///
static ThreadAffinity()
{
- ProcessorGroupCount = Software.OperatingSystem.IsUnix ? 1 : Kernel32.GetActiveProcessorGroupCount();
+ ProcessorGroupCount = Software.OperatingSystem.IsUnix ? 1 : PInvoke.GetActiveProcessorGroupCount();
if (ProcessorGroupCount < 1)
ProcessorGroupCount = 1;
@@ -58,7 +59,7 @@ internal static class ThreadAffinity
var groupAffinity = new Kernel32.GROUP_AFFINITY { Group = affinity.Group, Mask = (UIntPtr)affinity.Mask };
- IntPtr currentThread = Kernel32.GetCurrentThread();
+ IntPtr currentThread = PInvoke.GetCurrentThread();
return Kernel32.SetThreadGroupAffinity(currentThread,
ref groupAffinity,
diff --git a/LibreHardwareMonitorLib/Interop/AdvApi32.cs b/LibreHardwareMonitorLib/Interop/AdvApi32.cs
deleted file mode 100644
index 92133cc..0000000
--- a/LibreHardwareMonitorLib/Interop/AdvApi32.cs
+++ /dev/null
@@ -1,150 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-using System;
-using System.Runtime.InteropServices;
-
-// ReSharper disable InconsistentNaming
-
-namespace LibreHardwareMonitor.Interop;
-
-internal class AdvApi32
-{
- private const string DllName = "advapi32.dll";
-
- [DllImport(DllName, SetLastError = true, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr OpenSCManager(string lpMachineName, string lpDatabaseName, SC_MANAGER_ACCESS_MASK dwDesiredAccess);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool CloseServiceHandle(IntPtr hSCObject);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr CreateService
- (
- IntPtr hSCManager,
- string lpServiceName,
- string lpDisplayName,
- SERVICE_ACCESS_MASK dwDesiredAccess,
- SERVICE_TYPE dwServiceType,
- SERVICE_START dwStartType,
- SERVICE_ERROR dwErrorControl,
- string lpBinaryPathName,
- string lpLoadOrderGroup,
- string lpdwTagId,
- string lpDependencies,
- string lpServiceStartName,
- string lpPassword);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, SERVICE_ACCESS_MASK dwDesiredAccess);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool DeleteService(IntPtr hService);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool StartService(IntPtr hService, uint dwNumServiceArgs, string[] lpServiceArgVectors);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool ControlService(IntPtr hService, SERVICE_CONTROL dwControl, ref SERVICE_STATUS lpServiceStatus);
-
- [Flags]
- internal enum SC_MANAGER_ACCESS_MASK : uint
- {
- SC_MANAGER_CONNECT = 0x00001,
- SC_MANAGER_CREATE_SERVICE = 0x00002,
- SC_MANAGER_ENUMERATE_SERVICE = 0x00004,
- SC_MANAGER_LOCK = 0x00008,
- SC_MANAGER_QUERY_LOCK_STATUS = 0x00010,
- SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020,
- SC_MANAGER_ALL_ACCESS = 0xF003F
- }
-
- internal enum SERVICE_ACCESS_MASK : uint
- {
- SERVICE_QUERY_CONFIG = 0x00001,
- SERVICE_CHANGE_CONFIG = 0x00002,
- SERVICE_QUERY_STATUS = 0x00004,
- SERVICE_ENUMERATE_DEPENDENTS = 0x00008,
- SERVICE_START = 0x00010,
- SERVICE_STOP = 0x00020,
- SERVICE_PAUSE_CONTINUE = 0x00040,
- SERVICE_INTERROGATE = 0x00080,
- SERVICE_USER_DEFINED_CONTROL = 0x00100,
- SERVICE_ALL_ACCESS = 0xF01FF
- }
-
- internal enum SERVICE_TYPE : uint
- {
- SERVICE_DRIVER = 0x0000000B,
- SERVICE_WIN32 = 0x00000030,
- SERVICE_ADAPTER = 0x00000004,
- SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
- SERVICE_KERNEL_DRIVER = 0x00000001,
- SERVICE_RECOGNIZER_DRIVER = 0x00000008,
- SERVICE_WIN32_OWN_PROCESS = 0x00000010,
- SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
- SERVICE_USER_OWN_PROCESS = 0x00000050,
- SERVICE_USER_SHARE_PROCESS = 0x00000060,
- SERVICE_INTERACTIVE_PROCESS = 0x00000100
- }
-
- internal enum SERVICE_START : uint
- {
- SERVICE_BOOT_START = 0,
- SERVICE_SYSTEM_START = 1,
- SERVICE_AUTO_START = 2,
- SERVICE_DEMAND_START = 3,
- SERVICE_DISABLED = 4
- }
-
- internal enum SERVICE_ERROR : uint
- {
- SERVICE_ERROR_IGNORE = 0,
- SERVICE_ERROR_NORMAL = 1,
- SERVICE_ERROR_SEVERE = 2,
- SERVICE_ERROR_CRITICAL = 3
- }
-
- internal enum SERVICE_CONTROL : uint
- {
- SERVICE_CONTROL_STOP = 1,
- SERVICE_CONTROL_PAUSE = 2,
- SERVICE_CONTROL_CONTINUE = 3,
- SERVICE_CONTROL_INTERROGATE = 4,
- SERVICE_CONTROL_SHUTDOWN = 5,
- SERVICE_CONTROL_PARAMCHANGE = 6,
- SERVICE_CONTROL_NETBINDADD = 7,
- SERVICE_CONTROL_NETBINDREMOVE = 8,
- SERVICE_CONTROL_NETBINDENABLE = 9,
- SERVICE_CONTROL_NETBINDDISABLE = 10,
- SERVICE_CONTROL_DEVICEEVENT = 11,
- SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12,
- SERVICE_CONTROL_POWEREVENT = 13,
- SERVICE_CONTROL_SESSIONCHANGE = 14
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- internal struct SERVICE_STATUS
- {
- public uint dwServiceType;
- public uint dwCurrentState;
- public uint dwControlsAccepted;
- public uint dwWin32ExitCode;
- public uint dwServiceSpecificExitCode;
- public uint dwCheckPoint;
- public uint dwWaitHint;
- }
-}
diff --git a/LibreHardwareMonitorLib/Interop/CfgMgr32.cs b/LibreHardwareMonitorLib/Interop/CfgMgr32.cs
deleted file mode 100644
index 43cf0ba..0000000
--- a/LibreHardwareMonitorLib/Interop/CfgMgr32.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-// ReSharper disable IdentifierTypo
-// ReSharper disable InconsistentNaming
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace LibreHardwareMonitor.Interop;
-
-internal static class CfgMgr32
-{
- internal const uint CM_GET_DEVICE_INTERFACE_LIST_PRESENT = 0;
- internal const int CR_SUCCESS = 0;
-
- internal const string DllName = "CfgMgr32.dll";
- internal static Guid GUID_DISPLAY_DEVICE_ARRIVAL = new("1CA05180-A699-450A-9A0C-DE4FBE3DDD89");
-
- [DllImport(DllName, CharSet = CharSet.Unicode)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern uint CM_Get_Device_Interface_List_Size(out uint size, ref Guid interfaceClassGuid, string deviceID, uint flags);
-
- [DllImport(DllName, CharSet = CharSet.Unicode)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern uint CM_Get_Device_Interface_List(ref Guid interfaceClassGuid, string deviceID, char[] buffer, uint bufferLength, uint flags);
-}
\ No newline at end of file
diff --git a/LibreHardwareMonitorLib/Interop/D3dkmdt.cs b/LibreHardwareMonitorLib/Interop/D3dkmdt.cs
deleted file mode 100644
index c809a4e..0000000
--- a/LibreHardwareMonitorLib/Interop/D3dkmdt.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-// ReSharper disable IdentifierTypo
-// ReSharper disable InconsistentNaming
-
-using System.Runtime.InteropServices;
-
-namespace LibreHardwareMonitor.Interop;
-
-internal static class D3dkmdt
-{
- internal enum DXGK_ENGINE_TYPE
- {
- DXGK_ENGINE_TYPE_OTHER = 0,
- DXGK_ENGINE_TYPE_3D = 1,
- DXGK_ENGINE_TYPE_VIDEO_DECODE = 2,
- DXGK_ENGINE_TYPE_VIDEO_ENCODE = 3,
- DXGK_ENGINE_TYPE_VIDEO_PROCESSING = 4,
- DXGK_ENGINE_TYPE_SCENE_ASSEMBLY = 5,
- DXGK_ENGINE_TYPE_COPY = 6,
- DXGK_ENGINE_TYPE_OVERLAY = 7,
- DXGK_ENGINE_TYPE_CRYPTO,
- DXGK_ENGINE_TYPE_MAX
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct DXGK_NODEMETADATA_FLAGS
- {
- public uint Value;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
- internal struct DXGK_NODEMETADATA
- {
- public DXGK_ENGINE_TYPE EngineType;
-
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
- public string FriendlyName;
-
- public DXGK_NODEMETADATA_FLAGS Flags;
- public byte GpuMmuSupported;
- public byte IoMmuSupported;
- }
-}
\ No newline at end of file
diff --git a/LibreHardwareMonitorLib/Interop/D3dkmth.cs b/LibreHardwareMonitorLib/Interop/D3dkmth.cs
deleted file mode 100644
index 016bdfa..0000000
--- a/LibreHardwareMonitorLib/Interop/D3dkmth.cs
+++ /dev/null
@@ -1,562 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-// ReSharper disable IdentifierTypo
-// ReSharper disable InconsistentNaming
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace LibreHardwareMonitor.Interop;
-
-internal static class D3dkmth
-{
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_CLOSEADAPTER
- {
- public uint hAdapter;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYADAPTERINFO
- {
- public uint hAdapter;
- public KMTQUERYADAPTERINFOTYPE Type;
- public IntPtr pPrivateDriverData;
- public int PrivateDriverDataSize;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_OPENADAPTERFROMDEVICENAME
- {
- [MarshalAs(UnmanagedType.LPWStr)]
- public string pDeviceName;
-
- public uint hAdapter;
- public WinNt.LUID AdapterLuid;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_ADAPTERTYPE
- {
- public D3DKMT_ADAPTERTYPE_FLAGS Value;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT
- {
- public uint SegmentId;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_QUERY_NODE
- {
- public uint NodeId;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE
- {
- public uint VidPnSourceId;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_REFERENCE_DMA_BUFFER
- {
- public uint NbCall;
- public uint NbAllocationsReferenced;
- public uint MaxNbAllocationsReferenced;
- public uint NbNULLReference;
- public uint NbWriteReference;
- public uint NbRenamedAllocationsReferenced;
- public uint NbIterationSearchingRenamedAllocation;
- public uint NbLockedAllocationReferenced;
- public uint NbAllocationWithValidPrepatchingInfoReferenced;
- public uint NbAllocationWithInvalidPrepatchingInfoReferenced;
- public uint NbDMABufferSuccessfullyPrePatched;
- public uint NbPrimariesReferencesOverflow;
- public uint NbAllocationWithNonPreferredResources;
- public uint NbAllocationInsertedInMigrationTable;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_SEGMENTSIZEINFO
- {
- public ulong DedicatedVideoMemorySize;
- public ulong DedicatedSystemMemorySize;
- public ulong SharedSystemMemorySize;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_RENAMING
- {
- public uint NbAllocationsRenamed;
- public uint NbAllocationsShrinked;
- public uint NbRenamedBuffer;
- public uint MaxRenamingListLength;
- public uint NbFailuresDueToRenamingLimit;
- public uint NbFailuresDueToCreateAllocation;
- public uint NbFailuresDueToOpenAllocation;
- public uint NbFailuresDueToLowResource;
- public uint NbFailuresDueToNonRetiredLimit;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_COUNTER
- {
- public uint Count;
- public ulong Bytes;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_PREPRATION
- {
- public uint BroadcastStall;
- public uint NbDMAPrepared;
- public uint NbDMAPreparedLongPath;
- public uint ImmediateHighestPreparationPass;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocationsTrimmed;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_PAGING_FAULT
- {
- public D3DKMT_QUERYSTATISTICS_COUNTER Faults;
- public D3DKMT_QUERYSTATISTICS_COUNTER FaultsFirstTimeAccess;
- public D3DKMT_QUERYSTATISTICS_COUNTER FaultsReclaimed;
- public D3DKMT_QUERYSTATISTICS_COUNTER FaultsMigration;
- public D3DKMT_QUERYSTATISTICS_COUNTER FaultsIncorrectResource;
- public D3DKMT_QUERYSTATISTICS_COUNTER FaultsLostContent;
- public D3DKMT_QUERYSTATISTICS_COUNTER FaultsEvicted;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocationsMEM_RESET;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocationsUnresetSuccess;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocationsUnresetFail;
-
- public uint AllocationsUnresetSuccessRead;
- public uint AllocationsUnresetFailRead;
-
- public D3DKMT_QUERYSTATISTICS_COUNTER Evictions;
- public D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToPreparation;
- public D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToLock;
- public D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToClose;
- public D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToPurge;
- public D3DKMT_QUERYSTATISTICS_COUNTER EvictionsDueToSuspendCPUAccess;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_PAGING_TRANSFER
- {
- public ulong BytesFilled;
- public ulong BytesDiscarded;
- public ulong BytesMappedIntoAperture;
- public ulong BytesUnmappedFromAperture;
- public ulong BytesTransferredFromMdlToMemory;
- public ulong BytesTransferredFromMemoryToMdl;
- public ulong BytesTransferredFromApertureToMemory;
- public ulong BytesTransferredFromMemoryToAperture;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_SWIZZLING_RANGE
- {
- public uint NbRangesAcquired;
- public uint NbRangesReleased;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_LOCKS
- {
- public uint NbLocks;
- public uint NbLocksWaitFlag;
- public uint NbLocksDiscardFlag;
- public uint NbLocksNoOverwrite;
- public uint NbLocksNoReadSync;
- public uint NbLocksLinearization;
- public uint NbComplexLocks;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_ALLOCATIONS
- {
- public D3DKMT_QUERYSTATISTICS_COUNTER Created;
- public D3DKMT_QUERYSTATISTICS_COUNTER Destroyed;
- public D3DKMT_QUERYSTATISTICS_COUNTER Opened;
- public D3DKMT_QUERYSTATISTICS_COUNTER Closed;
- public D3DKMT_QUERYSTATISTICS_COUNTER MigratedSuccess;
- public D3DKMT_QUERYSTATISTICS_COUNTER MigratedFail;
- public D3DKMT_QUERYSTATISTICS_COUNTER MigratedAbandoned;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_TERMINATIONS
- {
- public D3DKMT_QUERYSTATISTICS_COUNTER TerminatedShared;
- public D3DKMT_QUERYSTATISTICS_COUNTER TerminatedNonShared;
- public D3DKMT_QUERYSTATISTICS_COUNTER DestroyedShared;
- public D3DKMT_QUERYSTATISTICS_COUNTER DestroyedNonShared;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION
- {
- public uint NbSegments;
- public uint NodeCount;
- public uint VidPnSourceCount;
-
- public uint VSyncEnabled;
- public uint TdrDetectedCount;
-
- public long ZeroLengthDmaBuffers;
- public ulong RestartedPeriod;
-
- public D3DKMT_QUERYSTATISTICS_REFERENCE_DMA_BUFFER ReferenceDmaBuffer;
- public D3DKMT_QUERYSTATISTICS_RENAMING Renaming;
- public D3DKMT_QUERYSTATISTICS_PREPRATION Preparation;
- public D3DKMT_QUERYSTATISTICS_PAGING_FAULT PagingFault;
- public D3DKMT_QUERYSTATISTICS_PAGING_TRANSFER PagingTransfer;
- public D3DKMT_QUERYSTATISTICS_SWIZZLING_RANGE SwizzlingRange;
- public D3DKMT_QUERYSTATISTICS_LOCKS Locks;
- public D3DKMT_QUERYSTATISTICS_ALLOCATIONS Allocations;
- public D3DKMT_QUERYSTATISTICS_TERMINATIONS Terminations;
-
- private readonly ulong Reserved;
- private readonly ulong Reserved1;
- private readonly ulong Reserved2;
- private readonly ulong Reserved3;
- private readonly ulong Reserved4;
- private readonly ulong Reserved5;
- private readonly ulong Reserved6;
- private readonly ulong Reserved7;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_MEMORY
- {
- public ulong TotalBytesEvicted;
- public uint AllocsCommitted;
- public uint AllocsResident;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal unsafe struct D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION
- {
- public ulong CommitLimit;
- public ulong BytesCommitted;
- public ulong BytesResident;
- public D3DKMT_QUERYSTATISTICS_MEMORY Memory;
- public uint Aperture; // boolean
- public fixed ulong TotalBytesEvictedByPriority[5]; // D3DKMT_QUERYSTATISTICS_SEGMENT_PREFERENCE_MAX
- public ulong SystemMemoryEndAddress;
- public D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION_POWER_FLAGS PowerFlags;
- public fixed ulong Reserved[6];
- }
-
- [StructLayout(LayoutKind.Explicit)]
- internal struct D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION_POWER_FLAGS
- {
- [FieldOffset(0)]
- public ulong PreservedDuringStandby;
-
- [FieldOffset(1)]
- public ulong PreservedDuringHibernate;
-
- [FieldOffset(2)]
- public ulong PartiallyPreservedDuringHibernate;
-
- [FieldOffset(3)]
- public ulong Reserved;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_VIDEO_MEMORY
- {
- public uint AllocsCommitted;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentIn0;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentIn1;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentIn2;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentIn3;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentIn4;
- public D3DKMT_QUERYSTATISTICS_COUNTER AllocsResidentInNonPreferred;
- public ulong TotalBytesEvictedDueToPreparation;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_POLICY
- {
- public ulong UseMRU;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal unsafe struct D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_INFORMATION
- {
- public ulong BytesCommitted;
- public ulong MaximumWorkingSet;
- public ulong MinimumWorkingSet;
-
- public uint NbReferencedAllocationEvictedInPeriod;
-
- public D3DKMT_QUERYSTATISTICS_VIDEO_MEMORY VideoMemory;
- public D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_POLICY _Policy;
-
- public fixed ulong Reserved[8];
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_PREEMPTION_INFORMATION
- {
- public uint PreemptionCounter;
- public uint PreemptionCounter1;
- public uint PreemptionCounter2;
- public uint PreemptionCounter3;
- public uint PreemptionCounter4;
- public uint PreemptionCounter5;
- public uint PreemptionCounter6;
- public uint PreemptionCounter7;
- public uint PreemptionCounter8;
- public uint PreemptionCounter9;
- public uint PreemptionCounter10;
- public uint PreemptionCounter11;
- public uint PreemptionCounter12;
- public uint PreemptionCounter13;
- public uint PreemptionCounter14;
- public uint PreemptionCounter15;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal unsafe struct D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION
- {
- public WinNt.LARGE_INTEGER RunningTime; // 100ns
- public uint ContextSwitch;
- private readonly D3DKMT_QUERYSTATISTICS_PREEMPTION_INFORMATION PreemptionStatistics;
- private readonly D3DKMT_QUERYSTATISTICS_PACKET_INFORMATION PacketStatistics;
- private fixed ulong Reserved[8];
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal unsafe struct D3DKMT_QUERYSTATISTICS_NODE_INFORMATION
- {
- public D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION GlobalInformation; // global
-
- public D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION SystemInformation; // system thread
-
- //public UInt32 NodeId; // Win10
- public fixed ulong Reserved[8];
- }
-
- internal struct D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION
- {
- public uint PacketSubmitted;
- public uint PacketCompleted;
- public uint PacketPreempted;
- public uint PacketFaulted;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION
- {
- public uint PacketSubmited;
- public uint PacketCompleted;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS_PACKET_INFORMATION
- {
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket1;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket2;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket3;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket4;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket5;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket6;
- public D3DKMT_QUERYSTATISTICS_QUEUE_PACKET_TYPE_INFORMATION QueuePacket7;
-
- public D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION DmaPacket;
- public D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION DmaPacket1;
- public D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION DmaPacket2;
- public D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE_INFORMATION DmaPacket3;
- }
-
- [StructLayout(LayoutKind.Explicit)]
- internal struct D3DKMT_QUERYSTATISTICS_RESULT
- {
- [FieldOffset(0), MarshalAs(UnmanagedType.Struct)]
- public D3DKMT_QUERYSTATISTICS_ADAPTER_INFORMATION AdapterInformation;
-
- [FieldOffset(0), MarshalAs(UnmanagedType.Struct)]
- public D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION SegmentInformation;
-
- [FieldOffset(0), MarshalAs(UnmanagedType.Struct)]
- public D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_INFORMATION ProcessSegmentInformation;
-
- [FieldOffset(0), MarshalAs(UnmanagedType.Struct)]
- public D3DKMT_QUERYSTATISTICS_NODE_INFORMATION NodeInformation;
-
- // D3DKMT_QUERYSTATISTICS_PROCESS_INFORMATION ProcessInformation;
- // D3DKMT_QUERYSTATISTICS_PROCESS_NODE_INFORMATION ProcessNodeInformation;
- // D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER_INFORMATION PhysAdapterInformation;
- // D3DKMT_QUERYSTATISTICS_SEGMENT_INFORMATION_V1 SegmentInformationV1; // WIN7
- // D3DKMT_QUERYSTATISTICS_VIDPNSOURCE_INFORMATION VidPnSourceInformation;
- // D3DKMT_QUERYSTATISTICS_PROCESS_ADAPTER_INFORMATION ProcessAdapterInformation;
- // D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE_INFORMATION ProcessVidPnSourceInformation;
- // D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_GROUP_INFORMATION ProcessSegmentGroupInformation;
- }
-
- [StructLayout(LayoutKind.Explicit)]
- internal struct D3DKMT_QUERYSTATISTICS_QUERY_ELEMENT
- {
- [FieldOffset(0)]
- public D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT QuerySegment;
-
- [FieldOffset(0)]
- public D3DKMT_QUERYSTATISTICS_QUERY_SEGMENT QueryProcessSegment;
-
- [FieldOffset(0)]
- public D3DKMT_QUERYSTATISTICS_QUERY_NODE QueryNode;
-
- [FieldOffset(0)]
- public D3DKMT_QUERYSTATISTICS_QUERY_NODE QueryProcessNode;
-
- [FieldOffset(0)]
- public D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE QueryVidPnSource;
-
- [FieldOffset(0)]
- public D3DKMT_QUERYSTATISTICS_QUERY_VIDPNSOURCE QueryProcessVidPnSource;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct D3DKMT_QUERYSTATISTICS
- {
- public D3DKMT_QUERYSTATISTICS_TYPE Type;
- public WinNt.LUID AdapterLuid;
- public IntPtr ProcessHandle;
- public D3DKMT_QUERYSTATISTICS_RESULT QueryResult;
- public D3DKMT_QUERYSTATISTICS_QUERY_ELEMENT QueryElement;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- internal struct D3DKMT_NODEMETADATA
- {
- public uint NodeOrdinalAndAdapterIndex;
- public D3dkmdt.DXGK_NODEMETADATA NodeData;
- }
-
- [Flags]
- internal enum D3DKMT_ADAPTERTYPE_FLAGS : uint
- {
- RenderSupported = 0,
- DisplaySupported = 1,
- SoftwareDevice = 2,
- PostDevice = 4,
- HybridDiscrete = 8,
- HybridIntegrated = 16,
- IndirectDisplayDevice = 32,
- Paravirtualized = 64,
- ACGSupported = 128,
- SupportSetTimingsFromVidPn = 256,
- Detachable = 512,
- ComputeOnly = 1024,
- Prototype = 2045
- }
-
- internal enum D3DKMT_QUERYSTATISTICS_TYPE
- {
- D3DKMT_QUERYSTATISTICS_ADAPTER,
- D3DKMT_QUERYSTATISTICS_PROCESS,
- D3DKMT_QUERYSTATISTICS_PROCESS_ADAPTER,
- D3DKMT_QUERYSTATISTICS_SEGMENT,
- D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT,
- D3DKMT_QUERYSTATISTICS_NODE,
- D3DKMT_QUERYSTATISTICS_PROCESS_NODE,
- D3DKMT_QUERYSTATISTICS_VIDPNSOURCE,
- D3DKMT_QUERYSTATISTICS_PROCESS_VIDPNSOURCE,
- D3DKMT_QUERYSTATISTICS_PROCESS_SEGMENT_GROUP,
- D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER
- }
-
- internal enum D3DKMT_QUERYSTATISTICS_DMA_PACKET_TYPE
- {
- D3DKMT_ClientRenderBuffer = 0,
- D3DKMT_ClientPagingBuffer = 1,
- D3DKMT_SystemPagingBuffer = 2,
- D3DKMT_SystemPreemptionBuffer = 3,
- D3DKMT_DmaPacketTypeMax
- }
-
- internal enum KMTQUERYADAPTERINFOTYPE
- {
- KMTQAITYPE_UMDRIVERPRIVATE = 0,
- KMTQAITYPE_UMDRIVERNAME = 1,
- KMTQAITYPE_UMOPENGLINFO = 2,
- KMTQAITYPE_GETSEGMENTSIZE = 3,
- KMTQAITYPE_ADAPTERGUID = 4,
- KMTQAITYPE_FLIPQUEUEINFO = 5,
- KMTQAITYPE_ADAPTERADDRESS = 6,
- KMTQAITYPE_SETWORKINGSETINFO = 7,
- KMTQAITYPE_ADAPTERREGISTRYINFO = 8,
- KMTQAITYPE_CURRENTDISPLAYMODE = 9,
- KMTQAITYPE_MODELIST = 10,
- KMTQAITYPE_CHECKDRIVERUPDATESTATUS = 11,
- KMTQAITYPE_VIRTUALADDRESSINFO = 12,
- KMTQAITYPE_DRIVERVERSION = 13,
- KMTQAITYPE_ADAPTERTYPE = 15,
- KMTQAITYPE_OUTPUTDUPLCONTEXTSCOUNT = 16,
- KMTQAITYPE_WDDM_1_2_CAPS = 17,
- KMTQAITYPE_UMD_DRIVER_VERSION = 18,
- KMTQAITYPE_DIRECTFLIP_SUPPORT = 19,
- KMTQAITYPE_MULTIPLANEOVERLAY_SUPPORT = 20,
- KMTQAITYPE_DLIST_DRIVER_NAME = 21,
- KMTQAITYPE_WDDM_1_3_CAPS = 22,
- KMTQAITYPE_MULTIPLANEOVERLAY_HUD_SUPPORT = 23,
- KMTQAITYPE_WDDM_2_0_CAPS = 24,
- KMTQAITYPE_NODEMETADATA = 25,
- KMTQAITYPE_CPDRIVERNAME = 26,
- KMTQAITYPE_XBOX = 27,
- KMTQAITYPE_INDEPENDENTFLIP_SUPPORT = 28,
- KMTQAITYPE_MIRACASTCOMPANIONDRIVERNAME = 29,
- KMTQAITYPE_PHYSICALADAPTERCOUNT = 30,
- KMTQAITYPE_PHYSICALADAPTERDEVICEIDS = 31,
- KMTQAITYPE_DRIVERCAPS_EXT = 32,
- KMTQAITYPE_QUERY_MIRACAST_DRIVER_TYPE = 33,
- KMTQAITYPE_QUERY_GPUMMU_CAPS = 34,
- KMTQAITYPE_QUERY_MULTIPLANEOVERLAY_DECODE_SUPPORT = 35,
- KMTQAITYPE_QUERY_HW_PROTECTION_TEARDOWN_COUNT = 36,
- KMTQAITYPE_QUERY_ISBADDRIVERFORHWPROTECTIONDISABLED = 37,
- KMTQAITYPE_MULTIPLANEOVERLAY_SECONDARY_SUPPORT = 38,
- KMTQAITYPE_INDEPENDENTFLIP_SECONDARY_SUPPORT = 39,
- KMTQAITYPE_PANELFITTER_SUPPORT = 40,
- KMTQAITYPE_PHYSICALADAPTERPNPKEY = 41,
- KMTQAITYPE_GETSEGMENTGROUPSIZE = 42,
- KMTQAITYPE_MPO3DDI_SUPPORT = 43,
- KMTQAITYPE_HWDRM_SUPPORT = 44,
- KMTQAITYPE_MPOKERNELCAPS_SUPPORT = 45,
- KMTQAITYPE_MULTIPLANEOVERLAY_STRETCH_SUPPORT = 46,
- KMTQAITYPE_GET_DEVICE_VIDPN_OWNERSHIP_INFO = 47,
- KMTQAITYPE_QUERYREGISTRY = 48,
- KMTQAITYPE_KMD_DRIVER_VERSION = 49,
- KMTQAITYPE_BLOCKLIST_KERNEL = 50,
- KMTQAITYPE_BLOCKLIST_RUNTIME = 51,
- KMTQAITYPE_ADAPTERGUID_RENDER = 52,
- KMTQAITYPE_ADAPTERADDRESS_RENDER = 53,
- KMTQAITYPE_ADAPTERREGISTRYINFO_RENDER = 54,
- KMTQAITYPE_CHECKDRIVERUPDATESTATUS_RENDER = 55,
- KMTQAITYPE_DRIVERVERSION_RENDER = 56,
- KMTQAITYPE_ADAPTERTYPE_RENDER = 57,
- KMTQAITYPE_WDDM_1_2_CAPS_RENDER = 58,
- KMTQAITYPE_WDDM_1_3_CAPS_RENDER = 59,
- KMTQAITYPE_QUERY_ADAPTER_UNIQUE_GUID = 60,
- KMTQAITYPE_NODEPERFDATA = 61,
- KMTQAITYPE_ADAPTERPERFDATA = 62,
- KMTQAITYPE_ADAPTERPERFDATA_CAPS = 63,
- KMTQUITYPE_GPUVERSION = 64,
- KMTQAITYPE_DRIVER_DESCRIPTION = 65,
- KMTQAITYPE_DRIVER_DESCRIPTION_RENDER = 66,
- KMTQAITYPE_SCANOUT_CAPS = 67,
- KMTQAITYPE_DISPLAY_UMDRIVERNAME = 71,
- KMTQAITYPE_PARAVIRTUALIZATION_RENDER = 68,
- KMTQAITYPE_SERVICENAME = 69,
- KMTQAITYPE_WDDM_2_7_CAPS = 70,
- KMTQAITYPE_TRACKEDWORKLOAD_SUPPORT = 72
- }
-}
diff --git a/LibreHardwareMonitorLib/Interop/Gdi32.cs b/LibreHardwareMonitorLib/Interop/Gdi32.cs
deleted file mode 100644
index d363b9c..0000000
--- a/LibreHardwareMonitorLib/Interop/Gdi32.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-// ReSharper disable IdentifierTypo
-// ReSharper disable InconsistentNaming
-
-using System.Runtime.InteropServices;
-
-namespace LibreHardwareMonitor.Interop;
-
-internal static class Gdi32
-{
- internal const string DllName = "Gdi32.dll";
-
- [DllImport(DllName, ExactSpelling = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern uint D3DKMTCloseAdapter(ref D3dkmth.D3DKMT_CLOSEADAPTER closeAdapter);
-
- [DllImport(DllName, ExactSpelling = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern uint D3DKMTOpenAdapterFromDeviceName(ref D3dkmth.D3DKMT_OPENADAPTERFROMDEVICENAME openAdapterFromDeviceName);
-
- [DllImport(DllName, ExactSpelling = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern uint D3DKMTQueryAdapterInfo(ref D3dkmth.D3DKMT_QUERYADAPTERINFO queryAdapterInfo);
-
- [DllImport(DllName, ExactSpelling = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern uint D3DKMTQueryStatistics(ref D3dkmth.D3DKMT_QUERYSTATISTICS queryStatistics);
-}
\ No newline at end of file
diff --git a/LibreHardwareMonitorLib/Interop/Kernel32.cs b/LibreHardwareMonitorLib/Interop/Kernel32.cs
index f0c179c..b44aea8 100644
--- a/LibreHardwareMonitorLib/Interop/Kernel32.cs
+++ b/LibreHardwareMonitorLib/Interop/Kernel32.cs
@@ -84,18 +84,6 @@ public class Kernel32
return result;
}
- ///
- /// Convert Win32 error code to HRESULT.
- ///
- ///
- /// HRESULT_FROM_WIN32 macro equivalent.
- ///
- /// Win32 error code
- /// HRESULT
- internal static int HResultFromWin32(int errorCode) => errorCode <= 0
- ? errorCode
- : (int)((errorCode & 0x0000FFFF) | 0x80070000);
-
internal static SafeFileHandle OpenDevice(string devicePath)
{
SafeFileHandle hDevice = CreateFile(devicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
@@ -105,11 +93,6 @@ public class Kernel32
return hDevice;
}
- [DllImport(DllName, CharSet = CharSet.Auto, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);
-
[DllImport(DllName, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto, SetLastError = true)]
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
internal static extern SafeFileHandle CreateFile
@@ -332,14 +315,6 @@ public class Kernel32
ref uint lpBytesReturned,
[In][Optional] IntPtr lpOverlapped);
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr LocalAlloc(uint uFlags, ulong uBytes);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr LocalFree(IntPtr hMem);
-
[DllImport(DllName, SetLastError = true)]
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
internal static extern void RtlZeroMemory(IntPtr Destination, int Length);
@@ -361,14 +336,6 @@ public class Kernel32
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool FreeLibrary(IntPtr module);
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr GetCurrentThread();
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern ushort GetActiveProcessorGroupCount();
-
[DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
internal static extern bool SetThreadGroupAffinity(IntPtr thread, ref GROUP_AFFINITY groupAffinity, out GROUP_AFFINITY previousGroupAffinity);
@@ -381,31 +348,6 @@ public class Kernel32
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
internal static extern bool VirtualFree(IntPtr lpAddress, UIntPtr dwSize, MEM dwFreeType);
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern bool DeviceIoControl
- (
- SafeFileHandle device,
- IOControlCode ioControlCode,
- [MarshalAs(UnmanagedType.AsAny)] [In] object inBuffer,
- uint inBufferSize,
- [MarshalAs(UnmanagedType.AsAny)] [Out] object outBuffer,
- uint nOutBufferSize,
- out uint bytesReturned,
- IntPtr overlapped);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr CreateFile
- (
- string lpFileName,
- uint dwDesiredAccess,
- FileShare dwShareMode,
- IntPtr lpSecurityAttributes,
- FileMode dwCreationDisposition,
- FileAttributes dwFlagsAndAttributes,
- IntPtr hTemplateFile);
-
[DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
[DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
internal static extern int EnumSystemFirmwareTables(Provider firmwareTableProviderSignature, IntPtr firmwareTableBuffer, int bufferSize);
@@ -714,20 +656,6 @@ public class Kernel32
PropertyQueryMaxDefined
}
- [StructLayout(LayoutKind.Sequential)]
- internal struct MEMORYSTATUSEX
- {
- public uint dwLength;
- public uint dwMemoryLoad;
- public ulong ullTotalPhys;
- public ulong ullAvailPhys;
- public ulong ullTotalPageFile;
- public ulong ullAvailPageFile;
- public ulong ullTotalVirtual;
- public ulong ullAvailVirtual;
- public ulong ullAvailExtendedVirtual;
- }
-
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SMART_ATTRIBUTE
{
diff --git a/LibreHardwareMonitorLib/Interop/NtDll.cs b/LibreHardwareMonitorLib/Interop/NtDll.cs
deleted file mode 100644
index c57b945..0000000
--- a/LibreHardwareMonitorLib/Interop/NtDll.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-using System.Runtime.InteropServices;
-
-// ReSharper disable InconsistentNaming
-
-namespace LibreHardwareMonitor.Interop;
-
-internal class NtDll
-{
- private const string DllName = "ntdll.dll";
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
- {
- public long IdleTime;
- public long KernelTime;
- public long UserTime;
- public long DpcTime;
- public long InterruptTime;
- public uint InterruptCount;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct SYSTEM_PROCESSOR_IDLE_INFORMATION
- {
- public long IdleTime;
- public long C1Time;
- public long C2Time;
- public long C3Time;
- public uint C1Transitions;
- public uint C2Transitions;
- public uint C3Transitions;
- public uint Padding;
- }
-
- internal enum SYSTEM_INFORMATION_CLASS
- {
- SystemProcessorPerformanceInformation = 8,
- SystemProcessorIdleInformation = 42
- }
-
- [DllImport(DllName)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern int NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass, [Out] SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[] SystemInformation, int SystemInformationLength, out int ReturnLength);
-
- [DllImport(DllName)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern int NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass, [Out] SYSTEM_PROCESSOR_IDLE_INFORMATION[] SystemInformation, int SystemInformationLength, out int ReturnLength);
-}
diff --git a/LibreHardwareMonitorLib/Interop/SetupApi.cs b/LibreHardwareMonitorLib/Interop/SetupApi.cs
deleted file mode 100644
index 56c4f0c..0000000
--- a/LibreHardwareMonitorLib/Interop/SetupApi.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace LibreHardwareMonitor.Interop;
-
-internal class SetupApi
-{
- internal const int DIGCF_DEVICEINTERFACE = 0x00000010;
- internal const int DIGCF_PRESENT = 0x00000002;
- internal const int ERROR_INSUFFICIENT_BUFFER = 122;
- internal const int ERROR_NO_MORE_ITEMS = 259;
-
- private const string DllName = "SetupAPI.dll";
- internal static Guid GUID_DEVICE_BATTERY = new(0x72631e54, 0x78A4, 0x11d0, 0xbc, 0xf7, 0x00, 0xaa, 0x00, 0xb7, 0xb3, 0x2a);
- internal static readonly IntPtr INVALID_HANDLE_VALUE = new(-1);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- internal static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, IntPtr Enumerator, IntPtr hwndParent, uint Flags);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool SetupDiEnumDeviceInterfaces
- (IntPtr DeviceInfoSet, IntPtr DeviceInfoData, ref Guid InterfaceClassGuid, uint MemberIndex, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);
-
- [DllImport(DllName, SetLastError = true, EntryPoint = "SetupDiGetDeviceInterfaceDetailW", CharSet = CharSet.Unicode)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool SetupDiGetDeviceInterfaceDetail
- (
- IntPtr DeviceInfoSet,
- in SP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
- [Out, Optional] IntPtr DeviceInterfaceDetailData,
- uint DeviceInterfaceDetailDataSize,
- out uint RequiredSize,
- IntPtr DeviceInfoData = default);
-
- [DllImport(DllName, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
- [return: MarshalAs(UnmanagedType.Bool)]
- internal static extern bool SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
-
- [StructLayout(LayoutKind.Sequential)]
- internal struct SP_DEVICE_INTERFACE_DATA
- {
- public uint cbSize;
- public Guid InterfaceClassGuid;
- public uint Flags;
- public IntPtr Reserved;
- }
-}
\ No newline at end of file
diff --git a/LibreHardwareMonitorLib/Interop/WinNt.cs b/LibreHardwareMonitorLib/Interop/WinNt.cs
deleted file mode 100644
index 642427a..0000000
--- a/LibreHardwareMonitorLib/Interop/WinNt.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
-// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-// Copyright (C) LibreHardwareMonitor and Contributors.
-// All Rights Reserved.
-
-// ReSharper disable IdentifierTypo
-// ReSharper disable InconsistentNaming
-
-using System.Runtime.InteropServices;
-
-namespace LibreHardwareMonitor.Interop;
-
-///
-/// Contains Win32 definitions for Windows NT.
-///
-internal static class WinNt
-{
- internal const int STATUS_SUCCESS = 0;
-
- ///
- /// Describes a local identifier for an adapter.
- ///
- [StructLayout(LayoutKind.Sequential)]
- internal struct LUID
- {
- public readonly uint LowPart;
- public readonly int HighPart;
- }
-
- ///
- /// Represents a 64-bit signed integer value.
- ///
- [StructLayout(LayoutKind.Explicit, Size = 8)]
- internal struct LARGE_INTEGER
- {
- [FieldOffset(0)]
- public long QuadPart;
-
- [FieldOffset(0)]
- public uint LowPart;
-
- [FieldOffset(4)]
- public int HighPart;
- }
-}
\ No newline at end of file
diff --git a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj
index a7e3301..d3970b4 100644
--- a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj
+++ b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj
@@ -18,6 +18,7 @@
latest
packageicon.png
true
+ x64
..\bin\Debug\
@@ -48,8 +49,13 @@
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/LibreHardwareMonitorLib/NativeMethods.txt b/LibreHardwareMonitorLib/NativeMethods.txt
new file mode 100644
index 0000000..5013294
--- /dev/null
+++ b/LibreHardwareMonitorLib/NativeMethods.txt
@@ -0,0 +1,26 @@
+CM_Get_Device_Interface_List_Size
+CM_Get_Device_Interface_List
+GUID_DISPLAY_DEVICE_ARRIVAL
+NtQuerySystemInformation
+SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
+STATUS_INFO_LENGTH_MISMATCH
+STATUS_SUCCESS
+D3DKMTCloseAdapter
+D3DKMTOpenAdapterFromDeviceName
+D3DKMTQueryAdapterInfo
+D3DKMTQueryStatistics
+D3DKMT_ADAPTERTYPE
+D3DKMT_QUERYSTATISTICS_QUERY_ELEMENT
+D3DKMT_SEGMENTSIZEINFO
+D3DKMT_NODEMETADATA
+D3DKMT_QUERYSTATISTICS_NODE_INFORMATION
+SetupDiDestroyDeviceInfoList
+SetupDiGetDeviceInterfaceDetail
+SetupDiEnumDeviceInterfaces
+SetupDiGetClassDevs
+GUID_DEVICE_BATTERY
+WIN32_ERROR
+HRESULT_FROM_WIN32
+GlobalMemoryStatusEx
+GetCurrentThread
+GetActiveProcessorGroupCount
\ No newline at end of file
diff --git a/LibreHardwareMonitorLib/PawnIo/PawnIo.cs b/LibreHardwareMonitorLib/PawnIo/PawnIo.cs
index fbd4683..7fddbc0 100644
--- a/LibreHardwareMonitorLib/PawnIo/PawnIo.cs
+++ b/LibreHardwareMonitorLib/PawnIo/PawnIo.cs
@@ -3,34 +3,20 @@ using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
+using Windows.Win32.Foundation;
using LibreHardwareMonitor.Interop;
using Microsoft.Win32;
using Microsoft.Win32.SafeHandles;
+using PInvoke = Windows.Win32.PInvoke;
namespace LibreHardwareMonitor.PawnIo;
public class PawnIo
{
private const uint DEVICE_TYPE = 41394u << 16;
- private const uint IOCTL_PIO_LOAD_BINARY = 0x821 << 2;
- private const uint IOCTL_PIO_EXECUTE_FN = 0x841 << 2;
private const int FN_NAME_LENGTH = 32;
-
- private enum ControlCode : uint
- {
- LoadBinary = DEVICE_TYPE | IOCTL_PIO_LOAD_BINARY,
- Execute = DEVICE_TYPE | IOCTL_PIO_EXECUTE_FN
- }
-
- ///
- /// Gets a value indicating whether PawnIO is installed on the system.
- ///
- public static bool IsInstalled => Version is not null;
-
- ///
- /// Retrieves the version information for the installed PawnIO.
- ///
- public static Version Version { get; } = null;
+ private const uint IOCTL_PIO_EXECUTE_FN = 0x841 << 2;
+ private const uint IOCTL_PIO_LOAD_BINARY = 0x821 << 2;
private readonly SafeFileHandle _handle;
@@ -46,12 +32,28 @@ public class PawnIo
private PawnIo(SafeFileHandle handle) => _handle = handle;
+ ///
+ /// Gets a value indicating whether PawnIO is installed on the system.
+ ///
+ public static bool IsInstalled => Version is not null;
+
+ ///
+ /// Retrieves the version information for the installed PawnIO.
+ ///
+ public static Version Version { get; }
+
+ public bool IsLoaded => _handle is
+ {
+ IsInvalid: false,
+ IsClosed: false
+ };
+
internal static PawnIo LoadModuleFromResource(Assembly assembly, string resourceName)
{
SafeFileHandle handle = Kernel32.CreateFile(@"\\.\PawnIO", FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
if (handle.IsInvalid)
- return new(null);
+ return new PawnIo(null);
uint read = 0;
@@ -61,39 +63,32 @@ public class PawnIo
byte[] bin = memory.ToArray();
if (Kernel32.DeviceIoControl(handle, (uint)ControlCode.LoadBinary, bin, (uint)bin.Length, null, 0u, ref read, IntPtr.Zero))
- return new(handle);
+ return new PawnIo(handle);
- return new(null);
+ return new PawnIo(null);
}
- public bool IsLoaded => _handle is
- {
- IsInvalid: false,
- IsClosed: false
- };
-
public void Close() => _handle.Close();
public long[] Execute(string name, long[] input, int outLength)
{
- if (!IsLoaded)
- return [];
-
- uint read = 0;
-
- byte[] output = new byte[outLength * sizeof(long)];
- byte[] inp = new byte[input.Length * sizeof(long) + FN_NAME_LENGTH];
- Buffer.BlockCopy(Encoding.ASCII.GetBytes(name), 0, inp, 0, Math.Min(FN_NAME_LENGTH - 1, name.Length));
- Buffer.BlockCopy(input, 0, inp, FN_NAME_LENGTH, input.Length * sizeof(long));
-
- if (Kernel32.DeviceIoControl(_handle, (uint)ControlCode.Execute, inp, (uint)inp.Length, output, (uint)output.Length, ref read))
+ if (IsLoaded)
{
- long[] outp = new long[read / sizeof(long)];
- Buffer.BlockCopy(output, 0, outp, 0, (int)read);
- return outp;
+ byte[] output = new byte[outLength * sizeof(long)];
+ byte[] inp = new byte[(input.Length * sizeof(long)) + FN_NAME_LENGTH];
+ Buffer.BlockCopy(Encoding.ASCII.GetBytes(name), 0, inp, 0, Math.Min(FN_NAME_LENGTH - 1, name.Length));
+ Buffer.BlockCopy(input, 0, inp, FN_NAME_LENGTH, input.Length * sizeof(long));
+
+ uint read = 0;
+ if (Kernel32.DeviceIoControl(_handle, (uint)ControlCode.Execute, inp, (uint)inp.Length, output, (uint)output.Length, ref read))
+ {
+ long[] outp = new long[read / sizeof(long)];
+ Buffer.BlockCopy(output, 0, outp, 0, (int)read);
+ return outp;
+ }
}
- return [];
+ return new long[outLength];
}
public int ExecuteHr(string name, long[] inBuffer, uint inSize, long[] outBuffer, uint outSize, out uint returnSize)
@@ -113,7 +108,7 @@ public class PawnIo
uint read = 0;
byte[] output = new byte[outSize * sizeof(long)];
- byte[] inp = new byte[inSize * sizeof(long) + FN_NAME_LENGTH];
+ byte[] inp = new byte[(inSize * sizeof(long)) + FN_NAME_LENGTH];
Buffer.BlockCopy(Encoding.ASCII.GetBytes(name), 0, inp, 0, Math.Min(FN_NAME_LENGTH - 1, name.Length));
Buffer.BlockCopy(inBuffer, 0, inp, FN_NAME_LENGTH, inBuffer.Length * sizeof(long));
@@ -125,7 +120,12 @@ public class PawnIo
}
returnSize = 0;
+ return PInvoke.HRESULT_FROM_WIN32((WIN32_ERROR)Marshal.GetLastWin32Error());
+ }
- return Kernel32.HResultFromWin32(Marshal.GetLastWin32Error());
+ private enum ControlCode : uint
+ {
+ LoadBinary = DEVICE_TYPE | IOCTL_PIO_LOAD_BINARY,
+ Execute = DEVICE_TYPE | IOCTL_PIO_EXECUTE_FN
}
}
diff --git a/LibreHardwareMonitorLib/RAMSPDToolkitDriver.cs b/LibreHardwareMonitorLib/RAMSPDToolkitDriver.cs
index 8d5153b..ba06773 100644
--- a/LibreHardwareMonitorLib/RAMSPDToolkitDriver.cs
+++ b/LibreHardwareMonitorLib/RAMSPDToolkitDriver.cs
@@ -7,33 +7,11 @@ namespace LibreHardwareMonitor;
internal sealed class RAMSPDToolkitDriver : IPawnIODriver
{
- internal class PawnIOModule : IPawnIOModule, IDisposable
- {
- public PawnIOModule(PawnIo.PawnIo pawnIO)
- {
- _pawnIO = pawnIO;
- }
-
- PawnIo.PawnIo _pawnIO;
-
- public int Execute(string name, long[] inBuffer, uint inSize, long[] outBuffer, uint outSize, out uint returnSize)
- => _pawnIO.ExecuteHr(name, inBuffer, inSize, outBuffer, outSize, out returnSize);
-
- public void Dispose()
- {
- if (_pawnIO != null)
- {
- _pawnIO.Close();
- _pawnIO = null;
- }
- }
- }
-
const string I801ModuleFilename = "SmbusI801.bin";
- const string Piix4ModuleFilename = "SmbusPIIX4.bin";
const string Nct6793ModuleFilename = "SmbusNCT6793.bin";
+ const string Piix4ModuleFilename = "SmbusPIIX4.bin";
- private List _pawnIOModules = new();
+ private readonly List _pawnIOModules = new();
public bool IsOpen => true;
@@ -79,10 +57,8 @@ internal sealed class RAMSPDToolkitDriver : IPawnIODriver
_pawnIOModules.Add(pawnIOModule);
return pawnIOModule;
}
- else
- {
- return null;
- }
+
+ return null;
}
public void Unload()
@@ -90,4 +66,26 @@ internal sealed class RAMSPDToolkitDriver : IPawnIODriver
_pawnIOModules.ForEach(p => p.Dispose());
_pawnIOModules.Clear();
}
+
+ internal class PawnIOModule : IPawnIOModule, IDisposable
+ {
+ private PawnIo.PawnIo _pawnIO;
+
+ public PawnIOModule(PawnIo.PawnIo pawnIO)
+ {
+ _pawnIO = pawnIO;
+ }
+
+ public int Execute(string name, long[] inBuffer, uint inSize, long[] outBuffer, uint outSize, out uint returnSize)
+ => _pawnIO.ExecuteHr(name, inBuffer, inSize, outBuffer, outSize, out returnSize);
+
+ public void Dispose()
+ {
+ if (_pawnIO != null)
+ {
+ _pawnIO.Close();
+ _pawnIO = null;
+ }
+ }
+ }
}