Do not modify the stack layout of a function by using inline assembler.
Modified: trunk/reactos/lib/kernel32/process/create.c

Modified: trunk/reactos/lib/kernel32/process/create.c
--- trunk/reactos/lib/kernel32/process/create.c	2005-05-06 11:53:35 UTC (rev 15039)
+++ trunk/reactos/lib/kernel32/process/create.c	2005-05-06 12:17:29 UTC (rev 15040)
@@ -275,7 +275,6 @@
    return bRetVal;
 }
 
-
 static EXCEPTION_DISPOSITION __cdecl
 _except_handler(EXCEPTION_RECORD *ExceptionRecord,
 		void * EstablisherFrame,
@@ -323,14 +322,34 @@
 		 DWORD lpParameter)
 {
    UINT uExitCode = 0;
+#if 1
+   PVOID OldHandler;
+#endif
 
    DPRINT("BaseProcessStart(..) - setting up exception frame.\n");
 
+#if 1
+   __asm__ __volatile__ ("movl %%fs:0, %0\n\t" \
+                         "movl %1, %%fs:0\n\t" \
+                         : "=r" (OldHandler)
+                         : "r" (_except_handler));
+#else
+   /* FIXME:
+    *   We cannot use push (__try1) and pop (__except1). 
+    *   Gcc doesn't like it, if anyone changes the stack layout.
+    */
    __try1(_except_handler)
+#endif
    {
       uExitCode = (lpStartAddress)((PVOID)lpParameter);
-   } __except1
-
+   } 
+#if 1
+   __asm__ __volatile__ ("movl %0, %%fs:0\n\t" \
+                         : 
+                         : "r" (OldHandler));
+#else
+   __except1
+#endif
    ExitProcess(uExitCode);
 }