Index: /trunk/src/VBox/Runtime/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Runtime/Makefile.kmk	(revision 58828)
+++ /trunk/src/VBox/Runtime/Makefile.kmk	(revision 58829)
@@ -1197,5 +1197,5 @@
  	generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp \
 	generic/sched-generic.cpp \
-	generic/semrw-$(if-expr defined(VBOX_WITH_LOCKLESS_SEMRW),ockless-,)generic.cpp \
+	generic/semrw-$(if-expr defined(VBOX_WITH_LOCKLESS_SEMRW),lockless-,)generic.cpp \
 	generic/timer-generic.cpp \
 	generic/utf16locale-generic.cpp \
@@ -1755,4 +1755,5 @@
 	generic/RTAssertShouldPanic-generic.cpp \
 	generic/critsect-generic.cpp \
+	generic/critsectrw-generic.cpp \
 	\
 	$(RuntimeNoCrt_SOURCES)
Index: /trunk/src/VBox/Runtime/generic/critsectrw-generic.cpp
===================================================================
--- /trunk/src/VBox/Runtime/generic/critsectrw-generic.cpp	(revision 58828)
+++ /trunk/src/VBox/Runtime/generic/critsectrw-generic.cpp	(revision 58829)
@@ -67,4 +67,9 @@
     pThis->u32Magic         = RTCRITSECTRW_MAGIC_DEAD;
     pThis->fNeedReset       = false;
+#ifdef IN_RING0
+    pThis->fFlags           = (uint16_t)(fFlags | RTCRITSECT_FLAGS_RING0);
+#else
+    pThis->fFlags           = (uint16_t)(fFlags & ~RTCRITSECT_FLAGS_RING0);
+#endif
     pThis->u64State         = 0;
     pThis->hNativeWriter    = NIL_RTNATIVETHREAD;
@@ -138,4 +143,9 @@
     AssertPtrReturn(pThis, RTLOCKVAL_SUB_CLASS_INVALID);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, RTLOCKVAL_SUB_CLASS_INVALID);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 #ifdef RTCRITSECTRW_STRICT
     AssertReturn(!(pThis->fFlags & RTCRITSECT_FLAGS_NOP), RTLOCKVAL_SUB_CLASS_INVALID);
@@ -158,4 +168,9 @@
     AssertPtr(pThis);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
 #ifdef RTCRITSECTRW_STRICT
@@ -257,5 +272,5 @@
                                                                RT_INDEFINITE_WAIT, RTTHREADSTATE_RW_READ, false);
                     if (RT_SUCCESS(rc))
-#else
+#elif defined(IN_RING3)
                     RTTHREAD hThreadSelf = RTThreadSelf();
                     RTThreadBlocking(hThreadSelf, RTTHREADSTATE_RW_READ, false);
@@ -263,5 +278,7 @@
                     {
                         rc = RTSemEventMultiWait(pThis->hEvtRead, RT_INDEFINITE_WAIT);
+#ifdef IN_RING3
                         RTThreadUnblocked(hThreadSelf, RTTHREADSTATE_RW_READ);
+#endif
                         if (pThis->u32Magic != RTCRITSECTRW_MAGIC)
                             return VERR_SEM_DESTROYED;
@@ -388,4 +405,9 @@
     AssertPtr(pThis);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
@@ -461,4 +483,9 @@
     AssertPtr(pThis);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
 #ifdef RTCRITSECTRW_STRICT
@@ -584,5 +611,5 @@
                                                      RT_INDEFINITE_WAIT, RTTHREADSTATE_RW_WRITE, false);
             if (RT_SUCCESS(rc))
-#else
+#elif defined(IN_RING3)
             RTTHREAD hThreadSelf = RTThreadSelf();
             RTThreadBlocking(hThreadSelf, RTTHREADSTATE_RW_WRITE, false);
@@ -590,5 +617,7 @@
             {
                 rc = RTSemEventWait(pThis->hEvtWrite, RT_INDEFINITE_WAIT);
+#ifdef IN_RING3
                 RTThreadUnblocked(hThreadSelf, RTTHREADSTATE_RW_WRITE);
+#endif
                 if (pThis->u32Magic != RTCRITSECTRW_MAGIC)
                     return VERR_SEM_DESTROYED;
@@ -682,4 +711,9 @@
     AssertPtr(pThis);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, VERR_SEM_DESTROYED);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     RTNATIVETHREAD hNativeSelf = RTThreadNativeSelf();
@@ -773,4 +807,9 @@
     AssertPtr(pThis);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, false);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
@@ -792,4 +831,9 @@
     AssertPtr(pThis);
     AssertReturn(pThis->u32Magic == RTCRITSECTRW_MAGIC, false);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
@@ -891,4 +935,9 @@
     //Assert(pThis->cLockers == -1);
     Assert(pThis->hNativeWriter == NIL_RTNATIVETHREAD);
+#ifdef IN_RING0
+    Assert(pThis->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pThis->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
@@ -909,6 +958,8 @@
     int rc2 = RTSemEventMultiDestroy(hEvtRead); AssertRC(rc2);
 
+#ifndef IN_RING0
     RTLockValidatorRecSharedDestroy(&pThis->pValidatorRead);
     RTLockValidatorRecExclDestroy(&pThis->pValidatorWrite);
+#endif
 
     return RT_SUCCESS(rc1) ? rc2 : rc1;
