Contributor: SWAG SUPPORT TEAM { > I need a way to find the volume Label of a drive. Any suggestions or > source code? } {$S-,R-,V-,I-,N-,B-,F-} Unit Volume; Interface Uses Dos; Type Drive = Byte; VolumeName = String [11]; VolFCB = Record FCB_Flag : Byte; Reserved : Array [1..5] of Byte; FileAttr : Byte; Drive_ID : Byte; FileName : Array [1..8] of Byte; File_Ext : Array [1..3] of Byte; Unused_A : Array [1..5] of Byte; File_New : Array [1..8] of Byte; fExt_New : Array [1..3] of Byte; Unused_B : Array [1..9] of Byte end; Function DelVol (D : Byte) : Boolean; Function AddVol (D : Byte; V : VolumeName) : Boolean; Function ChgVol (D : Byte; V : VolumeName) : Boolean; Function GetVol (D : Byte) : VolumeName; Implementation Procedure Pad_Name (Var V : VolumeName); begin While LENGTH (V) <> 11 DO V := V + ' ' end; Function Fix_Ext_Sym (Var V : VolumeName) : Byte; Var I : Byte; begin I := POS ('.', V); if I > 0 then DELETE (V, I, 1); Fix_Ext_Sym := I end; Function Extract_Name (S : SearchRec) : VolumeName; Var H, I : Byte; begin I := Fix_Ext_Sym (S.Name); if (I > 0) and (I < 9) then For H := 1 to (9 - I) DO INSERT (' ', S.Name, I); Extract_Name := S.Name end; Procedure Fix_Name (Var V : VolumeName); Var I : Byte; begin Pad_Name (V); For I := 1 to 11 do V [I] := UPCASE (V [I]) end; Function Valid_Drive_Num (D : Byte) : Boolean; begin Valid_Drive_Num := (D >= 1) and (D <= 26) end; Function Find_Vol (D : Byte; Var S : SearchRec) : Boolean; begin FINDFIRST (CHR (D + 64) + ':\*.*', VolumeID, S); Find_Vol := DosError = 0 end; Procedure Fix_FCB_NewFile (V : VolumeName; Var FCB : VolFCB); Var I : Byte; begin For I := 1 to 8 DO FCB.File_New [I] := ORD (V [I]); For I := 1 to 3 DO FCB.fExt_New [I] := ORD (V [I + 8]) end; Procedure Fix_FCB_FileName (V : VolumeName; Var FCB : VolFCB); Var I : Byte; begin For I := 1 to 8 DO FCB.FileName [I] := ORD (V [I]); For I := 1 to 3 DO FCB.File_Ext [I] := ORD (V [I + 8]) end; Function Vol_Int21 (Fnxn : Word; D : Drive; Var FCB : VolFCB) : Boolean; Var Regs : Registers; begin FCB.Drive_ID := D; FCB.FCB_Flag := $FF; FCB.FileAttr := $08; Regs.DS := SEG (FCB); Regs.DX := OFS (FCB); Regs.AX := Fnxn; MSDos (Regs); Vol_Int21 := Regs.AL = 0 end; Function DelVol (D : Byte) : Boolean; Var sRec : SearchRec; FCB : VolFCB; V : VolumeName; begin DelVol := False; if Valid_Drive_Num (D) then begin if Find_Vol (D, sRec) then begin V := Extract_Name (sRec); Pad_Name (V); Fix_FCB_FileName (V, FCB); DelVol := Vol_Int21 ($1300, D, FCB) end end end; Function AddVol (D : Byte; V : VolumeName) : Boolean; Var sRec : SearchRec; FCB : VolFCB; begin AddVol := False; if Valid_Drive_Num (D) then begin if not Find_Vol (D, sRec) then begin Fix_Name (V); Fix_FCB_FileName (V, FCB); AddVol := Vol_Int21 ($1600, D, FCB) end end end; Function ChgVol (D : Byte; V : VolumeName) : Boolean; Var sRec : SearchRec; FCB : VolFCB; x : Byte; begin ChgVol := False; if Valid_Drive_Num (D) then begin if Find_Vol (D, sRec) then begin x := Fix_Ext_Sym (V); Fix_Name (V); Fix_FCB_NewFile (V, FCB); V := Extract_Name (sRec); Pad_Name (V); Fix_FCB_FileName (V, FCB); ChgVol := Vol_Int21 ($1700, D, FCB) end end end; Function GetVol (D : Byte) : VolumeName; Var sRec : SearchRec; begin GetVol := ''; if Valid_Drive_Num (D) then if Find_Vol (D, sRec) then GetVol := Extract_Name (sRec) end; end.