diff --git a/dlls/ntdll/critsection.c b/dlls/ntdll/critsection.c
index 4373fa978fa2bf21c443bd6679f530538a5ab1a5..64ef389f8cb03c6b74de7283825c702c34267dd4 100644
--- a/dlls/ntdll/critsection.c
+++ b/dlls/ntdll/critsection.c
@@ -141,6 +141,7 @@ static inline HANDLE get_semaphore( RTL_CRITICAL_SECTION *crit )
  */
 NTSTATUS WINAPI RtlInitializeCriticalSection( RTL_CRITICAL_SECTION *crit )
 {
+    crit->DebugInfo      = NULL;
     crit->LockCount      = -1;
     crit->RecursionCount = 0;
     crit->OwningThread   = 0;
@@ -190,11 +191,15 @@ NTSTATUS WINAPI RtlpWaitForCriticalSection( RTL_CRITICAL_SECTION *crit )
         DWORD res = WaitForSingleObject( sem, 5000L );
         if ( res == WAIT_TIMEOUT )
         {
-            ERR("Critical section %p wait timed out, retrying (60 sec) fs=%04x\n", crit, __get_fs() );
+            const char *name = (char *)crit->DebugInfo;
+            if (!name || IsBadStringPtrA(name,80)) name = "?";
+            ERR( "section %p %s wait timed out, retrying (60 sec) fs=%04x\n",
+                 crit, debugstr_a(name), __get_fs() );
             res = WaitForSingleObject( sem, 60000L );
             if ( res == WAIT_TIMEOUT && TRACE_ON(relay) )
             {
-                ERR("Critical section %p wait timed out, retrying (5 min) fs=%04x\n", crit, __get_fs() );
+                ERR( "section %p %s wait timed out, retrying (5 min) fs=%04x\n",
+                     crit, debugstr_a(name), __get_fs() );
                 res = WaitForSingleObject( sem, 300000L );
             }
         }
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
index 4b8d6a296ba74dd2e80a3304cadbb968c1da6b08..12583df92906e86983048394310ec399fcbea836 100644
--- a/dlls/ntdll/rtl.c
+++ b/dlls/ntdll/rtl.c
@@ -21,7 +21,7 @@
 DEFAULT_DEBUG_CHANNEL(ntdll);
 
 
-static RTL_CRITICAL_SECTION peb_lock = CRITICAL_SECTION_INIT;
+static RTL_CRITICAL_SECTION peb_lock = CRITICAL_SECTION_INIT("peb_lock");
 
 /*
  *	resource functions
diff --git a/dlls/shell32/changenotify.c b/dlls/shell32/changenotify.c
index bf180d2c2abdd663812739983eaffe4fc73a72cb..91d009951c142d9c04d61a6588ae76fda3e305b9 100644
--- a/dlls/shell32/changenotify.c
+++ b/dlls/shell32/changenotify.c
@@ -14,7 +14,7 @@
 
 DEFAULT_DEBUG_CHANNEL(shell);
 
-static CRITICAL_SECTION SHELL32_ChangenotifyCS = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION SHELL32_ChangenotifyCS = CRITICAL_SECTION_INIT("SHELL32_ChangenotifyCS");
 
 /* internal list of notification clients (internal) */
 typedef struct _NOTIFICATIONLIST
diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c
index 9fbef9c2c391537c4227ff293d0332cd730960ce..192958e66d17d7ab2d2c2d768ac5950e5074f9f2 100644
--- a/dlls/shell32/iconcache.c
+++ b/dlls/shell32/iconcache.c
@@ -37,7 +37,7 @@ typedef struct
 } SIC_ENTRY, * LPSIC_ENTRY;
 
 static HDPA		sic_hdpa = 0;
-static CRITICAL_SECTION	SHELL32_SicCS = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION SHELL32_SicCS = CRITICAL_SECTION_INIT("SHELL32_SicCS");
 
 /*****************************************************************************
  * SIC_CompareEntrys			[called by comctl32.dll]
diff --git a/dlls/user/dde/misc.c b/dlls/user/dde/misc.c
index 62835c589805e16a26e9219844fcb1801279a17a..5d971566d44149a8a5cecb19ae81f64b7354f4af 100644
--- a/dlls/user/dde/misc.c
+++ b/dlls/user/dde/misc.c
@@ -27,7 +27,7 @@ DEFAULT_DEBUG_CHANNEL(ddeml);
 static WDML_INSTANCE*	WDML_InstanceList = NULL;
 static DWORD		WDML_MaxInstanceID = 0;  /* OK for present, have to worry about wrap-around later */
 const char		WDML_szEventClass[] = "DdeEventClass";
