Improved syslevel handling, store currently held syslevels in thread
database, WIN_CritSection converted to syslevel.

diff --git a/include/syslevel.h b/include/syslevel.h
index e0fa1d7..faeb3ec 100644
--- a/include/syslevel.h
+++ b/include/syslevel.h
@@ -10,6 +10,12 @@
 #include "windef.h"
 #include "winbase.h"
 
+typedef struct tagSYSLEVEL
+{
+    CRITICAL_SECTION crst;
+    INT level;
+} SYSLEVEL;
+
 extern WORD SYSLEVEL_Win16CurrentTeb;
 extern WORD SYSLEVEL_EmergencyTeb;
 
@@ -18,14 +24,17 @@
 VOID WINAPI SYSLEVEL_LeaveWin16Lock(VOID);
 VOID SYSLEVEL_ReleaseWin16Lock(VOID);
 VOID SYSLEVEL_RestoreWin16Lock(VOID);
+VOID SYSLEVEL_CheckNotLevel( INT level );
 
-VOID WINAPI GetpWin16Lock(CRITICAL_SECTION **lock);
+VOID WINAPI GetpWin16Lock(SYSLEVEL **lock);
 SEGPTR WINAPI GetpWin16Lock16(void);
-
-VOID WINAPI _EnterSysLevel(CRITICAL_SECTION *lock);
-VOID WINAPI _LeaveSysLevel(CRITICAL_SECTION *lock);
 DWORD WINAPI _ConfirmWin16Lock(void);
 
+VOID WINAPI _CreateSysLevel(SYSLEVEL *lock, INT level);
+VOID WINAPI _EnterSysLevel(SYSLEVEL *lock);
+VOID WINAPI _LeaveSysLevel(SYSLEVEL *lock);
+DWORD WINAPI _ConfirmSysLevel(SYSLEVEL *lock);
+
 VOID WINAPI ReleaseThunkLock(DWORD *mutex_count);
 VOID WINAPI RestoreThunkLock(DWORD mutex_count);
 
diff --git a/include/thread.h b/include/thread.h
index 9cd30a8..66d5e50 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -9,6 +9,7 @@
 
 #include "config.h"
 #include "winbase.h"
+#include "syslevel.h"
 #include "selectors.h"  /* for SET_FS */
 
 struct _PDB;
@@ -78,7 +79,7 @@
     void          *entry_arg;      /* 1c4 Entry point arg (was: unknown) */
     DWORD          unknown5[4];    /* 1c8 Unknown */
     DWORD          sys_count[4];   /* 1d8 Syslevel mutex entry counters */
-    CRITICAL_SECTION *sys_mutex[4];/* 1e8 Syslevel mutex pointers */
+    SYSLEVEL      *sys_mutex[4];   /* 1e8 Syslevel mutex pointers */
     DWORD          unknown6[2];    /* 1f8 Unknown */
     /* The following are Wine-specific fields */
     int            socket;         /* Socket for server communication */