[KERNEL32]:

Bug #39: BaseThreadStartup needs to call CsrNewThread (which registers the termination port with CSRSS) for Win32 threads.
Bug #40: If a crash happens during thread execution, ExitProcess should be called instead of ExitThread (unless this is a CSR thread).
Bug #41: The ExitThread/Process APIs should be called still from within the context of the SEH frame, not outside of it.
Use BaseRunningInServerProcess global instead of local IsServer local when connecting to CSRSS. This is needed for things such as the above.

svn path=/trunk/; revision=52801
This commit is contained in:
Alex Ionescu 2011-07-23 11:38:58 +00:00
parent d66140d475
commit 0d4067e028
3 changed files with 26 additions and 11 deletions

View file

@ -22,6 +22,8 @@
extern UNICODE_STRING SystemDirectory;
extern UNICODE_STRING WindowsDirectory;
BOOLEAN BaseRunningInServerProcess;
WCHAR BaseDefaultPathBuffer[6140];
HANDLE hProcessHeap = NULL;
@ -258,7 +260,6 @@ DllMain(HANDLE hDll,
LPVOID lpReserved)
{
NTSTATUS Status;
BOOLEAN IsServer;
ULONG Dummy;
ULONG DummySize = sizeof(Dummy);
WCHAR SessionDir[256];
@ -304,7 +305,7 @@ DllMain(HANDLE hDll,
InWindows ? 1 : 0,
&Dummy,
&DummySize,
&IsServer);
&BaseRunningInServerProcess);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to connect to CSR (Status %lx)\n", Status);
@ -313,7 +314,7 @@ DllMain(HANDLE hDll,
}
/* Check if we are running a CSR Server */
if (!IsServer)
if (!BaseRunningInServerProcess)
{
/* Set the termination port for the thread */
DPRINT("Creating new thread for CSR\n");

View file

@ -52,22 +52,34 @@ WINAPI
BaseThreadStartup(LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter)
{
volatile UINT uExitCode = 0;
/* Attempt to call the Thread Start Address */
_SEH2_TRY
{
/* Legacy check which is still used today for Win32 threads */
if (NtCurrentTeb()->NtTib.Version == (30 << 8)) // OS/2 V3.0 ("Cruiser")
{
/* This registers the termination port with CSRSS */
if (!BaseRunningInServerProcess) CsrNewThread();
}
/* Get the exit code from the Thread Start */
uExitCode = (lpStartAddress)((PVOID)lpParameter);
ExitThread((lpStartAddress)((PVOID)lpParameter));
}
_SEH2_EXCEPT(BaseThreadExceptionFilter(_SEH2_GetExceptionInformation()))
{
/* Get the Exit code from the SEH Handler */
uExitCode = _SEH2_GetExceptionCode();
} _SEH2_END;
/* Exit the Thread */
ExitThread(uExitCode);
if (!BaseRunningInServerProcess)
{
/* Kill the whole process, usually */
ExitProcess(_SEH2_GetExceptionCode());
}
else
{
/* If running inside CSRSS, kill just this thread */
ExitThread(_SEH2_GetExceptionCode());
}
}
_SEH2_END;
}
/*

View file

@ -106,6 +106,8 @@ extern LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter;
extern SYSTEM_BASIC_INFORMATION BaseCachedSysInfo;
extern BOOLEAN BaseRunningInServerProcess;
/* FUNCTION PROTOTYPES *******************************************************/
BOOL WINAPI VerifyConsoleIoHandle(HANDLE Handle);