⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getcpuid.pas

📁 放弃了先前的采用报表实现
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -