diff --git a/ntoskrnl/ke/amd64/trap.S b/ntoskrnl/ke/amd64/trap.S index 6013c5492d0..7d223877934 100644 --- a/ntoskrnl/ke/amd64/trap.S +++ b/ntoskrnl/ke/amd64/trap.S @@ -192,14 +192,30 @@ KiDebugTrapOrFaultKMode: ExitTrap TF_SAVE_ALL ENDFUNC +EXTERN KiNmiInterruptHandler:PROC + +FUNC KiNmiInterruptWithEf + /* Generate a KEXCEPTION_FRAME on the stack */ + GENERATE_EXCEPTION_FRAME + + /* Call the C handler */ + lea rcx, [rsp + KEXCEPTION_FRAME_LENGTH] + lea rdx, [rsp] + call KiNmiInterruptHandler + + /* Restore the registers from the KEXCEPTION_FRAME */ + RESTORE_EXCEPTION_STATE + + /* Return */ + ret +ENDFUNC PUBLIC KiNmiInterrupt FUNC KiNmiInterrupt /* Push pseudo error code */ EnterTrap TF_SAVE_ALL - UNIMPLEMENTED KiNmiInterrupt - int 3 + call KiNmiInterruptWithEf /* Return */ ExitTrap TF_SAVE_ALL diff --git a/ntoskrnl/ke/amd64/traphandler.c b/ntoskrnl/ke/amd64/traphandler.c index c4e973f4927..8f2da09a7ef 100644 --- a/ntoskrnl/ke/amd64/traphandler.c +++ b/ntoskrnl/ke/amd64/traphandler.c @@ -84,6 +84,14 @@ KiDpcInterruptHandler(VOID) KeLowerIrql(OldIrql); } +VOID +KiNmiInterruptHandler( + _In_ PKTRAP_FRAME TrapFrame, + _In_ PKEXCEPTION_FRAME ExceptionFrame) +{ + KiHandleNmi(); +} + #define MAX_SYSCALL_PARAMS 16 NTSTATUS