unit UInf;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses registry;

procedure TForm1.Button1Click(Sender: TObject);
var reg:TRegistry;
    buf: array[0..255] of char;
    nchar, i: integer;
    S: string;
    MemInfo: TMemoryStatus;
    SI : TSystemInfo;
    P : pointer;
begin
// BIOS
 RichEdit1.Clear;
 RichEdit1.SelAttributes.Style := [fsBold];
 RichEdit1.Lines.Add('BIOS');
 RichEdit1.SelAttributes := RichEdit1.DefAttributes;
 if (GetVersion < $80000000)
 // Windows NT
 then begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  if reg.OpenKey('HARDWARE\DESCRIPTION\System',false)
  then begin
   RichEdit1.Lines.Add('дата: ' + reg.ReadString('SystemBiosDate'));
   nchar := reg.ReadBinaryData('SystemBiosVersion', buf, 256) - 1;
   S := '';
   for i:=0 to nchar do
    if buf[i] = #0
     then S := S + ' '
     else S := S + buf[i];
   RichEdit1.Lines.Add('версия: ' + S);
  end;
 end
 // Windows 9.x
 else begin
  S := '';
  try
    P := Pointer($0ffff5);
    Move(P^, S[1], 8);
  except
    S := 'BIOS недоступен для чтения';
  end;
  RichEdit1.Lines.Add('дата: ' + S);
 end;
// Видеокарта
 RichEdit1.SelAttributes.Style := [fsBold];
 RichEdit1.Lines.Add('Видеокарта');
 RichEdit1.SelAttributes := RichEdit1.DefAttributes;
 if (GetVersion < $80000000)
 // Windows NT
 then begin
  RichEdit1.Lines.Add('дата: ' + reg.ReadString('VideoBiosDate'));
  reg.CloseKey;
  reg.Free;
 end
 // Windows 9.x
 else begin
  S := '';
  try
   P := Pointer($0C0000 + 60);
   Move(P^, S[1], 255);
   if Pos('/', S) > 2
    then S := copy(S, pos('/', S) - 2, 8)
    else begin
     P := Pointer($0C0000 + 60 + 250);
     Move(P^, S[1], 255);
     if Pos('/', S) > 2
      then S := copy(S, pos('/', S) - 2, 8);
     end;
  except
    S := 'BIOS недоступен для чтения';
  end;
  RichEdit1.Lines.Add('дата: ' + S)
 end;
// Процессор
 reg := TRegistry.Create;
 reg.RootKey := HKEY_LOCAL_MACHINE;
 RichEdit1.SelAttributes.Style := [fsBold];
 RichEdit1.Lines.Add('Процессор');
 RichEdit1.SelAttributes := RichEdit1.DefAttributes;
 if reg.OpenKey('HARDWARE\DESCRIPTION\System\CentralProcessor\0',false)
 then begin
  RichEdit1.Lines.Add('идентификатор: ' + reg.ReadString('Identifier'));
  RichEdit1.Lines.Add('производитель: ' + reg.ReadString('VendorIdentifier'));
 end;
 reg.CloseKey;
 reg.Free;
 GetSystemInfo(SI);
 case SI.dwProcessorType of
  386: begin
        S := 'процессор, совместимый с 80386, ';
        if (HiByte(SI.wProcessorRevision) = $FF)
         then S := S + 'модель ' + IntToStr((SI.wProcessorRevision and $F0) - $A) +
                   ' версия ' + char(SI.wProcessorRevision and $0F)
         else S := S + 'версия ' + char(HiByte(SI.wProcessorRevision) + ord('A')) +
                       IntToStr(SI.wProcessorRevision and $FF);
       end;
  486: begin
        S := 'процессор, совместимый с 80486, ';
        if (HiByte(SI.wProcessorRevision) = $FF)
         then S := S + 'модель ' + IntToStr((SI.wProcessorRevision and $F0) - $A) +
                   ' версия ' + char(SI.wProcessorRevision and $0F)
         else S := S + 'версия ' + char(HiByte(SI.wProcessorRevision) + ord('A')) +
                       IntToStr(SI.wProcessorRevision and $FF);
       end;
  586: S := 'процессор, совместимый с Pentium, модель ' +
             IntToStr(HiByte(SI.wProcessorRevision)) +
             ' версия ' + IntToStr(SI.wProcessorRevision and $FF);
  else S := 'Неизвестный процессор';
 end;
  RichEdit1.Lines.Add(S);
// Информация о памяти
 MemInfo.dwLength := SizeOf (MemInfo);
 GlobalMemoryStatus(MemInfo);
 RichEdit1.SelAttributes.Style := [fsBold];
 RichEdit1.Lines.Add('Память');
 RichEdit1.SelAttributes := RichEdit1.DefAttributes;
 with MemInfo do
 begin
  RichEdit1.Lines.Add(Format('ОЗУ: всего %d М (%d байт),' +
                             ' свободно %d М (%d байт), занято %d%%',
                             [dwTotalPhys shr 20, dwTotalPhys,
                              dwAvailPhys shr 20, dwAvailPhys, dwMemoryLoad]));
  RichEdit1.Lines.Add(Format('Файл подкачки: всего %d М (%d байт),' +
                             ' свободно %d М (%d байт)',
                             [dwTotalPageFile shr 20, dwTotalPageFile,
                              dwAvailPageFile shr 20, dwAvailPageFile]));
  RichEdit1.Lines.Add(Format('Адресное пространство: всего %d М (%d байт),' +
                             ' свободно %d М (%d байт)',
                             [dwTotalVirtual shr 20, dwTotalVirtual,
                              dwAvailVirtual shr 20, dwAvailVirtual]));
 end;
end;

end.
