https://git.reactos.org/?p=reactos.git;a=commitdiff;h=26a64324e785ff712bde6736ed7cbfc92a98925b

commit 26a64324e785ff712bde6736ed7cbfc92a98925b
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Tue Aug 15 22:51:05 2023 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Sun Sep 17 10:37:50 2023 +0300

    [NTOSKRNL/x64] Fix a bug in KeSwitchKernelStack
    
    Don't safe anything in the callee's home space, because the callee can 
overwrite it. Use the functions home space instead.
---
 ntoskrnl/ke/amd64/trap.S | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/ntoskrnl/ke/amd64/trap.S b/ntoskrnl/ke/amd64/trap.S
index 082160893b4..93dce4215dc 100644
--- a/ntoskrnl/ke/amd64/trap.S
+++ b/ntoskrnl/ke/amd64/trap.S
@@ -1213,19 +1213,18 @@ EXTERN KiSwitchKernelStack:PROC
 PUBLIC KeSwitchKernelStack
 FUNC KeSwitchKernelStack
 
+    /* Save rcx and allocate callee home space */
+    mov [rsp + P1Home], rcx
+    .savereg rcx, P1Home
     sub rsp, 40
     .allocstack 40
-
-    /* Save rcx */
-    mov [rsp], rcx
-    .savereg rcx, 0
     .endprolog
 
     /* Call the C handler, which returns the old stack in rax */
     call KiSwitchKernelStack
 
     /* Restore rcx (StackBase) */
-    mov rcx, [rsp]
+    mov rcx, [rsp + 40 + P1Home]
 
     /* Switch to new stack: RSP += (StackBase - OldStackBase) */
     sub rcx, rax

Reply via email to