diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index a4d8a2f79fb..46d5453a6f4 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -455,6 +455,7 @@ NTSTATUS PsInitializeThread(PEPROCESS Process, PETHREAD* ThreadPtr, POBJECT_ATTRIBUTES ObjectAttributes, + KPROCESSOR_MODE AccessMode, BOOLEAN First); PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread, @@ -532,6 +533,8 @@ VOID PsApplicationProcessorInit(VOID); VOID PsPrepareForApplicationProcessorInit(ULONG Id); +VOID +PsInitReaperThread(VOID); VOID STDCALL PsIdleThreadMain(PVOID Context); diff --git a/reactos/ntoskrnl/ps/create.c b/reactos/ntoskrnl/ps/create.c index fca97ad3875..7082ca55724 100644 --- a/reactos/ntoskrnl/ps/create.c +++ b/reactos/ntoskrnl/ps/create.c @@ -399,17 +399,15 @@ NTSTATUS PsInitializeThread(PEPROCESS Process, PETHREAD* ThreadPtr, POBJECT_ATTRIBUTES ObjectAttributes, + KPROCESSOR_MODE AccessMode, BOOLEAN First) { PETHREAD Thread; NTSTATUS Status; - KPROCESSOR_MODE PreviousMode; KIRQL oldIrql; PAGED_CODE(); - PreviousMode = ExGetPreviousMode(); - if (Process == NULL) { Process = PsInitialSystemProcess; @@ -418,7 +416,7 @@ PsInitializeThread(PEPROCESS Process, /* * Create and initialize thread */ - Status = ObCreateObject(PreviousMode, + Status = ObCreateObject(AccessMode, PsThreadType, ObjectAttributes, KernelMode, @@ -730,6 +728,7 @@ NtCreateThread(OUT PHANDLE ThreadHandle, Status = PsInitializeThread(Process, &Thread, ObjectAttributes, + PreviousMode, FALSE); ObDereferenceObject(Process); @@ -877,6 +876,7 @@ PsCreateSystemThread(PHANDLE ThreadHandle, Status = PsInitializeThread(NULL, &Thread, ObjectAttributes, + KernelMode, FALSE); if (!NT_SUCCESS(Status)) { diff --git a/reactos/ntoskrnl/ps/idle.c b/reactos/ntoskrnl/ps/idle.c index f77aa45d46b..11e846408e3 100644 --- a/reactos/ntoskrnl/ps/idle.c +++ b/reactos/ntoskrnl/ps/idle.c @@ -57,6 +57,7 @@ PsInitIdleThread(VOID) Status = PsInitializeThread(NULL, &IdleThread, NULL, + KernelMode, FALSE); if (!NT_SUCCESS(Status)) { diff --git a/reactos/ntoskrnl/ps/psmgr.c b/reactos/ntoskrnl/ps/psmgr.c index 82285f8f1ce..52d9fa6ca7f 100644 --- a/reactos/ntoskrnl/ps/psmgr.c +++ b/reactos/ntoskrnl/ps/psmgr.c @@ -30,6 +30,7 @@ PiInitProcessManager(VOID) PsInitProcessManagment(); PsInitThreadManagment(); PsInitIdleThread(); + PsInitReaperThread(); PsInitialiseSuspendImplementation(); PsInitialiseW32Call(); } diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index b22f1582a67..41fbd070ce7 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -709,6 +709,7 @@ PsPrepareForApplicationProcessorInit(ULONG Id) PsInitializeThread(NULL, &IdleThread, NULL, + KernelMode, FALSE); IdleThread->Tcb.State = THREAD_STATE_RUNNING; IdleThread->Tcb.FreezeCount = 0; @@ -731,10 +732,8 @@ PsInitThreadManagment(VOID) * FUNCTION: Initialize thread managment */ { - PETHREAD FirstThread, ReaperThread; + PETHREAD FirstThread; ULONG i; - KIRQL oldIrql; - NTSTATUS Status; for (i=0; i < MAXIMUM_PRIORITY; i++) { @@ -766,7 +765,7 @@ PsInitThreadManagment(VOID) ObpCreateTypeObject(PsThreadType); - PsInitializeThread(NULL, &FirstThread, NULL, TRUE); + PsInitializeThread(NULL, &FirstThread, NULL, KernelMode, TRUE); FirstThread->Tcb.State = THREAD_STATE_RUNNING; FirstThread->Tcb.FreezeCount = 0; FirstThread->Tcb.UserAffinity = (1 << 0); /* Set the affinity of the first thread to the boot processor */ @@ -776,7 +775,15 @@ PsInitThreadManagment(VOID) DPRINT("FirstThread %x\n",FirstThread); DoneInitYet = TRUE; +} +VOID +PsInitReaperThread(VOID) +{ + PETHREAD ReaperThread; + KIRQL oldIrql; + NTSTATUS Status; + /* * Create the reaper thread */ @@ -785,6 +792,7 @@ PsInitThreadManagment(VOID) Status = PsInitializeThread(NULL, &ReaperThread, NULL, + KernelMode, FALSE); if (!NT_SUCCESS(Status)) {