Table des matières

Informations sur le CPU

But

Le but est de pouvoir récupérer les mèmes informations que sur le Gestionnaire de Tâches

Via WMI

Root\CIMV2\Win32_Processor

wql sur root/CIMV2
Select * from Win32_Processor
instance of Win32_Processor

 show
{
	AddressWidth = 64;
	Architecture = 9;
	AssetTag = “To Be Filled By O.E.M.”;
	Availability = 3;
	Caption = “Intel64 Family 6 Model 158 Stepping 9”;
	Characteristics = 252;
	CpuStatus = 1;
	CreationClassName = “Win32_Processor”;
	CurrentClockSpeed = 3600;
	CurrentVoltage = 10;
	DataWidth = 64;
	Description = “Intel64 Family 6 Model 158 Stepping 9”;
	DeviceID = “CPU0”;
	ExtClock = 100;
	Family = 198;
	L2CacheSize = 1024;
	L3CacheSize = 8192;
	L3CacheSpeed = 0;
	Level = 6;
	LoadPercentage = 2;
	Manufacturer = “GenuineIntel”;
	MaxClockSpeed = 3600;
	Name = “Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz”;
	NumberOfCores = 4;
	NumberOfEnabledCore = 4;
	NumberOfLogicalProcessors = 8;
	PartNumber = “To Be Filled By O.E.M.”;
	PowerManagementSupported = FALSE;
	ProcessorId = “BFEBFBFF000906E9”;
	ProcessorType = 3;
	Role = “CPU”;
	SecondLevelAddressTranslationExtensions = FALSE;
	SerialNumber = “To Be Filled By O.E.M.”;
	SocketDesignation = “U3E1”;
	Status = “OK”;
	StatusInfo = 3;
	SystemCreationClassName = “Win32_ComputerSystem”;
	SystemName = “PC-THIERRY”;
	ThreadCount = 8;
	UpgradeMethod = 1;
	Version = “”;
	VirtualizationFirmwareEnabled = FALSE;
	VMMonitorModeExtensions = FALSE;
};

LoadPercentage

Type - UInt16

La propriété LoadPercentage indique la capacité de charge de chaque processeur calculée sur la dernière seconde.
Le terme 'processor loading' réfère à la charge de traitement totale supportée par chaque processeur en une fois.

ProcessorId

Type - String

La propriété ProcessorId contient des informations spécifiques au processeur qui décrivent ses fonctionnalités. Pour les processeurs de classe x86, le format du champ dépend de la prise en charge de l’instruction CPUID par le processeur.
Si l’instruction est prise en charge, la propriété ProcessorId contient deux valeurs au format DWORD.

  1. La première (décalages 08h-0Bh) est la valeur EAX renvoyée par une instruction CPUID avec l’entrée EAX définie à 1.
  2. La deuxième (décalages 0Ch-0Fh) est la valeur EDX renvoyées par cette instruction.

Seuls les deux premiers octets de la propriété ProcessorID sont significatifs (tous les autres sont définis à 0) et contiennent (au format WORD) le contenu du registre DX à la réinitialisation du processeur.

Win32_PerfFormattedData_Counters_ProcessorInformation

instance of Win32_PerfFormattedData_Counters_ProcessorInformation

 show
{
	AverageIdleTime = “3256073”;
	C1TransitionsPersec = “0”;
	C2TransitionsPersec = “2398”;
	C3TransitionsPersec = “0”;
	ClockInterruptsPersec = 693;
	DPCRate = 5;
	DPCsQueuedPersec = 517;
	IdleBreakEventsPersec = “2414”;
	InterruptsPersec = 2948;
	Name = “_Total”;
	ParkingStatus = 0;
	PercentC1Time = “0”;
	PercentC2Time = “96”;
	PercentC3Time = “0”;
	PercentDPCTime = “0”;
	PercentIdleTime = “100”;
	PercentInterruptTime = “0”;
	PercentofMaximumFrequency = 93;
	PercentPerformanceLimit = 100;
	PercentPriorityTime = “0”;
	PercentPrivilegedTime = “1”;
	PercentPrivilegedUtility = “1”;
	PercentProcessorPerformance = “66”;
	PercentProcessorTime = “0”;
	PercentProcessorUtility = “2”;
	PercentUserTime = “0”;
	PerformanceLimitFlags = 0;
	ProcessorFrequency = 3600;
	ProcessorStateFlags = 0;
};

On peut peut être en déduire la charge du CPU en fonction de PercentIdleTime qui est le pourcentage de temps libre,
donc la charge du CPU devrait être (100-PercentIdleTime)

On peut peut être en déduire la vitesse du CPU grâce a PercentofMaximumFrequency.
Qui est censé être le pourcentage de la vitesse max.
Sachant que la vitesse du CPU est fournie par ProcessorFrequency.

Mais ce ne sont que des suppositions qui mont l'air assez bancales.
En effet le CPU peut dépasser la vitesse fournie par ProcessorFrequency.

Donc indice de fiabilité faible sur les données récupérées par Win32_PerfFormattedData_Counters_ProcessorInformation

Win32_PerfFormattedData_PerfOS_Processor

wql sur Root/CIMV2
Select * from Win32_PerfFormattedData_PerfOS_Processor  WHERE Name="_Total"
Résultat → instance of Win32_PerfFormattedData_PerfOS_Processor

 show
{
	C1TransitionsPersec = “2974”;
	C2TransitionsPersec = “971”;
	C3TransitionsPersec = “0”;
	DPCRate = 2;
	DPCsQueuedPersec = 403;
	InterruptsPersec = 5750;
	Name = “_Total”;
	PercentC1Time = “13”;
	PercentC2Time = “30”;
	PercentC3Time = “0”;
	PercentDPCTime = “0”;
	PercentIdleTime = “44”;
	PercentInterruptTime = “0”;
	PercentPrivilegedTime = “32”;
	PercentProcessorTime = “52”;
	PercentUserTime = “20”;
};

root\WMI\ ProcessorPerformance

wql sur Namespace = Root\WMI\
Select * from ProcessorPerformance
Résultat → instances of ProcessorPerformance

 show

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_0”;
	percentage = 48;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_1”;
	percentage = 64;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_2”;
	percentage = 55;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_3”;
	percentage = 56;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_4”;
	percentage = 66;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_5”;
	percentage = 32;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_6”;
	percentage = 47;
	power = 1;
};

instance of ProcessorPerformance
{
	Active = TRUE;
	frequency = 3600;
	InstanceName = “PPM_Processor_7”;
	percentage = 35;
	power = 1;
};

Pas grand chose intéressant a en retirer, mis a part le pourcentage de vitesse pour chaque CPU…

Autres pistes a étudier

Via PDH

Source : https://learn.microsoft.com/fr-fr/windows/win32/perfctrs/using-the-pdh-functions-to-consume-counter-data

Via les API Windows

GetSystemTimes

Source : https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getsystemtimes

jwawinbase.pas
function GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime: LPFILETIME): BOOL; stdcall;

Sources & Ressources