https://git.reactos.org/?p=reactos.git;a=commitdiff;h=96c65e94e1621efb8989aa5ee93961ad1690c6ba

commit 96c65e94e1621efb8989aa5ee93961ad1690c6ba
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Mon Sep 9 17:05:53 2024 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Mon Sep 16 16:04:43 2024 +0300

    [NTOS:MM] Properly handle execution in NX section
    
    This prevents processes from looping forever, thinking the fault was 
already resolbed, because the page is writable.
---
 ntoskrnl/mm/mmfault.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/ntoskrnl/mm/mmfault.c b/ntoskrnl/mm/mmfault.c
index cfd6d756d15..5dbdc7a8ac2 100644
--- a/ntoskrnl/mm/mmfault.c
+++ b/ntoskrnl/mm/mmfault.c
@@ -22,7 +22,8 @@ NTSTATUS
 NTAPI
 MmpAccessFault(KPROCESSOR_MODE Mode,
                ULONG_PTR Address,
-               BOOLEAN FromMdl)
+               BOOLEAN FromMdl,
+               ULONG FaultCode)
 {
     PMMSUPPORT AddressSpace;
     MEMORY_AREA* MemoryArea;
@@ -36,6 +37,14 @@ MmpAccessFault(KPROCESSOR_MODE Mode,
         return(STATUS_UNSUCCESSFUL);
     }
 
+    /* Instruction fetch and the page is present.
+       This means the page is NX and we cannot do anything to "fix" it. */
+    if (MI_IS_INSTRUCTION_FETCH(FaultCode))
+    {
+        DPRINT1("Page fault instruction fetch at %p\n", Address);
+        return STATUS_ACCESS_VIOLATION;
+    }
+
     /*
      * Find the memory area for the faulting address
      */
@@ -285,7 +294,7 @@ Retry:
     if (!MI_IS_NOT_PRESENT_FAULT(FaultCode))
     {
         /* Call access fault */
-        Status = MmpAccessFault(Mode, (ULONG_PTR)Address, TrapInformation ? 
FALSE : TRUE);
+        Status = MmpAccessFault(Mode, (ULONG_PTR)Address, TrapInformation ? 
FALSE : TRUE, FaultCode);
     }
     else
     {

Reply via email to