Browse Source

* keep the stack 16 byte aligned on winx64
* fixed some winx64 issues regarding exec

git-svn-id: trunk@3213 -

florian 19 years ago
parent
commit
598853240c
6 changed files with 85 additions and 87 deletions
  1. 18 22
      rtl/win/dos.pp
  2. 4 4
      rtl/win/sysos.inc
  3. 3 2
      rtl/win/sysutils.pp
  4. 40 40
      rtl/win64/Makefile
  5. 1 1
      rtl/win64/Makefile.fpc
  6. 19 18
      rtl/win64/system.pp

+ 18 - 22
rtl/win/dos.pp

@@ -19,8 +19,6 @@ Const
   Max_Path    = 260;
   Max_Path    = 260;
 
 
 Type
 Type
-  TWin32Handle = longint;
-
   PWin32FileTime = ^TWin32FileTime;
   PWin32FileTime = ^TWin32FileTime;
   TWin32FileTime = record
   TWin32FileTime = record
     dwLowDateTime,
     dwLowDateTime,
@@ -44,7 +42,7 @@ Type
   end;
   end;
 
 
   Searchrec = Packed Record
   Searchrec = Packed Record
-    FindHandle  : TWin32Handle;
+    FindHandle  : THandle;
     W32FindData : TWin32FindData;
     W32FindData : TWin32FindData;
     ExcludeAttr : longint;
     ExcludeAttr : longint;
     time : longint;
     time : longint;
@@ -97,7 +95,7 @@ type
 
 
 var
 var
    versioninfo : OSVERSIONINFO;
    versioninfo : OSVERSIONINFO;
-   kernel32dll : TWin32Handle;
+   kernel32dll : THandle;
 
 
 {******************************************************************************
 {******************************************************************************
                            --- Conversion ---
                            --- Conversion ---
@@ -259,8 +257,8 @@ end;
 type
 type
   PProcessInformation = ^TProcessInformation;
   PProcessInformation = ^TProcessInformation;
   TProcessInformation = record
   TProcessInformation = record
-    hProcess: TWin32Handle;
-    hThread: TWin32Handle;
+    hProcess: THandle;
+    hThread: THandle;
     dwProcessId: DWORD;
     dwProcessId: DWORD;
     dwThreadId: DWORD;
     dwThreadId: DWORD;
   end;
   end;
@@ -271,24 +269,23 @@ type
                lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
                lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
                var lpProcessInformation: TProcessInformation): longbool;
                var lpProcessInformation: TProcessInformation): longbool;
      stdcall; external 'kernel32' name 'CreateProcessA';
      stdcall; external 'kernel32' name 'CreateProcessA';
-   function getExitCodeProcess(h:TWin32Handle;var code:longint):longbool;
+   function getExitCodeProcess(h:THandle;var code:longint):longbool;
      stdcall; external 'kernel32' name 'GetExitCodeProcess';
      stdcall; external 'kernel32' name 'GetExitCodeProcess';
-   function WaitForSingleObject(hHandle: TWin32Handle; dwMilliseconds: DWORD): DWORD;
+   function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD;
      stdcall; external 'kernel32' name 'WaitForSingleObject';
      stdcall; external 'kernel32' name 'WaitForSingleObject';
-   function CloseHandle(h : TWin32Handle) : longint;
+   function CloseHandle(h : THandle) : longint;
      stdcall; external 'kernel32' name 'CloseHandle';
      stdcall; external 'kernel32' name 'CloseHandle';
 
 
 procedure exec(const path : pathstr;const comline : comstr);
 procedure exec(const path : pathstr;const comline : comstr);
 var
 var
   SI: TStartupInfo;
   SI: TStartupInfo;
   PI: TProcessInformation;
   PI: TProcessInformation;
-  Proc : TWin32Handle;
   l    : Longint;
   l    : Longint;
   CommandLine : array[0..511] of char;
   CommandLine : array[0..511] of char;
   AppParam : array[0..255] of char;
   AppParam : array[0..255] of char;
   pathlocal : string;
   pathlocal : string;
 begin
 begin
-  DosError := 0;
+  DosError:=0;
   FillChar(SI, SizeOf(SI), 0);
   FillChar(SI, SizeOf(SI), 0);
   SI.cb:=SizeOf(SI);
   SI.cb:=SizeOf(SI);
   SI.wShowWindow:=1;
   SI.wShowWindow:=1;
