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.