Author: cwittich Date: Sat Mar 6 14:36:22 2010 New Revision: 45938
URL: http://svn.reactos.org/svn/reactos?rev=45938&view=rev Log: [KERNEL32_WINETEST] sync kernel32_winetest to wine 1.1.40
Modified: trunk/rostests/winetests/kernel32/change.c trunk/rostests/winetests/kernel32/debugger.c trunk/rostests/winetests/kernel32/file.c trunk/rostests/winetests/kernel32/format_msg.c trunk/rostests/winetests/kernel32/thread.c
Modified: trunk/rostests/winetests/kernel32/change.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/change.... ============================================================================== --- trunk/rostests/winetests/kernel32/change.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/change.c [iso-8859-1] Sat Mar 6 14:36:22 2010 @@ -79,6 +79,7 @@ ok(status == WAIT_OBJECT_0, "WaitForSingleObject status %d error %d\n", status, GetLastError());
ok(GetExitCodeThread(thread, &exitcode), "Could not retrieve thread exit code\n"); + CloseHandle(thread);
return exitcode; }
Modified: trunk/rostests/winetests/kernel32/debugger.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/debugge... ============================================================================== --- trunk/rostests/winetests/kernel32/debugger.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/debugger.c [iso-8859-1] Sat Mar 6 14:36:22 2010 @@ -31,12 +31,32 @@ #define STATUS_DEBUGGER_INACTIVE ((NTSTATUS) 0xC0000354) #endif
+#ifdef __GNUC__ +#define PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args))) +#else +#define PRINTF_ATTR(fmt,args) +#endif + +#define child_ok (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : test_child_ok + static int myARGC; static char** myARGV;
static BOOL (WINAPI *pCheckRemoteDebuggerPresent)(HANDLE,PBOOL); static BOOL (WINAPI *pDebugActiveProcessStop)(DWORD); static BOOL (WINAPI *pDebugSetProcessKillOnExit)(BOOL); + +static LONG child_failures; + +static void PRINTF_ATTR(2, 3) test_child_ok(int condition, const char *msg, ...) +{ + va_list valist; + + va_start(valist, msg); + winetest_vok(condition, msg, valist); + va_end(valist); + if (!condition) ++child_failures; +}
/* Copied from the process test */ static void get_file_name(char* buf) @@ -468,6 +488,94 @@ "expected error ERROR_INVALID_PARAMETER, got %d/%x\n",GetLastError(), GetLastError()); }
+struct child_blackbox +{ + LONG failures; +}; + +static void doChild(int argc, char **argv) +{ + struct child_blackbox blackbox; + const char *blackbox_file; + HANDLE parent; + DWORD ppid; + BOOL ret; + + blackbox_file = argv[4]; + sscanf(argv[3], "%08x", &ppid); + + parent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ppid); + child_ok(!!parent, "OpenProcess failed, last error %#x.\n", GetLastError()); + + ret = DebugActiveProcess(ppid); + child_ok(ret, "DebugActiveProcess failed, last error %#x.\n", GetLastError()); + + ret = pDebugActiveProcessStop(ppid); + child_ok(ret, "DebugActiveProcessStop failed, last error %#x.\n", GetLastError()); + + ret = CloseHandle(parent); + child_ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); + + blackbox.failures = child_failures; + save_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); +} + +static void test_debug_loop(int argc, char **argv) +{ + const char *arguments = " debugger child "; + struct child_blackbox blackbox; + char blackbox_file[MAX_PATH]; + PROCESS_INFORMATION pi; + STARTUPINFOA si; + DWORD pid; + char *cmd; + BOOL ret; + + if (!pDebugActiveProcessStop) + { + win_skip("DebugActiveProcessStop not available, skipping test.\n"); + return; + } + + pid = GetCurrentProcessId(); + get_file_name(blackbox_file); + cmd = HeapAlloc(GetProcessHeap(), 0, strlen(argv[0]) + strlen(arguments) + strlen(blackbox_file) + 10); + sprintf(cmd, "%s%s%08x %s", argv[0], arguments, pid, blackbox_file); + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + ret = CreateProcessA(NULL, cmd, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &si, &pi); + ok(ret, "CreateProcess failed, last error %#x.\n", GetLastError()); + + HeapFree(GetProcessHeap(), 0, cmd); + + for (;;) + { + DEBUG_EVENT ev; + + ret = WaitForDebugEvent(&ev, INFINITE); + ok(ret, "WaitForDebugEvent failed, last error %#x.\n", GetLastError()); + if (!ret) break; + + if (ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) break; + + ret = ContinueDebugEvent(ev.dwProcessId, ev.dwThreadId, DBG_CONTINUE); + ok(ret, "ContinueDebugEvent failed, last error %#x.\n", GetLastError()); + if (!ret) break; + } + + ret = CloseHandle(pi.hThread); + ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); + ret = CloseHandle(pi.hProcess); + ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); + + load_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); + ok(!blackbox.failures, "Got %d failures from child process.\n", blackbox.failures); + + ret = DeleteFileA(blackbox_file); + ok(ret, "DeleteFileA failed, last error %#x.\n", GetLastError()); +} + START_TEST(debugger) { HMODULE hdll; @@ -486,9 +594,14 @@ { doDebugger(myARGC, myARGV); } + else if (myARGC >= 5 && !strcmp(myARGV[2], "child")) + { + doChild(myARGC, myARGV); + } else { test_ExitCode(); test_RemoteDebugger(); - } -} + test_debug_loop(myARGC, myARGV); + } +}
Modified: trunk/rostests/winetests/kernel32/file.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/file.c?... ============================================================================== --- trunk/rostests/winetests/kernel32/file.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/file.c [iso-8859-1] Sat Mar 6 14:36:22 2010 @@ -1602,12 +1602,12 @@
/* zero-byte lock */ ok( LockFile( handle, 100, 0, 0, 0 ), "LockFile 100,0 failed\n" ); - limited_LockFile || ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" ); + if (!limited_LockFile) ok( !LockFile( handle, 98, 0, 4, 0 ), "LockFile 98,4 succeeded\n" ); ok( LockFile( handle, 90, 0, 10, 0 ), "LockFile 90,10 failed\n" ); - limited_LockFile || ok( !LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" ); + if (!limited_LockFile) ok( !LockFile( handle, 100, 0, 10, 0 ), "LockFile 100,10 failed\n" );
ok( UnlockFile( handle, 90, 0, 10, 0 ), "UnlockFile 90,10 failed\n" ); - !ok( UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 failed\n" ); + ok( !UnlockFile( handle, 100, 0, 10, 0 ), "UnlockFile 100,10 succeeded\n" );
ok( UnlockFile( handle, 100, 0, 0, 0 ), "UnlockFile 100,0 failed\n" );
Modified: trunk/rostests/winetests/kernel32/format_msg.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/format_... ============================================================================== --- trunk/rostests/winetests/kernel32/format_msg.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/format_msg.c [iso-8859-1] Sat Mar 6 14:36:22 2010 @@ -709,6 +709,7 @@ ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret); ok(error == ERROR_RESOURCE_LANG_NOT_FOUND || error == ERROR_MR_MID_NOT_FOUND || + error == ERROR_MUI_FILE_NOT_FOUND || error == ERROR_MUI_FILE_NOT_LOADED, "last error %u\n", error);
@@ -719,7 +720,8 @@ ok(ret == 0, "FormatMessageA returned %u instead of 0\n", ret); ok(error == ERROR_RESOURCE_LANG_NOT_FOUND || error == ERROR_MR_MID_NOT_FOUND || - error == ERROR_MUI_FILE_NOT_FOUND, + error == ERROR_MUI_FILE_NOT_FOUND || + error == ERROR_MUI_FILE_NOT_LOADED, "last error %u\n", error); }
Modified: trunk/rostests/winetests/kernel32/thread.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/kernel32/thread.... ============================================================================== --- trunk/rostests/winetests/kernel32/thread.c [iso-8859-1] (original) +++ trunk/rostests/winetests/kernel32/thread.c [iso-8859-1] Sat Mar 6 14:36:22 2010 @@ -421,7 +421,17 @@ "Thread did not execute successfully\n"); ok(CloseHandle(thread[i])!=0,"CloseHandle failed\n"); } - ok(TlsFree(tlsIndex)!=0,"TlsFree failed\n"); + + SetLastError(0xCAFEF00D); + ok(TlsFree(tlsIndex)!=0,"TlsFree failed: %08x\n", GetLastError()); + ok(GetLastError()==0xCAFEF00D, + "GetLastError: expected 0xCAFEF00D, got %08x\n", GetLastError()); + + /* Test freeing an already freed TLS index */ + SetLastError(0xCAFEF00D); + ok(TlsFree(tlsIndex)==0,"TlsFree succeeded\n"); + ok(GetLastError()==ERROR_INVALID_PARAMETER, + "GetLastError: expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
/* Test how passing NULL as a pointer to threadid works */ SetLastError(0xFACEaBAD); @@ -780,7 +790,7 @@ static VOID test_thread_processor(void) { HANDLE curthread,curproc; - DWORD_PTR processMask,systemMask; + DWORD_PTR processMask,systemMask,retMask; SYSTEM_INFO sysInfo; int error=0; BOOL is_wow64; @@ -803,6 +813,10 @@ "SetThreadAffinityMask failed\n"); ok(SetThreadAffinityMask(curthread,processMask+1)==0, "SetThreadAffinityMask passed for an illegal processor\n"); +/* NOTE: Pre-Vista does not recognize the "all processors" flag (all bits set) */ + retMask = SetThreadAffinityMask(curthread,~0UL); + ok(broken(retMask==0) || retMask==processMask, + "SetThreadAffinityMask(thread,-1) failed to request all processors.\n"); /* NOTE: This only works on WinNT/2000/XP) */ if (pSetThreadIdealProcessor) { SetLastError(0xdeadbeef);