https://git.reactos.org/?p=reactos.git;a=commitdiff;h=12ed9f30a7d076022a74e99a1948f8133668a92a

commit 12ed9f30a7d076022a74e99a1948f8133668a92a
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Thu Dec 15 21:44:43 2022 +0200
Commit:     Timo Kreuzer <[email protected]>
CommitDate: Wed Jan 4 10:32:28 2023 +0100

    [NTOS] Fix interrupt flag handling in KiPageFault
    
    This fixes a crash in kmtest:ZwAllocateVirtualMemory
---
 ntoskrnl/ke/amd64/trap.S | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/ntoskrnl/ke/amd64/trap.S b/ntoskrnl/ke/amd64/trap.S
index 9ca9dacde94..150d08d8133 100644
--- a/ntoskrnl/ke/amd64/trap.S
+++ b/ntoskrnl/ke/amd64/trap.S
@@ -417,13 +417,15 @@ FUNC KiPageFault
     mov rdx, cr2
     mov [rbp  + KTRAP_FRAME_FaultAddress], rdx
     
-    /* If interrupts are off, treat this as an access violation */
+    /* If interrupts are off, do not enable them */
     test dword ptr [rbp + KTRAP_FRAME_EFlags], EFLAGS_IF_MASK
-    jz AccessViolation
+    jz IntsDisabled
 
     /* Enable interrupts for the page fault handler */
     sti
 
+IntsDisabled:
+
     /* Call page fault handler */
     mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // FaultCode
     // rdx == Address
@@ -443,13 +445,10 @@ FUNC KiPageFault
 
 PageFaultError:
 
-    /* Disable interrupts again for the debugger */
-    cli
-
     /* Set parameter 1 to error code */
     mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
 
-    /* Set parameter2 to faulting address */
+    /* Set parameter 2 to faulting address */
     mov r10, cr2  // Param2 = faulting address
 
     cmp eax, STATUS_ACCESS_VIOLATION
@@ -477,6 +476,10 @@ SpecialCode:
     call InternalDispatchException
 
 PageFaultReturn:
+
+    /* Disable interrupts for the return */
+    cli
+
     /* Return */
     ExitTrap (TF_SAVE_ALL or TF_CHECKUSERAPC)
 ENDFUNC

Reply via email to