-/* $Id: thread.c,v 1.31 2002/10/25 22:59:55 chorns Exp $
+/* $Id: thread.c,v 1.32 2002/12/02 21:28:40 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
/* FUNCTIONS *****************************************************************/
-static\r
-EXCEPTION_DISPOSITION\r
-__cdecl\r
-_except_handler(\r
- struct _EXCEPTION_RECORD *ExceptionRecord,\r
- void * EstablisherFrame,\r
- struct _CONTEXT *ContextRecord,\r
- void * DispatcherContext )\r
-{\r
- ExitThread(0);
-
- /* We should not get to here */
- return ExceptionContinueSearch;
-}\r
-
-static VOID STDCALL
-ThreadStartup (LPTHREAD_START_ROUTINE lpStartAddress,
- LPVOID lpParameter)
+static EXCEPTION_DISPOSITION __cdecl
+_except_handler(struct _EXCEPTION_RECORD *ExceptionRecord,
+ void * EstablisherFrame,
+ struct _CONTEXT *ContextRecord,
+ void * DispatcherContext)
{
- UINT uExitCode;
+ ExitThread(0);
+
+ /* We should not get to here */
+ return(ExceptionContinueSearch);
+}
- __try1(_except_handler)
- {
- /* FIXME: notify csrss of thread creation ?? */
- uExitCode = (lpStartAddress)(lpParameter);
- } __except1
- {
- }
- ExitThread(uExitCode);
+static VOID STDCALL
+ThreadStartup(LPTHREAD_START_ROUTINE lpStartAddress,
+ LPVOID lpParameter)
+{
+ UINT uExitCode;
+
+ __try1(_except_handler)
+ {
+ /* FIXME: notify csrss of thread creation ?? */
+ uExitCode = (lpStartAddress)(lpParameter);
+ }
+ __except1
+ {
+ }
+
+ ExitThread(uExitCode);
}
-HANDLE STDCALL CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
- DWORD dwStackSize,
- LPTHREAD_START_ROUTINE lpStartAddress,
- LPVOID lpParameter,
- DWORD dwCreationFlags,
- LPDWORD lpThreadId)
+
+HANDLE STDCALL
+CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ DWORD dwStackSize,
+ LPTHREAD_START_ROUTINE lpStartAddress,
+ LPVOID lpParameter,
+ DWORD dwCreationFlags,
+ LPDWORD lpThreadId)
{
return(CreateRemoteThread(NtCurrentProcess(),
lpThreadAttributes,
lpThreadId));
}
-HANDLE STDCALL CreateRemoteThread(HANDLE hProcess,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- DWORD dwStackSize,
- LPTHREAD_START_ROUTINE lpStartAddress,
- LPVOID lpParameter,
- DWORD dwCreationFlags,
- LPDWORD lpThreadId)
+
+HANDLE STDCALL
+CreateRemoteThread(HANDLE hProcess,
+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
+ DWORD dwStackSize,
+ LPTHREAD_START_ROUTINE lpStartAddress,
+ LPVOID lpParameter,
+ DWORD dwCreationFlags,
+ LPDWORD lpThreadId)
{
- HANDLE ThreadHandle;
- OBJECT_ATTRIBUTES ObjectAttributes;
- CLIENT_ID ClientId;
- CONTEXT ThreadContext;
- INITIAL_TEB InitialTeb;
- BOOLEAN CreateSuspended = FALSE;
- PVOID BaseAddress;
- ULONG OldPageProtection;
- NTSTATUS Status;
-
- ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
- ObjectAttributes.RootDirectory = NULL;
- ObjectAttributes.ObjectName = NULL;
- ObjectAttributes.Attributes = 0;
- if (lpThreadAttributes != NULL)
- {
- if (lpThreadAttributes->bInheritHandle)
- ObjectAttributes.Attributes = OBJ_INHERIT;
- ObjectAttributes.SecurityDescriptor =
- lpThreadAttributes->lpSecurityDescriptor;
- }
- ObjectAttributes.SecurityQualityOfService = NULL;
-
- if ((dwCreationFlags & CREATE_SUSPENDED) == CREATE_SUSPENDED)
- CreateSuspended = TRUE;
- else
- CreateSuspended = FALSE;
+ HANDLE ThreadHandle;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ CLIENT_ID ClientId;
+ CONTEXT ThreadContext;
+ INITIAL_TEB InitialTeb;
+ BOOLEAN CreateSuspended = FALSE;
+ PVOID BaseAddress;
+ ULONG OldPageProtection;
+ NTSTATUS Status;
+
+ ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
+ ObjectAttributes.RootDirectory = NULL;
+ ObjectAttributes.ObjectName = NULL;
+ ObjectAttributes.Attributes = 0;
+ if (lpThreadAttributes != NULL)
+ {
+ if (lpThreadAttributes->bInheritHandle)
+ ObjectAttributes.Attributes = OBJ_INHERIT;
+ ObjectAttributes.SecurityDescriptor =
+ lpThreadAttributes->lpSecurityDescriptor;
+ }
+ ObjectAttributes.SecurityQualityOfService = NULL;
+
+ if ((dwCreationFlags & CREATE_SUSPENDED) == CREATE_SUSPENDED)
+ CreateSuspended = TRUE;
+ else
+ CreateSuspended = FALSE;
InitialTeb.StackReserve = 0x100000; /* 1MByte */
/* FIXME: use correct commit size */
return(ThreadHandle);
}
+
PTEB
GetTeb(VOID)
{
return(NtCurrentTeb());
}
+
WINBOOL STDCALL
SwitchToThread(VOID)
{
- NTSTATUS errCode;
- errCode = NtYieldExecution();
- return TRUE;
+ NTSTATUS errCode;
+ errCode = NtYieldExecution();
+ return TRUE;
}
+
DWORD STDCALL
-GetCurrentThreadId()
+GetCurrentThreadId(VOID)
{
- return((DWORD)(NtCurrentTeb()->Cid).UniqueThread);
+ return((DWORD)(NtCurrentTeb()->Cid).UniqueThread);
}
+
VOID STDCALL
ExitThread(DWORD uExitCode)
{
}
}
-WINBOOL STDCALL GetThreadTimes(HANDLE hThread,
- LPFILETIME lpCreationTime,
- LPFILETIME lpExitTime,
- LPFILETIME lpKernelTime,
- LPFILETIME lpUserTime)
+
+WINBOOL STDCALL
+GetThreadTimes(HANDLE hThread,
+ LPFILETIME lpCreationTime,
+ LPFILETIME lpExitTime,
+ LPFILETIME lpKernelTime,
+ LPFILETIME lpUserTime)
{
NTSTATUS errCode;
KERNEL_USER_TIMES KernelUserTimes;
}
-WINBOOL STDCALL GetThreadContext(HANDLE hThread,
- LPCONTEXT lpContext)
+WINBOOL STDCALL
+GetThreadContext(HANDLE hThread,
+ LPCONTEXT lpContext)
{
- NTSTATUS errCode;
-
- errCode = NtGetContextThread(hThread,
- lpContext);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return FALSE;
- }
- return TRUE;
+ NTSTATUS Status;
+
+ Status = NtGetContextThread(hThread,
+ lpContext);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+
+ return(TRUE);
}
-WINBOOL STDCALL SetThreadContext(HANDLE hThread,
- CONST CONTEXT *lpContext)
+
+WINBOOL STDCALL
+SetThreadContext(HANDLE hThread,
+ CONST CONTEXT *lpContext)
{
- NTSTATUS errCode;
-
- errCode = NtSetContextThread(hThread,
- (void *)lpContext);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return FALSE;
- }
- return TRUE;
+ NTSTATUS Status;
+
+ Status = NtSetContextThread(hThread,
+ (void *)lpContext);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+
+ return(TRUE);
}
-WINBOOL STDCALL GetExitCodeThread(HANDLE hThread,
- LPDWORD lpExitCode)
+
+WINBOOL STDCALL
+GetExitCodeThread(HANDLE hThread,
+ LPDWORD lpExitCode)
{
- NTSTATUS errCode;
- THREAD_BASIC_INFORMATION ThreadBasic;
- ULONG DataWritten;
-
- errCode = NtQueryInformationThread(hThread,
- ThreadBasicInformation,
- &ThreadBasic,
- sizeof(THREAD_BASIC_INFORMATION),
- &DataWritten);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return FALSE;
- }
- memcpy(lpExitCode, &ThreadBasic.ExitStatus, sizeof(DWORD));
- return TRUE;
+ THREAD_BASIC_INFORMATION ThreadBasic;
+ ULONG DataWritten;
+ NTSTATUS Status;
+
+ Status = NtQueryInformationThread(hThread,
+ ThreadBasicInformation,
+ &ThreadBasic,
+ sizeof(THREAD_BASIC_INFORMATION),
+ &DataWritten);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+
+ memcpy(lpExitCode, &ThreadBasic.ExitStatus, sizeof(DWORD));
+
+ return(TRUE);
}
-DWORD STDCALL ResumeThread(HANDLE hThread)
+
+DWORD STDCALL
+ResumeThread(HANDLE hThread)
{
- NTSTATUS errCode;
- ULONG PreviousResumeCount;
-
- errCode = NtResumeThread(hThread,
- &PreviousResumeCount);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return -1;
- }
- return PreviousResumeCount;
+ ULONG PreviousResumeCount;
+ NTSTATUS Status;
+
+ Status = NtResumeThread(hThread,
+ &PreviousResumeCount);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(-1);
+ }
+
+ return(PreviousResumeCount);
}
WINBOOL STDCALL
-TerminateThread (HANDLE hThread,
- DWORD dwExitCode)
+TerminateThread(HANDLE hThread,
+ DWORD dwExitCode)
{
- if (0 == hThread)
+ NTSTATUS Status;
+
+ if (0 == hThread)
{
- SetLastError (ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_INVALID_HANDLE);
+ return(FALSE);
}
- else
+
+ Status = NtTerminateThread(hThread,
+ dwExitCode);
+ if (!NT_SUCCESS(Status))
{
- NTSTATUS Status = NtTerminateThread (hThread, dwExitCode);
-
- if (NT_SUCCESS(Status))
- {
- return TRUE;
- }
- SetLastErrorByStatus (Status);
+ SetLastErrorByStatus(Status);
+ return(FALSE);
}
- return FALSE;
+
+ return(TRUE);
}
-DWORD STDCALL SuspendThread(HANDLE hThread)
+DWORD STDCALL
+SuspendThread(HANDLE hThread)
{
- NTSTATUS errCode;
- ULONG PreviousSuspendCount;
-
- errCode = NtSuspendThread(hThread,
- &PreviousSuspendCount);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return -1;
- }
- return PreviousSuspendCount;
+ ULONG PreviousSuspendCount;
+ NTSTATUS Status;
+
+ Status = NtSuspendThread(hThread,
+ &PreviousSuspendCount);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(-1);
+ }
+
+ return(PreviousSuspendCount);
}
-DWORD STDCALL SetThreadAffinityMask(HANDLE hThread,
- DWORD dwThreadAffinityMask)
+
+DWORD STDCALL
+SetThreadAffinityMask(HANDLE hThread,
+ DWORD dwThreadAffinityMask)
{
- return 0;
+ THREAD_BASIC_INFORMATION ThreadBasic;
+ KAFFINITY AffinityMask;
+ ULONG DataWritten;
+ NTSTATUS Status;
+
+ AffinityMask = (KAFFINITY)dwThreadAffinityMask;
+
+ Status = NtQueryInformationThread(hThread,
+ ThreadBasicInformation,
+ &ThreadBasic,
+ sizeof(THREAD_BASIC_INFORMATION),
+ &DataWritten);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(0);
+ }
+
+ Status = NtSetInformationThread(hThread,
+ ThreadAffinityMask,
+ &AffinityMask,
+ sizeof(KAFFINITY));
+ if (!NT_SUCCESS(Status))
+ SetLastErrorByStatus(Status);
+
+ return(ThreadBasic.AffinityMask);
}
-WINBOOL STDCALL SetThreadPriority(HANDLE hThread,
- int nPriority)
+
+WINBOOL STDCALL
+SetThreadPriority(HANDLE hThread,
+ int nPriority)
{
- NTSTATUS errCode;
- THREAD_BASIC_INFORMATION ThreadBasic;
- ULONG DataWritten;
-
- errCode = NtQueryInformationThread(hThread,
- ThreadBasicInformation,
- &ThreadBasic,
- sizeof(THREAD_BASIC_INFORMATION),
- &DataWritten);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return FALSE;
- }
- ThreadBasic.BasePriority = nPriority;
- errCode = NtSetInformationThread(hThread,
+ THREAD_BASIC_INFORMATION ThreadBasic;
+ ULONG DataWritten;
+ NTSTATUS Status;
+
+ Status = NtQueryInformationThread(hThread,
ThreadBasicInformation,
&ThreadBasic,
- sizeof(THREAD_BASIC_INFORMATION));
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return FALSE;
- }
- return TRUE;
+ sizeof(THREAD_BASIC_INFORMATION),
+ &DataWritten);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+
+ ThreadBasic.BasePriority = nPriority;
+
+ Status = NtSetInformationThread(hThread,
+ ThreadBasicInformation,
+ &ThreadBasic,
+ sizeof(THREAD_BASIC_INFORMATION));
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(FALSE);
+ }
+
+ return(TRUE);
}
-int STDCALL GetThreadPriority(HANDLE hThread)
+
+int STDCALL
+GetThreadPriority(HANDLE hThread)
{
- NTSTATUS errCode;
- THREAD_BASIC_INFORMATION ThreadBasic;
- ULONG DataWritten;
-
- errCode = NtQueryInformationThread(hThread,
- ThreadBasicInformation,
- &ThreadBasic,
- sizeof(THREAD_BASIC_INFORMATION),
- &DataWritten);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus(errCode);
- return THREAD_PRIORITY_ERROR_RETURN;
- }
- return ThreadBasic.BasePriority;
+ THREAD_BASIC_INFORMATION ThreadBasic;
+ ULONG DataWritten;
+ NTSTATUS Status;
+
+ Status = NtQueryInformationThread(hThread,
+ ThreadBasicInformation,
+ &ThreadBasic,
+ sizeof(THREAD_BASIC_INFORMATION),
+ &DataWritten);
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastErrorByStatus(Status);
+ return(THREAD_PRIORITY_ERROR_RETURN);
+ }
+
+ return(ThreadBasic.BasePriority);
}
/* EOF */