diff --git a/External/WinRing0.dll b/External/WinRing0.dll index 9ea86ea..beaf2b0 100644 Binary files a/External/WinRing0.dll and b/External/WinRing0.dll differ diff --git a/External/WinRing0x64.dll b/External/WinRing0x64.dll index 51dbd48..27fd92a 100644 Binary files a/External/WinRing0x64.dll and b/External/WinRing0x64.dll differ diff --git a/Hardware/CPU/AMD10CPU.cs b/Hardware/CPU/AMD10CPU.cs index 0034ced..859c045 100644 --- a/Hardware/CPU/AMD10CPU.cs +++ b/Hardware/CPU/AMD10CPU.cs @@ -65,7 +65,9 @@ namespace OpenHardwareMonitor.Hardware.CPU { coreCount = (cpuidExtData[8, 2] & 0xFF) + 1; // AMD family 10h processors support only one temperature sensor - coreTemperature = new Sensor("Core", 0, SensorType.Temperature, this); + coreTemperature = new Sensor( + "Core" + (coreCount > 1 ? " #1 - #" + coreCount : ""), 0, + SensorType.Temperature, this); pciAddress = WinRing0.FindPciDeviceById(PCI_AMD_VENDOR_ID, PCI_AMD_10H_MISCELLANEOUS_DEVICE_ID, 0); diff --git a/Hardware/CPU/IntelCPU.cs b/Hardware/CPU/IntelCPU.cs index fd2b0a1..047d90f 100644 --- a/Hardware/CPU/IntelCPU.cs +++ b/Hardware/CPU/IntelCPU.cs @@ -50,7 +50,9 @@ namespace OpenHardwareMonitor.Hardware.CPU { private Sensor[] coreTemperatures; private float tjMax = 0; + private uint logicalProcessors; private uint logicalProcessorsPerCore; + private uint coreCount; private const uint IA32_THERM_STATUS_MSR = 0x019C; private const uint IA32_TEMPERATURE_TARGET = 0x01A2; @@ -60,18 +62,23 @@ namespace OpenHardwareMonitor.Hardware.CPU { this.name = name; this.icon = Utilities.EmbeddedResources.GetImage("cpu.png"); - - uint logicalProcessors = 1; - if (cpuidData.GetLength(0) > 0x04) - logicalProcessors = ((cpuidData[4, 0] >> 26) & 0x3F) + 1; - + logicalProcessorsPerCore = 1; - if (cpuidData.GetLength(0) > 0x0B) - logicalProcessorsPerCore = cpuidData[0x0B, 1] & 0xFF; - if (logicalProcessorsPerCore == 0) + if (cpuidData.GetLength(0) > 0x0B) { + uint eax, ebx, ecx, edx; + WinRing0.CpuidEx(0x0B, 0, out eax, out ebx, out ecx, out edx); + logicalProcessorsPerCore = ebx & 0xFF; + WinRing0.CpuidEx(0x0B, 1, out eax, out ebx, out ecx, out edx); + logicalProcessors = ebx & 0xFF; + } else if (cpuidData.GetLength(0) > 0x04) { + logicalProcessors = ((cpuidData[4, 0] >> 26) & 0x3F) + 1; logicalProcessorsPerCore = 1; + } else { + logicalProcessors = 1; + logicalProcessorsPerCore = 1; + } - uint coreCount = logicalProcessors / logicalProcessorsPerCore; + coreCount = logicalProcessors / logicalProcessorsPerCore; switch (family) { case 0x06: { @@ -147,7 +154,9 @@ namespace OpenHardwareMonitor.Hardware.CPU { r.AppendLine("Intel CPU"); r.AppendLine(); r.AppendFormat("Name: {0}{1}", name, Environment.NewLine); - r.AppendFormat("Number of cores: {0}{1}", coreTemperatures.Length, + r.AppendFormat("Number of cores: {0}{1}", coreCount, + Environment.NewLine); + r.AppendFormat("Threads per core: {0}{1}", logicalProcessorsPerCore, Environment.NewLine); r.AppendFormat("TjMax: {0}{1}", tjMax, Environment.NewLine); r.AppendLine(); diff --git a/Hardware/WinRing0.cs b/Hardware/WinRing0.cs index a7216e9..ac0ccf1 100644 --- a/Hardware/WinRing0.cs +++ b/Hardware/WinRing0.cs @@ -79,8 +79,10 @@ namespace OpenHardwareMonitor.Hardware { public delegate uint GetDllStatusDelegate(); public delegate bool IsCpuidDelegate(); - public delegate bool CpuidDelegate(uint index, out uint eax, out uint ebx, - out uint ecx, out uint edx); + public delegate bool CpuidDelegate(uint index, + out uint eax, out uint ebx, out uint ecx, out uint edx); + public delegate bool CpuidExDelegate(uint index, uint ecxValue, + out uint eax, out uint ebx, out uint ecx, out uint edx); public delegate bool RdmsrPxDelegate(uint index, ref uint eax, ref uint edx, UIntPtr processAffinityMask); public delegate byte ReadIoPortByteDelegate(ushort port); @@ -99,14 +101,14 @@ namespace OpenHardwareMonitor.Hardware { public static GetDllStatusDelegate GetDllStatus; public static IsCpuidDelegate IsCpuid; public static CpuidDelegate Cpuid; + public static CpuidExDelegate CpuidEx; public static RdmsrPxDelegate RdmsrPx; public static ReadIoPortByteDelegate ReadIoPortByte; public static WriteIoPortByteDelegate WriteIoPortByte; public static SetPciMaxBusIndexDelegate SetPciMaxBusIndex; public static FindPciDeviceByIdDelegate FindPciDeviceById; public static ReadPciConfigDwordExDelegate ReadPciConfigDwordEx; - public static WritePciConfigDwordExDelegate WritePciConfigDwordEx; - + public static WritePciConfigDwordExDelegate WritePciConfigDwordEx; private static void GetDelegate(string entryPoint, out T newDelegate) where T : class @@ -125,6 +127,7 @@ namespace OpenHardwareMonitor.Hardware { GetDelegate("GetDllStatus", out GetDllStatus); GetDelegate("IsCpuid", out IsCpuid); GetDelegate("Cpuid", out Cpuid); + GetDelegate("CpuidEx", out CpuidEx); GetDelegate("RdmsrPx", out RdmsrPx); GetDelegate("ReadIoPortByte", out ReadIoPortByte); GetDelegate("WriteIoPortByte", out WriteIoPortByte); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 3595b89..f4e485d 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -69,5 +69,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.9.0")] -[assembly: AssemblyFileVersion("0.1.9.0")] +[assembly: AssemblyVersion("0.1.10.0")] +[assembly: AssemblyFileVersion("0.1.10.0")]