From 1d9a79736a7895e49b10380e7134adf388bd014a Mon Sep 17 00:00:00 2001 From: belliash Date: Sat, 11 Nov 2023 16:30:53 +0100 Subject: [PATCH] Allow to postpone thread startup --- xtoskrnl/includes/ke.h | 3 ++- xtoskrnl/ke/amd64/krnlinit.c | 12 ++++++++---- xtoskrnl/ke/i686/krnlinit.c | 12 ++++++++---- xtoskrnl/ke/kthread.c | 11 +++++++++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/xtoskrnl/includes/ke.h b/xtoskrnl/includes/ke.h index 00fd4a2..bea4a09 100644 --- a/xtoskrnl/includes/ke.h +++ b/xtoskrnl/includes/ke.h @@ -40,7 +40,8 @@ KeInitializeThread(IN PKPROCESS Process, IN PVOID StartContext, IN PCONTEXT Context, IN PVOID EnvironmentBlock, - IN PVOID Stack); + IN PVOID Stack, + IN BOOLEAN StartThread); XTAPI VOID diff --git a/xtoskrnl/ke/amd64/krnlinit.c b/xtoskrnl/ke/amd64/krnlinit.c index 6054701..3698a77 100644 --- a/xtoskrnl/ke/amd64/krnlinit.c +++ b/xtoskrnl/ke/amd64/krnlinit.c @@ -22,12 +22,16 @@ KepInitializeKernel(VOID) { PKPROCESSOR_CONTROL_BLOCK Prcb; ULONG_PTR PageDirectory[2]; + PKPROCESS CurrentProcess; PKTHREAD CurrentThread; /* Get processor control block and current thread */ Prcb = KeGetCurrentProcessorControlBlock(); CurrentThread = KeGetCurrentThread(); + /* Get current process */ + CurrentProcess = CurrentThread->ApcState.Process; + /* Initialize CPU power state structures */ PoInitializeProcessorControlBlock(Prcb); @@ -35,17 +39,17 @@ KepInitializeKernel(VOID) RtlInitializeListHead(&KepProcessListHead); PageDirectory[0] = 0; PageDirectory[1] = 0; - KeInitializeProcess(CurrentThread->ApcState.Process, 0, 0xFFFFFFFF, PageDirectory, FALSE); - CurrentThread->ApcState.Process->Quantum = MAXCHAR; + KeInitializeProcess(CurrentProcess, 0, 0xFFFFFFFF, PageDirectory, FALSE); + CurrentProcess->Quantum = MAXCHAR; /* Initialize Idle thread */ - KeInitializeThread(CurrentThread->ApcState.Process, CurrentThread, NULL, NULL, NULL, NULL, NULL, Prcb->DpcStack); + KeInitializeThread(CurrentProcess, CurrentThread, NULL, NULL, NULL, NULL, NULL, Prcb->DpcStack, TRUE); CurrentThread->NextProcessor = Prcb->Number; CurrentThread->Priority = THREAD_HIGH_PRIORITY; CurrentThread->State = Running; CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->Number; CurrentThread->WaitIrql = DISPATCH_LEVEL; - CurrentThread->ApcState.Process->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number; + CurrentProcess->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number; } /** diff --git a/xtoskrnl/ke/i686/krnlinit.c b/xtoskrnl/ke/i686/krnlinit.c index 900cb54..5b0d6f7 100644 --- a/xtoskrnl/ke/i686/krnlinit.c +++ b/xtoskrnl/ke/i686/krnlinit.c @@ -22,12 +22,16 @@ KepInitializeKernel(VOID) { PKPROCESSOR_CONTROL_BLOCK Prcb; ULONG_PTR PageDirectory[2]; + PKPROCESS CurrentProcess; PKTHREAD CurrentThread; /* Get processor control block and current thread */ Prcb = KeGetCurrentProcessorControlBlock(); CurrentThread = KeGetCurrentThread(); + /* Get current process */ + CurrentProcess = CurrentThread->ApcState.Process; + /* Initialize CPU power state structures */ PoInitializeProcessorControlBlock(Prcb); @@ -35,17 +39,17 @@ KepInitializeKernel(VOID) RtlInitializeListHead(&KepProcessListHead); PageDirectory[0] = 0; PageDirectory[1] = 0; - KeInitializeProcess(CurrentThread->ApcState.Process, 0, 0xFFFFFFFF, PageDirectory, FALSE); - CurrentThread->ApcState.Process->Quantum = MAXCHAR; + KeInitializeProcess(CurrentProcess, 0, 0xFFFFFFFF, PageDirectory, FALSE); + CurrentProcess->Quantum = MAXCHAR; /* Initialize Idle thread */ - KeInitializeThread(CurrentThread->ApcState.Process, CurrentThread, NULL, NULL, NULL, NULL, NULL, Prcb->DpcStack); + KeInitializeThread(CurrentProcess, CurrentThread, NULL, NULL, NULL, NULL, NULL, Prcb->DpcStack, TRUE); CurrentThread->NextProcessor = Prcb->Number; CurrentThread->Priority = THREAD_HIGH_PRIORITY; CurrentThread->State = Running; CurrentThread->Affinity = (ULONG_PTR)1 << Prcb->Number; CurrentThread->WaitIrql = DISPATCH_LEVEL; - CurrentThread->ApcState.Process->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number; + CurrentProcess->ActiveProcessors |= (ULONG_PTR)1 << Prcb->Number; } /** diff --git a/xtoskrnl/ke/kthread.c b/xtoskrnl/ke/kthread.c index 2e4afe6..8485d0b 100644 --- a/xtoskrnl/ke/kthread.c +++ b/xtoskrnl/ke/kthread.c @@ -49,7 +49,8 @@ KeInitializeThread(IN PKPROCESS Process, IN PVOID StartContext, IN PCONTEXT Context, IN PVOID EnvironmentBlock, - IN PVOID Stack) + IN PVOID Stack, + IN BOOLEAN StartThread) { PKWAIT_BLOCK TimerWaitBlock; BOOLEAN Allocation; @@ -164,7 +165,13 @@ KeInitializeThread(IN PKPROCESS Process, /* Mark thread as initialized and run it */ Thread->State = Initialized; - KeStartThread(Thread); + + /* Check if thread should be started */ + if(StartThread) + { + /* Start thread */ + KeStartThread(Thread); + } /* Return success */ return STATUS_SUCCESS;