@@ -315,13 +312,12 @@ begin
      DosError:=Last2DosError(GetLastError);
      DosError:=Last2DosError(GetLastError);
      exit;
      exit;
    end;
    end;
-  Proc:=PI.hProcess;
-  CloseHandle(PI.hThread);
-  if WaitForSingleObject(Proc, dword($ffffffff)) <> $ffffffff then
-    GetExitCodeProcess(Proc,l)
+  if WaitForSingleObject(PI.hProcess,dword($ffffffff))<>$ffffffff then
+    GetExitCodeProcess(PI.hProcess,l)
   else
   else
     l:=-1;
     l:=-1;
-  CloseHandle(Proc);
+  CloseHandle(PI.hProcess);
+  CloseHandle(PI.hThread);
   LastDosExitCode:=l;
   LastDosExitCode:=l;
 end;
 end;
 
 
@@ -421,11 +417,11 @@ end;
 
 
 { Needed kernel calls }
 { Needed kernel calls }
 
 
-   function FindFirstFile (lpFileName: PChar; var lpFindFileData: TWIN32FindData): TWin32Handle;
+   function FindFirstFile (lpFileName: PChar; var lpFindFileData: TWIN32FindData): THandle;
      stdcall; external 'kernel32' name 'FindFirstFileA';
      stdcall; external 'kernel32' name 'FindFirstFileA';
-   function FindNextFile  (hFindFile: TWin32Handle; var lpFindFileData: TWIN32FindData): LongBool;
+   function FindNextFile  (hFindFile: THandle; var lpFindFileData: TWIN32FindData): LongBool;
      stdcall; external 'kernel32' name 'FindNextFileA';
      stdcall; external 'kernel32' name 'FindNextFileA';
-   function FindCloseFile (hFindFile: TWin32Handle): LongBool;
+   function FindCloseFile (hFindFile: THandle): LongBool;
      stdcall; external 'kernel32' name 'FindClose';
      stdcall; external 'kernel32' name 'FindClose';
 
 
 Procedure StringToPchar (Var S : String);
 Procedure StringToPchar (Var S : String);
@@ -775,13 +771,13 @@ begin
 end;
 end;
 
 
 
 
-function FreeLibrary(hLibModule : TWin32Handle) : longbool;
+function FreeLibrary(hLibModule : THandle) : longbool;
   stdcall; external 'kernel32' name 'FreeLibrary';
   stdcall; external 'kernel32' name 'FreeLibrary';
 function GetVersionEx(var VersionInformation:OSVERSIONINFO) : longbool;
 function GetVersionEx(var VersionInformation:OSVERSIONINFO) : longbool;
   stdcall; external 'kernel32' name 'GetVersionExA';
   stdcall; external 'kernel32' name 'GetVersionExA';
-function LoadLibrary(lpLibFileName : pchar):TWin32Handle;
+function LoadLibrary(lpLibFileName : pchar):THandle;
   stdcall; external 'kernel32' name 'LoadLibraryA';
   stdcall; external 'kernel32' name 'LoadLibraryA';
-function GetProcAddress(hModule : TWin32Handle;lpProcName : pchar) : pointer;
+function GetProcAddress(hModule : THandle;lpProcName : pchar) : pointer;
   stdcall; external 'kernel32' name 'GetProcAddress';
   stdcall; external 'kernel32' name 'GetProcAddress';
 
 
 var
 var

+ 4 - 4
rtl/win/sysos.inc

@@ -15,10 +15,10 @@
 
 
 const
 const
    { constants for GetStdHandle }
    { constants for GetStdHandle }
-   STD_INPUT_HANDLE = longint($fffffff6);
-   STD_OUTPUT_HANDLE = longint($fffffff5);
-   STD_ERROR_HANDLE = longint($fffffff4);
-   INVALID_HANDLE_VALUE = longint($ffffffff);
+   STD_INPUT_HANDLE = dword($fffffff6);
+   STD_OUTPUT_HANDLE = dword($fffffff5);
+   STD_ERROR_HANDLE = dword($fffffff4);
+   INVALID_HANDLE_VALUE = dword($ffffffff);
 
 
    IGNORE = 0;               { Ignore signal }
    IGNORE = 0;               { Ignore signal }
    INFINITE = longint($FFFFFFFF);     { Infinite timeout }
    INFINITE = longint($FFFFFFFF);     { Infinite timeout }

