Qual é a CPU?
jan.15, 2010 in
Delphi, Dicas, Programação, Rad Studio
Boa dica para descobrir a CPU em que o programa está rodando:

CPU ID Vendor
Fontes:
type
TCPUVendor = (cvUnknown, cvAMD, cvCentaur, cvCyrix, cvIntel, cvTransmeta,
cvNexGen, cvRise, cvUMC, cvNSC, cvSiS);
TCPUVendorStr = string[12];
const
CPUVendorStr: array [ Low(TCPUVendor) .. High(TCPUVendor)]
of TCPUVendorStr = ('', 'AuthenticAMD', 'CentaurHauls',
'CyrixInstead', 'GenuineIntel', 'GenuineTMx86',
'NexGendriven', 'RiseRiseRise', 'UMC UMC UMC ', 'Geode by NSC',
'SiS SiS SiS');
function GetCPUVendorStr: string;
function GetCPUVendor: TCPUVendor;
var
FormCPUID: TFormCPUID;
implementation
{$R *.dfm}
function GetCPUVendorStr: string;
// Note: this code comes from the FastCode project
// (see http://sourceforge.net/projects/fastcode/)
type
TRegisters = packed record
EAX: Cardinal;
EBX: Cardinal;
ECX: Cardinal;
EDX: Cardinal;
end;
function IsCPUIDAvailable: boolean; register;
asm
PUSHFD // Save EFLAGS to stack
POP EAX // Store EFLAGS in EAX
MOV EDX, EAX // Save in EDX for later testing
XOR EAX, $200000 // Flip ID bit in EFLAGS
PUSH EAX // Save new EFLAGS value on stack
POPFD // Replace current EFLAGS value
PUSHFD // Get new EFLAGS
POP EAX // Store new EFLAGS in EAX
XOR EAX, EDX // Check if ID bit changed
JZ @Exit // No, CPUID not available
MOV EAX, True // Yes, CPUID is available
@Exit:
end;
procedure GetCPUID(const Param: Cardinal; var Registers: TRegisters);
asm
PUSH EBX { save affected registers }
PUSH EDI
MOV EDI, Registers
XOR EBX, EBX { clear EBX register }
XOR ECX, ECX { clear ECX register }
XOR EDX, EDX { clear EDX register }
DB $0F, $A2 { CPUID opcode }
MOV TRegisters(EDI).&EAX, EAX { save EAX register }
MOV TRegisters(EDI).&EBX, EBX { save EBX register }
MOV TRegisters(EDI).&ECX, ECX { save ECX register }
MOV TRegisters(EDI).&EDX, EDX { save EDX register }
POP EDI { restore registers }
POP EBX
end;
var
VendorStr: TCPUVendorStr;
Registers: TRegisters;
begin
if (IsCPUIDAvailable) then
begin
// Call CPUID function 0
GetCPUID(0, Registers);
// Get CPU vendor
SetLength(VendorStr, 12);
Move(Registers.EBX, VendorStr[1], 4);
Move(Registers.EDX, VendorStr[5], 4);
Move(Registers.ECX, VendorStr[9], 4);
Result:= string(VendorStr);
end
else
Result := 'cvUnknown';
end;
function GetCPUVendor: TCPUVendor;
var
VendorStr: TCPUVendorStr;
begin
Result:= cvUnknown;
VendorStr:= AnsiString(GetCPUVendorStr);
if VendorStr <> 'cvUnknown' then
begin
Result := High(TCPUVendor);
while ((VendorStr <> CPUVendorStr[Result]) and (Result > Low(TCPUVendor))) do
Dec(Result);
end;
end;
procedure TFormCPUID.Button1Click(Sender: TObject);
begin
Button1.Caption:= GetCPUVendorStr;
if cvIntel = GetCPUVendor then
MessageDlg('Genuine Intel!', mtInformation, [mbOK], 0);
end;

Leave a Reply