Browse Source

* only clear DS and ES instead of fillchar-ing the whole Registers record in
various places in the win16 rtl where int 21h is called

git-svn-id: trunk@31871 -

nickysn 9 years ago
parent
commit
2f32a7b718
3 changed files with 22 additions and 14 deletions
  1. 13 13
      rtl/win16/sysfile.inc
  2. 1 1
      rtl/win16/sysos.inc
  3. 8 0
      rtl/win16/system.pp

+ 13 - 13
rtl/win16/sysfile.inc

@@ -35,7 +35,7 @@ var
 begin
 begin
   if Handle<=4 then
   if Handle<=4 then
    exit;
    exit;
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.BX:=handle;
   regs.BX:=handle;
   if handle<max_files then
   if handle<max_files then
     begin
     begin
@@ -62,7 +62,7 @@ var
 begin
 begin
   oldp:=p;
   oldp:=p;
   DoDirSeparators(p,pchangeable);
   DoDirSeparators(p,pchangeable);
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.DX:=Ofs(p^);
   regs.DX:=Ofs(p^);
   regs.DS:=Seg(p^);
   regs.DS:=Seg(p^);
   if LFNSupport then
   if LFNSupport then
@@ -88,7 +88,7 @@ begin
   oldp2:=p2;
   oldp2:=p2;
   DoDirSeparators(p1,p1changeable);
   DoDirSeparators(p1,p1changeable);
   DoDirSeparators(p2,p2changeable);
   DoDirSeparators(p2,p2changeable);
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.DS:=Seg(p1^);
   regs.DS:=Seg(p1^);
   regs.DX:=Ofs(p1^);
   regs.DX:=Ofs(p1^);
   regs.ES:=Seg(p2^);
   regs.ES:=Seg(p2^);
@@ -112,7 +112,7 @@ function do_write(h:thandle;addr:pointer;len : longint) : longint;
 var
 var
   regs: Registers;
   regs: Registers;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.AH := $40;
   regs.AH := $40;
   regs.BX := h;
   regs.BX := h;
   regs.CX := len;
   regs.CX := len;
@@ -132,7 +132,7 @@ function do_read(h:thandle;addr:pointer;len : longint) : longint;
 var
 var
   regs: Registers;
   regs: Registers;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.AH := $3F;
   regs.AH := $3F;
   regs.BX := h;
   regs.BX := h;
   regs.CX := len;
   regs.CX := len;
@@ -152,7 +152,7 @@ function do_filepos(handle : thandle) : longint;
 var
 var
   regs : Registers;
   regs : Registers;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.BX:=handle;
   regs.BX:=handle;
   regs.CX:=0;
   regs.CX:=0;
   regs.DX:=0;
   regs.DX:=0;
@@ -172,7 +172,7 @@ procedure do_seek(handle:thandle;pos : longint);
 var
 var
   regs : Registers;
   regs : Registers;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.BX:=handle;
   regs.BX:=handle;
   regs.CX:=pos shr 16;
   regs.CX:=pos shr 16;
   regs.DX:=pos and $ffff;
   regs.DX:=pos and $ffff;
@@ -188,7 +188,7 @@ function do_seekend(handle:thandle):longint;
 var
 var
   regs : Registers;
   regs : Registers;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.BX:=handle;
   regs.BX:=handle;
   regs.CX:=0;
   regs.CX:=0;
   regs.DX:=0;
   regs.DX:=0;
@@ -220,7 +220,7 @@ var
   regs : Registers;
   regs : Registers;
 begin
 begin
   do_seek(handle,pos);
   do_seek(handle,pos);
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.CX:=0;
   regs.CX:=0;
   regs.BX:=handle;
   regs.BX:=handle;
   regs.AX:=$4000;
   regs.AX:=$4000;
@@ -237,7 +237,7 @@ var
   regs : Registers;
   regs : Registers;
 begin
 begin
   Inc(FileHandleCount,10);
   Inc(FileHandleCount,10);
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.BX:=FileHandleCount;
   regs.BX:=FileHandleCount;
   regs.AX:=$6700;
   regs.AX:=$6700;
   MsDos(regs);
   MsDos(regs);
@@ -263,7 +263,7 @@ var
   action : word;
   action : word;
   oldp : pchar;
   oldp : pchar;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
 { close first if opened }
 { close first if opened }
   if ((flags and $10000)=0) then
   if ((flags and $10000)=0) then
    begin
    begin
@@ -332,7 +332,7 @@ begin
     if regs.AX=4 then
     if regs.AX=4 then
       if Increase_file_handle_count then
       if Increase_file_handle_count then
         begin
         begin
-          FillChar(regs,SizeOf(regs),0);
+          ZeroSegRegs(regs);
           { Try again }
           { Try again }
           if LFNSupport then
           if LFNSupport then
             begin
             begin
@@ -409,7 +409,7 @@ begin
       do_isdevice:=true;
       do_isdevice:=true;
       exit;
       exit;
     end;
     end;
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.AX := $4400;
   regs.AX := $4400;
   regs.BX := handle;
   regs.BX := handle;
   MsDos(regs);
   MsDos(regs);

+ 1 - 1
rtl/win16/sysos.inc

@@ -19,7 +19,7 @@ procedure GetInOutRes(def: Word);
 var
 var
   regs : Registers;
   regs : Registers;
 begin
 begin
-  FillChar(regs,SizeOf(regs),0);
+  ZeroSegRegs(regs);
   regs.AX:=$5900;
   regs.AX:=$5900;
   regs.BX:=$0;
   regs.BX:=$0;
   MsDos(regs);
   MsDos(regs);

+ 8 - 0
rtl/win16/system.pp

@@ -146,6 +146,14 @@ procedure MsDos_Carry(var Regs: Registers); external name 'FPC_MSDOS_CARRY';
 {$I winprocsh.inc}
 {$I winprocsh.inc}
 {$I winprocs.inc}
 {$I winprocs.inc}
 
 
+{ in protected mode, loading invalid values into segment registers causes an
+  exception, so we use this function to initialize our Registers structure }
+procedure ZeroSegRegs(var regs: Registers); inline;
+begin
+  regs.DS:=0;
+  regs.ES:=0;
+end;
+
 {$I system.inc}
 {$I system.inc}
 
 
 {$IFDEF FPC_X86_DATA_NEAR}
 {$IFDEF FPC_X86_DATA_NEAR}