Rev 3067 | Rev 5576 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3067 | Rev 4567 | ||
---|---|---|---|
1 | //Asper |
- | |
2 | char a_libdir[43] = "/sys/lib/\0"; |
1 | char a_libdir[43] = "/sys/lib/\0"; |
- | 2 | ||
- | 3 | // stdcall with 1 parameter |
|
- | 4 | void dll_Load() { |
|
- | 5 | asm { |
|
- | 6 | push ebp |
|
- | 7 | mov ebp, esp |
|
- | 8 | mov esi, SSDWORD[EBP+8] |
|
- | 9 | @next_lib: |
|
- | 10 | mov edx, DSDWORD[ESI] |
|
- | 11 | or edx, edx |
|
- | 12 | jz exit |
|
- | 13 | push esi |
|
- | 14 | mov esi, DSDWORD[ESI+4] |
|
- | 15 | mov edi, #a_libdir+9 |
|
- | 16 | ||
- | 17 | @loc01: |
|
- | 18 | lodsb |
|
- | 19 | stosb |
|
- | 20 | or al, al |
|
- | 21 | jnz loc01 |
|
- | 22 | ||
- | 23 | mov eax, 68 |
|
- | 24 | mov ebx, 19 |
|
- | 25 | mov ecx, #a_libdir |
|
- | 26 | int 0x40 |
|
- | 27 | or eax, eax |
|
- | 28 | jz fail |
|
- | 29 | ||
- | 30 | push edx |
|
- | 31 | push eax |
|
- | 32 | call dll_Link |
|
- | 33 | ||
- | 34 | push eax |
|
- | 35 | mov eax, DSDWORD[eax] |
|
- | 36 | cmp DSDWORD[EAX], '_bil' // somehow this needs to be reversed.. |
|
- | 37 | pop eax |
|
3 | - | ||
4 | - | ||
5 | //proc dll.Load, import_table:dword |
- | |
6 | int dll_Load(dword import_table) |
- | |
7 | { |
- | |
8 | $mov esi, import_table |
- | |
9 | @next_lib: $mov edx, DSDWORD[esi] |
- | |
10 | $or edx,edx |
- | |
11 | $jz exit_ |
38 | jnz loc02 |
12 | $push esi |
- | |
13 | $mov esi,DSDWORD[esi+4] |
- | |
14 | $mov edi,#a_libdir |
- | |
15 | - | ||
16 | $push edi |
- | |
17 | $push esi |
- | |
18 | EAX=strlen(#a_libdir); |
- | |
19 | $pop esi |
- | |
20 | $pop edi |
- | |
21 | $add edi, eax //9 |
- | |
22 | 39 | ||
23 | @loc01: $lodsb |
- | |
24 | $stosb |
- | |
25 | $or al,al |
- | |
26 | $jnz loc01 |
- | |
27 | - | ||
28 | //IntToStr(EBX); |
- | |
29 | //$push edx |
- | |
30 | //WriteDebug(#a_libdir); |
- | |
31 | //$pop edx |
- | |
32 | //mcall 68,19,a_libdir |
- | |
33 | $mov eax, 68 |
- | |
34 | $mov ebx, 19 |
- | |
35 | $mov ecx,#a_libdir |
- | |
36 | $int 0x40 |
- | |
37 | - | ||
38 | $or eax,eax |
- | |
39 | $jz fail |
- | |
40 | //stdcall dll.Link,eax,edx |
- | |
41 | dll_Link(EAX, EDX); |
- | |
42 | $push eax |
- | |
43 | $mov eax, DSDWORD [eax] |
- | |
44 | $cmp DSDWORD [eax], 'lib_' |
- | |
45 | $pop eax |
- | |
46 | //$jnz loc02 |
- | |
47 | //IntToStr(EBX); |
- | |
48 | //$push eax |
- | |
49 | //WriteDebug(DSDWORD[EAX]); |
- | |
50 | //$pop eax |
- | |
51 | //stdcall dll.Init,[eax+4] |
40 | push DSDWORD[EAX+4] |
52 | //dll_Init(DSDWORD[EAX]); //dll_Init(DSDWORD[EAX+4]); |
- | |
53 | @loc02: |
- | |
54 | $pop esi |
- | |
55 | $add esi,8 |
- | |
56 | $jmp next_lib |
- | |
57 | @exit_: $xor eax,eax |
- | |
58 | return 0; |
- | |
59 | @fail: $add esp,4 |
- | |
60 | $xor eax,eax |
- | |
61 | $inc eax |
- | |
62 | return -1; |
- | |
63 | } |
- | |
64 | - | ||
65 | //proc dll.Link, exp:dword,imp:dword |
- | |
66 | void dll_Link(dword exp, imp) |
- | |
67 | { |
- | |
68 | $push eax |
- | |
69 | $mov esi, imp |
- | |
70 | $test esi, esi |
- | |
71 | $jz done |
- | |
72 | @next: $lodsd |
- | |
- | 41 | call dll_Init |
|
- | 42 | @loc02: |
|
- | 43 | ||
- | 44 | pop esi |
|
73 | $test eax,eax |
45 | add esi, 8 |
- | 46 | jmp next_lib |
|
- | 47 | @exit: |
|
- | 48 | xor eax, eax |
|
- | 49 | leave |
|
74 | $jz done |
50 | ret 4 |
75 | 51 | ||
76 | //stdcall dll.GetProcAddress,[exp],eax |
52 | @fail: |
- | 53 | add esp, 4 |
|
- | 54 | xor eax, eax |
|
- | 55 | inc eax |
|
- | 56 | leave |
|
- | 57 | ret 4 |
|
- | 58 | } |
|
- | 59 | } |
|
- | 60 | ||
- | 61 | //stdcall with 2 parameters |
|
- | 62 | void dll_Link() { |
|
- | 63 | asm { |
|
- | 64 | push ebp |
|
- | 65 | mov ebp, esp |
|
- | 66 | push eax |
|
- | 67 | mov esi, SSDWORD[EBP+12] |
|
- | 68 | test esi, esi |
|
- | 69 | jz done |
|
- | 70 | @next: |
|
- | 71 | lodsd |
|
- | 72 | test eax, eax |
|
- | 73 | jz done |
|
- | 74 | push eax |
|
77 | dll_GetProcAddress(exp,EAX); |
75 | push SSDWORD[EBP+8] |
78 | $or eax,eax |
76 | call dll_GetProcAddress |
79 | $jz loc03 |
77 | or eax, eax |
80 | 78 | jz loc03 |
|
- | 79 | mov DSDWORD[esi-4], eax |
|
81 | $mov DSDWORD[esi-4],eax |
80 | jmp next |
- | 81 | @loc03: |
|
- | 82 | mov SSDWORD[esp], 0 |
|
- | 83 | @done: |
|
82 | $jmp next |
84 | pop eax |
- | 85 | leave |
|
83 | @loc03: |
86 | ret 8 |
84 | $mov DSDWORD[esp],0 |
87 | } |
85 | @done: $pop eax |
88 | } |
- | 89 | ||
86 | } |
90 | |
- | 91 | //stdcall with 1 parameter |
|
87 | 92 | void dll_Init() { |
|
88 | //proc dll.Init, dllentry:dword |
93 | asm { |
89 | void dll_Init(dword dllentry) |
94 | push ebp |
90 | { |
95 | mov ebp, esp |
91 | $pushad |
96 | pushad |
- | 97 | mov eax, #mem_Alloc |
|
- | 98 | mov ebx, #mem_Free; |
|
92 | EAX=#mem_Alloc; |
99 | mov ecx, #mem_ReAlloc; |
- | 100 | mov edx, #dll_Load; |
|
93 | EBX=#mem_Free; |
101 | call SSDWORD[EBP+8] |
- | 102 | popad |
|
94 | ECX=#mem_ReAlloc; |
103 | leave |
95 | EDX=#dll_Load; |
104 | ret 4 |
96 | DSDWORD [dllentry+4] stdcall (); |
105 | } |
97 | $popad |
106 | } |
98 | } |
107 | |
- | 108 | ||
99 | 109 | // stdcall with 2 parameters |
|
- | 110 | void dll_GetProcAddress(){ |
|
- | 111 | asm { |
|
100 | //proc dll.GetProcAddress, exp:dword,sz_name:dword |
112 | push ebp |
101 | dword dll_GetProcAddress(dword exp, sz_name) |
113 | mov ebp, esp |
102 | { |
114 | mov edx, CSDWORD[EBP+8] |
103 | $push esi |
115 | xor eax, eax |
- | 116 | ||
- | 117 | @next: |
|
104 | $mov edx, exp |
118 | or edx, edx |
- | 119 | jz end |
|
105 | $xor eax,eax |
120 | cmp CSDWORD[edx], 0 |
106 | @next: $or edx,edx |
121 | jz end |
107 | $jz end_ |
122 | |
108 | $cmp edx,0 |
123 | push CSDWORD[EBP+12] |
109 | $jz end_ |
124 | push CSDWORD[EDX] |
110 | strcmp(DSDWORD[EDX],sz_name); |
125 | call dll_StrCmp |
111 | $test eax,eax |
126 | test eax, eax |
112 | $jz ok |
127 | jz ok |
113 | $add edx,8 |
128 | add edx, 8 |
- | 129 | jmp next |
|
114 | $jmp next |
130 | @ok: |
115 | @ok: |
131 | mov eax, DSDWORD[EDX+4] |
116 | $mov eax, DSDWORD[edx+4] |
132 | @end: |
117 | @end_: |
133 | leave |
118 | $pop esi |
134 | ret 8 |
119 | return EAX; |
135 | } |
120 | } |
136 | } |
121 | 137 | ||
- | 138 | ||
- | 139 | // stdcall with 2 parameters |
|
- | 140 | void dll_StrCmp() { |
|
- | 141 | asm { |
|
- | 142 | push ebp |
|
- | 143 | mov ebp, esp |
|
- | 144 | push esi |
|
- | 145 | push edi |
|
- | 146 | mov esi, CSDWORD[EBP+8] |
|
- | 147 | mov edi, CSDWORD[EBP+12] |
|
- | 148 | xor eax, eax |
|
- | 149 | @label1: |
|
- | 150 | lodsb |
|
- | 151 | scasb |
|
- | 152 | jne fail |
|
- | 153 | or al, al |
|
- | 154 | jnz label1 |
|
- | 155 | jmp label_ok |
|
- | 156 | @fail: |
|
- | 157 | or eax, -1 |
|
- | 158 | @label_ok: |
|
- | 159 | pop edi |
|
- | 160 | pop esi |
|
- | 161 | leave |
|
- | 162 | ret 8 |
|
- | 163 | } |
|
- | 164 | } |
|
122 | 165 | ||
123 | int load_dll2(dword dllname, import_table, byte need_init) |
166 | int load_dll2(dword dllname, import_table, byte need_init) |
124 | { |
167 | { |
125 | //dword dllentry=0; |
168 | //dword dllentry=0; |
126 | // load DLL |
169 | // load DLL |
127 | $mov eax, 68 |
170 | $mov eax, 68 |
128 | $mov ebx, 19 |
171 | $mov ebx, 19 |
129 | ECX=dllname; |
172 | ECX=dllname; |
130 | $int 0x40 |
173 | $int 0x40 |
131 | $test eax, eax |
174 | $test eax, eax |
132 | $jz exit01 |
175 | $jz exit01 |
133 | 176 | ||
134 | // initialize import |
177 | // initialize import |
135 | $mov edx,eax |
178 | $mov edx,eax |
136 | ESI=import_table; |
179 | ESI=import_table; |
137 | 180 | ||
138 | @import_loop01: |
181 | @import_loop01: |
139 | $lodsd |
182 | $lodsd |
140 | $test eax,eax |
183 | $test eax,eax |
141 | $jz import_done01 |
184 | $jz import_done01 |
142 | $push edx |
185 | $push edx |
143 | @import_find01: |
186 | @import_find01: |
144 | $mov ebx,DSDWORD[EDX] |
187 | $mov ebx,DSDWORD[EDX] |
145 | $test ebx, ebx |
188 | $test ebx, ebx |
146 | $jz exit01 |
189 | $jz exit01 |
147 | $push eax |
190 | $push eax |
148 | @nex101: |
191 | @nex101: |
149 | $mov cl,DSBYTE[EAX]; |
192 | $mov cl,DSBYTE[EAX]; |
150 | $cmp cl,DSBYTE[EBX]; |
193 | $cmp cl,DSBYTE[EBX]; |
151 | $jnz import_find_next01 |
194 | $jnz import_find_next01 |
152 | $test cl,cl |
195 | $test cl,cl |
153 | $jz import_found01 |
196 | $jz import_found01 |
154 | $inc eax |
197 | $inc eax |
155 | $inc ebx |
198 | $inc ebx |
156 | $jmp nex101 |
199 | $jmp nex101 |
157 | @import_find_next01: |
200 | @import_find_next01: |
158 | $pop eax |
201 | $pop eax |
159 | $add edx, 8 |
202 | $add edx, 8 |
160 | $jmp import_find01 |
203 | $jmp import_find01 |
161 | @import_found01: |
204 | @import_found01: |
162 | $pop eax |
205 | $pop eax |
163 | $mov eax,DSDWORD[edx+4] |
206 | $mov eax,DSDWORD[edx+4] |
164 | $mov DSDWORD[esi-4],eax |
207 | $mov DSDWORD[esi-4],eax |
165 | $pop edx |
208 | $pop edx |
166 | 209 | ||
167 | $jmp import_loop01 |
210 | $jmp import_loop01 |
168 | @import_done01: |
211 | @import_done01: |
169 | IF (need_init) dll_Init(EDX); |
212 | IF (need_init) dll_Init (DSDWORD[EDX+4]); |
170 | return 0; |
213 | return 0; |
171 | @exit01: |
214 | @exit01: |
172 | return -1; |
215 | return -1; |
173 | } |
216 | } |