don't receive the previous mode before the current thread was created,
this should finally fix the boot.
Modified: trunk/reactos/ntoskrnl/include/internal/ps.h
Modified: trunk/reactos/ntoskrnl/ps/create.c
Modified: trunk/reactos/ntoskrnl/ps/idle.c
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c
Modified: trunk/reactos/ntoskrnl/ps/thread.c
_____
Modified: trunk/reactos/ntoskrnl/include/internal/ps.h
--- trunk/reactos/ntoskrnl/include/internal/ps.h 2005-03-14
00:36:02 UTC (rev 14043)
+++ trunk/reactos/ntoskrnl/include/internal/ps.h 2005-03-14
01:47:18 UTC (rev 14044)
@@ -455,6 +455,7 @@
PsInitializeThread(PEPROCESS Process,
PETHREAD* ThreadPtr,
POBJECT_ATTRIBUTES ObjectAttributes,
+ KPROCESSOR_MODE AccessMode,
BOOLEAN First);
PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread,
@@ -532,6 +533,8 @@
PsApplicationProcessorInit(VOID);
VOID
PsPrepareForApplicationProcessorInit(ULONG Id);
+VOID
+PsInitReaperThread(VOID);
VOID STDCALL
PsIdleThreadMain(PVOID Context);
_____
Modified: trunk/reactos/ntoskrnl/ps/create.c
--- trunk/reactos/ntoskrnl/ps/create.c 2005-03-14 00:36:02 UTC (rev
14043)
+++ trunk/reactos/ntoskrnl/ps/create.c 2005-03-14 01:47:18 UTC (rev
14044)
@@ -399,17 +399,15 @@
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 @@
/*
* Create and initialize thread
*/
- Status = ObCreateObject(PreviousMode,
+ Status = ObCreateObject(AccessMode,
PsThreadType,
ObjectAttributes,
KernelMode,
@@ -730,6 +728,7 @@
Status = PsInitializeThread(Process,
&Thread,
ObjectAttributes,
+ PreviousMode,
FALSE);
ObDereferenceObject(Process);
@@ -877,6 +876,7 @@
Status = PsInitializeThread(NULL,
&Thread,
ObjectAttributes,
+ KernelMode,
FALSE);
if (!NT_SUCCESS(Status))
{
_____
Modified: trunk/reactos/ntoskrnl/ps/idle.c
--- trunk/reactos/ntoskrnl/ps/idle.c 2005-03-14 00:36:02 UTC (rev
14043)
+++ trunk/reactos/ntoskrnl/ps/idle.c 2005-03-14 01:47:18 UTC (rev
14044)
@@ -57,6 +57,7 @@
Status = PsInitializeThread(NULL,
&IdleThread,
NULL,
+ KernelMode,
FALSE);
if (!NT_SUCCESS(Status))
{
_____
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c
--- trunk/reactos/ntoskrnl/ps/psmgr.c 2005-03-14 00:36:02 UTC (rev
14043)
+++ trunk/reactos/ntoskrnl/ps/psmgr.c 2005-03-14 01:47:18 UTC (rev
14044)
@@ -30,6 +30,7 @@
PsInitProcessManagment();
PsInitThreadManagment();
PsInitIdleThread();
+ PsInitReaperThread();
PsInitialiseSuspendImplementation();
PsInitialiseW32Call();
}
_____
Modified: trunk/reactos/ntoskrnl/ps/thread.c
--- trunk/reactos/ntoskrnl/ps/thread.c 2005-03-14 00:36:02 UTC (rev
14043)
+++ trunk/reactos/ntoskrnl/ps/thread.c 2005-03-14 01:47:18 UTC (rev
14044)
@@ -709,6 +709,7 @@
PsInitializeThread(NULL,
&IdleThread,
NULL,
+ KernelMode,
FALSE);
IdleThread->Tcb.State = THREAD_STATE_RUNNING;
IdleThread->Tcb.FreezeCount = 0;
@@ -731,10 +732,8 @@
* 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 @@
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 @@
DPRINT("FirstThread %x\n",FirstThread);
DoneInitYet = TRUE;
+}
+VOID
+PsInitReaperThread(VOID)
+{
+ PETHREAD ReaperThread;
+ KIRQL oldIrql;
+ NTSTATUS Status;
+
/*
* Create the reaper thread
*/
@@ -785,6 +792,7 @@
Status = PsInitializeThread(NULL,
&ReaperThread,
NULL,
+ KernelMode,
FALSE);
if (!NT_SUCCESS(Status))
{