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; + } + } + } }