get_cpu_dmi_info.pas

来自「pipe类 pipe类 pipe类 pipe类 pipe类」· PAS 代码 · 共 324 行

PAS
324
字号
unit get_cpu_dmi_info;
{Version 2.0 for Windows 9x/2000/XP}
{This unit used to parse Information}
{Warning: This module requires 'get_dmi' module!}

interface
uses windows, sysutils, get_dmi, rvsfunctions;

procedure GetCPUDMIInfo();
procedure GetCacheDMIInfo();
function ReceiveDMIInfo():boolean;

var
dmi_available: boolean;
dmi23_available: boolean;

dmi_cpu_info: array [0..7] of
record
socket_designation: string;
cpu_upgrade: string;
//cpu_type: string;
//cpu_family: string;
//cpu_manufacturer: string;
//cpu_id_1: dword;
//cpu_id_2: dword;
//cpu_version: string;
//cpu_voltage: byte;
  cpu_ext_clock: word;
  cpu_max_speed: word;
  cpu_cur_speed: word;
  cpu_status: record
            spop: boolean;
            stat: string;
            end;
//cpu_upgrade: string;
  l1c_handle: dword;
  l2c_handle: dword;
  l3c_handle: dword;
//serial_number: string;
//asset_tag: string;
//part_number: string;
end;
//cpus_number:byte;

dmi_cache_info: array[0..32] of
record
  handle:word;
  socket_designation: string;
  cache_configuration: word;
  max_size: word;
  inst_size: word;
  supp_sram: string;
  inst_sram: string;
  speed: word;
  ec_type: string;
  cache_type: string;
//associativity: byte;
end;

implementation

var bf: TRomBiosDump;

var
  //tables
 dmi_table: array[0..2047] of byte;
 dmi_str: array[0..255] of dword;
 struct_str_count: array[0..255] of byte;
  //values
 table_entry_point:dword;
 table_size:dword;
 table_struct_num:dword;

 cpstrs: array[0..7] of string;
tmpstr: string;
 k,l: integer;


{Receiving DMI Info:
 Filling DMI Table    dmi_table
 Structures           dmi_str
 Entry Point          table_entry_point
 Table Size           table_size
 Structures num       table_struct_num
 Availability         dmi_available
}
function ReceiveDMIInfo(): boolean;
 var
  dmi_received, dmi_ok: boolean;
  entry_add,stradd,length: dword;
  i,j,k,pr_len,temp: dword;
begin
try
 dmi_received:=false;
 dmi_ok:=false;
// Receiving...
 if (integer(GetVersion)<0) then
  begin
   dmi_received:=ReadRomBios9x(bf);
  end
  else
  begin
   dmi_received:=ReadRomBiosNT(bf,INFINITE);
  end;
// Searching for anchor...
if dmi_received then begin
for i:=$000F0000 to $000FFFFF do
   begin
    if (bf[i]*$1000000+bf[i+1]*$10000+bf[i+2]*$100+bf[i+3]=$5F534D5F) then
     begin
     entry_add:=i;
     dmi_ok:=true;
     end;
   end;
end; // if dmi recvd end
// Processing Entry Point...
if dmi_ok then
 begin
  length:=bf[entry_add+$17]*$100+bf[entry_add+$16];
  stradd:=bf[entry_add+$1B]*$1000000+bf[entry_add+$1A]*$10000+bf[entry_add+$19]*$100+bf[entry_add+$18];
  {Check Length}
  if (length>=2048) then
   pr_len:=2047
  else
   pr_len:=length;
  {Loading Table}
  for i:=0 to pr_len do
   begin
    dmi_table[i]:=bf[stradd+i];
   end;
  //Determining Parameters
  table_entry_point:=stradd;
  table_struct_num:=bf[entry_add+$1D]*$100+bf[entry_add+$1C];
  table_size:=length;
  end; // if dmi ok end

  {Searching for structures}
 dmi_str[0]:=0;
 temp:=dmi_table[1];
 i:=0;
 j:=1;
  repeat
  i:=i+temp;
    repeat
    inc(i);
    until ((dmi_table[i-1]=0) and (dmi_table[i]=0));
  dmi_str[j]:=i+1;
  temp:=dmi_table[i];
  inc(j);
  until (j=table_struct_num+1);
 {/Searching for structures}

 dmi_available:=true;
 ReceiveDMIInfo:=true;
except
 dmi_available:=false;
 ReceiveDMIInfo:=false;
end; //try end
end; //func end

