Module: wine Branch: master Commit: 805f7d79db7811d1ef1e5396d5d0702a539b7e12 URL: http://source.winehq.org/git/wine.git/?a=commit;h=805f7d79db7811d1ef1e5396d5...
Author: Peter Rosin peda@lysator.liu.se Date: Wed Feb 3 14:37:35 2010 +0100
kernel32: Add SetThreadErrorMode and GetThreadErrorMode.
---
dlls/kernel32/kernel32.spec | 2 + dlls/kernel32/tests/thread.c | 2 +- dlls/kernel32/thread.c | 61 ++++++++++++++++++++++++++++++++++++++++++ include/winbase.h | 2 + 4 files changed, 66 insertions(+), 1 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index db9713f..7c32ff7 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -643,6 +643,7 @@ @ stdcall GetTempPathA(long ptr) @ stdcall GetTempPathW(long ptr) @ stdcall GetThreadContext(long ptr) +@ stdcall GetThreadErrorMode() @ stdcall GetThreadId(ptr) # @ stub GetThreadIOPendingFlag @ stdcall GetThreadLocale() @@ -1056,6 +1057,7 @@ @ stdcall SetTermsrvAppInstallMode(long) @ stdcall SetThreadAffinityMask(long long) @ stdcall SetThreadContext(long ptr) +@ stdcall SetThreadErrorMode(long ptr) @ stdcall SetThreadExecutionState(long) @ stdcall SetThreadIdealProcessor(long long) @ stdcall SetThreadLocale(long) diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index 85987d9..69203fe 100644 --- a/dlls/kernel32/tests/thread.c +++ b/dlls/kernel32/tests/thread.c @@ -1221,7 +1221,7 @@ static void test_ThreadErrorMode(void)
if (!pSetThreadErrorMode || !pGetThreadErrorMode) { - skip("SetThreadErrorMode and/or GetThreadErrorMode unavailable (added in Windows 7)\n"); + win_skip("SetThreadErrorMode and/or GetThreadErrorMode unavailable (added in Windows 7)\n"); return; }
diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c index 6979c36..e3754c2 100644 --- a/dlls/kernel32/thread.c +++ b/dlls/kernel32/thread.c @@ -651,3 +651,64 @@ DWORD WINAPI GetCurrentThreadId(void) }
#endif /* __i386__ */ + +/************************************************************************* + * rtlmode_to_win32mode + */ +static DWORD rtlmode_to_win32mode( DWORD rtlmode ) +{ + DWORD win32mode = 0; + + if (rtlmode & 0x10) + win32mode |= SEM_FAILCRITICALERRORS; + if (rtlmode & 0x20) + win32mode |= SEM_NOGPFAULTERRORBOX; + if (rtlmode & 0x40) + win32mode |= SEM_NOOPENFILEERRORBOX; + + return win32mode; +} + +/*********************************************************************** + * SetThreadErrorMode (KERNEL32.@) + */ +BOOL WINAPI SetThreadErrorMode( DWORD mode, LPDWORD oldmode ) +{ + NTSTATUS status; + DWORD tmp = 0; + + if (mode & ~(SEM_FAILCRITICALERRORS | + SEM_NOGPFAULTERRORBOX | + SEM_NOOPENFILEERRORBOX)) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + if (mode & SEM_FAILCRITICALERRORS) + tmp |= 0x10; + if (mode & SEM_NOGPFAULTERRORBOX) + tmp |= 0x20; + if (mode & SEM_NOOPENFILEERRORBOX) + tmp |= 0x40; + + status = RtlSetThreadErrorMode( tmp, oldmode ); + if (status) + { + SetLastError( RtlNtStatusToDosError(status) ); + return FALSE; + } + + if (oldmode) + *oldmode = rtlmode_to_win32mode(*oldmode); + + return TRUE; +} + +/*********************************************************************** + * GetThreadErrorMode (KERNEL32.@) + */ +DWORD WINAPI GetThreadErrorMode( void ) +{ + return rtlmode_to_win32mode( RtlGetThreadErrorMode() ); +} diff --git a/include/winbase.h b/include/winbase.h index 1cd26f5..06bc622 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1762,6 +1762,7 @@ WINBASEAPI DWORD WINAPI GetTickCount(void); WINBASEAPI ULONGLONG WINAPI GetTickCount64(void); WINBASEAPI DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION); WINBASEAPI BOOL WINAPI GetThreadContext(HANDLE,CONTEXT *); +WINBASEAPI DWORD WINAPI GetThreadErrorMode(void); WINBASEAPI INT WINAPI GetThreadPriority(HANDLE); WINBASEAPI BOOL WINAPI GetThreadPriorityBoost(HANDLE,PBOOL); WINBASEAPI BOOL WINAPI GetThreadSelectorEntry(HANDLE,DWORD,LPLDT_ENTRY); @@ -2096,6 +2097,7 @@ WINBASEAPI DWORD WINAPI SetTapeParameters(HANDLE,DWORD,LPVOID); WINBASEAPI DWORD WINAPI SetTapePosition(HANDLE,DWORD,DWORD,DWORD,DWORD,BOOL); WINBASEAPI DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE,DWORD_PTR); WINBASEAPI BOOL WINAPI SetThreadContext(HANDLE,const CONTEXT *); +WINBASEAPI BOOL WINAPI SetThreadErrorMode(DWORD,LPDWORD); WINBASEAPI DWORD WINAPI SetThreadExecutionState(EXECUTION_STATE); WINBASEAPI DWORD WINAPI SetThreadIdealProcessor(HANDLE,DWORD); WINBASEAPI BOOL WINAPI SetThreadPriority(HANDLE,INT);