From 362eefc2b3e3f704535932152200f3542c8f9660 Mon Sep 17 00:00:00 2001 From: belliash Date: Tue, 7 Nov 2023 15:34:49 +0100 Subject: [PATCH] Fixes in AMD64 version of KepInitializeThreadContext() to get rid of PageFault exception --- sdk/xtdk/amd64/ketypes.h | 8 +++++++- xtoskrnl/ke/amd64/kthread.c | 12 ++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/sdk/xtdk/amd64/ketypes.h b/sdk/xtdk/amd64/ketypes.h index f322c41..d5b8ab0 100644 --- a/sdk/xtdk/amd64/ketypes.h +++ b/sdk/xtdk/amd64/ketypes.h @@ -139,6 +139,11 @@ /* Size of legacy 387 registers */ #define SIZE_OF_80387_REGISTERS 80 +/* NPX state definitions */ +#define NPX_STATE_UNUSED 0x0 +#define NPX_STATE_SCRUB 0x1 +#define NPX_STATE_SWITCH 0x2 + /* Floating point state storing structure */ typedef struct _FLOATING_SAVE_AREA { @@ -352,7 +357,8 @@ typedef struct _KSWITCH_FRAME ULONG64 P4Home; ULONG64 P5Home; ULONG MxCsr; - UCHAR Reserved[4]; + KIRQL ApcBypass; + UCHAR Reserved[3]; ULONG64 Rbp; ULONG64 Return; } KSWITCH_FRAME, *PKSWITCH_FRAME; diff --git a/xtoskrnl/ke/amd64/kthread.c b/xtoskrnl/ke/amd64/kthread.c index d015456..7104b57 100644 --- a/xtoskrnl/ke/amd64/kthread.c +++ b/xtoskrnl/ke/amd64/kthread.c @@ -42,7 +42,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread, PKTHREAD_INIT_FRAME ThreadFrame; /* Set initial thread frame */ - ThreadFrame = (PKTHREAD_INIT_FRAME)Thread->InitialStack - sizeof(KTHREAD_INIT_FRAME); + ThreadFrame = ((PKTHREAD_INIT_FRAME)Thread->InitialStack) - 1; /* Fill floating point save area with zeroes */ RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FLOATING_SAVE_AREA)); @@ -68,7 +68,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread, Thread->PreviousMode = UserMode; /* Enable floating point state */ - Thread->NpxState = 1; + Thread->NpxState = NPX_STATE_SCRUB; /* Set initial floating point state */ ThreadFrame->NpxFrame.ControlWord = 0x27F; @@ -93,9 +93,9 @@ KepInitializeThreadContext(IN PKTHREAD Thread, Thread->PreviousMode = KernelMode; /* Disable floating point state */ - Thread->NpxState = 0; + Thread->NpxState = NPX_STATE_UNUSED; - /* Set thread startup frame return information */ + /* Set thread start address */ ThreadFrame->StartFrame.Return = (ULONG64)NULL; } @@ -106,10 +106,10 @@ KepInitializeThreadContext(IN PKTHREAD Thread, ThreadFrame->StartFrame.P4Home = (ULONG64)SystemRoutine; /* Initialize switch frame */ - ThreadFrame->SwitchFrame.Rbp = (ULONG64)&ThreadFrame->TrapFrame + 128; + ThreadFrame->SwitchFrame.ApcBypass = APC_LEVEL; ThreadFrame->SwitchFrame.MxCsr = INITIAL_MXCSR; + ThreadFrame->SwitchFrame.Rbp = (ULONG64)&ThreadFrame->TrapFrame; /* Set thread stack */ - Thread->InitialStack = &ThreadFrame->NpxFrame; Thread->KernelStack = &ThreadFrame->SwitchFrame; }