+ 3 - 2
rtl/win/sysutils.pp

@@ -756,7 +756,7 @@ function ExecuteProcess(Const Path: AnsiString; Const ComLine: AnsiString):integ
 var
 var
   SI: TStartupInfo;
   SI: TStartupInfo;
   PI: TProcessInformation;
   PI: TProcessInformation;
-  Proc : TWin32Handle;
+  Proc : THandle;
   l    : DWord;
   l    : DWord;
   CommandLine : ansistring;
   CommandLine : ansistring;
   e : EOSError;
   e : EOSError;
@@ -788,11 +788,11 @@ begin
       raise e;
       raise e;
     end;
     end;
   Proc:=PI.hProcess;
   Proc:=PI.hProcess;
-  CloseHandle(PI.hThread);
   if WaitForSingleObject(Proc, dword($ffffffff)) <> $ffffffff then
   if WaitForSingleObject(Proc, dword($ffffffff)) <> $ffffffff then
     begin
     begin
       GetExitCodeProcess(Proc,l);
       GetExitCodeProcess(Proc,l);
       CloseHandle(Proc);
       CloseHandle(Proc);
+      CloseHandle(PI.hThread);
       result:=l;
       result:=l;
     end
     end
   else
   else
@@ -800,6 +800,7 @@ begin
       e:=EOSError.CreateFmt(SExecuteProcessFailed,[CommandLine,GetLastError]);
       e:=EOSError.CreateFmt(SExecuteProcessFailed,[CommandLine,GetLastError]);
       e.ErrorCode:=GetLastError;
       e.ErrorCode:=GetLastError;
       CloseHandle(Proc);
       CloseHandle(Proc);
+      CloseHandle(PI.hThread);
       raise e;
       raise e;
     end;
     end;
 end;
 end;

+ 40 - 40
rtl/win64/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/04/02]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2006/04/04]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-solaris x86_64-linux x86_64-freebsd x86_64-win64 arm-linux arm-palmos arm-wince powerpc64-linux
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos powerpc-linux powerpc-netbsd powerpc-macos powerpc-darwin powerpc-morphos sparc-linux sparc-netbsd sparc-solaris x86_64-linux x86_64-freebsd x86_64-win64 arm-linux arm-palmos arm-wince powerpc64-linux
@@ -246,121 +246,121 @@ endif
 OBJPASDIR=$(RTL)/objpas
 OBJPASDIR=$(RTL)/objpas
 WINDOWS_SOURCE_FILES=$(addprefix $(WININC)/,$(addsuffix .inc,$(WINDOWS_FILES)))
 WINDOWS_SOURCE_FILES=$(addprefix $(WININC)/,$(addsuffix .inc,$(WINDOWS_FILES)))
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix windows winsock cmem dos objects rtlconsts sysconst sysutils math types strutils convutils dateutils
+override TARGET_UNITS+=system ctypes objpas macpas strings lineinfo heaptrc matrix dos objects windows winsock cmem rtlconsts sysconst sysutils math types strutils convutils dateutils
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_LOADERS+=$(LOADERS)
 override TARGET_LOADERS+=$(LOADERS)

+ 1 - 1
rtl/win64/Makefile.fpc

@@ -9,8 +9,8 @@ main=rtl
 loaders=$(LOADERS)
 loaders=$(LOADERS)
 units=system ctypes objpas macpas strings \
 units=system ctypes objpas macpas strings \
       lineinfo heaptrc matrix \
       lineinfo heaptrc matrix \
-      windows winsock cmem \
       dos objects \
       dos objects \
+      windows winsock cmem \
       rtlconsts sysconst sysutils math types \
       rtlconsts sysconst sysutils math types \
       strutils convutils dateutils
       strutils convutils dateutils
 #      varutils variants typinfo classes \
 #      varutils variants typinfo classes \

+ 19 - 18
rtl/win64/system.pp

@@ -62,7 +62,7 @@ const
   System_exception_frame : PEXCEPTION_FRAME =nil;
   System_exception_frame : PEXCEPTION_FRAME =nil;
 
 
 type
 type
-  TStartupInfo=packed record
+  TStartupInfo = record
     cb : longint;
     cb : longint;
     lpReserved : Pointer;
     lpReserved : Pointer;
     lpDesktop : Pointer;
     lpDesktop : Pointer;