procedure GetCacheDMIInfo();
const
ec_types:array[$00..$06] of string =(
{0}'N/A',
{1}'N/A',
{2}'Unknown',
{3}'None',
{4}'Parity',
{5}'Single-bit ECC',
{6}'Multi-bit ECC'
);
cache_types: array[$00..$05] of string =(
{0}'N/A',
{1}'N/A',
{2}'Unknown',
{3}'Instruction',
{4}'Data',
{5}'Unified'
);
sram_types: array[0..6] of string =(
{0}'N/A',
{1}'Unknown ',
{2}'Non-Burst ',
{3}'Burst ',
{4}'Pipeline Burst ',
{5}'Synchronous ',
{6}'Asynchronous '
);
var i,j,k,c:integer;
sram_array: array[0..31] of byte;
begin
try
//ReceiveDMIInfo();
c:=-1;
for i:=0 to table_struct_num do
 begin
  case dmi_table[dmi_str[i]] of
   $07: begin
        inc(c);
        j:=dmi_str[i];
        dmi_cache_info[c].handle:=dmi_table[j+$02]+$100*dmi_table[j+$03];
        dmi_cache_info[c].cache_configuration:=dmi_table[j+$05]+$100*dmi_table[j+$06];
         if (dmi_table[j+$07]+$100*dmi_table[j+$08]>$8000) then
          dmi_cache_info[c].max_size:=64*(dmi_table[j+$07]+$100*dmi_table[j+$08]-$8000)
         else
          dmi_cache_info[c].max_size:=dmi_table[j+$07]+$100*dmi_table[j+$08];
         if (dmi_table[j+$09]+$100*dmi_table[j+$0A]>$8000) then
          dmi_cache_info[c].inst_size:=64*(dmi_table[j+$09]+$100*dmi_table[j+$0A]-$8000)
         else
          dmi_cache_info[c].inst_size:=dmi_table[j+$09]+$100*dmi_table[j+$0A];
         dmi_cache_info[c].supp_sram:='';
         strdectobin(dmi_table[j+$0B]+$100*dmi_table[j+$0C],sram_array);
         for k:=0 to 6 do
          begin
           if sram_array[k]=1 then dmi_cache_info[c].supp_sram:=dmi_cache_info[c].supp_sram+sram_types[k];
          end;
         dmi_cache_info[c].inst_sram:='';
         strdectobin(dmi_table[j+$0D]+$100*dmi_table[j+$0E],sram_array);
         for k:=0 to 6 do
          begin
           if sram_array[k]=1 then dmi_cache_info[c].inst_sram:=dmi_cache_info[c].inst_sram+sram_types[k];
          end;
         dmi_cache_info[c].speed:=dmi_table[j+$0F];
         dmi_cache_info[c].ec_type:=ec_types[dmi_table[j+$10]];
         dmi_cache_info[c].cache_type:=cache_types[dmi_table[j+$11]];
         //dmi_cache_info[c].associativity:=[dmi_table[j+$12]];
        end;
  end;
 end;
except
end;
end;


procedure GetCPUDMIInfo();
const cpusts:array[0..7] of string=(
{0}'Unknown',
{1}'CPU Enabled',
{2}'CPU Disabled by user',
{3}'CPU Disabled by POST',
{4}'Idle',
{5}'',
{6}'',
{7}'Other');
upgstr: array[$01..$11] of string=(
{0}'Other',
{1}'Unknown',
{2}'Daugther board',
{3}'ZIF Socket',
{4}'Replaceble Piggy Back',
{5}'None',
{6}'LIF Socket',
{7}'Slot-1',
{8}'Slot-2',
{9}'Socket 370',
{A}'Slot A',
{B}'Slot M',
{C}'Socket 423',
{D}'Socket A',
{E}'Socket 478',
{F}'Socket 754',
{10}'Socket 940'
);
var i,j,c:integer;
begin
try
//ReceiveDMIInfo();
c:=-1;
for i:=0 to table_struct_num do
 begin
  case dmi_table[dmi_str[i]] of
   $04: begin
        inc(c);
        j:=dmi_str[i];
        {end;
  end;}

dmi_cpu_info[c].cpu_ext_clock:=dmi_table[j+$12]+$100*dmi_table[j+$13];
dmi_cpu_info[c].cpu_cur_speed:=dmi_table[j+$16]+$100*dmi_table[j+$17];
dmi_cpu_info[c].l1c_handle:=dmi_table[j+$1A]+$100*dmi_table[j+$1B];
dmi_cpu_info[c].l2c_handle:=dmi_table[j+$1C]+$100*dmi_table[j+$1D];
dmi_cpu_info[c].l3c_handle:=dmi_table[j+$1E]+$100*dmi_table[j+$1F];
//additional info
dmi_cpu_info[c].cpu_max_speed:=dmi_table[j+$14]+$100*dmi_table[j+$15];
if (dmi_table[j+$18] div $40 = 1) then
dmi_cpu_info[c].cpu_status.spop:=true
else
dmi_cpu_info[c].cpu_status.spop:=false;
dmi_cpu_info[c].cpu_status.stat:=cpusts[dmi_table[j+$18] mod $08];

k:=j+dmi_table[j+$01]-1;
l:=0;
tmpstr:='';
repeat
 inc(k);
 if dmi_table[k]<>0 then
 tmpstr:=tmpstr+chr(dmi_table[k])
 else
 {if dmi_table[k]=0 then }
  begin
  cpstrs[l]:=tmpstr;
  inc(l);
  tmpstr:='';
  end;
until ((dmi_table[k]=0) and (dmi_table[k+1]=0));

dmi_cpu_info[c].socket_designation:=cpstrs[dmi_table[j+$04]-1];
dmi_cpu_info[c].cpu_upgrade:=upgstr[dmi_table[j+$19]];
end;
end;
end;

except
for c:=0 to 7 do
 begin
  dmi_cpu_info[c].cpu_ext_clock:=0;
  dmi_cpu_info[c].cpu_cur_speed:=0;
 end;
end;
end;


end.
 

⌨️ 快捷键说明

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