CPU 제조사, 이름을 알아내는 함수
 
function GetBrandString: String;  

function CPUIDAvail: Boolean; assembler

asm 

pushfd 

pop   eax 

mov   edx,eax

xor   eax, 0200000h 

push  eax

popfd

pushfd

pop   eax

xor   eax,edx

and   eax, 0200000h

shr   eax, 21

end;

const CPUID=$a20f;
  
var s: array [0..48] of char;
begin

FillChar(s, sizeof(s), 0); 

if CPUIDAvail then begin 

asm 

//save regs
push ebx
push ecx
push edx
//check if necessary extended CPUID calls are
//supported, if not return null string
mov  eax,080000000h
{dw}   CPUID
cmp  eax,080000004h
jb   @@endbrandstr
//get first name part
mov  eax,080000002h
{dw}   CPUID
mov  longword(s[0]),eax
mov  longword(s[4]),ebx
mov  longword(s[8]),ecx
mov  longword(s[12]),edx
//get second name part
mov  eax,080000003h
{dw}   CPUID
mov  longword(s[16]),eax
mov  longword(s[20]),ebx
mov  longword(s[24]),ecx
mov  longword(s[28]),edx
//get third name part
mov  eax,080000004h
{dw}   CPUID
mov  longword(s[32]),eax
mov  longword(s[36]),ebx
mov  longword(s[40]),ecx
mov  longword(s[44]),edx

@@endbrandstr:
   //restore regs
   pop  edx
   pop  ecx
   pop  ebx

end

end

  

Result:=StrPas(s); 

end;     
 
 
 
CPU 의 코어갯수 - 레지스트리를 읽어내는 꽁수다..-_-; 더 나은게 없을까
 
function GetCPUCoreNumber: Integer; 
var

Reg: TRegistry;

sList: TStringList;  

begin 

sList:=TStringList.Create; 

Reg:=TRegistry.Create; 

try 

Reg.RootKey:=HKEY_LOCAL_MACHINE; 

Reg.OpenKeyReadOnly('Hardware\Description\System\CentralProcessor'); 

Reg.GetKeyNames(sList); 

Reg.OpenKeyReadOnly(sList[0]); 

  

Result:=IntToStr(sList.Count); 

finally 

Reg.CloseKey; 

if Assigned(Reg) then FreeAndNil(Reg);

if Assigned(sList) then FreeAndNil(sList); 

end

end
 
 
 
CPU 클럭속도 - 역시 레지스트리를 읽어내는 꽁수다...
 
function GetCPUSpeed: String
var 

Reg: TRegistry; 

sList: TStringList; 

begin 

sList:=TStringList.Create; 

Reg:=TRegistry.Create; 

try 

Reg.RootKey:=HKEY_LOCAL_MACHINE; 

Reg.OpenKeyReadOnly('Hardware\Description\System\CentralProcessor'); 

Reg.GetKeyNames(sList); 

Reg.OpenKeyReadOnly(sList[0]); 

Result:=FloatToStr(Reg.ReadInteger('~MHz')/1000)+' GHz'

finally 

Reg.CloseKey; 

if Assigned(Reg) then FreeAndNil(Reg); 

if Assigned(sList) then FreeAndNil(sList); 

end

end
 





Posted by bloodguy
,