Boa dica para descobrir a CPU em que o programa está rodando:

CPU ID

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;
Bookmark and Share: