[NTOS] Fix interrupt flag handling in KiPageFault

This fixes a crash in kmtest:ZwAllocateVirtualMemory
This commit is contained in:
Timo Kreuzer 2022-12-15 21:44:43 +02:00
parent 5b6e7eceda
commit 12ed9f30a7

View file

@ -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