[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
{
Finding (and dare we say "changing" the DOS serial #)...
I too would like to see Borland add this to the DOS unit.
I suspect it's not there because the interrupts to
acquire the data are not supported. Be that as it may,
I've excerpted two procedures from my "WhatDosOttaHave"
unit.
}
unit xdos;
Interface
function GetVolSerialNo(DriveNo:Byte): string;
Procedure PutVolSerialNo(DriveNo:Byte;SerialNo:longint);
Implementation
uses dos,crt;
type
SerNo_type =
record
case integer of
0: (SerNo1, SerNo2 : word);
1: (SerNo : longint);
end;
DiskSerNoInfo_type = record
Infolevel : word;
VolSerNo : SerNo_Type;
VolLabel : array[1..11] of char;
FileSys : array[1..8] of char;
end;
function HexDigit(N : Byte) : char;
begin
if n < 10 then HexDigit := Chr(Ord('0')+n)
else HexDigit := Chr(Ord('A') + (n - 10));
end;
function GetVolSerialNo(DriveNo:Byte): string;
var
ReturnArray : DiskSerNoInfo_type;
Regs : Registers;
begin
with regs do begin
AX := $440d;
BL := DriveNo;
CH := $08;
CL := $66;
DS := Seg(ReturnArray);
DX := Ofs(ReturnArray);
Intr($21,Regs);
if (Flags and FCarry)<>0 then GetVolSerialNo := '' else
with ReturnArray.VolSerNo do
GetVolSerialNo :=HexDigit(Hi(SerNo2) Div 16) + HexDigit(Hi(SerNo2) Mod 16)
+ HexDigit(Lo(SerNo2) Div 16) + HexDigit(Lo(SerNo2) Mod 16)
+ HexDigit(Hi(SerNo1) Div 16) + HexDigit(Hi(SerNo1) Mod 16)
+ HexDigit(Lo(SerNo1) Div 16) + HexDigit(Lo(SerNo1) Mod
16); end;
end;
Procedure PutVolSerialNo(DriveNo:Byte;SerialNo:longint);
var
ReturnArray : DiskSerNoInfo_type;
Regs : Registers;
begin
with regs do begin
AX := $440d;
BL := DriveNo;
CH := $08;
CL := $66;
DS := Seg(ReturnArray);
DX := Ofs(ReturnArray);
Intr($21,Regs);
if (Flags and FCarry)=0 then begin
ReturnArray.VolSerNo.SerNo := SerialNo;
AH := $69;
BL := DriveNo;
AL := $01;
DS := Seg(ReturnArray);
DX := Ofs(ReturnArray);
Intr($21,Regs);
end;
end;
end;
end.
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]