mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
158 lines
2.2 KiB
NASM
Executable file
158 lines
2.2 KiB
NASM
Executable file
bits 32
|
|
|
|
;------------------;
|
|
;ULONG getESP(void);
|
|
;------------------;
|
|
global getESP
|
|
getESP:
|
|
mov eax,esp
|
|
add eax,4 ;for the push of the call
|
|
ret
|
|
|
|
;-----------------;
|
|
;inportb(int port); returns a byte from the given port
|
|
;-----------------;
|
|
global inportb
|
|
inportb:
|
|
push ebp
|
|
mov ebp,esp
|
|
|
|
mov edx,[ebp+8]
|
|
in al,dx
|
|
|
|
pop ebp
|
|
ret ;4 ; (no params, in cdecl frees the caller)
|
|
|
|
;----------------------------------------------------------;
|
|
;void cpuid(ULONG *eax, ULONG *ebx, ULONG *ecx, ULONG *edx);
|
|
;----------------------------------------------------------;
|
|
global _cpuid
|
|
_cpuid:
|
|
push ebp
|
|
mov ebp,esp ;ebp=free to use, ebp+4 is address of caller, +8 is param1
|
|
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
|
|
mov eax,[ebp+8]
|
|
mov eax,[eax]
|
|
mov ebx,[ebp+12]
|
|
mov ebx,[ebx]
|
|
mov ecx,[ebp+16]
|
|
mov ecx,[ecx]
|
|
mov edx,[ebp+20]
|
|
mov edx,[edx]
|
|
cpuid
|
|
|
|
push ebx
|
|
mov ebx,eax
|
|
mov eax,[ebp+8] ;eax
|
|
mov [eax],ebx
|
|
pop ebx
|
|
|
|
mov eax,[ebp+12] ;ebx
|
|
mov [eax],ebx
|
|
|
|
mov eax,[ebp+16] ;ecx
|
|
mov [eax],ecx
|
|
|
|
mov eax,[ebp+20] ;edx
|
|
mov [eax],edx
|
|
|
|
pop edx
|
|
pop ecx
|
|
pop ebx
|
|
pop eax
|
|
|
|
mov esp,ebp
|
|
pop ebp
|
|
ret ;16
|
|
|
|
;---------------------------;
|
|
;void spinlock(int *lockvar);
|
|
;---------------------------;
|
|
global spinlock
|
|
spinlock:
|
|
push ebp
|
|
mov ebp,esp
|
|
|
|
push ebx
|
|
mov ebx,[ebp+8] ;ebx now contains the address of the lock
|
|
|
|
spinlock_loop:
|
|
;serialize
|
|
pushad
|
|
xor eax,eax
|
|
cpuid ;serialize
|
|
popad
|
|
|
|
;check lock
|
|
cmp dword [ebx],0
|
|
je spinlock_getlock
|
|
pause
|
|
jmp spinlock_loop
|
|
|
|
spinlock_getlock:
|
|
mov eax,1
|
|
xchg eax,[ebx] ;try to lock
|
|
cmp eax,0 ;test if successful
|
|
jne spinlock_loop
|
|
|
|
pop ebx
|
|
|
|
pop ebp
|
|
ret ;4
|
|
|
|
|
|
;-----------------------------------------;
|
|
;void outportb(short int port, char value);
|
|
;-----------------------------------------;
|
|
global outportb
|
|
outportb:
|
|
push ebp
|
|
mov ebp,esp
|
|
mov edx,[ebp+8] ;port
|
|
mov eax,[ebp+12] ;value
|
|
|
|
out dx,al
|
|
|
|
pop ebp
|
|
ret ;8
|
|
|
|
;--------------------;
|
|
;void showstate(void);
|
|
;--------------------;
|
|
global showstate
|
|
extern showstatec
|
|
showstate:
|
|
|
|
pushad ;+4
|
|
pushfd ;+32
|
|
mov eax,cr0
|
|
push eax ;+4
|
|
;mov eax,cr1
|
|
mov eax,0
|
|
push eax ;+4
|
|
mov eax,cr2
|
|
push eax ;+4
|
|
mov eax,cr3
|
|
push eax ;+4
|
|
|
|
sub esp,8
|
|
sgdt [esp]
|
|
mov eax,[esp+2]
|
|
add esp,8
|
|
push eax ;+4
|
|
|
|
sub esp,8
|
|
sidt [esp]
|
|
mov eax,[esp+2]
|
|
add esp,8
|
|
push eax ;+4
|
|
|
|
push esp ;+4
|
|
call showstatec
|
|
add esp,4+32+4+4+4+4+4+4+4
|
|
ret
|