diff --git a/rtl/go32v2/dos.pp b/rtl/go32v2/dos.pp index 75bb6feeb4..0b979a9c1f 100644 --- a/rtl/go32v2/dos.pp +++ b/rtl/go32v2/dos.pp @@ -342,40 +342,8 @@ function do_diskdata(drive : byte; Free : BOOLEAN) : Int64; VAR S : String; Rec : ExtendedFat32FreeSpaceRec; -BEGIN - if {(swap(dosversion)>=$070A) AND} LFNSupport then - begin - S:='C:\'#0; - if Drive=0 then - begin - GetDir(Drive,S); - Setlength(S,4); - S[4]:=#0; - end - else - S[1]:=chr(Drive+64); - Rec.Strucversion:=0; - dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); - dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); - dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; - dosregs.ds:=tb_segment; - dosregs.di:=tb_offset; - dosregs.es:=tb_segment; - dosregs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); - dosregs.ax:=$7303; - msdos(dosregs); - if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf} - begin - copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); - if Free then - Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec - else - Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; - end - else - Do_DiskData:=-1; - end - else + + procedure OldDosDiskData; inline; begin dosregs.dl:=drive; dosregs.ah:=$36; @@ -390,6 +358,46 @@ BEGIN else do_diskdata:=-1; end; + +BEGIN + if LFNSupport then + begin + S:='C:\'#0; + if Drive=0 then + begin + GetDir(Drive,S); + Setlength(S,4); + S[4]:=#0; + end + else + S[1]:=chr(Drive+64); + Rec.Strucversion:=0; + Rec.RetSize := 0; + dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); + dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); + dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; + dosregs.ds:=tb_segment; + dosregs.di:=tb_offset; + dosregs.es:=tb_segment; + dosregs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); + dosregs.ax:=$7303; + msdos(dosregs); + if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf} + begin + copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); + if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *) + OldDosDiskData + else + if Free then + Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec + else + Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; + end + else + Do_DiskData:=-1; + end + else + OldDosDiskData; end; function diskfree(drive : byte) : int64; diff --git a/rtl/go32v2/sysutils.pp b/rtl/go32v2/sysutils.pp index cd047a0e7e..14c884454e 100644 --- a/rtl/go32v2/sysutils.pp +++ b/rtl/go32v2/sysutils.pp @@ -502,43 +502,9 @@ function do_diskdata(drive : byte; Free : BOOLEAN) : Int64; VAR S : String; Rec : ExtendedFat32FreeSpaceRec; regs : registers; -BEGIN - if {(swap(dosversion)>=$070A) AND} LFNSupport then + + procedure OldDosDiskData; begin - DosError:=0; - S:='C:\'#0; - if Drive=0 then - begin - GetDir(Drive,S); - Setlength(S,4); - S[4]:=#0; - end - else - S[1]:=chr(Drive+64); - Rec.Strucversion:=0; - dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); - dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); - regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; - regs.ds:=tb_segment; - regs.di:=tb_offset; - regs.es:=tb_segment; - regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); - regs.ax:=$7303; - msdos(regs); - if regs.ax<>$ffff then - begin - copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); - if Free then - Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec - else - Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; - end - else - Do_DiskData:=-1; - end - else - begin - DosError:=0; regs.dl:=drive; regs.ah:=$36; msdos(regs); @@ -552,6 +518,46 @@ BEGIN else do_diskdata:=-1; end; + +BEGIN + if LFNSupport then + begin + S:='C:\'#0; + if Drive=0 then + begin + GetDir(Drive,S); + Setlength(S,4); + S[4]:=#0; + end + else + S[1]:=chr(Drive+64); + Rec.Strucversion:=0; + Rec.RetSize := 0; + dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); + dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); + regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; + regs.ds:=tb_segment; + regs.di:=tb_offset; + regs.es:=tb_segment; + regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); + regs.ax:=$7303; + msdos(regs); + if (regs.flags and fcarry) = 0 then {No error clausule in int except cf} + begin + copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); + if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *) + OldDosDiskData + else + if Free then + Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec + else + Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; + end + else + Do_DiskData:=-1; + end + else + OldDosDiskData; end; diff --git a/rtl/watcom/dos.pp b/rtl/watcom/dos.pp index 9581c1feb8..1088441d10 100644 --- a/rtl/watcom/dos.pp +++ b/rtl/watcom/dos.pp @@ -332,44 +332,13 @@ TYPE ExtendedFat32FreeSpaceRec=packed Record Dummy,Dummy2 : DWORD; {8 bytes reserved} END; + function do_diskdata(drive : byte; Free : BOOLEAN) : Int64; VAR S : String; Rec : ExtendedFat32FreeSpaceRec; -BEGIN - if {(swap(dosversion)>=$070A)} AND LFNSupport then - begin - S:='C:\'#0; - if Drive=0 then - begin - GetDir(Drive,S); - Setlength(S,4); - S[4]:=#0; - end - else - S[1]:=chr(Drive+64); - Rec.Strucversion:=0; - dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); - dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); - dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; - dosregs.ds:=tb_segment; - dosregs.di:=tb_offset; - dosregs.es:=tb_segment; - dosregs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); - dosregs.ax:=$7303; - msdos(dosregs); - if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf} - begin - copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); - if Free then - Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec - else - Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; - end - else - Do_DiskData:=-1; - end - else + + procedure OldDosDiskData; inline; begin dosregs.dl:=drive; dosregs.ah:=$36; @@ -384,8 +353,49 @@ BEGIN else do_diskdata:=-1; end; + +BEGIN + if LFNSupport then + begin + S:='C:\'#0; + if Drive=0 then + begin + GetDir(Drive,S); + Setlength(S,4); + S[4]:=#0; + end + else + S[1]:=chr(Drive+64); + Rec.Strucversion:=0; + Rec.RetSize := 0; + dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); + dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); + dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; + dosregs.ds:=tb_segment; + dosregs.di:=tb_offset; + dosregs.es:=tb_segment; + dosregs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); + dosregs.ax:=$7303; + msdos(dosregs); + if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf} + begin + copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); + if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *) + OldDosDiskData + else + if Free then + Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec + else + Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; + end + else + Do_DiskData:=-1; + end + else + OldDosDiskData; end; + function diskfree(drive : byte) : int64; begin diskfree:=Do_DiskData(drive,TRUE); diff --git a/rtl/watcom/sysutils.pp b/rtl/watcom/sysutils.pp index 6b1d7fe85f..cfb06b62c2 100644 --- a/rtl/watcom/sysutils.pp +++ b/rtl/watcom/sysutils.pp @@ -503,47 +503,14 @@ TYPE ExtendedFat32FreeSpaceRec=packed Record Dummy,Dummy2 : DWORD; {8 bytes reserved} END; + function do_diskdata(drive : byte; Free : BOOLEAN) : Int64; VAR S : String; Rec : ExtendedFat32FreeSpaceRec; regs : registers; -BEGIN - if {(swap(dosversion)>=$070A)} AND LFNSupport then + + procedure OldDosDiskData; begin - DosError:=0; - S:='C:\'#0; - if Drive=0 then - begin - GetDir(Drive,S); - Setlength(S,4); - S[4]:=#0; - end - else - S[1]:=chr(Drive+64); - Rec.Strucversion:=0; - dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); - dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); - regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; - regs.ds:=tb_segment; - regs.di:=tb_offset; - regs.es:=tb_segment; - regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); - regs.ax:=$7303; - msdos(regs); - if regs.ax<>$ffff then - begin - copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); - if Free then - Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec - else - Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; - end - else - Do_DiskData:=-1; - end - else - begin - DosError:=0; regs.dl:=drive; regs.ah:=$36; msdos(regs); @@ -557,9 +524,50 @@ BEGIN else do_diskdata:=-1; end; + +BEGIN + if LFNSupport then + begin + S:='C:\'#0; + if Drive=0 then + begin + GetDir(Drive,S); + Setlength(S,4); + S[4]:=#0; + end + else + S[1]:=chr(Drive+64); + Rec.Strucversion:=0; + Rec.RetSize := 0; + dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec)); + dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4); + regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1; + regs.ds:=tb_segment; + regs.di:=tb_offset; + regs.es:=tb_segment; + regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec); + regs.ax:=$7303; + msdos(regs); + if (regs.flags and fcarry) = 0 then {No error clausule in int except cf} + begin + copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec)); + if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *) + OldDosDiskData + else + if Free then + Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec + else + Do_DiskData:=int64(rec.TotalAllocUnits)*rec.SecPerClus*rec.BytePerSec; + end + else + Do_DiskData:=-1; + end + else + OldDosDiskData; end; + function diskfree(drive : byte) : int64; begin diskfree:=Do_DiskData(drive,TRUE);