diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index d1e958d663d..5c9669bef97 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -44,6 +44,8 @@ #define FRAME_EDITED 0xFFF8 +#define WE_DO_NOT_SPEAK_ABOUT_THE_V86_HACK 1 + #ifndef __ASM__ extern ULONG Ke386CacheAlignment; diff --git a/reactos/ntoskrnl/ke/i386/ctxswitch.S b/reactos/ntoskrnl/ke/i386/ctxswitch.S index b2fa214a489..1dc070b4eb0 100644 --- a/reactos/ntoskrnl/ke/i386/ctxswitch.S +++ b/reactos/ntoskrnl/ke/i386/ctxswitch.S @@ -299,6 +299,11 @@ BadThread: /* Save the Exception list */ push [ebx+KPCR_EXCEPTION_LIST] +#if WE_DO_NOT_SPEAK_ABOUT_THE_V86_HACK // V86 HACK + mov ecx, [ebx+KPCR_TSS] + push [ecx+KTSS_ESP0] +#endif + /* DPC shouldn't be active */ cmp byte ptr [ebx+KPCR_PRCB_DPC_ROUTINE_ACTIVE], 0 jnz BugCheckDpc @@ -393,6 +398,11 @@ SameProcess: inc dword ptr [esi+KTHREAD_CONTEXT_SWITCHES] //inc dword ptr [esi+KPRC_PRCB_CONTEXT_SWITCHES] +#if WE_DO_NOT_SPEAK_ABOUT_THE_V86_HACK + mov ebp, [ebx+KPCR_TSS] + pop [ebp+KTSS_ESP0] +#endif + /* Restore exception list */ pop [ebx+KPCR_EXCEPTION_LIST] diff --git a/reactos/ntoskrnl/ke/i386/thread.c b/reactos/ntoskrnl/ke/i386/thread.c index b7469485525..01898a57c86 100644 --- a/reactos/ntoskrnl/ke/i386/thread.c +++ b/reactos/ntoskrnl/ke/i386/thread.c @@ -14,6 +14,9 @@ typedef struct _KSHARED_CTXSWITCH_FRAME { +#if WE_DO_NOT_SPEAK_ABOUT_THE_V86_HACK // V86 HACK + ULONG_PTR Esp0; +#endif PVOID ExceptionList; KIRQL WaitIrql; PVOID RetEip; @@ -233,6 +236,11 @@ Ke386InitThreadWithContext(PKTHREAD Thread, CtxSwitchFrame->RetEip = KiThreadStartup; CtxSwitchFrame->WaitIrql = APC_LEVEL; CtxSwitchFrame->ExceptionList = (PVOID)0xFFFFFFFF; +#if WE_DO_NOT_SPEAK_ABOUT_THE_V86_HACK // V86 HACK + CtxSwitchFrame->Esp0 = (ULONG_PTR)Thread->InitialStack - + sizeof(FX_SAVE_AREA) - + 0x10; +#endif /* Save back the new value of the kernel stack. */ DPRINT("Final Kernel Stack: %x \n", CtxSwitchFrame);