From 656a5dcc1fd6fac455a469a39383ceeb4533f1f7 Mon Sep 17 00:00:00 2001 From: Justin Miller Date: Wed, 12 Mar 2025 05:24:36 -0700 Subject: [PATCH] [NTOS:KE] Implement KeI386VirtualIntExtensions code paths for INT and IRET. CORE-19049 (#7742) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Thomas Faber Co-authored-by: Hermès BÉLUSCA - MAÏTO Continued from PR #6070 JIRA issue: CORE-19049 --- ntoskrnl/ke/i386/v86vdm.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/ntoskrnl/ke/i386/v86vdm.c b/ntoskrnl/ke/i386/v86vdm.c index a50f3aba188..b4790d146f6 100644 --- a/ntoskrnl/ke/i386/v86vdm.c +++ b/ntoskrnl/ke/i386/v86vdm.c @@ -191,13 +191,21 @@ KiVdmOpcodeINTnn(IN PKTRAP_FRAME TrapFrame, V86EFlags &= (EFLAGS_ALIGN_CHECK | EFLAGS_INTERRUPT_MASK); /* Check for VME support */ - ASSERT(KeI386VirtualIntExtensions == FALSE); + if (KeI386VirtualIntExtensions) + { + /* Set IF based on VIF */ + V86EFlags &= ~EFLAGS_INTERRUPT_MASK; + if (TrapEFlags & EFLAGS_VIF) + { + V86EFlags |= EFLAGS_INTERRUPT_MASK; + } + } /* Mask in the relevant V86 EFlags into the trap flags */ V86EFlags |= (TrapEFlags & ~EFLAGS_INTERRUPT_MASK); /* And mask out the VIF, nested task and TF flag from the trap flags */ - TrapFrame->EFlags = TrapEFlags &~ (EFLAGS_VIF | EFLAGS_NESTED_TASK | EFLAGS_TF); + TrapFrame->EFlags = TrapEFlags & ~(EFLAGS_VIF | EFLAGS_NESTED_TASK | EFLAGS_TF); /* Add the IOPL flag to the local trap flags */ V86EFlags |= EFLAGS_IOPL; @@ -299,11 +307,17 @@ KiVdmOpcodeIRET(IN PKTRAP_FRAME TrapFrame, } /* Mask out EFlags */ - EFlags &= ~(EFLAGS_IOPL + EFLAGS_VIF + EFLAGS_NESTED_TASK + EFLAGS_VIP); + EFlags &= ~(EFLAGS_VIP | EFLAGS_VIF | EFLAGS_NESTED_TASK | EFLAGS_IOPL); V86EFlags = EFlags; /* Check for VME support */ - ASSERT(KeI386VirtualIntExtensions == FALSE); + if (KeI386VirtualIntExtensions) + { + if (EFlags & EFLAGS_INTERRUPT_MASK) + { + EFlags |= EFLAGS_VIF; + } + } /* Add V86 and Interrupt flag */ EFlags |= EFLAGS_V86_MASK | EFLAGS_INTERRUPT_MASK;