Use MmDeleteKernelStack and remove KeReleaseThread
Modified: trunk/reactos/ntoskrnl/ps/idle.c
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c
_____
Modified: trunk/reactos/ntoskrnl/ps/idle.c
--- trunk/reactos/ntoskrnl/ps/idle.c 2005-04-19 06:22:36 UTC (rev
14695)
+++ trunk/reactos/ntoskrnl/ps/idle.c 2005-04-19 06:24:15 UTC (rev
14696)
@@ -19,7 +19,7 @@
extern PEPROCESS PsIdleProcess;
/* FUNCTIONS
*****************************************************************/
-
+
/** System idle thread procedure
*
*/
@@ -45,45 +45,82 @@
}
}
+/*
+ * HACK-O-RAMA
+ * Antique vestigial code left alive for the sole purpose of First/Idle
Thread
+ * creation until I can merge my fix for properly creating them.
+ */
+NTSTATUS
+PsInitializeIdleOrFirstThread(PEPROCESS Process,
+ PETHREAD* ThreadPtr,
+ PKSTART_ROUTINE StartRoutine,
+ KPROCESSOR_MODE AccessMode,
+ BOOLEAN First)
+{
+ PETHREAD Thread;
+ PVOID KernelStack;
+ extern unsigned int init_stack;
-/** Initialization of system idle thread
- *
- */
-VOID INIT_FUNCTION
+ PAGED_CODE();
+
+ Thread = ExAllocatePool(NonPagedPool, sizeof(ETHREAD));
+
+ RtlZeroMemory(Thread, sizeof(ETHREAD));
+ Thread->ThreadsProcess = Process;
+
+ DPRINT("Thread = %x\n",Thread);
+
+ if (First)
+ {
+ KernelStack = (PVOID)init_stack;
+ }
+ else
+ {
+ KernelStack = MmCreateKernelStack(FALSE);
+ }
+
+ KeInitializeThread(&Process->Pcb,
+ &Thread->Tcb,
+ PspSystemThreadStartup,
+ StartRoutine,
+ NULL,
+ NULL,
+ NULL,
+ KernelStack);
+ Thread->Tcb.ApcQueueable = TRUE;
+
+ InitializeListHead(&Thread->IrpList);
+
+ DPRINT("Thread->Cid.UniqueThread %d\n",Thread->Cid.UniqueThread);
+
+ *ThreadPtr = Thread;
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ * HACK-O-RAMA
+ * Antique vestigial code left alive for the sole purpose of First/Idle
Thread
+ * creation until I can merge my fix for properly creating them.
+ */
+VOID
+INIT_FUNCTION
PsInitIdleThread(VOID)
{
- NTSTATUS Status;
- PETHREAD IdleThread;
- KIRQL oldIrql;
+ PETHREAD IdleThread;
+ KIRQL oldIrql;
- Status = PsInitializeThread(PsIdleProcess,
- &IdleThread,
- NULL,
- KernelMode,
- FALSE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Couldn't create idle system thread! Status: 0x%x\n",
Status);
- KEBUGCHECK(0);
- return;
- }
-
- IdleThread->StartAddress = PsIdleThreadMain;
- Status = KiArchInitThread(&IdleThread->Tcb, PsIdleThreadMain, NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Couldn't initialize system idle thread! Status:
0x%x\n", Status);
- ObDereferenceObject(IdleThread);
- KEBUGCHECK(0);
- return;
- }
+ PsInitializeIdleOrFirstThread(PsIdleProcess,
+ &IdleThread,
+ PsIdleThreadMain,
+ KernelMode,
+ FALSE);
- oldIrql = KeAcquireDispatcherDatabaseLock ();
- KiUnblockThread(&IdleThread->Tcb, NULL, 0);
- KeReleaseDispatcherDatabaseLock(oldIrql);
+ oldIrql = KeAcquireDispatcherDatabaseLock ();
+ KiUnblockThread(&IdleThread->Tcb, NULL, 0);
+ KeReleaseDispatcherDatabaseLock(oldIrql);
- KeGetCurrentPrcb()->IdleThread = &IdleThread->Tcb;
- KeSetPriorityThread(&IdleThread->Tcb, LOW_PRIORITY);
- KeSetAffinityThread(&IdleThread->Tcb, 1 << 0);
-
+ KeGetCurrentPrcb()->IdleThread = &IdleThread->Tcb;
+ KeSetPriorityThread(&IdleThread->Tcb, LOW_PRIORITY);
+ KeSetAffinityThread(&IdleThread->Tcb, 1 << 0);
}
_____
Modified: trunk/reactos/ntoskrnl/ps/psmgr.c
--- trunk/reactos/ntoskrnl/ps/psmgr.c 2005-04-19 06:22:36 UTC (rev
14695)
+++ trunk/reactos/ntoskrnl/ps/psmgr.c 2005-04-19 06:24:15 UTC (rev
14696)
@@ -103,7 +103,7 @@
ObpCreateTypeObject(PsThreadType);
- PsInitializeThread(NULL, &FirstThread, NULL, KernelMode, TRUE);
+ PsInitializeIdleOrFirstThread(PsInitialSystemProcess, &FirstThread,
NULL, KernelMode, TRUE);
FirstThread->Tcb.State = Running;
FirstThread->Tcb.FreezeCount = 0;
FirstThread->Tcb.UserAffinity = (1 << 0); /* Set the affinity of
the first thread to the boot processor */