2002-10-26 Casper S. Hornstrup <chorns@users.sourceforge.net>

* lib/kernel32/process/create.c (_except_handler): New function.
	(BaseProcessStart): Ditto.
	(KlCreateFirstThread): Return INVALID_HANDLE_VALUE on error; Call
	BaseProcessStart() before process entry point.
	* lib/kernel32/thread/thread.c (_except_handler): New function.
	(ThreadStartup): Protect thread using SEH constructs.

svn path=/trunk/; revision=3656
This commit is contained in:
Casper Hornstrup 2002-10-25 22:59:55 +00:00
parent 9e54d1d8d3
commit 5437114eaa
3 changed files with 85 additions and 15 deletions

View file

@ -1,3 +1,12 @@
2002-10-26 Casper S. Hornstrup <chorns@users.sourceforge.net>
* lib/kernel32/process/create.c (_except_handler): New function.
(BaseProcessStart): Ditto.
(KlCreateFirstThread): Return INVALID_HANDLE_VALUE on error; Call
BaseProcessStart() before process entry point.
* lib/kernel32/thread/thread.c (_except_handler): New function.
(ThreadStartup): Protect thread using SEH constructs.
2002-10-26 Casper S. Hornstrup <chorns@users.sourceforge.net> 2002-10-26 Casper S. Hornstrup <chorns@users.sourceforge.net>
* include/ddk/zw.h (NtProcessStartup): Use standard calling convention. * include/ddk/zw.h (NtProcessStartup): Use standard calling convention.

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.55 2002/10/20 11:56:00 chorns Exp $ /* $Id: create.c,v 1.56 2002/10/25 22:59:55 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -168,6 +168,47 @@ CreateProcessA (LPCSTR lpApplicationName,
} }
static
EXCEPTION_DISPOSITION
__cdecl
_except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext )
{
DPRINT("Process terminated abnormally...\n");
if (/* FIXME: */ TRUE) /* Not a service */
{
ExitProcess(0);
}
else
{
ExitThread(0);
}
/* We should not get to here */
return ExceptionContinueSearch;
}
VOID STDCALL
BaseProcessStart(LPTHREAD_START_ROUTINE lpStartAddress,
DWORD lpParameter)
{
UINT uExitCode = 0;
__try1(_except_handler)
{
uExitCode = (lpStartAddress)(lpParameter);
} __except1
{
}
ExitThread(uExitCode);
}
HANDLE STDCALL HANDLE STDCALL
KlCreateFirstThread(HANDLE ProcessHandle, KlCreateFirstThread(HANDLE ProcessHandle,
LPSECURITY_ATTRIBUTES lpThreadAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes,
@ -186,7 +227,7 @@ KlCreateFirstThread(HANDLE ProcessHandle,
BOOLEAN CreateSuspended = FALSE; BOOLEAN CreateSuspended = FALSE;
ULONG OldPageProtection; ULONG OldPageProtection;
ULONG ResultLength; ULONG ResultLength;
ULONG InitialStack[5]; ULONG InitialStack[6];
ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
ObjectAttributes.RootDirectory = NULL; ObjectAttributes.RootDirectory = NULL;
@ -257,7 +298,7 @@ KlCreateFirstThread(HANDLE ProcessHandle,
DPRINT("Error comitting stack page(s)!\n"); DPRINT("Error comitting stack page(s)!\n");
SetLastErrorByStatus(Status); SetLastErrorByStatus(Status);
return(NULL); return(INVALID_HANDLE_VALUE);
} }
DPRINT("StackLimit: %p\n", DPRINT("StackLimit: %p\n",
@ -279,18 +320,18 @@ KlCreateFirstThread(HANDLE ProcessHandle,
DPRINT("Error comitting guard page!\n"); DPRINT("Error comitting guard page!\n");
SetLastErrorByStatus(Status); SetLastErrorByStatus(Status);
return(NULL); return(INVALID_HANDLE_VALUE);
} }
memset(&ThreadContext,0,sizeof(CONTEXT)); memset(&ThreadContext,0,sizeof(CONTEXT));
ThreadContext.Eip = (ULONG)lpStartAddress; ThreadContext.Eip = (ULONG)BaseProcessStart;
ThreadContext.SegGs = USER_DS; ThreadContext.SegGs = USER_DS;
ThreadContext.SegFs = USER_DS; ThreadContext.SegFs = USER_DS;
ThreadContext.SegEs = USER_DS; ThreadContext.SegEs = USER_DS;
ThreadContext.SegDs = USER_DS; ThreadContext.SegDs = USER_DS;
ThreadContext.SegCs = USER_CS; ThreadContext.SegCs = USER_CS;
ThreadContext.SegSs = USER_DS; ThreadContext.SegSs = USER_DS;
ThreadContext.Esp = (ULONG)InitialTeb.StackBase - 20; ThreadContext.Esp = (ULONG)InitialTeb.StackBase - 6*4;
ThreadContext.EFlags = (1<<1) + (1<<9); ThreadContext.EFlags = (1<<1) + (1<<9);
DPRINT("ThreadContext.Eip %x\n",ThreadContext.Eip); DPRINT("ThreadContext.Eip %x\n",ThreadContext.Eip);
@ -299,7 +340,9 @@ KlCreateFirstThread(HANDLE ProcessHandle,
* Write in the initial stack. * Write in the initial stack.
*/ */
InitialStack[0] = 0; InitialStack[0] = 0;
InitialStack[1] = PEB_BASE; InitialStack[1] = (DWORD)lpStartAddress;
InitialStack[2] = PEB_BASE;
Status = ZwWriteVirtualMemory(ProcessHandle, Status = ZwWriteVirtualMemory(ProcessHandle,
(PVOID)ThreadContext.Esp, (PVOID)ThreadContext.Esp,
InitialStack, InitialStack,
@ -308,7 +351,7 @@ KlCreateFirstThread(HANDLE ProcessHandle,
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT1("Failed to write initial stack.\n"); DPRINT1("Failed to write initial stack.\n");
return(Status); return(INVALID_HANDLE_VALUE);
} }
Status = NtCreateThread(&ThreadHandle, Status = NtCreateThread(&ThreadHandle,
@ -326,7 +369,7 @@ KlCreateFirstThread(HANDLE ProcessHandle,
&InitialTeb.StackReserve, &InitialTeb.StackReserve,
MEM_RELEASE); MEM_RELEASE);
SetLastErrorByStatus(Status); SetLastErrorByStatus(Status);
return(NULL); return(INVALID_HANDLE_VALUE);
} }
if (lpThreadId != NULL) if (lpThreadId != NULL)
@ -941,7 +984,7 @@ CreateProcessW(LPCWSTR lpApplicationName,
ImageBaseAddress + (ULONG)Sii.EntryPoint, ImageBaseAddress + (ULONG)Sii.EntryPoint,
dwCreationFlags, dwCreationFlags,
&lpProcessInformation->dwThreadId); &lpProcessInformation->dwThreadId);
if (hThread == NULL) if (hThread == INVALID_HANDLE_VALUE)
{ {
return FALSE; return FALSE;
} }

View file

@ -1,4 +1,4 @@
/* $Id: thread.c,v 1.30 2002/10/01 19:27:20 chorns Exp $ /* $Id: thread.c,v 1.31 2002/10/25 22:59:55 chorns Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -12,7 +12,6 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#include <ddk/ntddk.h>
#include <windows.h> #include <windows.h>
#include <kernel32/thread.h> #include <kernel32/thread.h>
#include <ntdll/ldr.h> #include <ntdll/ldr.h>
@ -28,15 +27,34 @@ static VOID ThreadAttachDlls (VOID);
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
static
EXCEPTION_DISPOSITION
__cdecl
_except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext )
{
ExitThread(0);
/* We should not get to here */
return ExceptionContinueSearch;
}
static VOID STDCALL static VOID STDCALL
ThreadStartup (LPTHREAD_START_ROUTINE lpStartAddress, ThreadStartup (LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter) LPVOID lpParameter)
{ {
UINT uExitCode; UINT uExitCode;
/* FIXME: notify csrss of thread creation ?? */ __try1(_except_handler)
{
uExitCode = (lpStartAddress)(lpParameter); /* FIXME: notify csrss of thread creation ?? */
uExitCode = (lpStartAddress)(lpParameter);
} __except1
{
}
ExitThread(uExitCode); ExitThread(uExitCode);
} }