From 208684c3b4c6b2ec1357e2983c41db73f0e3d825 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Mon, 15 Jun 2026 09:15:48 +0200 Subject: [PATCH] Update i686 thread context initialization to match AMD64 --- sdk/xtdk/i686/ketypes.h | 11 ++++++----- xtoskrnl/ke/i686/dispatch.cc | 2 +- xtoskrnl/ke/i686/kthread.cc | 10 +++++----- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/sdk/xtdk/i686/ketypes.h b/sdk/xtdk/i686/ketypes.h index 22e26bd..f75db58 100644 --- a/sdk/xtdk/i686/ketypes.h +++ b/sdk/xtdk/i686/ketypes.h @@ -428,18 +428,19 @@ typedef struct _KEXCEPTION_FRAME /* Thread start frame definition */ typedef struct _KSTART_FRAME { - PKSYSTEM_ROUTINE SystemRoutine; - PKSTART_ROUTINE StartRoutine; - PVOID StartContext; + ULONG P1Home; + ULONG P2Home; + ULONG P3Home; BOOLEAN UserMode; + ULONG Return; } KSTART_FRAME, *PKSTART_FRAME; /* Switch frame definition */ typedef struct _KSWITCH_FRAME { PVOID ExceptionList; - BOOLEAN ApcBypassDisabled; - PVOID Return; + KRUNLEVEL ApcBypass; + ULONG Return; } KSWITCH_FRAME, *PKSWITCH_FRAME; /* Trap frame definition */ diff --git a/xtoskrnl/ke/i686/dispatch.cc b/xtoskrnl/ke/i686/dispatch.cc index 53446e4..38e19c9 100644 --- a/xtoskrnl/ke/i686/dispatch.cc +++ b/xtoskrnl/ke/i686/dispatch.cc @@ -114,7 +114,7 @@ KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread, : : [FrameSize] "i" (sizeof(KSWITCH_FRAME) - 4), [PrcbcCurrentThread] "i" (FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread)), - [SwApcBypass] "i" (FIELD_OFFSET(KSWITCH_FRAME, ApcBypassDisabled)), + [SwApcBypass] "i" (FIELD_OFFSET(KSWITCH_FRAME, ApcBypass)), [SwExceptionList] "i" (FIELD_OFFSET(KSWITCH_FRAME, ExceptionList)), [SwitchRoutine] "i" (SwitchThreadContext), [ThrdInfoExceptions] "i" (FIELD_OFFSET(THREAD_INFORMATION_BLOCK, ExceptionList)), diff --git a/xtoskrnl/ke/i686/kthread.cc b/xtoskrnl/ke/i686/kthread.cc index eec4f94..6142f1d 100644 --- a/xtoskrnl/ke/i686/kthread.cc +++ b/xtoskrnl/ke/i686/kthread.cc @@ -121,14 +121,14 @@ KE::KThread::InitializeThreadContext(IN PKTHREAD Thread, } /* Initialize thread startup information */ - ThreadFrame->StartFrame.StartContext = StartContext; - ThreadFrame->StartFrame.StartRoutine = StartRoutine; - ThreadFrame->StartFrame.SystemRoutine = SystemRoutine; + ThreadFrame->StartFrame.P1Home = (ULONG)StartContext; + ThreadFrame->StartFrame.P2Home = (ULONG)StartRoutine; + ThreadFrame->StartFrame.P3Home = (ULONG)SystemRoutine; /* Initialize switch frame */ - ThreadFrame->SwitchFrame.ApcBypassDisabled = TRUE; + ThreadFrame->SwitchFrame.ApcBypass = APC_LEVEL; ThreadFrame->SwitchFrame.ExceptionList = (PEXCEPTION_REGISTRATION_RECORD) - 1; - ThreadFrame->SwitchFrame.Return = (PVOID)(ULONG)RunThread; + ThreadFrame->SwitchFrame.Return = (ULONG)RunThread; /* Set thread stack boundaries */ Thread->InitialStack = (PVOID)&ThreadFrame->NpxFrame;