forked from Artoria/RMSFX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdem.py
80 lines (65 loc) · 1.84 KB
/
dem.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import ctypes
from ctypes import *
import struct
CALL_STACK_STDCALL = WINFUNCTYPE(c_int, c_int, c_int)
DEM = ctypes.cdll.dem
stack = 0
callbacklist = []
def log(line):
f = open("dem.log","a")
f.write(str(line))
f.close
def current():
return stack
def call_by_name(stack = None):
stack = stack or current()
push_string(name, stack)
DEM.dem_push_register(stack, 1)
DEM.dem_call_stack_stdcall(stack)
DEM.dem_call_stack_stdcall(stack)
def pop(stack = None):
stack = stack or current()
x = ctypes.create_string_buffer(8)
DEM.dem_pop(stack, x)
tp, value = struct.unpack('ii', x.raw)
if tp == 1:
return value
if tp == 2:
return struct.unpack('if', x.raw)[1]
if tp == 3:
return ctypes.string_at(value)
def unpack(argnumber, stack = None):
args = []
stack = stack or current()
for i in range(0, argnumber):
x = ctypes.create_string_buffer(8)
DEM.dem_pop(stack, x)
tp, value = struct.unpack('ii', x.raw)
if tp == 1:
args.append(value)
if tp == 2:
args.append(struct.unpack('if', x.raw)[1])
if tp == 3:
args.append(ctypes.string_at(value))
return args
def push_int(value, stack = None):
stack = stack or current()
DEM.dem_push_int(stack, value)
def push_string(value, stack = None):
stack = stack or current()
DEM.dem_push_object(stack, 3, value)
def ret_object(tp, value, stack = None):
stack = stack or current()
DEM.dem_push_object(stack, tp, value)
def register_dem_function(name, func, stack = None):
stack = stack or current()
global DEM
global callbacklist
callbacklist.append(CALL_STACK_STDCALL(func))
DEM.dem_push_object(stack,callbacklist[-1] , 0)
DEM.dem_push_object(stack, 3, name)
DEM.dem_push_register(stack, 0)
DEM.dem_call_stack_stdcall(stack)
def init(dem_stack):
global stack
stack = dem_stack