Вот модуль 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]