source: trunk/src/kernel32/thread.cpp@ 2115

Last change on this file since 2115 was 2115, checked in by sandervl, 26 years ago

EB's changes for GetThreadContext + Read/WriteProcessMemory

File size: 8.5 KB
Line 
1/* $Id: thread.cpp,v 1.19 1999-12-18 17:17:55 sandervl Exp $ */
2
3/*
4 * Win32 Thread API functions
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12
13/*****************************************************************************
14 * Includes *
15 *****************************************************************************/
16
17#include <odin.h>
18#include <odinwrap.h>
19#include <os2sel.h>
20
21#include <os2win.h>
22#include <stdarg.h>
23#include <string.h>
24#include "thread.h"
25#include "exceptutil.h"
26#include <misc.h>
27#include <wprocess.h>
28#include <windllbase.h>
29#include <winexebase.h>
30#include "exceptutil.h"
31
32ODINDEBUGCHANNEL(KERNEL32-THREAD)
33
34
35static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
36
37
38//******************************************************************************
39//******************************************************************************
40ODINFUNCTION6(HANDLE,CreateThread,LPSECURITY_ATTRIBUTES, lpsa,
41 DWORD, cbStack,
42 LPTHREAD_START_ROUTINE, lpStartAddr,
43 LPVOID, lpvThreadParm,
44 DWORD, fdwCreate,
45 LPDWORD, lpIDThread)
46{
47 Win32Thread *winthread;
48
49 winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate);
50
51 if(winthread == 0)
52 return(0);
53
54#ifdef DEBUG
55 // @@@PH Note: with debug code enabled, ODIN might request more stack space!
56 if (cbStack > 0)
57 cbStack <<= 1; // double stack
58 else
59 cbStack = 1048576; // per default 1MB stack per thread
60#endif
61
62 return(O32_CreateThread(lpsa,
63 cbStack,
64 winthread->GetOS2Callback(),
65 (LPVOID)winthread,
66 fdwCreate,
67 lpIDThread));
68}
69//******************************************************************************
70//******************************************************************************
71DWORD WIN32API GetCurrentThreadId()
72{
73//// dprintf(("GetCurrentThreadId\n"));
74 return(O32_GetCurrentThreadId());
75}
76//******************************************************************************
77//******************************************************************************
78HANDLE WIN32API GetCurrentThread()
79{
80//// dprintf(("GetCurrentThread\n"));
81 return(O32_GetCurrentThread());
82}
83//******************************************************************************
84//******************************************************************************
85BOOL WIN32API GetExitCodeThread(HANDLE hThread, LPDWORD arg2)
86{
87 dprintf(("GetExitCodeThread (%08xh,%08xh)\n",
88 hThread,
89 arg2));
90
91 return O32_GetExitCodeThread(hThread, arg2);
92}
93//******************************************************************************
94//******************************************************************************
95BOOL WIN32API TerminateThread(HANDLE hThread, DWORD arg2)
96{
97 dprintf(("TerminateThread (%08xh,%08xh)\n",
98 hThread,
99 arg2));
100
101 return O32_TerminateThread(hThread, arg2);
102}
103//******************************************************************************
104//******************************************************************************
105DWORD WIN32API ResumeThread(HANDLE hThread)
106{
107 dprintf(("ResumeThread (%08xh)\n",
108 hThread));
109
110 return O32_ResumeThread(hThread);
111}
112//******************************************************************************
113//******************************************************************************
114INT WIN32API GetThreadPriority(HANDLE hThread)
115{
116 dprintf(("OS2GetThreadPriority(%08xh)\n",
117 hThread));
118
119 return O32_GetThreadPriority(hThread);
120}
121//******************************************************************************
122//******************************************************************************
123DWORD WIN32API SuspendThread(HANDLE hThread)
124{
125 dprintf(("OS2SuspendThread %08xh)\n",
126 hThread));
127
128 return O32_SuspendThread(hThread);
129}
130//******************************************************************************
131//******************************************************************************
132BOOL WIN32API SetThreadPriority(HANDLE hThread, int priority)
133{
134 dprintf(("OS2SetThreadPriority (%08xh,%08xh)\n",
135 hThread,
136 priority));
137
138 return O32_SetThreadPriority(hThread, priority);
139}
140//******************************************************************************
141//TODO: Implement this??
142//******************************************************************************
143BOOL WIN32API GetThreadContext(HANDLE hThread, PCONTEXT lpContext)
144{
145 USHORT cs, ds;
146
147 dprintf(("GetThreadContext NOT IMPLEMENTED!! (TRUE)\n"));
148 memset(lpContext, 0, sizeof(CONTEXT));
149
150 /* make up some plausible values for segment registers */
151 cs = getCS();
152 ds = getDS();
153 lpContext->SegCs = cs;
154 lpContext->SegDs = ds;
155 lpContext->SegEs = ds;
156 lpContext->SegGs = ds;
157 lpContext->SegSs = ds;
158 lpContext->SegFs = ds;
159
160 return TRUE;
161}
162//******************************************************************************
163//TODO: Implement this??
164//******************************************************************************
165BOOL WIN32API SetThreadContext(HANDLE hThread, const CONTEXT *lpContext)
166{
167 dprintf(("SetThreadContext NOT IMPLEMENTED!!\n"));
168
169 return FALSE;
170}
171//******************************************************************************
172//******************************************************************************
173VOID WIN32API ExitThread(DWORD exitcode)
174{
175 dprintf(("ExitThread (%08xu)\n",
176 exitcode));
177
178 Win32DllBase::detachThreadFromAllDlls(); //send DLL_THREAD_DETACH message to all dlls
179 Win32DllBase::tlsDetachThreadFromAllDlls(); //destroy TLS structures of all dlls
180 WinExe->tlsDetachThread(); //destroy TLS structure of main exe
181 DestroyTIB();
182 O32_ExitThread(exitcode);
183}
184//******************************************************************************
185//******************************************************************************
186Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags)
187{
188 lpUserData = lpData;
189 pCallback = pUserCallback;
190 this->dwFlags = dwFlags;
191}
192//******************************************************************************
193//******************************************************************************
194Win32Thread::~Win32Thread()
195{
196
197}
198//******************************************************************************
199//******************************************************************************
200PTHREAD_START_ROUTINE_O32 Win32Thread::GetOS2Callback()
201{
202 return Win32ThreadProc;
203}
204//******************************************************************************
205//******************************************************************************
206static DWORD OPEN32API Win32ThreadProc(LPVOID lpData)
207{
208 EXCEPTION_FRAME exceptFrame;
209 Win32Thread *me = (Win32Thread *)lpData;
210 WIN32THREADPROC winthread = me->pCallback;
211 LPVOID userdata = me->lpUserData;
212 DWORD rc;
213
214 delete(me); //only called once
215 dprintf(("Win32ThreadProc %d\n", GetCurrentThreadId()));
216
217 TEB *winteb = (TEB *)InitializeTIB();
218 if(winteb == NULL) {
219 dprintf(("Win32ThreadProc: InitializeTIB failed!!"));
220 DebugInt3();
221 return 0;
222 }
223 winteb->flags = me->dwFlags;
224
225 THDB *thdb = (THDB *)(winteb+1);
226 thdb->entry_point = (void *)winthread;
227 thdb->entry_arg = (void *)userdata;
228
229 //Note: The Win32 exception structure referenced by FS:[0] is the same
230 // in OS/2
231 OS2SetExceptionHandler((void *)&exceptFrame);
232
233 SetWin32TIB();
234 WinExe->tlsAttachThread(); //setup TLS structure of main exe
235 Win32DllBase::tlsAttachThreadToAllDlls(); //setup TLS structures of all dlls
236 Win32DllBase::attachThreadToAllDlls(); //send DLL_THREAD_ATTACH message to all dlls
237
238 rc = winthread(userdata);
239
240 Win32DllBase::detachThreadFromAllDlls(); //send DLL_THREAD_DETACH message to all dlls
241 Win32DllBase::tlsDetachThreadFromAllDlls(); //destroy TLS structures of all dlls
242 WinExe->tlsDetachThread(); //destroy TLS structure of main exe
243 DestroyTIB();
244 OS2UnsetExceptionHandler((void *)&exceptFrame);
245
246 return rc;
247}
248//******************************************************************************
249//******************************************************************************
Note: See TracBrowser for help on using the repository browser.