UNIT FCBLabel; {Turbo Pascal unit for manipulating volume labels} INTERFACE USES DOS; TYPE DriveType = String[1]; DiskIDType = String[11]; FUNCTION GetDiskID(Drive:DriveType): DiskIDType; FUNCTION SetDiskID(Drive:DriveType; DiskID:DiskIDType): Boolean; FUNCTION ReNameDiskID(Drive:DriveType; OldDiskID:DiskIDType; NewDiskID:DiskIDType): Boolean; FUNCTION DeleteDiskID(Drive:DriveType): Boolean; IMPLEMENTATION TYPE ExtendedFCBRecord = RECORD ExtFCB : Byte; Res1 : ARRAY[1..5] OF Byte; Attr : Byte; Drive : Byte; Name1 : ARRAY[1..11] OF Char; Unused1: ARRAY[1..5] OF Char; Name2 : ARRAY[1..11] OF Char; Unused2: ARRAY[1..9] OF Byte; END; FUNCTION GetDiskID(Drive:DriveType): DiskIDType; VAR DirInfo : SearchRec; DirDiskID : String[12]; I,PosPeriod : Byte; BEGIN FindFirst(Drive+':\'+'*.*',VolumeID,DirInfo); IF DosError = 0 THEN BEGIN DirDiskID := DirInfo.Name; PosPeriod := POS('.',DirDiskID); IF PosPeriod > 0 THEN Delete(DirDiskID,PosPeriod,1); GetDiskID := DirDiskID END ELSE GetDiskID := '' END; {Use MsDos service 16H to SET a volume label } FUNCTION SetDiskID(Drive:DriveType; DiskID:DiskIDType): Boolean; VAR FCB : ExtendedFCBRecord; Regs : Registers; Temp : String[1]; I : Integer; BEGIN Temp := Drive; WITH FCB DO BEGIN ExtFCB := $FF; Attr := $8; Drive := Ord(UpCase(Temp[1])) - 64; FOR I := 1 TO Length(DiskID) DO Name1[I] := DiskID[I]; IF Length(DiskID) < 11 THEN FOR I := (Length(DiskID) + 1) TO 11 DO Name1[I] := ' ' END; Regs.ah := $16; Regs.ds := Seg(FCB); Regs.dx := Ofs(FCB); MsDos(Regs); IF Regs.AL = 0 THEN SetDiskID := TRUE ELSE SetDiskID := FALSE END; {use MsDOS service 17H to RENAME a volume label } FUNCTION ReNameDiskID(Drive:DriveType; OldDiskID:DiskIDType ; NewDiskID:DiskIDType): Boolean; VAR FCB : ExtendedFCBRecord; Regs : Registers; Temp : String[1]; I : Integer; BEGIN Temp := Drive; WITH FCB DO BEGIN ExtFCB := $FF; Attr := $8; Drive := Ord(UpCase(Temp[1])) - 64; {Set old disk id} FOR I := 1 TO Length(OldDiskID) DO Name1[I] := OldDiskID[I]; FOR I := (Length(OldDiskID) + 1) TO 11 DO Name1[I] := ' '; {Set new disk id} FOR I := 1 TO Length(NewDiskID) DO Name2[I] := NewDiskID[I]; FOR I := (Length(NewDiskID) + 1) TO 11 DO Name2[I] := ' ' END; Regs.ah := $17; Regs.ds := Seg(FCB); Regs.dx := Ofs(FCB); MsDos(Regs); IF Regs.AL = 0 THEN ReNameDiskID := TRUE ELSE ReNameDiskID := FALSE END; {Use MsDos service 13H DELETE a volume label } FUNCTION DeleteDiskID(Drive:DriveType): Boolean; VAR FCB : ExtendedFCBRecord; Regs : Registers; Temp : String[1]; I : Integer; BEGIN Temp := Drive; WITH FCB DO BEGIN ExtFCB := $FF; Attr := $8; Drive := Ord(UpCase(Temp[1])) - 64; Name1[1] := '*'; Name1[2] := '.'; Name1[3] := '*'; FOR I := 4 TO 11 DO Name1[I] := ' ' END; Regs.ah := $13; Regs.ds := Seg(FCB); Regs.dx := Ofs(FCB); MsDos(Regs); IF Regs.AL = 0 THEN DeleteDiskID := TRUE ELSE DeleteDiskID := FALSE END; END. { --------------- TEST PROGRAM -------------------} PROGRAM TestFCB; { test FCBLabel UNIT} USES CRT,FCBLabel; VAR Choice : Byte; Drive : DriveType; DiskID : DiskIDType; NewDiskID : DiskIDType; BEGIN REPEAT {Endless loop - select option 5 to Exit} ClrScr; GotoXY(25,1); WriteLn('Volume Functions'); GotoXY(25,9); WriteLn('1) SET LABEL'); GotoXY(25,10); WriteLn('2) DELETE LABEL'); GotoXY(25,11); WriteLn('3) RENAME LABEL'); GotoXY(25,12); WriteLn('4) GET LABEL'); GotoXY(25,13); WriteLn('5) Exit'); GotoXY(20,15); Write('Type number and press Enter > '); ReadLn(Choice); WriteLn; Drive := 'C'; { use drive C: as test drive } CASE Choice OF 1: BEGIN {Set volume LABEL} DiskID := GetDiskID(Drive); IF DiskID <> '' THEN BEGIN WriteLn('Label not null: ',DiskID); WriteLn('Use RENAME instead'); WriteLn('Press Enter to continue'); ReadLn END ELSE BEGIN Write('Enter new label > '); ReadLn(DiskID); IF NOT SetDiskID(Drive,DiskID) THEN BEGIN WriteLn('System Error'); WriteLn ('Press Enter to continue'); ReadLn END END END; 2: BEGIN {Delete Volume LABEL} IF DeleteDiskID(Drive) THEN WriteLn('Volume label deleted') ELSE WriteLn('System Error'); WriteLn('Press Enter to continue'); ReadLn END; 3: BEGIN {Rename Volume LABEL} DiskID := GetDiskID(Drive); IF DiskID = '' THEN BEGIN WriteLn('Current label is null:'); WriteLn('Use SET option instead'); WriteLn('Press Enter to continue'); ReadLn END ELSE BEGIN Write('Enter new name of label > '); ReadLn(NewDiskID); IF NOT ReNameDiskID (Drive,DiskID,NewDiskID) THEN BEGIN WriteLn('System Error'); WriteLn ('Press Enter to continue'); ReadLn END END END; 4: BEGIN {Get Volume LABEL} DiskID := GetDiskID(Drive); Write('The current label is '); IF DiskID = '' THEN WriteLn('null') ELSE WriteLn(DiskID); WriteLn('Press Enter to continue'); ReadLn END; 5: Halt; ELSE { continue } END { case } UNTIL FALSE END.