mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
189 lines
No EOL
4.7 KiB
NASM
189 lines
No EOL
4.7 KiB
NASM
;RCX: 1st integer argument
|
|
;RDX: 2nd integer argument
|
|
;R8: 3rd integer argument
|
|
;R9: 4th integer argument
|
|
|
|
CALLBACK struct
|
|
A qword ?
|
|
S qword ?
|
|
CALLBACK ends
|
|
|
|
|
|
ASMENTRY_STACK struct ;keep this 16 byte aligned
|
|
Scratchspace qword ?
|
|
Scratchspace2 qword ?
|
|
Scratchspace3 qword ?
|
|
Scratchspace4 qword ?
|
|
Originalmxcsr qword ?
|
|
OriginalRAX qword ? ;0
|
|
OriginalRBX qword ? ;1
|
|
OriginalRCX qword ? ;2
|
|
OriginalRDX qword ? ;3
|
|
OriginalRSI qword ? ;4
|
|
OriginalRDI qword ? ;5
|
|
OriginalRBP qword ? ;6
|
|
OriginalRSP qword ? ;7 not really 'original'
|
|
OriginalR8 qword ? ;8
|
|
OriginalR9 qword ? ;9
|
|
OriginalR10 qword ? ;10
|
|
OriginalR11 qword ? ;11
|
|
OriginalR12 qword ? ;12
|
|
OriginalR13 qword ? ;13
|
|
OriginalR14 qword ? ;14
|
|
OriginalR15 qword ? ;15
|
|
OriginalES qword ? ;16
|
|
OriginalDS qword ? ;17
|
|
OriginalSS qword ? ;18
|
|
|
|
;errorcode ;19
|
|
;4096 bytes
|
|
;eip ;20
|
|
;cs ;21
|
|
;eflags
|
|
;esp
|
|
;ss
|
|
|
|
ASMENTRY_STACK ends
|
|
|
|
|
|
_TEXT SEGMENT 'CODE'
|
|
|
|
EXTERN interrupt1_centry : proc
|
|
EXTERN Int1JumpBackLocation : CALLBACK
|
|
|
|
PUBLIC interrupt1_asmentry
|
|
interrupt1_asmentry:
|
|
;save stack position
|
|
sub rsp,4096 ;functions like setThreadContext adjust the stackframe entry directly. I can't have that messing up my own stack
|
|
|
|
cld
|
|
push 0 ;push an errorcode on the stack so the stackindex enum type can stay the same relative to interrupts that do have an errorcode (int 14)
|
|
|
|
;stack is aligned at this point
|
|
sub rsp,SIZEOF ASMENTRY_STACK
|
|
|
|
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRBP,rbp
|
|
lea rbp,(ASMENTRY_STACK PTR [rsp]).OriginalRAX
|
|
|
|
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRAX,rax
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRBX,rbx
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRCX,rcx
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRDX,rdx
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRSI,rsi
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRDI,rdi
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalRSP,rsp
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR8,r8
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR9,r9
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR10,r10
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR11,r11
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR12,r12
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR13,r13
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR14,r14
|
|
mov (ASMENTRY_STACK PTR [rsp]).OriginalR15,r15
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov ax,ds
|
|
mov word ptr (ASMENTRY_STACK PTR [rsp]).OriginalDS,ax
|
|
|
|
mov ax,es
|
|
mov word ptr (ASMENTRY_STACK PTR [rsp]).OriginalES,ax
|
|
|
|
mov ax,ss
|
|
mov word ptr (ASMENTRY_STACK PTR [rsp]).OriginalSS,ax
|
|
|
|
|
|
mov ax,2bh
|
|
mov ds,ax
|
|
mov es,ax
|
|
|
|
mov ax,18h
|
|
mov ss,ax
|
|
|
|
|
|
; rbp= pointer to OriginalRAX
|
|
|
|
cmp qword ptr [rbp+8*21+4096],010h ;check if origin is in kernelmode (check ss)
|
|
je skipswap1 ;if so, skip the swapgs
|
|
|
|
swapgs ;swap gs with the kernel version
|
|
|
|
skipswap1:
|
|
|
|
|
|
|
|
stmxcsr dword ptr (ASMENTRY_STACK PTR [rsp]).Originalmxcsr
|
|
|
|
mov (ASMENTRY_STACK PTR [rsp]).scratchspace2,1f80h
|
|
ldmxcsr dword ptr (ASMENTRY_STACK PTR [rsp]).scratchspace2
|
|
|
|
|
|
mov rcx,rbp
|
|
call interrupt1_centry
|
|
|
|
ldmxcsr dword ptr (ASMENTRY_STACK PTR [rsp]).Originalmxcsr
|
|
|
|
cmp qword ptr [rbp+8*21+4096],10h ;was it a kernelmode interrupt ?
|
|
je skipswap2 ;if so, skip the swapgs part
|
|
|
|
swapgs ;swap back
|
|
skipswap2:
|
|
|
|
cmp al,1
|
|
|
|
|
|
;restore state
|
|
mov ax,word ptr (ASMENTRY_STACK PTR [rsp]).OriginalDS
|
|
mov ds,ax
|
|
|
|
mov ax,word ptr (ASMENTRY_STACK PTR [rsp]).OriginalES
|
|
mov es,ax
|
|
|
|
mov ax,word ptr (ASMENTRY_STACK PTR [rsp]).OriginalSS
|
|
mov ss,ax
|
|
|
|
|
|
mov rax,(ASMENTRY_STACK PTR [rsp]).OriginalRAX
|
|
mov rbx,(ASMENTRY_STACK PTR [rsp]).OriginalRBX
|
|
mov rcx,(ASMENTRY_STACK PTR [rsp]).OriginalRCX
|
|
mov rdx,(ASMENTRY_STACK PTR [rsp]).OriginalRDX
|
|
mov rsi,(ASMENTRY_STACK PTR [rsp]).OriginalRSI
|
|
mov rdi,(ASMENTRY_STACK PTR [rsp]).OriginalRDI
|
|
mov r8, (ASMENTRY_STACK PTR [rsp]).OriginalR8
|
|
mov r9, (ASMENTRY_STACK PTR [rsp]).OriginalR9
|
|
mov r10,(ASMENTRY_STACK PTR [rsp]).OriginalR10
|
|
mov r11,(ASMENTRY_STACK PTR [rsp]).OriginalR11
|
|
mov r12,(ASMENTRY_STACK PTR [rsp]).OriginalR12
|
|
mov r13,(ASMENTRY_STACK PTR [rsp]).OriginalR13
|
|
mov r14,(ASMENTRY_STACK PTR [rsp]).OriginalR14
|
|
mov r15,(ASMENTRY_STACK PTR [rsp]).OriginalR15
|
|
|
|
|
|
je skip_original_int1
|
|
|
|
;stack unwind
|
|
mov rbp,(ASMENTRY_STACK PTR [rsp]).OriginalRBP
|
|
add rsp,SIZEOF ASMENTRY_STACK
|
|
add rsp,4096
|
|
add rsp,8 ;+8 for the push 0
|
|
|
|
jmp [Int1JumpBackLocation.A] ;<-works fine
|
|
|
|
|
|
skip_original_int1:
|
|
;stack unwind
|
|
mov rbp,(ASMENTRY_STACK PTR [rsp]).OriginalRBP
|
|
add rsp,SIZEOF ASMENTRY_STACK ;+8 for the push 0
|
|
add rsp,4096
|
|
add rsp,8
|
|
|
|
iretq
|
|
|
|
|
|
_TEXT ENDS
|
|
END |