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