Parcourir la source

Merged revisions 8461-8462,8469-8470,8472-8483,8486-8488,8490,8493,8496,8506,8516,8532 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r8461 | hajny | 2007-09-13 22:54:00 +0200 (Thu, 13 Sep 2007) | 1 line

* remove erratic / unreliable check for DOS version in Do_DiskData
........
r8516 | hajny | 2007-09-16 22:17:27 +0200 (Sun, 16 Sep 2007) | 1 line

* yet another fix for DiskFree/DiskSize
........
r8532 | hajny | 2007-09-17 23:19:12 +0200 (Mon, 17 Sep 2007) | 1 line

* inline on needed for 2.0.x
........

git-svn-id: branches/fixes_2_2@8998 -

peter il y a 18 ans
Parent
commit
dbb647e164
4 fichiers modifiés avec 114 ajouts et 70 suppressions
  1. 27 16
      rtl/go32v2/dos.pp
  2. 28 19
      rtl/go32v2/sysutils.pp
  3. 29 16
      rtl/watcom/dos.pp
  4. 30 19
      rtl/watcom/sysutils.pp

+ 27 - 16
rtl/go32v2/dos.pp

@@ -12,6 +12,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
+
+{$inline on}
+
 unit dos;
 
 interface
@@ -342,8 +345,25 @@ function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR
   S    : String;
   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
- if {(swap(dosversion)>=$070A) AND} LFNSupport then
+ if LFNSupport then
   begin
    S:='C:\'#0;
    if Drive=0 then
@@ -355,6 +375,7 @@ BEGIN
    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;
@@ -366,7 +387,10 @@ BEGIN
    msdos(dosregs);
    if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     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
@@ -376,20 +400,7 @@ BEGIN
     Do_DiskData:=-1;
   end
  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;
 
 function diskfree(drive : byte) : int64;

+ 28 - 19
rtl/go32v2/sysutils.pp

@@ -13,6 +13,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
+
+{$inline on}
+
 unit sysutils;
 interface
 
@@ -502,10 +505,26 @@ function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR S    : String;
     Rec  : ExtendedFat32FreeSpaceRec;
     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
- if (swap(dosversion)>=$070A) AND LFNSupport then
+ if LFNSupport then
   begin
-   DosError:=0;
    S:='C:\'#0;
    if Drive=0 then
     begin
@@ -516,6 +535,7 @@ BEGIN
    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;
@@ -525,9 +545,12 @@ BEGIN
    regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
    regs.ax:=$7303;
    msdos(regs);
-   if regs.ax<>$ffff then
+   if (regs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     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
@@ -537,21 +560,7 @@ BEGIN
     Do_DiskData:=-1;
   end
  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;
 
 

+ 29 - 16
rtl/watcom/dos.pp

@@ -12,6 +12,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
+
+{$inline on}
+
 unit dos;
 interface
 
@@ -332,12 +335,30 @@ TYPE  ExtendedFat32FreeSpaceRec=packed Record
          Dummy,Dummy2    : DWORD;  {8 bytes reserved}
          END;
 
+
 function do_diskdata(drive : byte; Free : BOOLEAN) : Int64;
 VAR
   S    : String;
   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
- if (swap(dosversion)>=$070A) AND LFNSupport then
+ if LFNSupport then
   begin
    S:='C:\'#0;
    if Drive=0 then
@@ -349,6 +370,7 @@ BEGIN
    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;
@@ -360,7 +382,10 @@ BEGIN
    msdos(dosregs);
    if (dosregs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     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
@@ -370,22 +395,10 @@ BEGIN
     Do_DiskData:=-1;
   end
  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;
 
+
 function diskfree(drive : byte) : int64;
 begin
    diskfree:=Do_DiskData(drive,TRUE);

+ 30 - 19
rtl/watcom/sysutils.pp

@@ -13,6 +13,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
+
+{$inline on}
+
 unit sysutils;
 interface
 
@@ -503,14 +506,31 @@ 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;
+
+  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
- if (swap(dosversion)>=$070A) AND LFNSupport then
+ if LFNSupport then
   begin
-   DosError:=0;
    S:='C:\'#0;
    if Drive=0 then
     begin
@@ -521,6 +541,7 @@ BEGIN
    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;
@@ -530,9 +551,12 @@ BEGIN
    regs.cx:=Sizeof(ExtendedFat32FreeSpaceRec);
    regs.ax:=$7303;
    msdos(regs);
-   if regs.ax<>$ffff then
+   if (regs.flags and fcarry) = 0 then {No error clausule in int except cf}
     begin
-      copyfromdos(rec,Sizeof(ExtendedFat32FreeSpaceRec));
+     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
@@ -542,24 +566,11 @@ BEGIN
     Do_DiskData:=-1;
   end
  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;
 
 
+
 function diskfree(drive : byte) : int64;
 begin
    diskfree:=Do_DiskData(drive,TRUE);