Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Misc Toolhelp functions |
| 3 | * |
| 4 | * Copyright 1996 Marcus Meissner |
| 5 | */ |
| 6 | |
| 7 | #include <stdlib.h> |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 8 | #include <string.h> |
| 9 | #include <unistd.h> |
| 10 | #include <ctype.h> |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 11 | #include <assert.h> |
Marcus Meissner | 04c3e1d | 1999-02-19 10:37:02 +0000 | [diff] [blame] | 12 | #include "winbase.h" |
| 13 | #include "wine/winbase16.h" |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 14 | #include "winerror.h" |
Alexandre Julliard | 6b14117 | 2000-07-31 21:01:05 +0000 | [diff] [blame] | 15 | #include "local.h" |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 16 | #include "tlhelp32.h" |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 17 | #include "toolhelp.h" |
Alexandre Julliard | 37e9503 | 2001-07-19 00:39:09 +0000 | [diff] [blame] | 18 | #include "wine/server.h" |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 19 | #include "debugtools.h" |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 20 | |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 21 | DEFAULT_DEBUG_CHANNEL(toolhelp); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 22 | |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 23 | |
Francois Gouget | 070e749 | 2001-11-06 21:01:32 +0000 | [diff] [blame] | 24 | /* FIXME: to make this work, we have to call back all these registered |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 25 | * functions from all over the WINE code. Someone with more knowledge than |
| 26 | * me please do that. -Marcus |
| 27 | */ |
| 28 | static struct notify |
| 29 | { |
Alexandre Julliard | bf9130a | 1996-10-13 17:45:47 +0000 | [diff] [blame] | 30 | HTASK16 htask; |
Alexandre Julliard | 18f92e7 | 1996-07-17 20:02:21 +0000 | [diff] [blame] | 31 | FARPROC16 lpfnCallback; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 32 | WORD wFlags; |
| 33 | } *notifys = NULL; |
| 34 | |
| 35 | static int nrofnotifys = 0; |
| 36 | |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 37 | static FARPROC16 HookNotify = NULL; |
| 38 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 39 | /*********************************************************************** |
Patrik Stridvall | 01d5e5b | 2001-07-02 19:59:40 +0000 | [diff] [blame] | 40 | * NotifyRegister (TOOLHELP.73) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 41 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 42 | BOOL16 WINAPI NotifyRegister16( HTASK16 htask, FARPROC16 lpfnCallback, |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 43 | WORD wFlags ) |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 44 | { |
| 45 | int i; |
| 46 | |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 47 | FIXME("(%x,%lx,%x), semi-stub.\n", |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 48 | htask, (DWORD)lpfnCallback, wFlags ); |
Alexandre Julliard | 03468f7 | 1998-02-15 19:40:49 +0000 | [diff] [blame] | 49 | if (!htask) htask = GetCurrentTask(); |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 50 | for (i=0;i<nrofnotifys;i++) |
| 51 | if (notifys[i].htask==htask) |
| 52 | break; |
| 53 | if (i==nrofnotifys) { |
| 54 | if (notifys==NULL) |
Alexandre Julliard | 90476d6 | 2000-02-16 22:47:24 +0000 | [diff] [blame] | 55 | notifys=(struct notify*)HeapAlloc( GetProcessHeap(), 0, |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 56 | sizeof(struct notify) ); |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 57 | else |
Alexandre Julliard | 90476d6 | 2000-02-16 22:47:24 +0000 | [diff] [blame] | 58 | notifys=(struct notify*)HeapReAlloc( GetProcessHeap(), 0, notifys, |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 59 | sizeof(struct notify)*(nrofnotifys+1)); |
| 60 | if (!notifys) return FALSE; |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 61 | nrofnotifys++; |
| 62 | } |
| 63 | notifys[i].htask=htask; |
| 64 | notifys[i].lpfnCallback=lpfnCallback; |
| 65 | notifys[i].wFlags=wFlags; |
| 66 | return TRUE; |
| 67 | } |
| 68 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 69 | /*********************************************************************** |
Patrik Stridvall | 01d5e5b | 2001-07-02 19:59:40 +0000 | [diff] [blame] | 70 | * NotifyUnregister (TOOLHELP.74) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 71 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 72 | BOOL16 WINAPI NotifyUnregister16( HTASK16 htask ) |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 73 | { |
| 74 | int i; |
| 75 | |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 76 | FIXME("(%x), semi-stub.\n", htask ); |
Alexandre Julliard | 03468f7 | 1998-02-15 19:40:49 +0000 | [diff] [blame] | 77 | if (!htask) htask = GetCurrentTask(); |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 78 | for (i=nrofnotifys;i--;) |
| 79 | if (notifys[i].htask==htask) |
| 80 | break; |
| 81 | if (i==-1) |
| 82 | return FALSE; |
| 83 | memcpy(notifys+i,notifys+(i+1),sizeof(struct notify)*(nrofnotifys-i-1)); |
Alexandre Julliard | 90476d6 | 2000-02-16 22:47:24 +0000 | [diff] [blame] | 84 | notifys=(struct notify*)HeapReAlloc( GetProcessHeap(), 0, notifys, |
Alexandre Julliard | 491502b | 1997-11-01 19:08:16 +0000 | [diff] [blame] | 85 | (nrofnotifys-1)*sizeof(struct notify)); |
Alexandre Julliard | 7e56f68 | 1996-01-31 19:02:28 +0000 | [diff] [blame] | 86 | nrofnotifys--; |
| 87 | return TRUE; |
| 88 | } |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 89 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 90 | /*********************************************************************** |
Patrik Stridvall | 0c61028 | 2001-01-25 22:22:21 +0000 | [diff] [blame] | 91 | * StackTraceCSIPFirst (TOOLHELP.67) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 92 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 93 | BOOL16 WINAPI StackTraceCSIPFirst16(STACKTRACEENTRY *ste, WORD wSS, WORD wCS, WORD wIP, WORD wBP) |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 94 | { |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 95 | FIXME("(%p, ss %04x, cs %04x, ip %04x, bp %04x): stub.\n", ste, wSS, wCS, wIP, wBP); |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 96 | return TRUE; |
| 97 | } |
| 98 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 99 | /*********************************************************************** |
Patrik Stridvall | 0c61028 | 2001-01-25 22:22:21 +0000 | [diff] [blame] | 100 | * StackTraceFirst (TOOLHELP.66) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 101 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 102 | BOOL16 WINAPI StackTraceFirst16(STACKTRACEENTRY *ste, HTASK16 Task) |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 103 | { |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 104 | FIXME("(%p, %04x), stub.\n", ste, Task); |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 105 | return TRUE; |
| 106 | } |
| 107 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 108 | /*********************************************************************** |
Patrik Stridvall | 0c61028 | 2001-01-25 22:22:21 +0000 | [diff] [blame] | 109 | * StackTraceNext (TOOLHELP.68) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 110 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 111 | BOOL16 WINAPI StackTraceNext16(STACKTRACEENTRY *ste) |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 112 | { |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 113 | FIXME("(%p), stub.\n", ste); |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 114 | return TRUE; |
| 115 | } |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 116 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 117 | /*********************************************************************** |
Patrik Stridvall | 0c61028 | 2001-01-25 22:22:21 +0000 | [diff] [blame] | 118 | * InterruptRegister (TOOLHELP.75) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 119 | */ |
Alexandre Julliard | 4220b29 | 1999-07-11 17:20:01 +0000 | [diff] [blame] | 120 | BOOL16 WINAPI InterruptRegister16( HTASK16 task, FARPROC callback ) |
| 121 | { |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 122 | FIXME("(%04x, %p), stub.\n", task, callback); |
Alexandre Julliard | 4220b29 | 1999-07-11 17:20:01 +0000 | [diff] [blame] | 123 | return TRUE; |
| 124 | } |
| 125 | |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 126 | /*********************************************************************** |
Patrik Stridvall | 0c61028 | 2001-01-25 22:22:21 +0000 | [diff] [blame] | 127 | * InterruptUnRegister (TOOLHELP.76) |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 128 | */ |
Alexandre Julliard | 4220b29 | 1999-07-11 17:20:01 +0000 | [diff] [blame] | 129 | BOOL16 WINAPI InterruptUnRegister16( HTASK16 task ) |
| 130 | { |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 131 | FIXME("(%04x), stub.\n", task); |
Alexandre Julliard | 4220b29 | 1999-07-11 17:20:01 +0000 | [diff] [blame] | 132 | return TRUE; |
| 133 | } |
| 134 | |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 135 | /*********************************************************************** |
Alexandre Julliard | 6b14117 | 2000-07-31 21:01:05 +0000 | [diff] [blame] | 136 | * TimerCount (TOOLHELP.80) |
| 137 | */ |
| 138 | BOOL16 WINAPI TimerCount16( TIMERINFO *pTimerInfo ) |
| 139 | { |
| 140 | /* FIXME |
| 141 | * In standard mode, dwmsSinceStart = dwmsThisVM |
| 142 | * |
| 143 | * I tested this, under Windows in enhanced mode, and |
| 144 | * if you never switch VM (ie start/stop DOS) these |
| 145 | * values should be the same as well. |
| 146 | * |
| 147 | * Also, Wine should adjust for the hardware timer |
| 148 | * to reduce the amount of error to ~1ms. |
| 149 | * I can't be bothered, can you? |
| 150 | */ |
| 151 | pTimerInfo->dwmsSinceStart = pTimerInfo->dwmsThisVM = GetTickCount(); |
| 152 | return TRUE; |
| 153 | } |
| 154 | |
| 155 | /*********************************************************************** |
| 156 | * SystemHeapInfo (TOOLHELP.71) |
| 157 | */ |
| 158 | BOOL16 WINAPI SystemHeapInfo16( SYSHEAPINFO *pHeapInfo ) |
| 159 | { |
| 160 | WORD user = LoadLibrary16( "USER.EXE" ); |
| 161 | WORD gdi = LoadLibrary16( "GDI.EXE" ); |
| 162 | pHeapInfo->wUserFreePercent = (int)LOCAL_CountFree(user) * 100 / LOCAL_HeapSize(user); |
| 163 | pHeapInfo->wGDIFreePercent = (int)LOCAL_CountFree(gdi) * 100 / LOCAL_HeapSize(gdi); |
| 164 | pHeapInfo->hUserSegment = user; |
| 165 | pHeapInfo->hGDISegment = gdi; |
| 166 | FreeLibrary16( user ); |
| 167 | FreeLibrary16( gdi ); |
| 168 | return TRUE; |
| 169 | } |
| 170 | |
| 171 | |
| 172 | /*********************************************************************** |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 173 | * ToolHelpHook (KERNEL.341) |
| 174 | * see "Undocumented Windows" |
| 175 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 176 | FARPROC16 WINAPI ToolHelpHook16(FARPROC16 lpfnNotifyHandler) |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 177 | { |
Andreas Mohr | 92dcad8 | 2000-09-22 20:51:09 +0000 | [diff] [blame] | 178 | FARPROC16 tmp; |
| 179 | |
| 180 | FIXME("(%p), stub.\n", lpfnNotifyHandler); |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 181 | tmp = HookNotify; |
| 182 | HookNotify = lpfnNotifyHandler; |
| 183 | /* just return previously installed notification function */ |
| 184 | return tmp; |
| 185 | } |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 186 | |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 187 | |
| 188 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 189 | * CreateToolhelp32Snapshot (KERNEL32.@) |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 190 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 191 | HANDLE WINAPI CreateToolhelp32Snapshot( DWORD flags, DWORD process ) |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 192 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 193 | HANDLE ret; |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 194 | |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 195 | TRACE("%lx,%lx\n", flags, process ); |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 196 | if (!(flags & (TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE))) |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 197 | { |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 198 | FIXME("flags %lx not implemented\n", flags ); |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 199 | SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 200 | return INVALID_HANDLE_VALUE; |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 201 | } |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 202 | |
Alexandre Julliard | 96c08d8 | 1999-02-28 13:27:56 +0000 | [diff] [blame] | 203 | /* Now do the snapshot */ |
Alexandre Julliard | 67a7499 | 2001-02-27 02:09:16 +0000 | [diff] [blame] | 204 | SERVER_START_REQ( create_snapshot ) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 205 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 206 | req->flags = flags & ~TH32CS_INHERIT; |
| 207 | req->inherit = (flags & TH32CS_INHERIT) != 0; |
| 208 | req->pid = (void *)process; |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 209 | wine_server_call_err( req ); |
| 210 | ret = reply->handle; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 211 | } |
| 212 | SERVER_END_REQ; |
Alexandre Julliard | 8081e5a | 2001-01-05 04:08:07 +0000 | [diff] [blame] | 213 | if (!ret) ret = INVALID_HANDLE_VALUE; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 214 | return ret; |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 215 | } |
| 216 | |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 217 | |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 218 | /*********************************************************************** |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 219 | * TOOLHELP_Thread32Next |
| 220 | * |
| 221 | * Implementation of Thread32First/Next |
| 222 | */ |
| 223 | static BOOL TOOLHELP_Thread32Next( HANDLE handle, LPTHREADENTRY32 lpte, BOOL first ) |
| 224 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 225 | BOOL ret; |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 226 | |
| 227 | if (lpte->dwSize < sizeof(THREADENTRY32)) |
| 228 | { |
| 229 | SetLastError( ERROR_INSUFFICIENT_BUFFER ); |
| 230 | ERR("Result buffer too small (req: %d, was: %ld)\n", sizeof(THREADENTRY32), lpte->dwSize); |
| 231 | return FALSE; |
| 232 | } |
Alexandre Julliard | 67a7499 | 2001-02-27 02:09:16 +0000 | [diff] [blame] | 233 | SERVER_START_REQ( next_thread ) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 234 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 235 | req->handle = handle; |
| 236 | req->reset = first; |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 237 | if ((ret = !wine_server_call_err( req ))) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 238 | { |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 239 | lpte->cntUsage = reply->count; |
| 240 | lpte->th32ThreadID = (DWORD)reply->tid; |
| 241 | lpte->th32OwnerProcessID = (DWORD)reply->pid; |
| 242 | lpte->tpBasePri = reply->base_pri; |
| 243 | lpte->tpDeltaPri = reply->delta_pri; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 244 | lpte->dwFlags = 0; /* SDK: "reserved; do not use" */ |
| 245 | } |
| 246 | } |
| 247 | SERVER_END_REQ; |
| 248 | return ret; |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 249 | } |
| 250 | |
| 251 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 252 | * Thread32First (KERNEL32.@) |
Andreas Mohr | f4077e6 | 1999-12-05 23:11:10 +0000 | [diff] [blame] | 253 | * |
| 254 | * Return info about the first thread in a toolhelp32 snapshot |
| 255 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 256 | BOOL WINAPI Thread32First(HANDLE hSnapshot, LPTHREADENTRY32 lpte) |
Andreas Mohr | f4077e6 | 1999-12-05 23:11:10 +0000 | [diff] [blame] | 257 | { |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 258 | return TOOLHELP_Thread32Next(hSnapshot, lpte, TRUE); |
Andreas Mohr | f4077e6 | 1999-12-05 23:11:10 +0000 | [diff] [blame] | 259 | } |
| 260 | |
| 261 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 262 | * Thread32Next (KERNEL32.@) |
Andreas Mohr | f4077e6 | 1999-12-05 23:11:10 +0000 | [diff] [blame] | 263 | * |
| 264 | * Return info about the "next" thread in a toolhelp32 snapshot |
| 265 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 266 | BOOL WINAPI Thread32Next(HANDLE hSnapshot, LPTHREADENTRY32 lpte) |
Andreas Mohr | f4077e6 | 1999-12-05 23:11:10 +0000 | [diff] [blame] | 267 | { |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 268 | return TOOLHELP_Thread32Next(hSnapshot, lpte, FALSE); |
Andreas Mohr | f4077e6 | 1999-12-05 23:11:10 +0000 | [diff] [blame] | 269 | } |
| 270 | |
| 271 | /*********************************************************************** |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 272 | * TOOLHELP_Process32Next |
| 273 | * |
| 274 | * Implementation of Process32First/Next |
| 275 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 276 | static BOOL TOOLHELP_Process32Next( HANDLE handle, LPPROCESSENTRY32 lppe, BOOL first ) |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 277 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 278 | BOOL ret; |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 279 | |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 280 | if (lppe->dwSize < sizeof(PROCESSENTRY32)) |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 281 | { |
| 282 | SetLastError( ERROR_INSUFFICIENT_BUFFER ); |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 283 | ERR("Result buffer too small (req: %d, was: %ld)\n", sizeof(PROCESSENTRY32), lppe->dwSize); |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 284 | return FALSE; |
| 285 | } |
Alexandre Julliard | 67a7499 | 2001-02-27 02:09:16 +0000 | [diff] [blame] | 286 | SERVER_START_REQ( next_process ) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 287 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 288 | req->handle = handle; |
| 289 | req->reset = first; |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 290 | if ((ret = !wine_server_call_err( req ))) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 291 | { |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 292 | lppe->cntUsage = reply->count; |
| 293 | lppe->th32ProcessID = (DWORD)reply->pid; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 294 | lppe->th32DefaultHeapID = 0; /* FIXME */ |
| 295 | lppe->th32ModuleID = 0; /* FIXME */ |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 296 | lppe->cntThreads = reply->threads; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 297 | lppe->th32ParentProcessID = 0; /* FIXME */ |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 298 | lppe->pcPriClassBase = reply->priority; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 299 | lppe->dwFlags = -1; /* FIXME */ |
| 300 | lppe->szExeFile[0] = 0; /* FIXME */ |
| 301 | } |
| 302 | } |
| 303 | SERVER_END_REQ; |
| 304 | return ret; |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 305 | } |
| 306 | |
| 307 | |
| 308 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 309 | * Process32First (KERNEL32.@) |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 310 | * |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 311 | * Return info about the first process in a toolhelp32 snapshot |
| 312 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 313 | BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe) |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 314 | { |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 315 | return TOOLHELP_Process32Next( hSnapshot, lppe, TRUE ); |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 316 | } |
| 317 | |
| 318 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 319 | * Process32Next (KERNEL32.@) |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 320 | * |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 321 | * Return info about the "next" process in a toolhelp32 snapshot |
| 322 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 323 | BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe) |
Patrick Spinler | 3f8e1e4 | 1998-12-11 15:04:11 +0000 | [diff] [blame] | 324 | { |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 325 | return TOOLHELP_Process32Next( hSnapshot, lppe, FALSE ); |
Alexandre Julliard | ebfc0fe | 1998-06-28 18:40:26 +0000 | [diff] [blame] | 326 | } |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 327 | |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 328 | |
| 329 | /*********************************************************************** |
| 330 | * TOOLHELP_Module32Next |
| 331 | * |
| 332 | * Implementation of Module32First/Next |
| 333 | */ |
| 334 | static BOOL TOOLHELP_Module32Next( HANDLE handle, LPMODULEENTRY32 lpme, BOOL first ) |
| 335 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 336 | BOOL ret; |
| 337 | |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 338 | if (lpme->dwSize < sizeof (MODULEENTRY32)) |
| 339 | { |
| 340 | SetLastError( ERROR_INSUFFICIENT_BUFFER ); |
| 341 | ERR("Result buffer too small (req: %d, was: %ld)\n", sizeof(MODULEENTRY32), lpme->dwSize); |
| 342 | return FALSE; |
| 343 | } |
Alexandre Julliard | 67a7499 | 2001-02-27 02:09:16 +0000 | [diff] [blame] | 344 | SERVER_START_REQ( next_module ) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 345 | { |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 346 | req->handle = handle; |
| 347 | req->reset = first; |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 348 | if ((ret = !wine_server_call_err( req ))) |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 349 | { |
| 350 | lpme->th32ModuleID = 0; /* toolhelp internal id, never used */ |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 351 | lpme->th32ProcessID = (DWORD)reply->pid; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 352 | lpme->GlblcntUsage = 0; /* FIXME */ |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 353 | lpme->ProccntUsage = 0; /* FIXME */ |
| 354 | lpme->modBaseAddr = reply->base; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 355 | lpme->modBaseSize = 0; /* FIXME */ |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 356 | lpme->hModule = (DWORD)reply->base; |
Alexandre Julliard | 9c2370b | 2000-08-30 00:00:48 +0000 | [diff] [blame] | 357 | lpme->szModule[0] = 0; /* FIXME */ |
| 358 | lpme->szExePath[0] = 0; /* FIXME */ |
| 359 | } |
| 360 | } |
| 361 | SERVER_END_REQ; |
| 362 | return ret; |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 363 | } |
| 364 | |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 365 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 366 | * Module32First (KERNEL32.@) |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 367 | * |
| 368 | * Return info about the "first" module in a toolhelp32 snapshot |
| 369 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 370 | BOOL WINAPI Module32First(HANDLE hSnapshot, LPMODULEENTRY32 lpme) |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 371 | { |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 372 | return TOOLHELP_Module32Next( hSnapshot, lpme, TRUE ); |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 373 | } |
| 374 | |
| 375 | /*********************************************************************** |
Patrik Stridvall | dae8de6 | 2001-06-13 20:13:18 +0000 | [diff] [blame] | 376 | * Module32Next (KERNEL32.@) |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 377 | * |
| 378 | * Return info about the "next" module in a toolhelp32 snapshot |
| 379 | */ |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 380 | BOOL WINAPI Module32Next(HANDLE hSnapshot, LPMODULEENTRY32 lpme) |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 381 | { |
Alexandre Julliard | 07d8446 | 2000-04-16 19:45:05 +0000 | [diff] [blame] | 382 | return TOOLHELP_Module32Next( hSnapshot, lpme, FALSE ); |
Marcus Meissner | e3e268e | 1999-03-18 17:29:40 +0000 | [diff] [blame] | 383 | } |
Uwe Bonnes | 2df1afd | 1999-04-25 09:22:13 +0000 | [diff] [blame] | 384 | |
| 385 | /************************************************************************ |
Patrik Stridvall | 01d5e5b | 2001-07-02 19:59:40 +0000 | [diff] [blame] | 386 | * GlobalMasterHandle (KERNEL.28) |
Uwe Bonnes | 2df1afd | 1999-04-25 09:22:13 +0000 | [diff] [blame] | 387 | * |
| 388 | * |
| 389 | * Should return selector and handle of the information structure for |
| 390 | * the global heap. selector and handle are stored in the THHOOK as |
| 391 | * pGlobalHeap and hGlobalHeap. |
| 392 | * As Wine doesn't have this structure, we return both values as zero |
| 393 | * Applications should interpret this as "No Global Heap" |
| 394 | */ |
| 395 | DWORD WINAPI GlobalMasterHandle16(void) |
| 396 | { |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 397 | FIXME(": stub\n"); |
Uwe Bonnes | 2df1afd | 1999-04-25 09:22:13 +0000 | [diff] [blame] | 398 | return 0; |
| 399 | } |