Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить информацию о BIOSе

Delphi , ОС и Железо , BIOS

Получить информацию о BIOSе

Вот пример как можно даты БИОС материнской платы и видеокарты выдрать.

То же самое можно с названием производителя и версией.

В WinNT приходится читать не из ПЗУ а из реестра но это достаточно надежно

- соотв ключи WinNT закрывает на запись и обновляет при каждом старте (?).

Для Win9x можешь хоть весь БИОС напрямую читать.

Получить заводской номер винчестера (не тот что getvolumeinfo дает) ИМХО

невозможно - порты IDE даже Win9x блокирует.

Code:

type
TRegistryRO = class (TRegistry)
 function OpenKeyRO (const Key: string): Boolean;
end;
{ это уже ветхая история - был один глюк у D3}
 
implementation
 
uses WAPIInfo, Windows, SysUtils, StrUtils;
 
function TRegistryRO.OpenKeyRO (const Key: string): Boolean;
function
IsRelative(const Value: string): Boolean;
begin Result := not ((Value <> '') and (Value[1] = '\')) end;
var
TempKey: HKey;
S: string;
Relative: Boolean;
begin
S := Key;
Relative := IsRelative(S);
if not Relative then Delete(S, 1, 1);
TempKey := 0;
   Result := RegOpenKeyEx(GetBaseKey(Relative), PChar(S), 0,
     KEY_READ, TempKey) = ERROR_SUCCESS;
 if Result then begin
    if (CurrentKey <> 0) and Relative then S := CurrentPath + '\' + S;
    ChangeKey(TempKey, S);
   end;
end;
 
function GetBIOSDate : string;
const
BIOSDatePtr
= $0ffff5;
SystemKey = 'HARDWARE\DESCRIPTION\System';
BiosDateParam = 'SystemBiosDate';
var
p : pointer;
s : string[128];
begin
if OSisNT then begin
    with TRegistryRO.Create do try
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKeyRO (SystemKey) then begin
        s := ReadString (BiosDateParam);
       end;
      finally Free;
     end; { of try}
   end
 else try
     s[0] := #8;
     p := Pointer(BIOSDatePtr);
     Move (p^, s[1], 8);
    except FillChar (s[1],
8, '9');
   end; { of try}
Result := copy (s, 1, 2) + copy (s, 4, 2) + copy (s, 7, 2);
end;
 
function GetVideoDate : string;
const
VideoDatePtr = $0C0000;
SystemKey = 'HARDWARE\DESCRIPTION\System';
VideoDateParam = 'VideoBiosDate';
var
p : pointer;
s : string[255];
begin
if OSisNT then begin
    with TRegistryRO.Create do try
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKeyRO (SystemKey)
       then s := ReadString (VideoDateParam)
       else s := 'NT/de/tected';
      finally Free;
     end; { of
try}
   end
 else try
     s[0] := #255;
     p := Pointer(VideoDatePtr + 60); { первые $60 - строка CopyRight}
     Move (p^, s[1], 255);
     if pos('/', s) > 2 then s := copy (s, pos('/', s) - 2, 8)
      else begin
        p := Pointer(VideoDatePtr + 60 + 250);
        Move (p^, s[1], 255);
        if pos('/', s) > 2 then s := copy (s, pos('/', s) - 2, 8);
       end;
    except FillChar (s[1], 8, '9');
   end; { of try}
Result := copy (s, 1, 2) + copy (s, 4, 2) + copy (s, 7, 2);
end;

Code:

unit WAPIInfo;
 
interface
 
uses
Registry, SysUtils, Windows;
 
procedure GetOSVerInfo (var OSID : DWORD; var OSStr : string);
function OSisNT : boolean;
procedure GetCPUInfo (var CPUID : DWORD; var CPUStr : string);
procedure GetMemInfo (var MemStr : string);
 
implementation
 
procedure GetOSVerInfo (var OSID : DWORD; var OSStr : string);
var
OSVerInfo : TOSVersionInfo;
Reg : TRegistry;
s : string;
begin
OSVerInfo.dwOSVersionInfoSize := SizeOf (OSVerInfo);
GetVersionEx (OSVerInfo);
OSID := OSVerInfo.dwPlatformID;
case OSID of
   VER_PLATFORM_WIN32S : OSStr := 'Windows 3+';
   VER_PLATFORM_WIN32_WINDOWS : OSStr := 'Windows 95+';
  VER_PLATFORM_WIN32_NT : begin
     OSStr := 'Windows NT';
     Reg := TRegistry.Create;
     Reg.RootKey := HKEY_LOCAL_MACHINE;
     if Reg.OpenKey ('SYSTEM\CurrentControlSet\Control\', False)
       then try
        s := Reg.ReadString ('ProductOptions')
       except s := ''
      end;
     if s = 'WINNT' then OSStr := OSStr + ' WorkStation'
     else if s = 'SERVERNT' then OSStr := OSStr + ' Server 3.5 & hi'
     else if s = 'LANMANNT' then OSStr := OSStr + ' Advanced server 3.1';
     Reg.Free;
 
end;
 end;
with OSVerInfo do OSStr := OSStr + Format (' %d.%d (выпуск %d)',
  [dwMajorVersion, dwMinorVersion, LoWord(dwBuildNumber)]);
end;
 
function OSisNT : boolean;
var
s : string;
i : DWORD;
begin
GetOSVerInfo (i, s);
Result := (i = VER_PLATFORM_WIN32_NT);
end;
 
procedure GetCPUInfo (var CPUID : DWORD; var CPUStr : string);
var SI : TSystemInfo;
begin
GetSystemInfo (SI);
CPUID := SI.dwProcessorType;
case CPUID of
   386: CPUStr := '80386-совместимый процессор';
   486: CPUStr := '80486-совместимый процессор';
   586: CPUStr := 'Pentium-совместимый процессор';
 
else CPUStr := 'Неизвестный процессор';
 end;
{  case SI.wProcessorArchitecture of
   PROCESSOR_ARCHITECTURE_INTEL: ;
   MIPS
   ALPHA
   PPC
   UNKNOWN
  end;}
end;
 
procedure GetMemInfo (var MemStr : string);
var MemInfo : TMemoryStatus;
begin
MemInfo.dwLength := SizeOf (MemInfo);
GlobalMemoryStatus (MemInfo);
with MemInfo do MemStr := Format ('ОЗУ: %0.2f M (свободно %0.2f M)'#$d+
 ' Файл подкачки: %0.2f M (свободно: %0.2f M)'#$d,
  [(dwTotalPhys div 1024) / 1024,
   (dwAvailPhys div 1024) / 1024,
   (dwTotalPageFile div 1024) / 1024,
   (dwAvailPageFile div 1024) / 1024]);
end;
 
end.

PS Возможно, эти процедуры не всегда дату возвращают но то что практически всегда для разных материнских/видео плат возвращаются разные значения - проверено, что мне собственно и требовалось.

Andrey Sorokin from sunny Saint-Petersburg anso@mail.ru

Russian Technology http://attend.to/rt anso@rt.spb.ru

Автор: Song

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

Код предназначен для извлечения информации о BIOS компьютера, в частности даты и имени производителя с версией.

Класс TRegistryRO используется для чтения значений реестра без изменения их. Это полезно при работе с Windows NT, так как оно предотвращает случайные изменения настроек системы.

Функция GetBIOSDate читает дату BIOS из реестра (если работает под Windows NT) или напрямую из памяти (если работает под Windows 9x).

Функция GetVideoDate делает что-то аналогичное для информации о видеокарте.

Есть также модуль WAPIInfo, содержащий процедуры для извлечения информации о версии операционной системы, типе CPU и использовании памяти. Функция OSisNT проверяет, является ли операционная система NT-основанной или нет.

В отношении вашей вопросы о получении заводского номера жёсткого диска, похоже, что вы ищете что-то вроде GetVolumeInformation, которое предоставляет детали о том, какое количество информации. Однако автор отмечает, что это может быть невозможно достичь в Windows 9x из-за блокировки порта IDE.

В целом, код appears to be a mix of old and new techniques, with some parts being specific to Windows NT or 9x. Интересно видеть, как различные подходы были приняты для различных операционных систем!

Получить информацию о BIOS материнской платы и видеокарты, а также заводской номер винчестера с помощью программирования в языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: BIOS ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:53:53/0.0058979988098145/1