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 */