; /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 <dee.engineering@usa.net>  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
