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

📄 cpuinfo.pas

📁 改进的Hardware检测代码
💻 PAS
字号:
unit CPUInfo;

interface

uses Windows, SysUtils;

function GetCPUID: string;
function GetCPUVendor: string;
function GetCPUSpeed: string;

implementation

const
    ID_BIT = $200000; // EFLAGS ID bit

function IsCPUIDAvailable: Boolean; register;
asm
    PUSHFD {direct access to flags no possible, only via stack}
    POP EAX {flags to EAX}
    MOV EDX,EAX {save current flags}
    XOR EAX,ID_BIT {not ID bit}
    PUSH EAX {onto stack}
    POPFD {from stack to flags, with not ID bit}
    PUSHFD {back to stack}
    POP EAX {get back to EAX}
    XOR EAX,EDX {check if ID bit affected}
    JZ @exit {no, CPUID not availavle}
    MOV AL,True {Result=True}
    @exit:
end;

function GetCPUID: string;
type
    TCPUID = array[1..4] of Longint; //cpuid

    function CPUID: TCPUID; 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
    I: Integer;
    thisId: TCPUID;
begin
    for I := Low(thisId) to High(thisId) do thisId[I] := -1;
    thisId := CPUID;
    if IsCPUIDAvailable then
        result := IntToHex(thisId[1], 8) + '-' + IntToHex(thisId[2], 8) + '-' + IntToHex(thisId[3], 8) + '-' + IntToHex(thisId[4], 8)
    else
        Result := '00000000-00000000-00000000-00000000';
end;

function GetCPUVendor: string;
type
    TVendor = array[0..11] of char; //cpuid

    function CPUVendor: TVendor; assembler; register;
    asm
      PUSH    EBX               //Save affected register
      PUSH    EDI
      MOV     EDI,EAX           //@Result (TVendor)
      MOV     EAX,0
      DW      $A20F             //CPUID Command
      MOV     EAX,EBX
      XCHG    EBX,ECX           //save ECX result
      MOV     ECX,4
    @1:
      STOSB
      SHR     EAX,8
      LOOP    @1
      MOV     EAX,EDX
      MOV     ECX,4
    @2:
      STOSB
      SHR     EAX,8
      LOOP    @2
      MOV     EAX,EBX
      MOV     ECX,4
    @3:
      STOSB
      SHR     EAX,8
      LOOP    @3
      POP     EDI              //Restore registers
      POP     EBX
    end;
begin
    Result := CPUVendor;
end;

function GetCPUSpeed: string;
const
    DelayTime = 500; //时间单位是毫秒
var
    TimerHi, TimerLo: DWORD;
    PriorityClass, Priority: Integer;
begin
    PriorityClass := GetPriorityClass(GetCurrentProcess);
    Priority := GetThreadPriority(GetCurrentThread);
    SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
    Sleep(10);
    asm
        dw 310Fh //rdtsc
        mov TimerLo, eax
        mov TimerHi, edx
    end;
    Sleep(DelayTime);
    asm
        dw 310Fh //rdtsc
        sub eax, TimerLo
        sbb edx, TimerHi
        mov TimerLo, eax
        mov TimerHi, edx
    end;

    SetThreadPriority(GetCurrentThread, Priority);
    SetPriorityClass(GetCurrentProcess, PriorityClass);
    Result := FloatToStr(TimerLo / (1000.0 * DelayTime));
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -