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);
}
Show replies by date