/* * PROJECT: ReactOS Kernel * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: ReactOS AMD64 user mode callback helper * COPYRIGHT: Timo Kreuzer (timo.kreuzer@reactos.org) */ #include /* * NTSTATUS * KiUserModeCallout ( * _Inout_ PKCALLOUT_FRAME CalloutFrame); */ EXTERN KiUserModeCallout:PROC .code64 /* * NTSTATUS * KiCallUserMode ( * _In_ PVOID *OutputBuffer@, * _In_ PULONG OutputLength@); */ PUBLIC KiCallUserMode .PROC KiCallUserMode /* Generate a KEXCEPTION_FRAME on the stack */ /* This is identical to a KCALLOUT_FRAME */ GENERATE_EXCEPTION_FRAME /* Save OutputBuffer and OutputLength */ mov [rsp + ExOutputBuffer], rcx mov [rsp + ExOutputLength], rdx /* Call the C function */ mov rcx, rsp call KiUserModeCallout /* Restore the registers from the KEXCEPTION_FRAME */ RESTORE_EXCEPTION_STATE /* Return */ ret .ENDP /* * DECLSPEC_NORETURN * VOID * KiCallbackReturn ( * _In_ PVOID Stack, * _In_ NTSTATUS Status); */ PUBLIC KiCallbackReturn .PROC KiCallbackReturn .ENDPROLOG /* Restore the stack */ mov rsp, rcx /* Set return status */ mov eax, edx /* Restore the registers from the KEXCEPTION_FRAME */ RESTORE_EXCEPTION_STATE /* Return */ ret .ENDP END