Code:

unit BiosDate;

 

interface

 

function GetBiosDate: String;

 

implementation

 

function SegOfsToLinear(Segment, Offset: Word): Integer;

begin

result := (Segment SHL 4) OR Offset;

end;

 

function GetBiosDate: String;

begin

result := String(PChar(Ptr(SegOfsToLinear($F000, $FFF5))));

end;

 

end.

 

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

 

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

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

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

 

Получить заводской номер винчестера (не тот что getvolumeinfo дает) ИМХО невозможно - порты IDE даже Win9x блокирует.

 

Code:

with Memo1.Lines do

begin

Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061))));

Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091))));

Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5))));

Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71))));

end;

 

 

 

Code:

{$APPTYPE CONSOLE}

 

uses

SysUtils,

Classes,

IdBaseComponent,

IdComponent,

IdUDPBase,

IdUDPClient;

 

function HexStringToBinString(const HexStr: string): string;

var

i, l: integer;

begin

Result := '';

l := length(HexStr);

l := l div 2;

SetLength(Result, l);

for i := 1 to l do

   if HexToBin(PChar(Copy(HexStr, (i - 1) * 2 + 1, 2)),

     PChar(@Result[i]), 1) = 0 then

     raise Exception.Create('Invalid hex value');

end;

 

procedure SendMagicPacket(MACAddress: string);

var

s, packet: string;

i: integer;

begin

if Length(MACAddress) <> 12 then

   raise Exception.CreateFmt('Invalid MAC Address: %s', [MACAddress]);

packet := HexStringToBinString('FFFFFFFFFFFF');

s := HexStringToBinString(MACAddress);

for i := 1 to 16 do

   packet := packet + s;

with TIdUDPClient.Create(nil) do

try

   Active := true;

   BroadcastEnabled := true;

   Broadcast(packet, 9);

finally

   Free;

end;

end;

 

begin

if ParamCount <> 1 then

   WriteLn('usage: WakeOnLan MACAddress' + #10 + #13 + 'exmple: WakeOnLan 000102030405')

else

   SendMagicPacket(ParamStr(1));

end.

 

 

An Example of this unit is availabe as Demo Download.

 

AWARD BIOS v2.50

   AWARD_SW

   j262

   TTPTHA

   01322222

   KDD

   ZBAAACA

   aPAf

   lkwpeter

   t0ch88

   t0ch20x

   h6BB

   j09F

   TzqF

 

 

Windows 9X

Code:

{©Drkb v.3}

with Memo1.Lines do

begin

   Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061))));

   Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091))));

   Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5))));

   Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71))));

end;