From d96f01b5dc831ed32f9c259e06a56bd2f9dd2411 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 6 Dec 2023 19:51:07 +0200 Subject: [PATCH] [NTOS:KE/x64] Add KiNmiInterruptHandler So far it only calls KiHandleNmi. It will also handle processor freeze later. TODO: Pass TF_WITH_EF to directly generate a KEXCEPTION_FRAME --- ntoskrnl/ke/amd64/trap.S | 20 ++++++++++++++++++-- ntoskrnl/ke/amd64/traphandler.c | 8 ++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) 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