- Fix worker thread priorities. A quick check of the DDK and ProcesXP confirmed that there was a bug (thanks GvG!). Turns out I had forgotten to use the -base- priority kernel call. Renamed some variables to make it clearer and fixed the bug. The correct priorities are 12, 13, 15.
Modified: trunk/reactos/ntoskrnl/ex/work.c
Modified: trunk/reactos/ntoskrnl/ke/kthread.c

Modified: trunk/reactos/ntoskrnl/ex/work.c
--- trunk/reactos/ntoskrnl/ex/work.c	2006-01-04 14:26:06 UTC (rev 20560)
+++ trunk/reactos/ntoskrnl/ex/work.c	2006-01-04 20:45:58 UTC (rev 20561)
@@ -19,17 +19,17 @@
 /* DATA **********************************************************************/
 
 /* Number of worker threads for each Queue */
-#define EX_HYPERCRITICAL_WORK_THREADS   1
-#define EX_DELAYED_WORK_THREADS         3
-#define EX_CRITICAL_WORK_THREADS        5
+#define EX_HYPERCRITICAL_WORK_THREADS               1
+#define EX_DELAYED_WORK_THREADS                     3
+#define EX_CRITICAL_WORK_THREADS                    5
 
 /* Magic flag for dynamic worker threads */
-#define EX_DYNAMIC_WORK_THREAD          0x80000000
+#define EX_DYNAMIC_WORK_THREAD                      0x80000000
 
-/* Worker thread priorities */
-#define EX_HYPERCRITICAL_QUEUE_PRIORITY 7
-#define EX_CRITICAL_QUEUE_PRIORITY      5
-#define EX_DELAYED_QUEUE_PRIORITY       4
+/* Worker thread priority increments (added to base priority) */
+#define EX_HYPERCRITICAL_QUEUE_PRIORITY_INCREMENT   7
+#define EX_CRITICAL_QUEUE_PRIORITY_INCREMENT        5
+#define EX_DELAYED_QUEUE_PRIORITY_INCREMENT         4
 
 /* The actual worker queue array */
 EX_WORK_QUEUE ExWorkerQueue[MaximumWorkQueue];
@@ -284,17 +284,17 @@
     if (WorkQueueType == DelayedWorkQueue)
     {
         /* Priority == 4 */
-        Priority = EX_DELAYED_QUEUE_PRIORITY;
+        Priority = EX_DELAYED_QUEUE_PRIORITY_INCREMENT;
     }
     else if (WorkQueueType == CriticalWorkQueue)
     {
         /* Priority == 5 */
-        Priority = EX_CRITICAL_QUEUE_PRIORITY;
+        Priority = EX_CRITICAL_QUEUE_PRIORITY_INCREMENT;
     }
     else
     {
         /* Priority == 7 */
-        Priority = EX_HYPERCRITICAL_QUEUE_PRIORITY;
+        Priority = EX_HYPERCRITICAL_QUEUE_PRIORITY_INCREMENT;
     }
 
     /* Get the Thread */
@@ -306,7 +306,7 @@
                               NULL);
 
     /* Set the Priority */
-    KeSetPriorityThread(&Thread->Tcb, Priority);
+    KeSetBasePriorityThread(&Thread->Tcb, Priority);
 
     /* Dereference and close handle */
     ObDereferenceObject(Thread);
@@ -431,7 +431,7 @@
 
     /* Raise our priority above all other worker threads */
     KeSetBasePriorityThread(KeGetCurrentThread(),
-                            EX_CRITICAL_QUEUE_PRIORITY + 1);
+                            EX_CRITICAL_QUEUE_PRIORITY_INCREMENT + 1);
 
     /* Setup the timer */
     KeInitializeTimer(&Timer);

Modified: trunk/reactos/ntoskrnl/ke/kthread.c
--- trunk/reactos/ntoskrnl/ke/kthread.c	2006-01-04 14:26:06 UTC (rev 20560)
+++ trunk/reactos/ntoskrnl/ke/kthread.c	2006-01-04 20:45:58 UTC (rev 20561)
@@ -1177,15 +1177,12 @@
 }
 
 /*
- * Sets thread's base priority relative to the process' base priority
- * Should only be passed in THREAD_PRIORITY_ constants in pstypes.h
- *
  * @implemented
  */
 LONG
 STDCALL
-KeSetBasePriorityThread (PKTHREAD Thread,
-                         LONG Increment)
+KeSetBasePriorityThread(PKTHREAD Thread,
+                        LONG Increment)
 {
     KIRQL OldIrql;
     PKPROCESS Process;