diff --git a/xtoskrnl/includes/ke/kthread.hh b/xtoskrnl/includes/ke/kthread.hh index 13ffd99..79bbff2 100644 --- a/xtoskrnl/includes/ke/kthread.hh +++ b/xtoskrnl/includes/ke/kthread.hh @@ -38,6 +38,7 @@ namespace KE STATIC XTAPI VOID StartThread(IN PKTHREAD Thread); private: + STATIC XTAPI VOID HandleSystemThreadExit(VOID); STATIC XTAPI VOID InitializeThreadContext(IN PKTHREAD Thread, IN PKSYSTEM_ROUTINE SystemRoutine, IN PKSTART_ROUTINE StartRoutine, @@ -53,6 +54,7 @@ namespace KE STATIC XTAPI VOID SuspendThread(IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); + STATIC XTAPI VOID SwitchToUserMode(VOID); }; } diff --git a/xtoskrnl/ke/amd64/kthread.cc b/xtoskrnl/ke/amd64/kthread.cc index 67a40ec..1193a51 100644 --- a/xtoskrnl/ke/amd64/kthread.cc +++ b/xtoskrnl/ke/amd64/kthread.cc @@ -105,6 +105,9 @@ KE::KThread::InitializeThreadContext(IN PKTHREAD Thread, ThreadFrame->ExceptionFrame.P2Home = (ULONGLONG)StartRoutine; ThreadFrame->ExceptionFrame.P3Home = (ULONGLONG)SystemRoutine; ThreadFrame->ExceptionFrame.P4Home = (ULONGLONG)SystemRoutine; + + /* Set the routine that will handle the thread finishing its initialization and transition it to UserMode */ + ThreadFrame->StartFrame.Return = (ULONG64)SwitchToUserMode; } else { @@ -113,6 +116,9 @@ KE::KThread::InitializeThreadContext(IN PKTHREAD Thread, /* Disable floating point state */ Thread->NpxState = NPX_STATE_UNUSED; + + /* Set the routine that will handle a system thread that unexpectedly finished its execution */ + ThreadFrame->StartFrame.Return = (ULONG64)HandleSystemThreadExit; } /* Initialize thread startup information */ diff --git a/xtoskrnl/ke/i686/kthread.cc b/xtoskrnl/ke/i686/kthread.cc index ca3e1f2..eec4f94 100644 --- a/xtoskrnl/ke/i686/kthread.cc +++ b/xtoskrnl/ke/i686/kthread.cc @@ -99,6 +99,9 @@ KE::KThread::InitializeThreadContext(IN PKTHREAD Thread, ThreadFrame->TrapFrame.SegDs |= RPL_MASK; ThreadFrame->TrapFrame.SegEs |= RPL_MASK; ThreadFrame->TrapFrame.SegSs |= RPL_MASK; + + /* Set the routine that will handle the thread finishing its initialization and transition it to UserMode */ + ThreadFrame->StartFrame.Return = (ULONG)SwitchToUserMode; } else { @@ -112,6 +115,9 @@ KE::KThread::InitializeThreadContext(IN PKTHREAD Thread, /* Set initial floating point state */ ThreadFrame->NpxFrame.FxArea.ControlWord = 0x27F; ThreadFrame->NpxFrame.FxArea.MxCsr = 0x1F80; + + /* Set the routine that will handle a system thread that unexpectedly finished its execution */ + ThreadFrame->StartFrame.Return = (ULONG)HandleSystemThreadExit; } /* Initialize thread startup information */ diff --git a/xtoskrnl/ke/kthread.cc b/xtoskrnl/ke/kthread.cc index 72151e5..a6f6746 100644 --- a/xtoskrnl/ke/kthread.cc +++ b/xtoskrnl/ke/kthread.cc @@ -23,6 +23,19 @@ KE::KThread::GetInitialThread(VOID) return &InitialThread; } +/** + * Handles an unexpected system thread exit. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KE::KThread::HandleSystemThreadExit(VOID) +{ +} + /** * Initializes an Idle Thread. * @@ -369,3 +382,16 @@ KE::KThread::SuspendThread(IN PVOID NormalContext, { UNIMPLEMENTED; } + +/** + * Switches a new thread into User Mode. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +KE::KThread::SwitchToUserMode(VOID) +{ +}