From fbac67d3720d98e785dda1dfc99ac2228aa76632 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 5 Sep 2000 13:53:27 +0000 Subject: [PATCH] Implemented dll detach on thread termination svn path=/trunk/; revision=1333 --- reactos/lib/kernel32/misc/dllmain.c | 6 ++- reactos/lib/kernel32/misc/stubs.c | 12 +---- reactos/lib/kernel32/process/proc.c | 12 ++++- reactos/lib/kernel32/thread/thread.c | 24 ++++++++- reactos/ntoskrnl/ps/tinfo.c | 73 +++++++++++++++++++++++++++- 5 files changed, 110 insertions(+), 17 deletions(-) diff --git a/reactos/lib/kernel32/misc/dllmain.c b/reactos/lib/kernel32/misc/dllmain.c index c6109103107..9ef87796489 100644 --- a/reactos/lib/kernel32/misc/dllmain.c +++ b/reactos/lib/kernel32/misc/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.14 2000/09/05 10:59:27 ekohl Exp $ +/* $Id: dllmain.c,v 1.15 2000/09/05 13:52:04 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -51,6 +52,9 @@ WINBOOL STDCALL DllMain(HANDLE hInst, (PKUSER_SHARED_DATA)USER_SHARED_DATA_BASE; DPRINT("DLL_PROCESS_ATTACH\n"); + + LdrDisableThreadCalloutsForDll ((PVOID)hInst); + /* * Connect to the csrss server */ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 8cd3b6d5754..13973eafff6 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.21 2000/09/01 17:09:19 ekohl Exp $ +/* $Id: stubs.c,v 1.22 2000/09/05 13:52:04 ekohl Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -748,16 +748,6 @@ ExtendVirtualBuffer ( } -VOID -STDCALL -FatalExit ( - int ExitCode - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); -} - - ATOM STDCALL FindAtomW ( diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index 261e409eb21..a68307f8ffb 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.34 2000/09/05 11:00:07 ekohl Exp $ +/* $Id: proc.c,v 1.35 2000/09/05 13:52:30 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -509,6 +509,16 @@ FatalAppExitW ( } +VOID +STDCALL +FatalExit ( + int ExitCode + ) +{ + ExitProcess(ExitCode); +} + + DWORD STDCALL GetPriorityClass ( diff --git a/reactos/lib/kernel32/thread/thread.c b/reactos/lib/kernel32/thread/thread.c index 8baeafcc7f9..9b2b4afbc10 100644 --- a/reactos/lib/kernel32/thread/thread.c +++ b/reactos/lib/kernel32/thread/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.18 2000/09/01 17:09:50 ekohl Exp $ +/* $Id: thread.c,v 1.19 2000/09/05 13:52:44 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -170,6 +170,26 @@ DWORD STDCALL GetCurrentThreadId() VOID STDCALL ExitThread(UINT uExitCode) { NTSTATUS errCode; + BOOLEAN LastThread; + NTSTATUS Status; + + /* + * Terminate process if this is the last thread + * of the current process + */ + Status = NtQueryInformationThread(NtCurrentThread(), + ThreadAmILastThread, + &LastThread, + sizeof(BOOLEAN), + NULL); + if (NT_SUCCESS(Status) && LastThread == TRUE) + { + ExitProcess (uExitCode); + } + + /* FIXME: notify csrss of thread termination */ + + LdrShutdownThread(); errCode = NtTerminateThread(NtCurrentThread(), uExitCode); @@ -282,7 +302,7 @@ TerminateThread ( ) { NTSTATUS errCode; - + errCode = NtTerminateThread(hThread, dwExitCode); if (!NT_SUCCESS(errCode)) diff --git a/reactos/ntoskrnl/ps/tinfo.c b/reactos/ntoskrnl/ps/tinfo.c index c128a4873c3..92c836c6f5d 100644 --- a/reactos/ntoskrnl/ps/tinfo.c +++ b/reactos/ntoskrnl/ps/tinfo.c @@ -92,7 +92,7 @@ NTSTATUS STDCALL NtSetInformationThread(HANDLE ThreadHandle, break; case ThreadAmILastThread: - break; + break; case ThreadPriorityBoost: break; @@ -114,7 +114,76 @@ NtQueryInformationThread ( IN ULONG ThreadInformationLength, OUT PULONG ReturnLength) { - UNIMPLEMENTED + PETHREAD Thread; + NTSTATUS Status; + + Status = ObReferenceObjectByHandle(ThreadHandle, + THREAD_QUERY_INFORMATION, + PsThreadType, + UserMode, + (PVOID*)&Thread, + NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + switch (ThreadInformationClass) + { + case ThreadBasicInformation: + break; + + case ThreadTimes: + break; + + case ThreadPriority: + break; + + case ThreadBasePriority: + break; + + case ThreadAffinityMask: + break; + + case ThreadImpersonationToken: + break; + + case ThreadDescriptorTableEntry: + UNIMPLEMENTED; + break; + + case ThreadEventPair: + UNIMPLEMENTED; + break; + + case ThreadQuerySetWin32StartAddress: + break; + + case ThreadZeroTlsCell: + break; + + case ThreadPerformanceCount: + break; + + case ThreadAmILastThread: + { + BOOLEAN *LastThread; + PLIST_ENTRY Entry; + + LastThread = (PBOOLEAN) ThreadInformation; + Entry = &(Thread->ThreadsProcess->ThreadListHead); + *LastThread = (Entry->Flink->Flink == Entry)?TRUE:FALSE; + } + break; + + case ThreadPriorityBoost: + break; + + default: + Status = STATUS_UNSUCCESSFUL; + } + ObDereferenceObject(Thread); + return Status; } VOID KeSetPreviousMode(ULONG Mode)