Как получить информацию о BIOS в Windows NT/2000/XP?

Материал из DRKB

Как получить информацию о BIOS в Windows NT/2000/XP?[править | править код]

В NT/2000/XP не получится прочитать значения прямо из BIOS, однако, ничего не мешает нам считать нужные значения из реестра.


procedure TBIOSInfo.GetRegInfoWinNT;
var
  RegistryV: TRegistry;
  RegPath: string;
  sl: TStrings;
begin
  Params.Clear;
  RegPath := '\HARDWARE\DESCRIPTION\System';
  RegistryV := TRegistry.Create;
  RegistryV.RootKey := HKEY_LOCAL_MACHINE;
  sl := nil;
  try
    RegistryV.Openkey(RegPath, False);
    ShowMessage('BIOS Date: ' + RegistryV.ReadString('SystemBiosDate'));
    sl := ReadMultirowKey(RegistryV, 'SystemBiosVersion');
    ShowMessage('BIOS Version: ' + sl.Text);
  except
  end;
  RegistryV.Free;
  if Assigned(sl) then sl.Free;
end;


ID: 01362



// следующий метод получает многострочные значения из реестра
// и преобразует их в TStringlist
function ReadMultirowKey(reg: TRegistry; Key: string): TStrings; 
const
  bufsize = 100; 
var 
  i: integer; 
  s1: string; 
  sl: TStringList; 
  bin: array[1..bufsize] of char; 
begin 
  try 
    result := nil; 
    sl := nil; 
    sl := TStringList.Create; 
    if not Assigned(reg) then 
      raise Exception.Create('TRegistry object not assigned.'); 
    FillChar(bin, bufsize, #0); 
    reg.ReadBinaryData(Key, bin, bufsize); 
    i := 1; 
    s1 := ''; 
    while i < bufsize do 
    begin 
      if ord(bin[i]) >= 32 then 
        s1 := s1 + bin[i] 
      else 
      begin 
        if Length(s1) > 0 then 
        begin 
          sl.Add(s1); 
          s1 := ''; 
        end; 
      end; 
      inc(i); 
    end; 
    result := sl; 
  except 
    sl.Free; 
    raise; 
  end; 
end;


Source: Взято из http://forum.sources.ru
ID: 01363