; /sl/utl/volid/volid.asm - Set the C drive serial number
;
; Use DOS function "Get Media ID", 440Dh, minor 66h to read volume 
; information and use DOS function "Set Media ID", 440Dh, minor 46h 
; to write volume info back to disk with a modified serial number.
;
; This x86 program runs under DOS and Windows 95 in DOS mode.  It is untested on
; win98 and will not work under NT or much of anything else.
;
; Ref: Microsoft MS-DOS Programmer's Reference, Version 5, ISBN 1-55615-329-5
; Pages 314, 319
;
; D. Edwards <david@dee-engineering.com>  6/11/2000 5:27PM
;
; :set ts=8
      
   DOSSEG

   include      z:\sl\dosasm\struc500.inc
   
   .MODEL SMALL
   .STACK 100h
   
   .DATA
MediaID MID     <>   
str1 DB 'INVALID FUNCTION',13,10,'$'
str2 DB 'FILE NOT FOUND',13,10,'$'
str3 DB 'ACCESS DENIED',13,10,'$'

   .CODE
   mov  ax,@data
   mov  ds,ax                           ;Set DS to point to the data segment
        
   ; Get Disk Volume information        
   ; 0=def, 1=A, 3=C, 4=D, 5=E, 6=F, 7=G, 8=H, 9=I, 10=J        
   mov  bx,3                            ;Set drive number
   mov  ch,08h                          ;Device category (always 08h)
   mov  cl,66h                          ;Get Media ID minor code
   mov  dx,OFFSET MediaID               ;DS:DX points to MID struc
   mov  ax,440Dh                        ;IOCTL for block devices
   int  21h                             ;Fill the MID struc

; Modify the volume ID in the MID structure and write it out to disk
   mov  si,OFFSET MediaID.midSerialNum  ;Point to the DWord result
   mov  [si],15F1h                      ;Bultaco VolID LSW
   mov  [si+2],096Bh                    ;Bultaco VolID MSW

   mov  bx,3                            ;Set drive number
   mov  ch,08h                          ;Device category (always 08h)
   mov  cl,46h                          ;Get Media ID minor code
   mov  dx,OFFSET MediaID               ;DS:DX points to MID struc
   mov  ax,440Dh                        ;IOCTL for block devices
   int  21h                             ;Write the MID struc out to disk
   
   jnc  ok                              ;Carry flag is set on error
   mov  ah,9                            ;DOS print string function
   mov  dx,OFFSET str3                  ;point to str3
   int  21h                             ;display str3
   
ok:  
 ; All done, exit  
   mov  ah,4ch                          ;DOS terminate program function
   int  21h                             ;terminate the program
   END