@@ -78,9 +78,9 @@ type
     wShowWindow : Word;
     wShowWindow : Word;
     cbReserved2 : Word;
     cbReserved2 : Word;
     lpReserved2 : Pointer;
     lpReserved2 : Pointer;
-    hStdInput : longint;
-    hStdOutput : longint;
-    hStdError : longint;
+    hStdInput : THandle;
+    hStdOutput : THandle;
+    hStdError : THandle;
   end;
   end;
 
 
 var
 var
@@ -391,6 +391,7 @@ var
 procedure Exe_entry;[public,alias:'_FPC_EXE_Entry'];
 procedure Exe_entry;[public,alias:'_FPC_EXE_Entry'];
   var
   var
     ST : pointer;
     ST : pointer;
+    EBP : pointer;
   begin
   begin
      IsLibrary:=false;
      IsLibrary:=false;
      { install the handlers for exe only ?
      { install the handlers for exe only ?
@@ -401,17 +402,19 @@ procedure Exe_entry;[public,alias:'_FPC_EXE_Entry'];
      ExitCode:=0;
      ExitCode:=0;
      asm
      asm
          { allocate space for an exception frame }
          { allocate space for an exception frame }
-        pushl $0
-        pushl %fs:(0)
+        pushq $0
+        pushq %fs:(0)
         { movl  %esp,%fs:(0)
         { movl  %esp,%fs:(0)
           but don't insert it as it doesn't
           but don't insert it as it doesn't
           point to anything yet
           point to anything yet
           this will be used in signals unit }
           this will be used in signals unit }
         movl %esp,%eax
         movl %esp,%eax
         movl %eax,System_exception_frame
         movl %eax,System_exception_frame
-        pushl %ebp
-        movl %esp,%eax
-        movl %eax,st
+        { keep stack aligned }
+        pushq $0
+        pushq %rbp
+        movq %rsp,%rax
+        movq %rax,st
      end;
      end;
      StackTop:=st;
      StackTop:=st;
      asm
      asm
@@ -419,9 +422,10 @@ procedure Exe_entry;[public,alias:'_FPC_EXE_Entry'];
         movw %ss,%ax
         movw %ss,%ax
         movl %eax,_SS
         movl %eax,_SS
         call SysResetFPU
         call SysResetFPU
-        xorl %ebp,%ebp
+        xorl %rbp,%rbp
         call PASCALMAIN
         call PASCALMAIN
-        popl %ebp
+        popq %rbp
+        popq %rax
      end;
      end;
      { if we pass here there was no error ! }
      { if we pass here there was no error ! }
      system_exit;
      system_exit;
@@ -991,9 +995,6 @@ procedure fpc_cpucodeinit;
   begin
   begin
   end;
   end;
 
 
-
-
-
 {****************************************************************************
 {****************************************************************************
                       OS dependend widestrings
                       OS dependend widestrings
 ****************************************************************************}
 ****************************************************************************}
@@ -1150,9 +1151,9 @@ procedure SysInitStdIO;
 begin
 begin
   { Setup stdin, stdout and stderr, for GUI apps redirect stderr,stdout to be
   { Setup stdin, stdout and stderr, for GUI apps redirect stderr,stdout to be
     displayed in a messagebox }
     displayed in a messagebox }
-  StdInputHandle:=longint(GetStdHandle(cardinal(STD_INPUT_HANDLE)));
-  StdOutputHandle:=longint(GetStdHandle(cardinal(STD_OUTPUT_HANDLE)));
-  StdErrorHandle:=longint(GetStdHandle(cardinal(STD_ERROR_HANDLE)));
+  StdInputHandle:=THandle(GetStdHandle(STD_INPUT_HANDLE));
+  StdOutputHandle:=THandle(GetStdHandle(STD_OUTPUT_HANDLE));
+  StdErrorHandle:=THandle(GetStdHandle(STD_ERROR_HANDLE));
   if not IsConsole then
   if not IsConsole then
    begin
    begin
      AssignError(stderr);
      AssignError(stderr);
@@ -1220,5 +1221,5 @@ begin
   errno:=0;
   errno:=0;
   initvariantmanager;
   initvariantmanager;
   initwidestringmanager;
   initwidestringmanager;
-  InitWin32Widestrings
+  InitWin32Widestrings;
 end.
 end.