_TEXT    SEGMENT

FUNC_PROLOGUE macro
    pushfq 
    push    rax
    mov     rax,rsp
    and     rsp,-10h
    sub     rsp,000002A0h
    fxsave  [rsp+20h]
    mov     [rsp+00000220h],rbx
    mov     [rsp+00000228h],rcx
    mov     [rsp+00000230h],rdx
    mov     [rsp+00000238h],rsi
    mov     [rsp+00000240h],rdi
    mov     [rsp+00000248h],rax
    mov     [rsp+00000250h],rbp
    mov     [rsp+00000258h],r8
    mov     [rsp+00000260h],r9
    mov     [rsp+00000268h],r10
    mov     [rsp+00000270h],r11
    mov     [rsp+00000278h],r12
    mov     [rsp+00000280h],r13
    mov     [rsp+00000288h],r14
    mov     [rsp+00000290h],r15
endm

FUNC_EPILOGUE macro
    mov     r15,[rsp+00000290h]
    mov     r14,[rsp+00000288h]
    mov     r13,[rsp+00000280h]
    mov     r12,[rsp+00000278h]
    mov     r11,[rsp+00000270h]
    mov     r10,[rsp+00000268h]
    mov     r9, [rsp+00000260h]
    mov     r8, [rsp+00000258h]
    mov     rbp,[rsp+00000250h]
    mov     rdi,[rsp+00000240h]
    mov     rsi,[rsp+00000238h]
    mov     rdx,[rsp+00000230h]
    mov     rcx,[rsp+00000228h]
    mov     rbx,[rsp+00000220h]
    fxrstor [rsp+20h]
    mov     rsp,[rsp+00000248h]
    pop     rax
    popfq 
endm


EXTERN mp_zone_changing_injection_return: qword
extern mp_zone_changing_helper: proc

; Assembly code below is injected into the function that changes the the current mp zone
PUBLIC mp_zone_changing_injection
mp_zone_changing_injection PROC

;original code
;preventivly write the zones
mov     [rbx+354h], eax
mov     rcx, rbx
mov     eax, [rdi+0Ch]
mov     [rbx+358h], eax

FUNC_PROLOGUE
mov     ecx, dword ptr [rbx+354h] ;the vanilla zone
mov     rdx, rbx ;the current entity
call    mp_zone_changing_helper
FUNC_EPILOGUE

jmp     mp_zone_changing_injection_return
mp_zone_changing_injection ENDP

_TEXT    ENDS

END
