kernel32: Add SetThreadErrorMode and GetThreadErrorMode.
Peter Rosin
peda at lysator.liu.se
Wed Feb 3 07:37:35 CST 2010
---
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);
--
1.6.5
--------------070301010400060807010401--
More information about the wine-patches
mailing list