📄 getcpuid.pas
字号:
pop eax
End;
For i := 0 To 31 Do Begin
BinArray[i] := L1I Mod 2;
L1I := L1I Div 2;
End;
TempL1I := 0;
p := 0;
For i := 24 To 31 Do Begin
TempL1I := TempL1I + (BinArray[i] * StrToInt(FloatToStr(Power(2,
p))));
inc(p);
End;
GetExtendedL1ICache := TempL1I;
End;
Function TCpuData.GetExtendedL2Cache: word;
Var
L2, TempL2 : dword;
BinArray : Array[0..31] Of byte;
i, p : integer;
Begin
Asm
push eax
push ebx
push ecx
push edx
mov eax,$80000006
mov ebx,0
mov ecx,0
mov edx,0
dW $A20F /// cpuid
mov L2,ecx
pop edx
pop ecx
pop ebx
pop eax
End;
For i := 0 To 31 Do Begin
BinArray[i] := L2 Mod 2;
L2 := L2 Div 2;
End;
TempL2 := 0;
p := 0;
For i := 16 To 31 Do Begin
TempL2 := TempL2 + (BinArray[i] * StrToInt(FloatToStr(Power(2, p))));
inc(p);
End;
GetExtendedL2Cache := TempL2;
End;
Function TCpuData.CheckCeleron: Boolean;
Var
BId : byte;
Begin
Asm
push eax
push ebx
push ecx
push edx
mov eax,1
db $0F,$A2 /// cpuid
mov BId,bl
pop edx
pop ecx
pop ebx
pop eax
End;
CheckCeleron := (BId = $1);
End;
Function TCpuData.CheckPentiumIII: Boolean;
Begin
CheckPentiumIII := (CheckMMX And CheckSSE);
End;
Function TCpuData.CheckXeon: Boolean;
Var
BId : byte;
Begin
Asm
push eax
push ebx
push ecx
push edx
mov eax,1
db $0F,$A2 /// cpuid
mov BId,bl
pop edx
pop ecx
pop ebx
pop eax
End;
CheckXeon := (BId = $3);
End;
Function TCpuData.CheckPentium4: Boolean;
Var
BId : byte;
Begin
Asm
push eax
push ebx
push ecx
push edx
mov eax,1
db $0F,$A2 /// cpuid
mov BId,bl
pop edx
pop ecx
pop ebx
pop eax
End;
CheckPentium4 := (BId = $8);
End;
Function TCpuData.CheckIthanium: Boolean;
Var
res : dword;
BinArray : Array[0..31] Of byte;
i : byte;
Begin
Asm
push eax
push ebx
push ecx
push edx
mov eax,1
db $0F,$A2 /// cpuid
mov res,edx
pop edx
pop ecx
pop ebx
pop eax
End;
For i := 0 To 31 Do Begin
BinArray[i] := res Mod 2;
res := res Div 2;
End;
CheckIthanium := (CheckPentium4 And (BinArray[30] = 1));
End;
Function TCpuData.IntelP5N: String;
Begin
If CheckMMX Then IntelP5N := 'Intel Pentium(r) MMX(tm)'
Else IntelP5N := 'Intel Pentium(r)';
End;
Function TCpuData.IntelP6N: String;
Begin
If CheckCeleron Then IntelP6N := 'Intel Celeron(r)'
Else
If CheckPentiumIII Then IntelP6N := 'Intel Pentium(r) III'
Else
If CheckXeon Then IntelP6N := 'Intel Pentium(r) III Xeon(tm)'
Else
If Not CheckMMX Then IntelP6N := 'Intel Pentium(r) PRO'
Else IntelP6N := 'Intel Pentium(r) II';
End;
Function TCpuData.AMDK5N: String;
Var
Family, Model, Stepping: byte;
Begin
GetFMS(Family, Model, Stepping);
If Model = 0 Then AMDK5N := 'AMD K5'
Else AMDK5N := GetExtendedCpuName;
End;
Function TCpuData.Cyrix686N: String;
Begin
If CpuData.GetMaxExtendedFunctions > 0 Then Cyrix686N := GetExtendedCpuName
Else
If CheckMMX Then Cyrix686N := 'VIA Cyrix 6x86MII'
Else
Cyrix686N := 'VIA Cyrix 6x86';
End;
Function TCpuData.GenericCpuN: String;
Var
SysInfo : TSystemInfo;
Begin
GetSystemInfo(SysInfo);
If SysInfo.dwProcessorType = 386 Then GenericCpuN := 'Generic 386 CPU'
Else
If SysInfo.dwProcessorType = 486 Then GenericCpuN := 'Generic 486 CPU'
Else
If SysInfo.dwProcessorType = 586 Then
GenericCpuN := 'Pentium Class CPU'
Else GenericCpuN := 'Unknown CPU';
End;
Function TCpuData.P5CacheL1DI: word;
Begin
If CheckMMX Then P5CacheL1DI := 16
Else P5CacheL1DI := 8;
End;
Function TCpuData.P6CacheL1DI: word;
Begin
If Not CheckMMX Then P6CacheL1DI := 8
Else P6CacheL1DI := 16;
End;
Function TCpuData.P6CacheL2: word;
Var
Family, Model, Stepping: byte;
Begin
If CheckCeleron Then P6CacheL2 := 128
Else
If CheckPentiumIII Then Begin
GetFMS(Family, Model, Stepping);
If Model = 7 Then P6CacheL2 := 512
Else If Model = 8 Then P6CacheL2 := 256
Else P6CacheL2 := 512;
End
Else If Not CheckMMX Then P6CacheL2 := 512
Else P6CacheL2 := 512;
End;
Function TCpuData.AuthenticAMD: TCpuRec;
Var
Family, Model, Stepping: byte;
EFamily, EModel, EStepping: byte;
Begin
GetFMS(Family, Model, Stepping);
If Family = 4 Then Begin
AuthenticAMD.Name := 'AMD 486';
AuthenticAMD.Vendor := GetVendorString;
AuthenticAMD.Frequency := 0;
AuthenticAMD.Family := Family;
AuthenticAMD.Model := Model;
AuthenticAMD.Stepping := Stepping;
AuthenticAMD.L1DCache := 8;
AuthenticAMD.L1ICache := 8;
AuthenticAMD.L2Cache := 0;
End
Else
If Family = 5 Then Begin
If GetMaxExtendedFunctions > 4 Then Begin
AuthenticAMD.Name := GetExtendedCpuName;
AuthenticAMD.Vendor := GetVendorString;
AuthenticAMD.Frequency := GetCPUFrequency;
GetExtendedFMS(EFamily, EModel, EStepping);
AuthenticAMD.Family := EFamily;
AuthenticAMD.Model := EModel;
AuthenticAMD.Stepping := EStepping;
AuthenticAMD.L1DCache := GetExtendedL1DCache;
AuthenticAMD.L1ICache := GetExtendedL1ICache;
AuthenticAMD.L2Cache := 0;
End
Else Begin
AuthenticAMD.Name := AMDK5N;
AuthenticAMD.Vendor := GetVendorString;
AuthenticAMD.Frequency := GetCPUFrequency;
AuthenticAMD.Family := Family;
AuthenticAMD.Model := Model;
AuthenticAMD.Stepping := Stepping;
AuthenticAMD.L1DCache := 16;
AuthenticAMD.L1ICache := 16;
AuthenticAMD.L2Cache := 0;
End;
End
Else If Family > 5 Then Begin
AuthenticAMD.Name := GetExtendedCpuName;
AuthenticAMD.Name := GetExtendedCpuName;
AuthenticAMD.Vendor := GetVendorString;
AuthenticAMD.Frequency := GetCPUFrequency;
GetExtendedFMS(EFamily, EModel, EStepping);
AuthenticAMD.Family := EFamily;
AuthenticAMD.Model := EModel;
AuthenticAMD.Stepping := EStepping;
AuthenticAMD.L1DCache := GetExtendedL1DCache;
AuthenticAMD.L1ICache := GetExtendedL1ICache;
AuthenticAMD.L2Cache := GetExtendedL2Cache;
End;
End;
Function TCpuData.GenuineIntel: TCpuRec;
Var
Family, Model, Stepping: byte;
Begin
GetFMS(Family, Model, Stepping);
If Family = 4 Then Begin
GenuineIntel.Name := 'Intel 486';
GenuineIntel.Vendor := GetVendorString;
GenuineIntel.Frequency := 0;
GenuineIntel.Family := Family;
GenuineIntel.Model := Model;
GenuineIntel.Stepping := Stepping;
GenuineIntel.L1DCache := 8;
GenuineIntel.L1ICache := 8;
GenuineIntel.L2Cache := 0;
End
Else
If Family = 5 Then Begin
GenuineIntel.Name := IntelP5N;
GenuineIntel.Vendor := GetVendorString;
GenuineIntel.Frequency := GetCPUFrequency;
GenuineIntel.Family := Family;
GenuineIntel.Model := Model;
GenuineIntel.Stepping := Stepping;
GenuineIntel.L1DCache := P5CacheL1DI;
GenuineIntel.L1ICache := P5CacheL1DI;
GenuineIntel.L2Cache := 0;
End
Else
If Family = 6 Then Begin
GenuineIntel.Name := IntelP6N;
GenuineIntel.Vendor := GetVendorString;
GenuineIntel.Frequency := GetCPUFrequency;
GenuineIntel.Family := Family;
GenuineIntel.Model := Model;
GenuineIntel.Stepping := Stepping;
GenuineIntel.L1DCache := P6CacheL1DI;
GenuineIntel.L1ICache := P6CacheL1DI;
GenuineIntel.L2Cache := P6CacheL2;
End
Else
If Family = $F Then Begin
If CheckPentium4 Then Begin
GenuineIntel.Name := 'Intel Pentium(r) 4';
GenuineIntel.Vendor := GetVendorString;
GenuineIntel.Frequency := GetCPUFrequency;
GenuineIntel.Family := 32;
GenuineIntel.Model := Model;
GenuineIntel.Stepping := Stepping;
GenuineIntel.L1DCache := 8;
GenuineIntel.L1ICache := 12;
GenuineIntel.L2Cache := 256;
End
Else If CheckIthanium Then Begin
GenuineIntel.Name := 'Intel Ithanium';
GenuineIntel.Vendor := GetVendorString;
GenuineIntel.Frequency := GetCPUFrequency;
GenuineIntel.Family := 64;
GenuineIntel.Model := Model;
GenuineIntel.Stepping := Stepping;
GenuineIntel.L1DCache := 0;
GenuineIntel.L1ICache := 0;
GenuineIntel.L2Cache := 0;
End;
End;
End;
Function TCpuData.CyrixInstead: TCpuRec;
Var
Family, Model, Stepping: byte;
EFamily, EModel, EStepping: byte;
Begin
GetFMS(Family, Model, Stepping);
If Family = 4 Then Begin
CyrixInstead.Name := 'VIA Cyrix 4x86';
CyrixInstead.Vendor := GetVendorString;
CyrixInstead.Frequency := 0;
CyrixInstead.Family := Family;
CyrixInstead.Model := Model;
CyrixInstead.Stepping := Stepping;
CyrixInstead.L1DCache := 8;
CyrixInstead.L1ICache := 8;
CyrixInstead.L2Cache := 0;
End
Else
If Family = 5 Then Begin
CyrixInstead.Name := 'VIA Cyrix 5x86';
CyrixInstead.Vendor := GetVendorString;
CyrixInstead.Frequency := GetCPUFrequency;
CyrixInstead.Family := Family;
CyrixInstead.Model := Model;
CyrixInstead.Stepping := Stepping;
CyrixInstead.L1DCache := 8;
CyrixInstead.L1ICache := 8;
CyrixInstead.L2Cache := 0;
End
Else Begin
If GetMaxExtendedFunctions > 0 Then Begin
CyrixInstead.Name := GetExtendedCpuName;
CyrixInstead.Vendor := GetVendorString;
CyrixInstead.Frequency := GetCPUFrequency;
GetExtendedFMS(EFamily, EModel, EStepping);
CyrixInstead.Family := EFamily;
CyrixInstead.Model := EModel;
CyrixInstead.Stepping := EStepping;
CyrixInstead.L1DCache := GetExtendedL1DCache;
CyrixInstead.L1ICache := GetExtendedL1ICache;
CyrixInstead.L2Cache := GetExtendedL2Cache;
End
Else Begin
CyrixInstead.Name := Cyrix686N;
CyrixInstead.Vendor := GetVendorString;
CyrixInstead.Frequency := GetCPUFrequency;
CyrixInstead.Family := Family;
CyrixInstead.Model := Model;
CyrixInstead.Stepping := Stepping;
CyrixInstead.L1DCache := 32;
CyrixInstead.L1ICache := 32;
CyrixInstead.L2Cache := 0;
End;
End;
End;
Function TCpuData.GenericCPU: TCpuRec;
Var
Family, Model, Stepping: byte;
EFamily, EModel, EStepping: byte;
Begin
If Not GetCPUIDSupport Then Begin
MessageDlg('This CPU does not support the CPUID instruction!!!',
mtWarning,
[mbOk], 0);
GenericCPU.Name := 'Unidentified CPU';
GenericCPU.Vendor := 'Unidentified';
GenericCPU.Frequency := 0;
GenericCPU.Family := -1;
GenericCPU.Model := -1;
GenericCPU.Stepping := -1;
GenericCPU.L1DCache := 0;
GenericCPU.L1ICache := 0;
GenericCPU.L2Cache := 0;
End
Else Begin
GetFMS(Family, Model, Stepping);
If GetMaxExtendedFunctions > 0 Then Begin
GenericCPU.Name := GetExtendedCpuName;
GenericCPU.Vendor := GetVendorString;
GenericCPU.Frequency := GetCPUFrequency;
CpuData.GetExtendedFMS(EFamily, EModel, EStepping);
GenericCPU.Family := EFamily;
GenericCPU.Model := EFamily;
GenericCPU.Stepping := EStepping;
GenericCPU.L1DCache := GetExtendedL1DCache;
GenericCPU.L1ICache := GetExtendedL1ICache;
GenericCPU.L2Cache := GetExtendedL2Cache;
End
Else Begin
GenericCPU.Name := GenericCpuN;
GenericCPU.Vendor := GetVendorString;
If Family <= 4 Then GenericCPU.Frequency := 0
Else GenericCPU.Frequency := GetCPUFrequency;
GenericCPU.Family := Family;
GenericCPU.Model := Model;
GenericCPU.Stepping := Stepping;
GenericCPU.L1DCache := 0;
GenericCPU.L1ICache := 0;
GenericCPU.L2Cache := 0;
End;
End;
End;
Function TCpuData.GetCPUID: String;
Function GetCPUIDASM: TCPUIDARRAY; Assembler; Register;
Asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
End;
Var
CPUID : TCPUIDARRAY;
i : integer;
Begin
CPUID := GetCPUIDASM;
For i := 1 To 4 Do result := result + IntToStr(CPUID[i]) + ' ';
End;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -