Browse Source

* yet another fix for DiskFree/DiskSize

git-svn-id: trunk@8516 -
Tomas Hajny 18 years ago
parent
commit
f0959c1b1d
4 changed files with 102 additions and 70 deletions
  1. 24 16
      rtl/go32v2/dos.pp
  2. 25 19
      rtl/go32v2/sysutils.pp
  3. 26 16
      rtl/watcom/dos.pp
  4. 27 19
      rtl/watcom/sysutils.pp

+ 24 - 16
rtl/go32v2/dos.pp

@@ -342,8 +342,25 @@ function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR
 VAR
   S    : String;
   S    : String;
   Rec  : ExtendedFat32FreeSpaceRec;
   Rec  : ExtendedFat32FreeSpaceRec;
+
+  procedure OldDosDiskData; inline;
+  begin
+   dosregs.dl:=drive;
+   dosregs.ah:=$36;
+   msdos(dosregs);
+   if dosregs.ax<>$FFFF then
+    begin
+     if Free then
+      Do_DiskData:=int64(dosregs.ax)*dosregs.bx*dosregs.cx
+     else
+      Do_DiskData:=int64(dosregs.ax)*dosregs.cx*dosregs.dx;
+    end
+   else
+    do_diskdata:=-1;
+  end;
+
 BEGIN
 BEGIN
- if {(swap(dosversion)>=$070A) AND} LFNSupport then
+ if LFNSupport then
   begin
   begin
    S:='C:\'#0;
    S:='C:\'#0;
    if Drive=0 then
    if Drive=0 then
@@ -355,6 +372,7 @@ BEGIN
    else
    else
     S[1]:=chr(Drive+64);
     S[1]:=chr(Drive+64);
    Rec.Strucversion:=0;
    Rec.Strucversion:=0;
+   Rec.RetSize := 0;
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
    dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
@@ -366,7 +384,10 @@ BEGIN
    msdos(dosregs);
    msdos(dosregs);
    if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf}
    if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *)
+      OldDosDiskData
+     else
       if Free then
       if Free then
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
       else
       else
@@ -376,20 +397,7 @@ BEGIN
     Do_DiskData:=-1;
     Do_DiskData:=-1;
   end
   end
  else
  else
-  begin
-   dosregs.dl:=drive;
-   dosregs.ah:=$36;
-   msdos(dosregs);
-   if dosregs.ax<>$FFFF then
-    begin
-     if Free then
-      Do_DiskData:=int64(dosregs.ax)*dosregs.bx*dosregs.cx
-     else
-      Do_DiskData:=int64(dosregs.ax)*dosregs.cx*dosregs.dx;
-    end
-   else
-    do_diskdata:=-1;
-  end;
+  OldDosDiskData;
 end;
 end;
 
 
 function diskfree(drive : byte) : int64;
 function diskfree(drive : byte) : int64;

+ 25 - 19
rtl/go32v2/sysutils.pp

@@ -502,10 +502,26 @@ function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR S    : String;
 VAR S    : String;
     Rec  : ExtendedFat32FreeSpaceRec;
     Rec  : ExtendedFat32FreeSpaceRec;
     regs : registers;
     regs : registers;
+
+  procedure OldDosDiskData;
+  begin
+   regs.dl:=drive;
+   regs.ah:=$36;
+   msdos(regs);
+   if regs.ax<>$FFFF then
+    begin
+     if Free then
+      Do_DiskData:=int64(regs.ax)*regs.bx*regs.cx
+     else
+      Do_DiskData:=int64(regs.ax)*regs.cx*regs.dx;
+    end
+   else
+    do_diskdata:=-1;
+  end;
+
 BEGIN
 BEGIN
- if {(swap(dosversion)>=$070A) AND} LFNSupport then
+ if LFNSupport then
   begin
   begin
-   DosError:=0;
    S:='C:\'#0;
    S:='C:\'#0;
    if Drive=0 then
    if Drive=0 then
     begin
     begin
@@ -516,6 +532,7 @@ BEGIN
    else
    else
     S[1]:=chr(Drive+64);
     S[1]:=chr(Drive+64);
    Rec.Strucversion:=0;
    Rec.Strucversion:=0;
+   Rec.RetSize := 0;
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
    regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
@@ -525,9 +542,12 @@ BEGIN
    regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
    regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
    regs.ax:=$7303;
    regs.ax:=$7303;
    msdos(regs);
    msdos(regs);
-   if regs.ax<>$ffff then
+   if (regs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *)
+      OldDosDiskData
+     else
       if Free then
       if Free then
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
       else
       else
@@ -537,21 +557,7 @@ BEGIN
     Do_DiskData:=-1;
     Do_DiskData:=-1;
   end
   end
  else
  else
-  begin
-   DosError:=0;
-   regs.dl:=drive;
-   regs.ah:=$36;
-   msdos(regs);
-   if regs.ax<>$FFFF then
-    begin
-     if Free then
-      Do_DiskData:=int64(regs.ax)*regs.bx*regs.cx
-     else
-      Do_DiskData:=int64(regs.ax)*regs.cx*regs.dx;
-    end
-   else
-    do_diskdata:=-1;
-  end;
+  OldDosDiskData;
 end;
 end;
 
 
 
 

+ 26 - 16
rtl/watcom/dos.pp

@@ -332,12 +332,30 @@ TYPE  ExtendedFat32FreeSpaceRec=packed Record
          Dummy,Dummy2    : DWORD;  {8 bytes reserved}
          Dummy,Dummy2    : DWORD;  {8 bytes reserved}
          END;
          END;
 
 
