From 641b34b119b36501ddf4f0b42187efe083ff4c8a Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 8 Nov 2023 16:06:01 +0100 Subject: [PATCH] Fixes in i686 version of KepInitializeThreadContext() --- sdk/xtdk/i686/ketypes.h | 24 ++++++++++++++---------- sdk/xtdk/i686/xtstruct.h | 4 ++-- xtoskrnl/ke/i686/kthread.c | 29 ++++++++++++++++------------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/sdk/xtdk/i686/ketypes.h b/sdk/xtdk/i686/ketypes.h index 14e65a4..ceb5494 100644 --- a/sdk/xtdk/i686/ketypes.h +++ b/sdk/xtdk/i686/ketypes.h @@ -169,8 +169,12 @@ #define SIZE_OF_80387_REGISTERS 80 #define SIZE_OF_FX_REGISTERS 128 +/* NPX state definitions */ +#define NPX_STATE_LOADED 0x0 +#define NPX_STATE_UNLOADED 0xA + /* Floating point state storing structure */ -typedef struct _FLOATING_SAVE_AREA +typedef struct _FN_SAVE_FORMAT { ULONG ControlWord; ULONG StatusWord; @@ -181,10 +185,10 @@ typedef struct _FLOATING_SAVE_AREA ULONG DataSelector; UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +} FN_SAVE_FORMAT, *PFN_SAVE_FORMAT; /* Data for FXSAVE/FXRSTOR instructions structure definition */ -typedef struct _SIMD_SAVE_AREA +typedef struct _FX_SAVE_FORMAT { USHORT ControlWord; USHORT StatusWord; @@ -200,15 +204,15 @@ typedef struct _SIMD_SAVE_AREA UCHAR Reserved3[SIZE_OF_FX_REGISTERS]; UCHAR Reserved4[224]; UCHAR Align16Byte[8]; -} SIMD_SAVE_AREA, *PSIMD_SAVE_AREA; +} FX_SAVE_FORMAT, *PFX_SAVE_FORMAT; /* Floating save area structure definition */ typedef struct _FX_SAVE_AREA { union { - FLOATING_SAVE_AREA FnArea; - SIMD_SAVE_AREA FxArea; + FN_SAVE_FORMAT FnArea; + FX_SAVE_FORMAT FxArea; }; ULONG NpxSavedCpu; ULONG Cr0NpxState; @@ -224,7 +228,7 @@ typedef struct _CONTEXT ULONG Dr3; ULONG Dr6; ULONG Dr7; - FLOATING_SAVE_AREA FloatSave; + FN_SAVE_FORMAT FloatSave; ULONG SegGs; ULONG SegFs; ULONG SegEs; @@ -357,7 +361,7 @@ typedef struct _KSTART_FRAME typedef struct _KSWITCH_FRAME { PVOID ExceptionList; - PVOID Reserved; + BOOLEAN ApcBypassDisabled; PVOID Return; } KSWITCH_FRAME, *PKSWITCH_FRAME; @@ -366,8 +370,8 @@ typedef struct _KTRAP_FRAME { ULONG DbgEbp; ULONG DbgEip; - ULONG DbgArgMark; - ULONG DbgArgPointer; + ULONG DbgMark; + ULONG DbgPointer; ULONG TempSegCs; ULONG TempEsp; ULONG Dr0; diff --git a/sdk/xtdk/i686/xtstruct.h b/sdk/xtdk/i686/xtstruct.h index c1bca3c..59aca37 100644 --- a/sdk/xtdk/i686/xtstruct.h +++ b/sdk/xtdk/i686/xtstruct.h @@ -22,8 +22,9 @@ typedef struct _CONTEXT CONTEXT, *PCONTEXT; typedef struct _CPU_IDENTIFICATION CPU_IDENTIFICATION, *PCPU_IDENTIFICATION; typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS; typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE; -typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +typedef struct _FN_SAVE_FORMAT FN_SAVE_FORMAT, *PFN_SAVE_FORMAT; typedef struct _FX_SAVE_AREA FX_SAVE_AREA, *PFX_SAVE_AREA; +typedef struct _FX_SAVE_FORMAT FX_SAVE_FORMAT, *PFX_SAVE_FORMAT; typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE; typedef struct _HARDWARE_PTE_PAE HARDWARE_PTE_PAE, *PHARDWARE_PTE_PAE; typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR; @@ -40,7 +41,6 @@ typedef struct _KSWITCH_FRAME KSWITCH_FRAME, *PKSWITCH_FRAME; typedef struct _KTHREAD_INIT_FRAME KTHREAD_INIT_FRAME, *PKTHREAD_INIT_FRAME; typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME; typedef struct _KTSS KTSS, *PKTSS; -typedef struct _SIMD_SAVE_AREA SIMD_SAVE_AREA, *PSIMD_SAVE_AREA; typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK; #endif /* __XTDK_I686_XTSTRUCT_H */ diff --git a/xtoskrnl/ke/i686/kthread.c b/xtoskrnl/ke/i686/kthread.c index b65e565..95b003a 100644 --- a/xtoskrnl/ke/i686/kthread.c +++ b/xtoskrnl/ke/i686/kthread.c @@ -40,13 +40,13 @@ KepInitializeThreadContext(IN PKTHREAD Thread, IN PCONTEXT ContextRecord) { PKTHREAD_INIT_FRAME ThreadFrame; - PSIMD_SAVE_AREA SimdSaveArea; + PFX_SAVE_FORMAT FxSaveFormat; /* Set initial thread frame */ - ThreadFrame = (PKTHREAD_INIT_FRAME)Thread->InitialStack - sizeof(KTHREAD_INIT_FRAME); + ThreadFrame = ((PKTHREAD_INIT_FRAME)Thread->InitialStack) - sizeof(KTHREAD_INIT_FRAME); /* Fill floating point save area with zeroes */ - RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FLOATING_SAVE_AREA)); + RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FX_SAVE_AREA)); /* Check if context provided for this thread */ if(ContextRecord) @@ -58,19 +58,20 @@ KepInitializeThreadContext(IN PKTHREAD Thread, ContextRecord->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL; /* This is user mode thread */ + ThreadFrame->StartFrame.UserMode = TRUE; Thread->PreviousMode = UserMode; /* Disable coprocessor floating point state */ - Thread->NpxState = CR0_TS | CR0_MP; + Thread->NpxState = NPX_STATE_UNLOADED; Thread->Header.NpxIrql = PASSIVE_LEVEL; /* Set initial floating point state */ + FxSaveFormat = (PFX_SAVE_FORMAT)ContextRecord->ExtendedRegisters; + FxSaveFormat->ControlWord = 0x27F; + FxSaveFormat->MxCsr = 0x1F80; + ContextRecord->FloatSave.Cr0NpxState = 0; ThreadFrame->NpxFrame.Cr0NpxState = 0; ThreadFrame->NpxFrame.NpxSavedCpu = 0; - SimdSaveArea = (PSIMD_SAVE_AREA)ContextRecord->ExtendedRegisters; - SimdSaveArea->ControlWord = 0x27F; - SimdSaveArea->MxCsr = 0x1F80; - ContextRecord->FloatSave.Cr0NpxState = 0; /* Clear DR6 and DR7 registers */ ThreadFrame->TrapFrame.Dr6 = 0; @@ -84,23 +85,24 @@ KepInitializeThreadContext(IN PKTHREAD Thread, ThreadFrame->TrapFrame.SegEs |= RPL_MASK; ThreadFrame->TrapFrame.HardwareSegSs |= RPL_MASK; - /* Set kernel mode thread in the trap frame */ + /* Set debug mark in the trap frame */ + ThreadFrame->TrapFrame.DbgMark = 0x8BADF00D; + + /* Set user mode thread in the trap frame */ ThreadFrame->TrapFrame.PreviousMode = UserMode; } else { /* This is kernel mode thread */ + ThreadFrame->StartFrame.UserMode = FALSE; Thread->PreviousMode = KernelMode; /* Disable coprocessor floating point state */ - Thread->NpxState = CR0_TS | CR0_MP; + Thread->NpxState = NPX_STATE_UNLOADED; /* Set initial floating point state */ ThreadFrame->NpxFrame.FxArea.ControlWord = 0x27F; ThreadFrame->NpxFrame.FxArea.MxCsr = 0x1F80; - - /* Mark as kernel mode thread in the start frame */ - ThreadFrame->StartFrame.UserMode = FALSE; } /* Initialize thread startup information */ @@ -109,6 +111,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread, ThreadFrame->StartFrame.SystemRoutine = SystemRoutine; /* Initialize switch frame */ + ThreadFrame->SwitchFrame.ApcBypassDisabled = TRUE; ThreadFrame->SwitchFrame.ExceptionList = (PEXCEPTION_REGISTRATION_RECORD) - 1; /* Set thread stack */