Советы по Delphi


Серийный номер диска


Вот модуль Delphi, который читает эту информацию. Чтобы записать ее, необходимо перез вызовом прерывания изменить значение AX на $6901 и заполнить буфер вашими значениями. Требуется DOS 4.00+.

    unit Sernumu;

interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;


type
TMediaID = Record InfoLevel : Word; SerialNumber : LongInt; VolumeLabel : Array[0..10] of Char; SysName : Array[0..7] of Char; End; TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } MediaID : TMediaID; public { Public declarations } end;
var
Form1: TForm1;
implementation

{$R *.DFM}

type
DPMIRegisters = record DI : LongInt; SI : LongInt; BP : LongInt; Reserved : LongInt; BX : LongInt; DX : LongInt; CX : LongInt; AX : LongInt; Flags : Word; ES : Word; DS : Word; FS : Word; GS : Word; IP : Word; CS : Word; SP : Word; SS : Word; end;

function RealIntr(IntNo : Byte; var Regs : DPMIRegisters) : Word; Assembler; asm xor     bx,bx mov     bl,IntNo xor     cx,cx        {StackWords = 0} les     di,Regs mov     ax,0300h int     31h jc      @@ExitPoint xor     ax,ax @@ExitPoint: end;

function GetDiskInfo(Drive : Word; var MediaID : TMediaID) : Boolean;
type
tLong = Record LoWord, HiWord : Word; End; var
Regs : DPMIRegisters; dwAddress : LongInt; Address : tLong absolute dwAddress; begin
Result := False; FillChar(MediaID, SizeOf(MediaID), 0); dwAddress := GlobalDosAlloc(SizeOf(MediaID)); { два параграфа памяти DOS } if dwAddress = 0 then            { в случае ошибки адрес будет нулевым } exit;
With Regs do begin bx := Drive; cx := $66; ds := Address.HiWord; ax := $6900; dx := 0; es := 0; flags := 0; end; If RealIntr($21, Regs) <> 0 Then Exit; Move(ptr(Address.LoWord, 0)^, MediaID, SizeOf(MediaID)); GlobalDosFree(Address.LoWord)     { освобождаем блок DOS памяти } Result := True; end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetDiskInfo(1, MediaID); With MediaID do Begin Label1.Caption := IntToHex(SerialNumber, 8); Label2.Caption := VolumeLabel; Label3.Caption := SysName; End; end;

end.

[001955]



Содержание раздела