Index: /trunk/src/VBox/Runtime/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Runtime/Makefile.kmk	(revision 4228)
+++ /trunk/src/VBox/Runtime/Makefile.kmk	(revision 4229)
@@ -777,4 +777,5 @@
 	r0drv/nt/spinlock-r0drv-nt.cpp \
 	r0drv/nt/thread-r0drv-nt.cpp \
+	r0drv/nt/thread2-r0drv-nt.cpp \
 	string/strncmp.cpp
 
Index: /trunk/src/VBox/Runtime/include/internal/thread.h
===================================================================
--- /trunk/src/VBox/Runtime/include/internal/thread.h	(revision 4228)
+++ /trunk/src/VBox/Runtime/include/internal/thread.h	(revision 4229)
@@ -85,5 +85,5 @@
     RTTHREADSTATE volatile  enmState;
 #if defined(RT_OS_WINDOWS) && defined(IN_RING3)
-    /** The thread handle.
+    /** The thread handle
      * This is not valid until the create function has returned! */
     uintptr_t               hThread;
Index: /trunk/src/VBox/Runtime/r0drv/nt/thread2-r0drv-nt.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r0drv/nt/thread2-r0drv-nt.cpp	(revision 4228)
+++ /trunk/src/VBox/Runtime/r0drv/nt/thread2-r0drv-nt.cpp	(revision 4229)
@@ -22,7 +22,15 @@
 
 #include <iprt/thread.h>
+#include <iprt/assert.h>
 #include <iprt/err.h>
 
 #include "internal/thread.h"
+
+
+int rtThreadNativeInit(void)
+{
+    /* No TLS in Ring-0. :-/ */
+    return VINF_SUCCESS;
+}
 
 
@@ -32,2 +40,94 @@
 }
 
+
+int rtThreadNativeSetPriority(PRTTHREADINT pThread, RTTHREADTYPE enmType)
+{
+    /*
+     * Convert the IPRT priority type to NT priority.
+     *
+     * The NT priority is in the range 0..32, with realtime starting
+     * at 16 and the default for user processes at 8. (Should try find
+     * the appropriate #defines for some of this...)
+     */
+    KPRIORITY Priority;
+    switch (enmType)
+    {
+        case RTTHREADTYPE_INFREQUENT_POLLER:    Priority = 6; break;
+        case RTTHREADTYPE_EMULATION:            Priority = 7; break;
+        case RTTHREADTYPE_DEFAULT:              Priority = 8; break;
+        case RTTHREADTYPE_MSG_PUMP:             Priority = 9; break;
+        case RTTHREADTYPE_IO:                   Priority = LOW_REALTIME_PRIORITY; break;
+        case RTTHREADTYPE_TIMER:                Priority = MAXIMUM_PRIORITY; break;
+
+        default:
+            AssertMsgFailed(("enmType=%d\n", enmType));
+            return VERR_INVALID_PARAMETER;
+    }
+
+    /*
+     * Do the actual modification.
+     */
+    NTSTATUS rc = KeSetPriorityThread((PKTHREAD)pThread->Core.Key, Priority);
+    AssertMsg(NT_SUCCESS(rc), ("%#x\n", rc));
+    return RTErrConvertFromNtStatus(rc);
+}
+
+
+int rtThreadNativeAdopt(PRTTHREADINT pThread)
+{
+    return VERR_NOT_IMPLEMENTED;
+}
+
+
+/**
+ * Native kernel thread wrapper function.
+ *
+ * This will forward to rtThreadMain and do termination upon return.
+ *
+ * @param pvArg         Pointer to the argument package.
+ */
+static VOID __stdcall rtThreadNativeMain(PVOID pvArg)
+{
+    PETHREAD Self = PsGetCurrentThread();
+    PRTTHREADINT pThread = (PRTTHREADINT)pvArg;
+
+    rtThreadMain(pThread, (RTNATIVETHREAD)Self, &pThread->szName[0]);
+
+    ObDereferenceObject(Self); /* the rtThreadNativeCreate ref. */
+}
+
+
+int rtThreadNativeCreate(PRTTHREADINT pThreadInt, PRTNATIVETHREAD pNativeThread)
+{
+    /*
+     * PsCreateSysemThread create a thread an give us a handle in return.
+     * We requests the object for that handle and then close it, so what
+     * we keep around is the pointer to the thread object and not a handle.
+     * The thread will dereference the object before returning.
+     */
+    HANDLE hThread = NULL;
+    OBJECT_ATTRIBUTES ObjAttr;
+    InitializeObjectAttributes(&ObjAttr, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
+    NTSTATUS rc = PsCreateSystemThread(&hThread,
+                                       THREAD_ALL_ACCESS,
+                                       &ObjAttr,
+                                       NULL /* ProcessHandle - kernel */,
+                                       NULL /* ClientID - kernel */,
+                                       rtThreadNativeMain,
+                                       pThreadInt);
+    if (NT_SUCCESS(rc))
+    {
+        PVOID pvThreadObj;
+        rc = ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL /* object type */,
+                                       KernelMode, &pvThreadObj, NULL /* handle info */);
+        if (NT_SUCCESS(rc))
+        {
+            ZwClose(hThread);
+            *pNativeThread = (RTNATIVETHREAD)pvThreadObj;
+        }
+        else
+            AssertMsgFailed(("%#x\n", rc));
+    }
+    return RTErrConvertFromNtStatus(rc);
+}
+
