Contributor: JIMISOLA LAURSEN         

{
jimisola.laursen@cindy.ct.se (jimisola laursen)

> Anybody know how to read the Volume Serial Number from a (hard) disk??
> No problem getting the Volume Label, but this seemsa to be another matter...
}

Unit Serial;

Interface

Uses
  Dos;

Function Get_Serial_number(Drive : Byte) : String;

Implementation

Asm
  mov  ax, w
  mov  bx, b
  xor  cx, cx
  les  di, @result
  xor  si, si
  jcxz @@@20
 @@@10:
  xor  dx, dx
  div  bx
  cmp  dl, 10
  jb   @h10
  add  dl, 'A'-10
  jmp  @h20
 @h10:
   or  dl, '0'
 @h20:
  push dx
  inc  si
  loop @@@10
 @@@20:
  inc  cx
  or   ax, ax
  jnz  @@@10
  mov  cx, si
  jcxz @@@40
  cld
  mov  al, cl
  stosb
 @@@30:
  pop  ax
  stosb
  loop @@@30
 @@@40:
end;

Function Get_Serial_number(Drive : Byte) : String;
(* "Drive" is 0=current, 1=A:, 2=B: osv.. *)
Type
  Disk_info = Record
    RES     : Word;                 (* reserverad ska Vara 0 *)
    SER_NR1 : Word;                 (* Serinummer (bin{rt) *)
    SER_NR2 : Word;                 (* Serinummer (bin{rt) *)
    VOL     : Array [1..11] of Char;(* Volume Label *)
    TYP     : Array [1..8] of Char; (* tex 'FAT12' eller 'FAT16' *)
  end;
Var
   D_I    : Disk_Info;
   s1, s2 : String[5];
begin
  Asm
    push ds
    mov ax,ss
    mov ds,ax
    lea dx,D_I
    mov bl,drive
    mov ax,6900h
    int 21h
    pop ds
  end;
  s1 := NumAscii(D_I.SER_NR2, 16);
  s2 := NumAscii(D_I.SER_NR1, 16);
  While length(s1) < 4 do
    s1 := '0' + s1;
  While length(s2) < 4 do
    s2 := '0' + s2;
  Get_Serial_number := s1 + '-' + s2;
end;

end.