Содержание материала

 

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

В 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

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить