ReactOS  0.4.13-dev-92-gf251225
toolhelp.c File Reference
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "tlhelp32.h"
#include "wine/test.h"
#include "winuser.h"
Include dependency graph for toolhelp.c:

Go to the source code of this file.

Macros

#define WAIT_TIME   (60 * 1000)
 
#define NUM_OF(x)   (sizeof(x) / sizeof(x[0]))
 

Functions

static HANDLE (WINAPI *pCreateToolhelp32Snapshot)(DWORD
 
static BOOL (WINAPI *pModule32First)(HANDLE
 
static DWORD WINAPI sub_thread (void *pmt)
 
static int init (void)
 
static void test_process (DWORD curr_pid, DWORD sub_pcs_pid)
 
static void test_thread (DWORD curr_pid, DWORD sub_pcs_pid)
 
static void test_module (DWORD pid, const char *expected[], unsigned num_expected)
 
 START_TEST (toolhelp)
 

Variables

static char selfname [MAX_PATH]
 
static DWORD
 
static LPMODULEENTRY32
 
static LPPROCESSENTRY32
 
static LPTHREADENTRY32
 
static const charcurr_expected_modules []
 
static const charsub_expected_modules []
 

Macro Definition Documentation

◆ NUM_OF

#define NUM_OF (   x)    (sizeof(x) / sizeof(x[0]))

Definition at line 220 of file toolhelp.c.

◆ WAIT_TIME

#define WAIT_TIME   (60 * 1000)

Definition at line 43 of file toolhelp.c.

Function Documentation

◆ BOOL()

static BOOL ( WINAPI pModule32First)
static

◆ HANDLE()

static HANDLE ( WINAPI pCreateToolhelp32Snapshot)
static

Referenced by Heap32First(), and init().

◆ init()

static int init ( void  )
static

Definition at line 61 of file toolhelp.c.

62 {
63  int argc;
64  char** argv;
65  HANDLE ev1, ev2, ev3, hThread;
66  DWORD w, tid;
67 
69  strcpy(selfname, argv[0]);
70 
71  switch (argc)
72  {
73  case 2: /* the test program */
74  return 0;
75  case 4: /* the sub-process */
76  ev1 = (HANDLE)(INT_PTR)atoi(argv[2]);
77  ev2 = (HANDLE)(INT_PTR)atoi(argv[3]);
78  ev3 = CreateEventW(NULL, FALSE, FALSE, NULL);
79 
80  if (ev3 == NULL) ExitProcess(WAIT_ABANDONED);
81  hThread = CreateThread(NULL, 0, sub_thread, ev3, 0, &tid);
83  if (!LoadLibraryA("shell32.dll")) ExitProcess(WAIT_ABANDONED);
84 
85  /* signal init of sub-process is done */
86  SetEvent(ev1);
87  /* wait for parent to have done all its queries */
89  if (w != WAIT_OBJECT_0) ExitProcess(w);
90  /* signal sub-thread to terminate */
91  SetEvent(ev3);
93  if (w != WAIT_OBJECT_0) ExitProcess(w);
95  ExitProcess(w);
96  default:
97  return -1;
98  }
99 }
static DWORD WINAPI sub_thread(void *pmt)
Definition: toolhelp.c:45
static int argc
Definition: ServiceArgs.c:12
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
#define WAIT_ABANDONED
Definition: winbase.h:393
static char selfname[MAX_PATH]
Definition: toolhelp.c:31
VOID WINAPI ExitProcess(IN UINT uExitCode)
Definition: proc.c:1517
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
int32_t INT_PTR
Definition: typedefs.h:62
#define argv
Definition: mplay32.c:18
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:597
BOOL WINAPI GetExitCodeThread(IN HANDLE hThread, OUT LPDWORD lpExitCode)
Definition: thread.c:503
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:112
smooth NULL
Definition: ftsmooth.c:416
#define WAIT_OBJECT_0
Definition: winbase.h:387
static HANDLE(WINAPI *pCreateToolhelp32Snapshot)(DWORD
unsigned long DWORD
Definition: ntddk_ex.h:95
int winetest_get_mainargs(char ***pargv)
HANDLE hThread
Definition: wizard.c:27
#define WAIT_TIME
Definition: toolhelp.c:43
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
static TfClientId tid

Referenced by START_TEST().

◆ START_TEST()

START_TEST ( toolhelp  )

Definition at line 284 of file toolhelp.c.

285 {
287  int r;
288  char *p, module[MAX_PATH];
289  char buffer[MAX_PATH];
293  HANDLE ev1, ev2;
294  DWORD w;
295  HANDLE hkernel32 = GetModuleHandleA("kernel32");
296 
297  pCreateToolhelp32Snapshot = (VOID *) GetProcAddress(hkernel32, "CreateToolhelp32Snapshot");
298  pModule32First = (VOID *) GetProcAddress(hkernel32, "Module32First");
299  pModule32Next = (VOID *) GetProcAddress(hkernel32, "Module32Next");
300  pProcess32First = (VOID *) GetProcAddress(hkernel32, "Process32First");
301  pProcess32Next = (VOID *) GetProcAddress(hkernel32, "Process32Next");
302  pThread32First = (VOID *) GetProcAddress(hkernel32, "Thread32First");
303  pThread32Next = (VOID *) GetProcAddress(hkernel32, "Thread32Next");
304 
305  if (!pCreateToolhelp32Snapshot ||
306  !pModule32First || !pModule32Next ||
307  !pProcess32First || !pProcess32Next ||
308  !pThread32First || !pThread32Next)
309  {
310  win_skip("Needed functions are not available, most likely running on Windows NT\n");
311  return;
312  }
313 
314  r = init();
315  ok(r == 0, "Basic init of sub-process test\n");
316  if (r != 0) return;
317 
318  sa.nLength = sizeof(sa);
319  sa.lpSecurityDescriptor = NULL;
320  sa.bInheritHandle = TRUE;
321 
322  ev1 = CreateEventW(&sa, FALSE, FALSE, NULL);
323  ev2 = CreateEventW(&sa, FALSE, FALSE, NULL);
324  ok (ev1 != NULL && ev2 != NULL, "Couldn't create events\n");
325  memset(&startup, 0, sizeof(startup));
326  startup.cb = sizeof(startup);
327  startup.dwFlags = STARTF_USESHOWWINDOW;
328  startup.wShowWindow = SW_SHOWNORMAL;
329 
330  sprintf(buffer, "%s tests/toolhelp.c %lu %lu", selfname, (DWORD_PTR)ev1, (DWORD_PTR)ev2);
331  ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &info), "CreateProcess\n");
332  /* wait for child to be initialized */
334  ok(w == WAIT_OBJECT_0, "Failed to wait on sub-process startup\n");
335 
336  GetModuleFileNameA( 0, module, sizeof(module) );
337  if (!(p = strrchr( module, '\\' ))) p = module;
338  else p++;
340  sub_expected_modules[0] = p;
341 
342  test_process(pid, info.dwProcessId);
343  test_thread(pid, info.dwProcessId);
346 
347  SetEvent(ev2);
348  winetest_wait_child_process( info.hProcess );
349 }
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3835
#define TRUE
Definition: types.h:120
HMODULE module
Definition: main.cpp:47
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
static const char * sub_expected_modules[]
Definition: toolhelp.c:212
static void test_thread(DWORD curr_pid, DWORD sub_pcs_pid)
Definition: toolhelp.c:153
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static char selfname[MAX_PATH]
Definition: toolhelp.c:31
static HINSTANCE hkernel32
Definition: process.c:66
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:679
GLuint buffer
Definition: glext.h:5915
int startup(int argc, const char *argv[])
Definition: startup.c:430
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:546
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:597
struct _test_info info[]
Definition: SetCursorPos.c:19
static int init(void)
Definition: toolhelp.c:61
#define sprintf(buf, format,...)
Definition: sprintf.c:55
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define NUM_OF(x)
Definition: toolhelp.c:220
static const char * curr_expected_modules[]
Definition: toolhelp.c:205
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
#define STARTF_USESHOWWINDOW
Definition: winbase.h:472
#define WAIT_OBJECT_0
Definition: winbase.h:387
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4772
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
static void test_process(DWORD curr_pid, DWORD sub_pcs_pid)
Definition: toolhelp.c:101
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:819
uint32_t DWORD_PTR
Definition: typedefs.h:63
void winetest_wait_child_process(HANDLE process)
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WAIT_TIME
Definition: toolhelp.c:43
#define GetProcAddress(x, y)
Definition: compat.h:410
static void test_module(DWORD pid, const char *expected[], unsigned num_expected)
Definition: toolhelp.c:222
GLfloat GLfloat p
Definition: glext.h:8902
#define memset(x, y, z)
Definition: compat.h:39
#define win_skip
Definition: test.h:141
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
DWORD WINAPI GetCurrentProcessId(VOID)
Definition: proc.c:1188

◆ sub_thread()

static DWORD WINAPI sub_thread ( void pmt)
static

Definition at line 45 of file toolhelp.c.

46 {
48  return w;
49 }
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WAIT_TIME
Definition: toolhelp.c:43

Referenced by init().

◆ test_module()

static void test_module ( DWORD  pid,
const char expected[],
unsigned  num_expected 
)
static

Definition at line 222 of file toolhelp.c.

223 {
224  HANDLE hSnapshot;
225  PROCESSENTRY32 pe;
226  THREADENTRY32 te;
227  MODULEENTRY32 me;
228  unsigned found[32];
229  unsigned i;
230  int num = 0;
231 
232  ok(NUM_OF(found) >= num_expected, "Internal: bump found[] size\n");
233 
234  hSnapshot = pCreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid );
235  ok(hSnapshot != NULL, "Cannot create snapshot\n");
236 
237  for (i = 0; i < num_expected; i++) found[i] = 0;
238  me.dwSize = sizeof(me);
239  if (pModule32First( hSnapshot, &me ))
240  {
241  do
242  {
243  trace("PID=%x base=%p size=%x %s %s\n",
245  ok(me.th32ProcessID == pid, "wrong returned process id\n");
246  for (i = 0; i < num_expected; i++)
247  if (!lstrcmpiA(expected[i], me.szModule)) found[i]++;
248  num++;
249  } while (pModule32Next( hSnapshot, &me ));
250  }
251  for (i = 0; i < num_expected; i++)
252  ok(found[i] == 1, "Module %s is %s\n",
253  expected[i], found[i] ? "listed more than once" : "not listed");
254 
255  /* check that first really resets the enumeration */
256  for (i = 0; i < num_expected; i++) found[i] = 0;
257  me.dwSize = sizeof(me);
258  if (pModule32First( hSnapshot, &me ))
259  {
260  do
261  {
262  trace("PID=%x base=%p size=%x %s %s\n",
264  for (i = 0; i < num_expected; i++)
265  if (!lstrcmpiA(expected[i], me.szModule)) found[i]++;
266  num--;
267  } while (pModule32Next( hSnapshot, &me ));
268  }
269  for (i = 0; i < num_expected; i++)
270  ok(found[i] == 1, "Module %s is %s\n",
271  expected[i], found[i] ? "listed more than once" : "not listed");
272  ok(!num, "mismatch in counting\n");
273 
274  pe.dwSize = sizeof(pe);
275  ok(!pProcess32First( hSnapshot, &pe ), "shouldn't return a process\n");
276 
277  te.dwSize = sizeof(te);
278  ok(!pThread32First( hSnapshot, &te ), "shouldn't return a thread\n");
279 
280  CloseHandle(hSnapshot);
281  ok(!pModule32First( hSnapshot, &me ), "shouldn't return a module\n");
282 }
#define trace(...)
Definition: kmt_test.h:217
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3835
#define CloseHandle
Definition: compat.h:398
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
char szExePath[MAX_PATH]
Definition: tlhelp32.h:103
BYTE * modBaseAddr
Definition: tlhelp32.h:99
#define TH32CS_SNAPMODULE
Definition: tlhelp32.h:28
char szModule[MAX_MODULE_NAME32+1]
Definition: tlhelp32.h:102
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NUM_OF(x)
Definition: toolhelp.c:220
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
GLuint GLuint num
Definition: glext.h:9618
BOOL expected
Definition: store.c:2063
DWORD th32ProcessID
Definition: tlhelp32.h:96
DWORD modBaseSize
Definition: tlhelp32.h:100

Referenced by START_TEST().

◆ test_process()

static void test_process ( DWORD  curr_pid,
DWORD  sub_pcs_pid 
)
static

Definition at line 101 of file toolhelp.c.

102 {
103  HANDLE hSnapshot;
104  PROCESSENTRY32 pe;
105  MODULEENTRY32 me;
106  unsigned found = 0;
107  int num = 0;
108  int childpos = -1;
109 
110  hSnapshot = pCreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
111  ok(hSnapshot != NULL, "Cannot create snapshot\n");
112 
113  /* check that this current process is enumerated */
114  pe.dwSize = sizeof(pe);
115  if (pProcess32First( hSnapshot, &pe ))
116  {
117  do
118  {
119  if (pe.th32ProcessID == curr_pid) found++;
120  if (pe.th32ProcessID == sub_pcs_pid) { childpos = num; found++; }
121  trace("PID=%x %s\n", pe.th32ProcessID, pe.szExeFile);
122  num++;
123  } while (pProcess32Next( hSnapshot, &pe ));
124  }
125  ok(found == 2, "couldn't find self and/or sub-process in process list\n");
126 
127  /* check that first really resets the enumeration */
128  found = 0;
129  if (pProcess32First( hSnapshot, &pe ))
130  {
131  do
132  {
133  if (pe.th32ProcessID == curr_pid) found++;
134  if (pe.th32ProcessID == sub_pcs_pid) found++;
135  trace("PID=%x %s\n", pe.th32ProcessID, pe.szExeFile);
136  num--;
137  } while (pProcess32Next( hSnapshot, &pe ));
138  }
139  ok(found == 2, "couldn't find self and/or sub-process in process list\n");
140  ok(!num, "mismatch in counting\n");
141 
142  /* one broken program does Process32First() and does not expect anything
143  * interesting to be there, especially not the just forked off child */
144  ok (childpos !=0, "child is not expected to be at position 0.\n");
145 
146  me.dwSize = sizeof(me);
147  ok(!pModule32First( hSnapshot, &me ), "shouldn't return a module\n");
148 
149  CloseHandle(hSnapshot);
150  ok(!pProcess32First( hSnapshot, &pe ), "shouldn't return a process\n");
151 }
#define trace(...)
Definition: kmt_test.h:217
#define CloseHandle
Definition: compat.h:398
CHAR szExeFile[MAX_PATH]
Definition: tlhelp32.h:70
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
GLuint GLuint num
Definition: glext.h:9618
DWORD th32ProcessID
Definition: tlhelp32.h:63
#define TH32CS_SNAPPROCESS
Definition: tlhelp32.h:26

Referenced by START_TEST().

◆ test_thread()

static void test_thread ( DWORD  curr_pid,
DWORD  sub_pcs_pid 
)
static

Definition at line 153 of file toolhelp.c.

154 {
155  HANDLE hSnapshot;
156  THREADENTRY32 te;
157  MODULEENTRY32 me;
158  int num = 0;
159  unsigned curr_found = 0;
160  unsigned sub_found = 0;
161 
162  hSnapshot = pCreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
163  ok(hSnapshot != NULL, "Cannot create snapshot\n");
164 
165  /* check that this current process is enumerated */
166  te.dwSize = sizeof(te);
167  if (pThread32First( hSnapshot, &te ))
168  {
169  do
170  {
171  if (te.th32OwnerProcessID == curr_pid) curr_found++;
172  if (te.th32OwnerProcessID == sub_pcs_pid) sub_found++;
173  if (winetest_debug > 1)
174  trace("PID=%x TID=%x %d\n", te.th32OwnerProcessID, te.th32ThreadID, te.tpBasePri);
175  num++;
176  } while (pThread32Next( hSnapshot, &te ));
177  }
178  ok(curr_found, "couldn't find self in thread list\n");
179  ok(sub_found >= 2, "couldn't find sub-process threads in thread list\n");
180 
181  /* check that first really resets enumeration */
182  curr_found = 0;
183  sub_found = 0;
184  if (pThread32First( hSnapshot, &te ))
185  {
186  do
187  {
188  if (te.th32OwnerProcessID == curr_pid) curr_found++;
189  if (te.th32OwnerProcessID == sub_pcs_pid) sub_found++;
190  if (winetest_debug > 1)
191  trace("PID=%x TID=%x %d\n", te.th32OwnerProcessID, te.th32ThreadID, te.tpBasePri);
192  num--;
193  } while (pThread32Next( hSnapshot, &te ));
194  }
195  ok(curr_found, "couldn't find self in thread list\n");
196  ok(sub_found >= 2, "couldn't find sub-process threads in thread list\n");
197 
198  me.dwSize = sizeof(me);
199  ok(!pModule32First( hSnapshot, &me ), "shouldn't return a module\n");
200 
201  CloseHandle(hSnapshot);
202  ok(!pThread32First( hSnapshot, &te ), "shouldn't return a thread\n");
203 }
#define trace(...)
Definition: kmt_test.h:217
#define CloseHandle
Definition: compat.h:398
int winetest_debug
DWORD th32ThreadID
Definition: tlhelp32.h:75
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
GLuint GLuint num
Definition: glext.h:9618
DWORD th32OwnerProcessID
Definition: tlhelp32.h:76
#define TH32CS_SNAPTHREAD
Definition: tlhelp32.h:27

Referenced by START_TEST().

Variable Documentation

◆ curr_expected_modules

const char* curr_expected_modules[]
static
Initial value:
=
{
"kernel32_test.exe",
"kernel32.dll",
"ntdll.dll"
}

Definition at line 205 of file toolhelp.c.

Referenced by START_TEST().

◆ DWORD

Definition at line 34 of file toolhelp.c.

◆ LPMODULEENTRY32

Definition at line 35 of file toolhelp.c.

◆ LPPROCESSENTRY32

Definition at line 37 of file toolhelp.c.

◆ LPTHREADENTRY32

◆ selfname

char selfname[MAX_PATH]
static

Definition at line 31 of file toolhelp.c.

Referenced by init(), and START_TEST().

◆ sub_expected_modules

const char* sub_expected_modules[]
static
Initial value:
=
{
"kernel32_test.exe",
"kernel32.dll",
"shell32.dll",
"ntdll.dll"
}

Definition at line 212 of file toolhelp.c.

Referenced by START_TEST().