-CRITICAL_SECTION	WDML_CritSect = CRITICAL_SECTION_INIT;
+CRITICAL_SECTION	WDML_CritSect = CRITICAL_SECTION_INIT("WDML_CritSect");
 
 /* ================================================================
  *
diff --git a/dlls/winaspi/winaspi32.c b/dlls/winaspi/winaspi32.c
index 170bd8eb00863b1d75ea1a0d2d8fb5485dafecf5..98c8fbff4513396e9e0e00a5f7715d0b54f78d6e 100644
--- a/dlls/winaspi/winaspi32.c
+++ b/dlls/winaspi/winaspi32.c
@@ -30,7 +30,7 @@ DEFAULT_DEBUG_CHANNEL(aspi);
 #ifdef linux
 
 static ASPI_DEVICE_INFO *ASPI_open_devices = NULL;
-static CRITICAL_SECTION ASPI_CritSection = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION ASPI_CritSection = CRITICAL_SECTION_INIT("ASPI_CritSection");
 
 #endif /* defined(linux) */
 
diff --git a/dlls/winsock/async.c b/dlls/winsock/async.c
index 87612bcefa76e98922c5476dc558822f7b493b48..b46b3b03b196dbe9eb90363c03b649d0f27ca478 100644
--- a/dlls/winsock/async.c
+++ b/dlls/winsock/async.c
@@ -91,7 +91,7 @@ DEFAULT_DEBUG_CHANNEL(winsock);
 
 
 /* critical section to protect some non-rentrant net function */
-CRITICAL_SECTION csWSgetXXXbyYYY = CRITICAL_SECTION_INIT;
+CRITICAL_SECTION csWSgetXXXbyYYY = CRITICAL_SECTION_INIT("csWSgetXXXbyYYY");
 
 /* protoptypes of some functions in socket.c
  */
diff --git a/dlls/x11drv/x11drv_main.c b/dlls/x11drv/x11drv_main.c
index 95d9abd314429b3fb8962f9be5e153d58bcd6a18..2638300460f9103b091bfe410acb33c5055653f4 100644
--- a/dlls/x11drv/x11drv_main.c
+++ b/dlls/x11drv/x11drv_main.c
@@ -47,7 +47,7 @@ DEFAULT_DEBUG_CHANNEL(x11drv);
 static void (*old_tsx11_lock)(void);
 static void (*old_tsx11_unlock)(void);
 
-static CRITICAL_SECTION X11DRV_CritSection = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION X11DRV_CritSection = CRITICAL_SECTION_INIT("X11DRV_CritSection");
 
 Screen *screen;
 Visual *visual;
diff --git a/files/profile.c b/files/profile.c
index f984058a8c90d38673ee27a15077e31d313e4794..c20fbb57276e4dab9141a9baa8253541c94c0ced 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -79,7 +79,7 @@ static char PROFILE_WineIniUsed[MAX_PATHNAME_LEN] = "";
 
 static const WCHAR wininiW[] = { 'w','i','n','.','i','n','i',0 };
 
-static CRITICAL_SECTION PROFILE_CritSect = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION PROFILE_CritSect = CRITICAL_SECTION_INIT("PROFILE_CritSect");
 
 static const char hex[16] = "0123456789ABCDEF";
 
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 7bf36e862d533c764454b72df52eb2080230729c..ed864a8fe5da318e5d00c08b897f8b8a8614f46d 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -306,7 +306,7 @@ static const struct CharsetBindingInfo charsetbindings[] =
 
 static int		DefResolution = 0;
 
-static CRITICAL_SECTION crtsc_fonts_X11 = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION crtsc_fonts_X11 = CRITICAL_SECTION_INIT("crtsc_fonts_X11");
 
 static fontResource*	fontList = NULL;
 static fontObject*      fontCache = NULL;		/* array */
