[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 rdx, cr2
mov [rbp + KTRAP_FRAME_FaultAddress], rdx 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 test dword ptr [rbp + KTRAP_FRAME_EFlags], EFLAGS_IF_MASK
jz AccessViolation jz IntsDisabled
/* Enable interrupts for the page fault handler */ /* Enable interrupts for the page fault handler */
sti sti
IntsDisabled:
/* Call page fault handler */ /* Call page fault handler */
mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // FaultCode mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // FaultCode
// rdx == Address // rdx == Address
@ -443,9 +445,6 @@ FUNC KiPageFault
PageFaultError: PageFaultError:
/* Disable interrupts again for the debugger */
cli
/* Set parameter 1 to error code */ /* Set parameter 1 to error code */
mov r9d, [rbp + KTRAP_FRAME_ErrorCode] mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
@ -477,6 +476,10 @@ SpecialCode:
call InternalDispatchException call InternalDispatchException
PageFaultReturn: PageFaultReturn:
/* Disable interrupts for the return */
cli
/* Return */ /* Return */
ExitTrap (TF_SAVE_ALL or TF_CHECKUSERAPC) ExitTrap (TF_SAVE_ALL or TF_CHECKUSERAPC)
ENDFUNC ENDFUNC