+
 function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR
 VAR
   S    : String;
   S    : String;
   Rec  : ExtendedFat32FreeSpaceRec;
   Rec  : ExtendedFat32FreeSpaceRec;
+
+  procedure OldDosDiskData; inline;
+  begin
+   dosregs.dl:=drive;
+   dosregs.ah:=$36;
+   msdos(dosregs);
+   if dosregs.ax<>$FFFF then
+    begin
+     if Free then
+      Do_DiskData:=int64(dosregs.ax)*dosregs.bx*dosregs.cx
+     else
+      Do_DiskData:=int64(dosregs.ax)*dosregs.cx*dosregs.dx;
+    end
+   else
+    do_diskdata:=-1;
+  end;
+
 BEGIN
 BEGIN
- if {(swap(dosversion)>=$070A)} AND LFNSupport then
+ if LFNSupport then
   begin
   begin
    S:='C:\'#0;
    S:='C:\'#0;
    if Drive=0 then
    if Drive=0 then
@@ -349,6 +367,7 @@ BEGIN
    else
    else
     S[1]:=chr(Drive+64);
     S[1]:=chr(Drive+64);
    Rec.Strucversion:=0;
    Rec.Strucversion:=0;
+   Rec.RetSize := 0;
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
    dosregs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
@@ -360,7 +379,10 @@ BEGIN
    msdos(dosregs);
    msdos(dosregs);
    if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf}
    if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *)
+      OldDosDiskData
+     else
       if Free then
       if Free then
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
       else
       else
@@ -370,22 +392,10 @@ BEGIN
     Do_DiskData:=-1;
     Do_DiskData:=-1;
   end
   end
  else
  else
-  begin
-   dosregs.dl:=drive;
-   dosregs.ah:=$36;
-   msdos(dosregs);
-   if dosregs.ax<>$FFFF then
-    begin
-     if Free then
-      Do_DiskData:=int64(dosregs.ax)*dosregs.bx*dosregs.cx
-     else
-      Do_DiskData:=int64(dosregs.ax)*dosregs.cx*dosregs.dx;
-    end
-   else
-    do_diskdata:=-1;
-  end;
+  OldDosDiskData;
 end;
 end;
 
 
+
 function diskfree(drive : byte) : int64;
 function diskfree(drive : byte) : int64;
 begin
 begin
    diskfree:=Do_DiskData(drive,TRUE);
    diskfree:=Do_DiskData(drive,TRUE);

+ 27 - 19
rtl/watcom/sysutils.pp

@@ -503,14 +503,31 @@ TYPE  ExtendedFat32FreeSpaceRec=packed Record
          Dummy,Dummy2    : DWORD;  {8 bytes reserved}
          Dummy,Dummy2    : DWORD;  {8 bytes reserved}
          END;
          END;
 
 
+
 function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR S    : String;
 VAR S    : String;
     Rec  : ExtendedFat32FreeSpaceRec;
     Rec  : ExtendedFat32FreeSpaceRec;
     regs : registers;
     regs : registers;
+
+  procedure OldDosDiskData;
+  begin
+   regs.dl:=drive;
+   regs.ah:=$36;
+   msdos(regs);
+   if regs.ax<>$FFFF then
+    begin
+     if Free then
+      Do_DiskData:=int64(regs.ax)*regs.bx*regs.cx
+     else
+      Do_DiskData:=int64(regs.ax)*regs.cx*regs.dx;
+    end
+   else
+    do_diskdata:=-1;
+  end;
+
 BEGIN
 BEGIN
- if {(swap(dosversion)>=$070A)} AND LFNSupport then
+ if LFNSupport then
   begin
   begin
-   DosError:=0;
    S:='C:\'#0;
    S:='C:\'#0;
    if Drive=0 then
    if Drive=0 then
     begin
     begin
@@ -521,6 +538,7 @@ BEGIN
    else
    else
     S[1]:=chr(Drive+64);
     S[1]:=chr(Drive+64);
    Rec.Strucversion:=0;
    Rec.Strucversion:=0;
+   Rec.RetSize := 0;
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset,Rec,SIZEOF(ExtendedFat32FreeSpaceRec));
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    dosmemput(tb_segment,tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1,S[1],4);
    regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
    regs.dx:=tb_offset+Sizeof(ExtendedFat32FreeSpaceRec)+1;
@@ -530,9 +548,12 @@ BEGIN
    regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
    regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
    regs.ax:=$7303;
    regs.ax:=$7303;
    msdos(regs);
    msdos(regs);
-   if regs.ax<>$ffff then
+   if (regs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     if Rec.RetSize = 0 then (* Error - "FAT32" function not supported! *)
+      OldDosDiskData
+     else
       if Free then
       if Free then
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
        Do_DiskData:=int64(rec.AvailAllocUnits)*rec.SecPerClus*rec.BytePerSec
       else
       else
@@ -542,24 +563,11 @@ BEGIN
     Do_DiskData:=-1;
     Do_DiskData:=-1;
   end
   end
  else
  else
-  begin
-   DosError:=0;
-   regs.dl:=drive;
-   regs.ah:=$36;
-   msdos(regs);
-   if regs.ax<>$FFFF then
-    begin
-     if Free then
-      Do_DiskData:=int64(regs.ax)*regs.bx*regs.cx
-     else
-      Do_DiskData:=int64(regs.ax)*regs.cx*regs.dx;
-    end
-   else
-    do_diskdata:=-1;
-  end;
+  OldDosDiskData;
 end;
 end;
 
 
 
 
+
 function diskfree(drive : byte) : int64;
 function diskfree(drive : byte) : int64;
 begin
 begin
    diskfree:=Do_DiskData(drive,TRUE);
    diskfree:=Do_DiskData(drive,TRUE);