Use MmDeleteKernelStack and remove KeReleaseThread

svn path=/trunk/; revision=14696
This commit is contained in:
Alex Ionescu 2005-04-19 06:24:15 +00:00
parent c683236f8a
commit 05c22b76ae
2 changed files with 74 additions and 37 deletions

View file

@ -19,7 +19,7 @@
extern PEPROCESS PsIdleProcess; extern PEPROCESS PsIdleProcess;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
/** System idle thread procedure /** System idle thread procedure
* *
*/ */
@ -45,45 +45,82 @@ PsIdleThreadMain(PVOID Context)
} }
} }
/*
* 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 PAGED_CODE();
*
*/ Thread = ExAllocatePool(NonPagedPool, sizeof(ETHREAD));
VOID INIT_FUNCTION
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) PsInitIdleThread(VOID)
{ {
NTSTATUS Status; PETHREAD IdleThread;
PETHREAD IdleThread; KIRQL oldIrql;
KIRQL oldIrql;
Status = PsInitializeThread(PsIdleProcess, PsInitializeIdleOrFirstThread(PsIdleProcess,
&IdleThread, &IdleThread,
NULL, PsIdleThreadMain,
KernelMode, KernelMode,
FALSE); 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;
}
oldIrql = KeAcquireDispatcherDatabaseLock (); oldIrql = KeAcquireDispatcherDatabaseLock ();
KiUnblockThread(&IdleThread->Tcb, NULL, 0); KiUnblockThread(&IdleThread->Tcb, NULL, 0);
KeReleaseDispatcherDatabaseLock(oldIrql); 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);
} }

View file

@ -103,7 +103,7 @@ PsInitThreadManagment(VOID)
ObpCreateTypeObject(PsThreadType); ObpCreateTypeObject(PsThreadType);
PsInitializeThread(NULL, &FirstThread, NULL, KernelMode, TRUE); PsInitializeIdleOrFirstThread(PsInitialSystemProcess, &FirstThread, NULL, KernelMode, TRUE);
FirstThread->Tcb.State = Running; FirstThread->Tcb.State = Running;
FirstThread->Tcb.FreezeCount = 0; FirstThread->Tcb.FreezeCount = 0;
FirstThread->Tcb.UserAffinity = (1 << 0); /* Set the affinity of the first thread to the boot processor */ FirstThread->Tcb.UserAffinity = (1 << 0); /* Set the affinity of the first thread to the boot processor */