diff --git a/include/winbase.h b/include/winbase.h
index e32946fb3abc08c8b3a085d416e56681b97805c3..f8159f111d23eb914912eb87e821fd81767ade61 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -986,7 +986,7 @@ typedef DWORD CALLBACK (*LPPROGRESS_ROUTINE)(LARGE_INTEGER, LARGE_INTEGER, LARGE
 #define	FORMAT_MESSAGE_MAX_WIDTH_MASK	0x000000FF
 
 #ifdef __WINE__
-#define CRITICAL_SECTION_INIT { 0, -1, 0, 0, 0, 0 }
+#define CRITICAL_SECTION_INIT(name) { (void *)(__FILE__ ": " name), -1, 0, 0, 0, 0 }
 #endif
 
 typedef struct {
diff --git a/memory/virtual.c b/memory/virtual.c
index be9cf7570d57b988b1c39bfefc94c987f9af7c20..5635e384fd2ae4653c5075ba512a7e092bcb096a 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -81,7 +81,7 @@ static const BYTE VIRTUAL_Win32Flags[16] =
 
 
 static FILE_VIEW *VIRTUAL_FirstView;
-static CRITICAL_SECTION csVirtual = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION csVirtual = CRITICAL_SECTION_INIT("csVirtual");
 
 #ifdef __i386__
 /* These are always the same on an i386, and it will be faster this way */
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index e05c890483c7c953a27444f2e55951921737a1b1..87baefca2c2d3d54803ca4c1dc1c604d034eae41 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -170,7 +170,7 @@ static GDIOBJHDR * StockObjects[NB_STOCK_OBJECTS] =
 
 HBITMAP hPseudoStockBitmap; /* 1x1 bitmap for memory DCs */
 
-static SYSLEVEL GDI_level = { CRITICAL_SECTION_INIT, 3 };
+static SYSLEVEL GDI_level = { CRITICAL_SECTION_INIT("GDI_level"), 3 };
 static WORD GDI_HeapSel;
 
 static BOOL get_bool(char *buffer, BOOL def_value)
diff --git a/scheduler/pthread.c b/scheduler/pthread.c
index becebf30dee9f7f2f16221984ba45bb0a6995491..ab473b656dace5f10f38c6a736308b467cebeecf 100644
--- a/scheduler/pthread.c
+++ b/scheduler/pthread.c
@@ -121,7 +121,7 @@ strong_alias(__pthread_kill_other_threads_np, pthread_kill_other_threads_np);
 
 #define MAX_ATFORK 8  /* libc doesn't need that many anyway */
 
-static CRITICAL_SECTION atfork_section = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION atfork_section = CRITICAL_SECTION_INIT("atfork_section");
 typedef void (*atfork_handler)();
 static atfork_handler atfork_prepare[MAX_ATFORK];
 static atfork_handler atfork_parent[MAX_ATFORK];
diff --git a/scheduler/syslevel.c b/scheduler/syslevel.c
index 90f89892fabc3ee2f157a3ffcb9312fc42d85d65..4647e1964f6b0393a69c489b49945cb79a83f30f 100644
--- a/scheduler/syslevel.c
+++ b/scheduler/syslevel.c
@@ -14,7 +14,7 @@
 
 DEFAULT_DEBUG_CHANNEL(win32);
 
-static SYSLEVEL Win16Mutex = { CRITICAL_SECTION_INIT, 1 };
+static SYSLEVEL Win16Mutex = { CRITICAL_SECTION_INIT("Win16Mutex"), 1 };
 
 /* Global variable to save current TEB while in 16-bit code */
 WORD SYSLEVEL_Win16CurrentTeb = 0;
diff --git a/windows/cursoricon.c b/windows/cursoricon.c
index 93670421c7af635a3a40ab6b966cd4cd2ab6a682..88a8ace13e3b39cdd952d2cb98b027edf59eec42 100644
--- a/windows/cursoricon.c
+++ b/windows/cursoricon.c
@@ -78,7 +78,7 @@ typedef struct tagICONCACHE
 } ICONCACHE;
 
 static ICONCACHE *IconAnchor = NULL;
-static CRITICAL_SECTION IconCrst = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION IconCrst = CRITICAL_SECTION_INIT("IconCrst");
 static WORD ICON_HOTSPOT = 0x4242;
 
 
diff --git a/windows/timer.c b/windows/timer.c
index 9163dffaf82196ba325016173f7393edc47bbfc0..79f1dbb9c5841098067650ba40dc54e0daa1306b 100644
--- a/windows/timer.c
+++ b/windows/timer.c
@@ -35,7 +35,7 @@ typedef struct tagTIMER
 
 static TIMER TimersArray[NB_TIMERS];
 
-static CRITICAL_SECTION csTimer = CRITICAL_SECTION_INIT;
+static CRITICAL_SECTION csTimer = CRITICAL_SECTION_INIT("csTimer");
 
 
 /***********************************************************************