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 */