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 + -
显示快捷键?