kernel32: Add a test to show that CreateThread is supposed to fail after the NtTerminateProcess call.
Dmitry Timoshkov
dmitry at baikal.ru
Wed Apr 24 06:39:07 CDT 2013
---
dlls/kernel32/tests/loader.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index 38c059c..6291d9c 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -1042,7 +1042,6 @@ nt4_is_broken:
#define MAX_COUNT 10
static HANDLE attached_thread[MAX_COUNT], stop_event, event, mutex, semaphore;
static DWORD attached_thread_count;
-static LONG noop_thread_started;
static int test_dll_phase;
static DWORD WINAPI mutex_thread_proc(void *param)
@@ -1085,14 +1084,19 @@ static DWORD WINAPI semaphore_thread_proc(void *param)
static DWORD WINAPI noop_thread_proc(void *param)
{
- InterlockedIncrement(&noop_thread_started);
+ if (param)
+ {
+ LONG *noop_thread_started = param;
+ InterlockedIncrement(noop_thread_started);
+ }
trace("%04u: noop_thread_proc: exiting\n", GetCurrentThreadId());
- return 196;
+ return 195;
}
static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
{
+ static LONG noop_thread_started;
DWORD ret;
switch (reason)
@@ -1136,7 +1140,7 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
ok(!ret || broken(ret) /* before Vista */, "RtlDllShutdownInProgress returned %d\n", ret);
}
- ok(attached_thread_count == 2, "attached thread count should be 2\n");
+ ok(attached_thread_count >= 2, "attached thread count should be >= 2\n");
for (i = 0; i < attached_thread_count; i++)
{
@@ -1179,7 +1183,7 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
*/
noop_thread_started = 0;
SetLastError(0xdeadbeef);
- handle = CreateThread(NULL, 0, noop_thread_proc, NULL, 0, &ret);
+ handle = CreateThread(NULL, 0, noop_thread_proc, &noop_thread_started, 0, &ret);
/* manual call to LdrShutdownProcess doesn't prevent thread creation */
if (param && test_dll_phase != 4)
{
@@ -1187,7 +1191,11 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
if (!handle)
ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
else
+ {
+ ret = WaitForSingleObject(handle, 1000);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %#x\n", ret);
CloseHandle(handle);
+ }
}
else
{
@@ -1212,7 +1220,7 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
noop_thread_started = 0;
SetLastError(0xdeadbeef);
- handle = CreateRemoteThread(process, NULL, 0, noop_thread_proc, NULL, 0, &ret);
+ handle = CreateRemoteThread(process, NULL, 0, noop_thread_proc, &noop_thread_started, 0, &ret);
/* manual call to LdrShutdownProcess doesn't prevent thread creation */
if (param && test_dll_phase != 4)
{
@@ -1220,7 +1228,11 @@ static BOOL WINAPI dll_entry_point(HINSTANCE hinst, DWORD reason, LPVOID param)
if (!handle)
ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
else
+ {
+ ret = WaitForSingleObject(handle, 1000);
+ ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %#x\n", ret);
CloseHandle(handle);
+ }
}
else
{
@@ -1438,6 +1450,19 @@ static void child_process(const char *dll_name, DWORD target_offset)
ret = pRtlDllShutdownInProgress();
ok(!ret, "RtlDllShutdownInProgress returned %d\n", ret);
+ SetLastError(0xdeadbeef);
+ thread = CreateThread(NULL, 0, noop_thread_proc, &dummy, 0, &ret);
+todo_wine
+ ok(!thread || broken(thread != 0) /* before win7 */, "CreateThread should fail\n");
+ if (!thread)
+ ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
+ else
+ {
+ ret = WaitForSingleObject(thread, 1000);
+ ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %#x\n", ret);
+ CloseHandle(thread);
+ }
+
break;
case 1:
--
1.8.2.1
More information about the wine-patches
mailing list