mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Use MmDeleteKernelStack and remove KeReleaseThread
svn path=/trunk/; revision=14696
This commit is contained in:
parent
c683236f8a
commit
05c22b76ae
2 changed files with 74 additions and 37 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue