Mega Code Archive

 
Categories / Delphi / Forms
 

Get Information like No. of active threads, CPU Usage%, etc from the registry

Title: Get Information like No. of active threads, CPU Usage%, etc from the registry Question: How do I get information such as Cpu usage%, No: of active threads etc from the registry. Answer: In the registry there is a section call HKEY_DYN_DATA. A lot of information about system is stored in this section under the PerfStats Key. To get information such as cpu usage etc. you need to do three things. The first step is to start the selected counter in the registry. This is done by reading the value of coressponding registry key. For example if we want to get CPU usage% then we have to read the value of the key 'PerfStats\StartStat\KERNEL\CPUusage' present in HKEY_DYN_DATA section of registry. this step starts the counter. The next step is to read the value of the key 'PerfStats\StatData\KERNEL\CPUusage'. This value gives the percentage of CpU used at present. If we put this code in the On timer event of a timer we can get the amount of cpu used to see dynamic changes. The final step is to stop the counter. To do this we have to read the registry key 'PerfStats\StopStat\KERNEL\CPUusage'.This stops the counter. There are many other counters other than the CPU usage counter. You can see the list of counters by opening the PerfStats\StatData key using the Registry Editor. I have created a component that gets the value of all the counters present in the HKEY_DYN_DATA section of the registry. Here is the code. unit SystemInfo; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,extctrls; type TDialupAdapterInfo = record //Information of Dialup adapter alignment:dword; buffer:dword; bytesrecieved:dword; bytesXmit:dword; ConnectSpeed:dword; CRC:dword; framesrecieved:dword; FramesXmit:dword; Framing:dword; runts:dword; Overrun:dword; timeout:dword; totalbytesrecieved:dword; totalbytesXmit:dword; end; type TKernelInfo = record CpuUsagePcnt:dword; Numthreads:dword; NumVMS:dword; end; type TVCACHEInfo = record ccurpages:dword; cMacPages:dword; cminpages:dword; FailedRecycles:dword; Hits:dword; LRUBuffers:dword; LRURecycles:dword; Misses:dword; RandomRecycles:dword; end; type TFATInfo = record BreadsSec:dword; BwritesSec:dword; Dirtydata:dword; ReadsSec:dword; WritesSec:dword; end; type TVMMInfo = record CDiscards:dword; CInstancefaults:dword; CPageFaults:dword; cPageIns:dword; cPageOuts:dword; cpgCommit:dword; cpgDiskCache:dword; cpgDiskCacheMac:dword; cpgDiskCacheMid:dword; cpgDiskCacheMin:dword; cpgfree:dword; cpglocked:dword; cpglockedNoncache:dword; cpgother:dword; cpgsharedpages:dword; cpgswap:dword; cpgswapfile:dword; cpgswapfiledefective:dword; cpgswapfileinuse:dword; end; type TSysInfo = class(TComponent) private fDialupAdapterInfo:TDialupAdapterInfo; fKernelInfo:TKernelInfo; fVCACHEInfo:TVCACHEInfo; fFATInfo:TFATInfo; fVMMInfo:TVMMInfo; ftimer:TTimer; fupdateinterval:integer; tmp:dword; vsize:dword; pkey:hkey; regtype:pdword; fstopped:boolean; procedure fupdatinginfo(sender:tobject); procedure fsetupdateinterval(aupdateinterval:integer); protected fsysInfoChanged:TNotifyEvent; public constructor Create(Aowner:Tcomponent);override; destructor Destroy;override; property DialupAdapterInfo: TDialupAdapterInfo read fDialupAdapterInfo; property KernelInfo: TKernelInfo read fKernelInfo; property VCACHEInfo: TVCACHEInfo read fVCACHEInfo; property FATInfo: TFATInfo read fFATInfo; property VMMInfo: TVMMInfo read fVMMInfo; procedure StartRecievingInfo; procedure StopRecievingInfo; published property SysInfoChanged:TNotifyEvent read fsysInfoChanged write fsysInfoChanged;//this event is called after a specific interval. property UpdateInterval:integer read fupdateInterval write fsetupdateinterval default 5000; end; procedure Register; implementation constructor TSysInfo.Create(Aowner:Tcomponent); begin inherited; ftimer:=ttimer.Create(self); ftimer.enabled:=false; ftimer.OnTimer:=fupdatinginfo; vsize:=4; fstopped:=true; end; procedure TSysInfo.startrecievingInfo; var res:integer; begin res:=RegOpenKeyEx(HKEY_DYN_DATA,'PerfStats\StartStat',0,KEY_ALL_ACCESS,pkey); if res0 then raise exception.Create('Could not open registry key'); fstopped:=false; // For Dial Up Adapter RegQueryValueEx(pkey,'Dial-Up Adapter\Alignment',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Buffer',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Framing',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Overrun ',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Timeout',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\CRC',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Runts',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\FramesXmit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\FramesRecvd',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesXmit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesRecvd',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\TotalBytesXmit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\TotalBytesRecvd',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\ConnectSpeed',nil,regtype,@tmp,@vsize); // For VCACHE RegQueryValueEx(pkey,'VCACHE\LRUBuffers',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\FailedRecycles',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\RandomRecycles',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\LRURecycles',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\Misses',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\Hits',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\cMacPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\cMinPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\cCurPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesXmit',nil,regtype,@tmp,@vsize); //For VFAT RegQueryValueEx(pkey,'VFAT\DirtyData',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\BReadsSec',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\BWritesSec',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\ReadsSec',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\WritesSec',nil,regtype,@tmp,@vsize); //For VMM RegQueryValueEx(pkey,'VMM\cpgLockedNoncache',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgCommit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSharedPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMid',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMac',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMin',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcache',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfileDefective',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfileInUse',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfile',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cDiscards',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cPageOuts',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cPageIns',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cInstanceFaults',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cPageFaults',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgOther',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwap',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgLocked',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgFree',nil,regtype,@tmp,@vsize); //For KERNEL RegQueryValueEx(pkey,'KERNEL\CPUUsage',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'KERNEL\VMs',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'KERNEL\Threads',nil,regtype,@tmp,@vsize); RegCloseKey(pkey); ftimer.enabled:=true; end; procedure tsysinfo.fupdatinginfo(sender:tobject); var res:integer; begin res:=RegOpenKeyEx(HKEY_DYN_DATA,'PerfStats\StatData',0,KEY_ALL_ACCESS,pkey); if res0 then raise exception.Create('Could not open registry key'); //For Dial Up Adapter RegQueryValueEx(pkey,'Dial-Up Adapter\Alignment',nil,regtype,@fDialupAdapterInfo.alignment,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Buffer',nil,regtype,@fDialupAdapterInfo.buffer,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Framing',nil,regtype,@fDialupAdapterInfo.framing,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Overrun ',nil,regtype,@fDialupAdapterInfo.overrun,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Timeout',nil,regtype,@fDialupAdapterInfo.timeout,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\CRC',nil,regtype,@fDialupAdapterInfo.crc,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Runts',nil,regtype,@fDialupAdapterInfo.runts,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\FramesXmit',nil,regtype,@fDialupAdapterInfo.framesxmit,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\FramesRecvd',nil,regtype,@fDialupAdapterInfo.framesrecieved,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesXmit',nil,regtype,@fDialupAdapterInfo.bytesxmit,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesRecvd',nil,regtype,@fDialupAdapterInfo.bytesrecieved,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\TotalBytesXmit',nil,regtype,@fDialupAdapterInfo.totalbytesxmit,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\TotalBytesRecvd',nil,regtype,@fDialupAdapterInfo.totalbytesrecieved,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\ConnectSpeed',nil,regtype,@fDialupAdapterInfo.connectspeed,@vsize); // For VCACHE RegQueryValueEx(pkey,'VCACHE\LRUBuffers',nil,regtype,@fVCACHEInfo.lrubuffers,@vsize); RegQueryValueEx(pkey,'VCACHE\FailedRecycles',nil,regtype,@fVCACHEInfo.failedrecycles,@vsize); RegQueryValueEx(pkey,'VCACHE\RandomRecycles',nil,regtype,@fVCACHEInfo.randomrecycles,@vsize); RegQueryValueEx(pkey,'VCACHE\LRURecycles',nil,regtype,@fVCACHEInfo.lrurecycles,@vsize); RegQueryValueEx(pkey,'VCACHE\Misses',nil,regtype,@fVCACHEInfo.misses,@vsize); RegQueryValueEx(pkey,'VCACHE\Hits',nil,regtype,@fVCACHEInfo.hits,@vsize); RegQueryValueEx(pkey,'VCACHE\cMacPages',nil,regtype,@fVCACHEInfo.cmacpages,@vsize); RegQueryValueEx(pkey,'VCACHE\cMinPages',nil,regtype,@fVCACHEInfo.cminpages,@vsize); RegQueryValueEx(pkey,'VCACHE\cCurPages',nil,regtype,@fVCACHEInfo.ccurpages,@vsize); //For VFAT RegQueryValueEx(pkey,'VFAT\DirtyData',nil,regtype,@ffatinfo.dirtydata,@vsize); RegQueryValueEx(pkey,'VFAT\BReadsSec',nil,regtype,@ffatinfo.breadssec,@vsize); RegQueryValueEx(pkey,'VFAT\BWritesSec',nil,regtype,@ffatinfo.bwritessec,@vsize); RegQueryValueEx(pkey,'VFAT\ReadsSec',nil,regtype,@ffatinfo.readssec,@vsize); RegQueryValueEx(pkey,'VFAT\WritesSec',nil,regtype,@ffatinfo.writessec,@vsize); //For VMM RegQueryValueEx(pkey,'VMM\cpgLockedNoncache',nil,regtype,@fvmminfo.cpglockednoncache,@vsize); RegQueryValueEx(pkey,'VMM\cpgCommit',nil,regtype,@fvmminfo.cpgcommit,@vsize); RegQueryValueEx(pkey,'VMM\cpgSharedPages',nil,regtype,@fvmminfo.cpgsharedpages,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMid',nil,regtype,@fvmminfo.cpgdiskcacheMid,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMac',nil,regtype,@fvmminfo.cpgdiskcacheMac,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMin',nil,regtype,@fvmminfo.cpgdiskcacheMin,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcache',nil,regtype,@fvmminfo.cpgdiskcache,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfileDefective',nil,regtype,@fvmminfo.cpgswapfiledefective,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfileInUse',nil,regtype,@fvmminfo.cpgswapfileinuse,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfile',nil,regtype,@fvmminfo.cpgswapfile,@vsize); RegQueryValueEx(pkey,'VMM\cDiscards',nil,regtype,@fvmminfo.cdiscards,@vsize); RegQueryValueEx(pkey,'VMM\cPageOuts',nil,regtype,@fvmminfo.cpageouts,@vsize); RegQueryValueEx(pkey,'VMM\cPageIns',nil,regtype,@fvmminfo.cpageins,@vsize); RegQueryValueEx(pkey,'VMM\cInstanceFaults',nil,regtype,@fvmminfo.cinstancefaults,@vsize); RegQueryValueEx(pkey,'VMM\cPageFaults',nil,regtype,@fvmminfo.cpagefaults,@vsize); RegQueryValueEx(pkey,'VMM\cpgOther',nil,regtype,@fvmminfo.cpgother,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwap',nil,regtype,@fvmminfo.cpgswap,@vsize); RegQueryValueEx(pkey,'VMM\cpgLocked',nil,regtype,@fvmminfo.cpglocked,@vsize); RegQueryValueEx(pkey,'VMM\cpgFree',nil,regtype,@fvmminfo.cpgfree,@vsize); //For KERNEL RegQueryValueEx(pkey,'KERNEL\CPUUsage',nil,regtype,@fkernelinfo.cpuusagepcnt,@vsize); RegQueryValueEx(pkey,'KERNEL\VMs',nil,regtype,@fkernelinfo.numvms,@vsize); RegQueryValueEx(pkey,'KERNEL\Threads',nil,regtype,@fkernelinfo.numThreads,@vsize); RegCloseKey(pkey); if assigned(SysInfoChanged) then SysInfoChanged(self); end; procedure TSysInfo.stoprecievingInfo; var res:integer; begin res:=RegOpenKeyEx(HKEY_DYN_DATA,'PerfStats\StopStat',0,KEY_ALL_ACCESS,pkey); if not fstopped then begin if res0 then raise exception.Create('Could not open registry key'); //For Dial Up Adapter RegQueryValueEx(pkey,'Dial-Up Adapter\Alignment',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Buffer',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Framing',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Overrun ',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Timeout',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\CRC',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\Runts',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\FramesXmit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\FramesRecvd',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesXmit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesRecvd',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\TotalBytesXmit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\TotalBytesRecvd',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\ConnectSpeed',nil,regtype,@tmp,@vsize); // For VCACHE RegQueryValueEx(pkey,'VCACHE\LRUBuffers',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\FailedRecycles',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\RandomRecycles',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\LRURecycles',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\Misses',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\Hits',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\cMacPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\cMinPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VCACHE\cCurPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'Dial-Up Adapter\BytesXmit',nil,regtype,@tmp,@vsize); //For VFAT RegQueryValueEx(pkey,'VFAT\DirtyData',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\BReadsSec',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\BWritesSec',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\ReadsSec',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VFAT\WritesSec',nil,regtype,@tmp,@vsize); //For VMM RegQueryValueEx(pkey,'VMM\cpgLockedNoncache',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgCommit',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSharedPages',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMid',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMac',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcacheMin',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgDiskcache',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfileDefective',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfileInUse',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwapfile',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cDiscards',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cPageOuts',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cPageIns',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cInstanceFaults',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cPageFaults',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgOther',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgSwap',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgLocked',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'VMM\cpgFree',nil,regtype,@tmp,@vsize); //For KERNEL RegQueryValueEx(pkey,'KERNEL\CPUUsage',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'KERNEL\VMs',nil,regtype,@tmp,@vsize); RegQueryValueEx(pkey,'KERNEL\Threads',nil,regtype,@tmp,@vsize); RegCloseKey(pkey); ftimer.enabled:=false; fstopped:=true; end; end; procedure tsysinfo.fsetupdateinterval(aupdateinterval:integer); begin if (ftimernil) and(aupdateinterval0) then begin ftimer.Interval:=aupdateinterval; fupdateinterval:=aupdateinterval; end; if (ftimernil) and(aupdateinterval=0) then begin ftimer.Interval:=500; fupdateinterval:=500; end; end; destructor tsysinfo.Destroy; begin StopRecievingInfo; ftimer.Destroy; inherited; end; procedure Register; begin RegisterComponents('Samples', [TSysInfo]); end; Copy it into a .pas file and then install it.