Rev 5576 | Rev 5626 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5576 | Rev 5598 | ||
---|---|---|---|
- | 1 | #ifndef INCLUDE_DLL_H |
|
- | 2 | #define INCLUDE_DLL_H |
|
- | 3 | ||
1 | char a_libdir[43] = "/sys/lib/\0"; |
4 | char a_libdir[43] = "/sys/lib/\0"; |
2 | 5 | ||
3 | :inline void error_init(dword text) |
6 | :inline void error_init(dword text) |
4 | { |
7 | { |
5 | dword l,ll; |
8 | dword l,ll; |
6 | dword TEXT_ERROR = malloc(1024); |
9 | dword TEXT_ERROR = malloc(1024); |
7 | #ifdef LANG_RUS |
10 | #ifdef LANG_RUS |
8 | strcpy(TEXT_ERROR,"'訡ª ¯à¨ § £à㧪¥ ¡¨¡«¨®â¥ª¨ `"); |
11 | strcpy(TEXT_ERROR,"'訡ª ¯à¨ § £à㧪¥ ¡¨¡«¨®â¥ª¨ `"); |
9 | #elif LANG_EST |
12 | #elif LANG_EST |
10 | strcpy(TEXT_ERROR,"'Viga teegi laadimisel `"); |
13 | strcpy(TEXT_ERROR,"'Viga teegi laadimisel `"); |
11 | #else |
14 | #else |
12 | strcpy(TEXT_ERROR,"'Error while loading library `"); |
15 | strcpy(TEXT_ERROR,"'Error while loading library `"); |
13 | #endif |
16 | #endif |
14 | ll = strlen(TEXT_ERROR); |
17 | ll = strlen(TEXT_ERROR); |
15 | strcpy(TEXT_ERROR+ll,text); |
18 | strcpy(TEXT_ERROR+ll,text); |
16 | l = strlen(text); |
19 | l = strlen(text); |
17 | strncpy(TEXT_ERROR+ll+l,"`' -E",4); |
20 | strncpy(TEXT_ERROR+ll+l,"`' -E",4); |
18 | notify(TEXT_ERROR); |
21 | notify(TEXT_ERROR); |
19 | free(TEXT_ERROR); |
22 | free(TEXT_ERROR); |
20 | ExitProcess(); |
23 | ExitProcess(); |
21 | } |
24 | } |
22 | 25 | ||
23 | // stdcall with 1 parameter |
26 | // stdcall with 1 parameter |
24 | void dll_Load() { |
27 | void dll_Load() { |
25 | asm { |
28 | asm { |
26 | push ebp |
29 | push ebp |
27 | mov ebp, esp |
30 | mov ebp, esp |
28 | mov esi, SSDWORD[EBP+8] |
31 | mov esi, SSDWORD[EBP+8] |
29 | @next_lib: |
32 | @next_lib: |
30 | mov edx, DSDWORD[ESI] |
33 | mov edx, DSDWORD[ESI] |
31 | or edx, edx |
34 | or edx, edx |
32 | jz exit |
35 | jz exit |
33 | push esi |
36 | push esi |
34 | mov esi, DSDWORD[ESI+4] |
37 | mov esi, DSDWORD[ESI+4] |
35 | mov edi, #a_libdir+9 |
38 | mov edi, #a_libdir+9 |
36 | 39 | ||
37 | @loc01: |
40 | @loc01: |
38 | lodsb |
41 | lodsb |
39 | stosb |
42 | stosb |
40 | or al, al |
43 | or al, al |
41 | jnz loc01 |
44 | jnz loc01 |
42 | 45 | ||
43 | mov eax, 68 |
46 | mov eax, 68 |
44 | mov ebx, 19 |
47 | mov ebx, 19 |
45 | mov ecx, #a_libdir |
48 | mov ecx, #a_libdir |
46 | int 0x40 |
49 | int 0x40 |
47 | or eax, eax |
50 | or eax, eax |
48 | jz fail |
51 | jz fail |
49 | 52 | ||
50 | push edx |
53 | push edx |
51 | push eax |
54 | push eax |
52 | call dll_Link |
55 | call dll_Link |
53 | 56 | ||
54 | push eax |
57 | push eax |
55 | mov eax, DSDWORD[eax] |
58 | mov eax, DSDWORD[eax] |
56 | cmp DSDWORD[EAX], '_bil' // somehow this needs to be reversed.. |
59 | cmp DSDWORD[EAX], '_bil' // somehow this needs to be reversed.. |
57 | pop eax |
60 | pop eax |
58 | jnz loc02 |
61 | jnz loc02 |
59 | 62 | ||
60 | push DSDWORD[EAX+4] |
63 | push DSDWORD[EAX+4] |
61 | call dll_Init |
64 | call dll_Init |
62 | @loc02: |
65 | @loc02: |
63 | 66 | ||
64 | pop esi |
67 | pop esi |
65 | add esi, 8 |
68 | add esi, 8 |
66 | jmp next_lib |
69 | jmp next_lib |
67 | @exit: |
70 | @exit: |
68 | xor eax, eax |
71 | xor eax, eax |
69 | leave |
72 | leave |
70 | ret 4 |
73 | ret 4 |
71 | 74 | ||
72 | @fail: |
75 | @fail: |
73 | add esp, 4 |
76 | add esp, 4 |
74 | xor eax, eax |
77 | xor eax, eax |
75 | inc eax |
78 | inc eax |
76 | leave |
79 | leave |
77 | ret 4 |
80 | ret 4 |
78 | } |
81 | } |
79 | } |
82 | } |
80 | 83 | ||
81 | //stdcall with 2 parameters |
84 | //stdcall with 2 parameters |
82 | void dll_Link() { |
85 | void dll_Link() { |
83 | asm { |
86 | asm { |
84 | push ebp |
87 | push ebp |
85 | mov ebp, esp |
88 | mov ebp, esp |
86 | push eax |
89 | push eax |
87 | mov esi, SSDWORD[EBP+12] |
90 | mov esi, SSDWORD[EBP+12] |
88 | test esi, esi |
91 | test esi, esi |
89 | jz done |
92 | jz done |
90 | @next: |
93 | @next: |
91 | lodsd |
94 | lodsd |
92 | test eax, eax |
95 | test eax, eax |
93 | jz done |
96 | jz done |
94 | push eax |
97 | push eax |
95 | push SSDWORD[EBP+8] |
98 | push SSDWORD[EBP+8] |
96 | call dll_GetProcAddress |
99 | call dll_GetProcAddress |
97 | or eax, eax |
100 | or eax, eax |
98 | jz loc03 |
101 | jz loc03 |
99 | mov DSDWORD[esi-4], eax |
102 | mov DSDWORD[esi-4], eax |
100 | jmp next |
103 | jmp next |
101 | @loc03: |
104 | @loc03: |
102 | mov SSDWORD[esp], 0 |
105 | mov SSDWORD[esp], 0 |
103 | @done: |
106 | @done: |
104 | pop eax |
107 | pop eax |
105 | leave |
108 | leave |
106 | ret 8 |
109 | ret 8 |
107 | } |
110 | } |
108 | } |
111 | } |
109 | 112 | ||
110 | 113 | ||
111 | //stdcall with 1 parameter |
114 | //stdcall with 1 parameter |
112 | void dll_Init() { |
115 | void dll_Init() { |
113 | asm { |
116 | asm { |
114 | push ebp |
117 | push ebp |
115 | mov ebp, esp |
118 | mov ebp, esp |
116 | pushad |
119 | pushad |
117 | mov eax, #mem_Alloc |
120 | mov eax, #mem_Alloc |
118 | mov ebx, #mem_Free; |
121 | mov ebx, #mem_Free; |
119 | mov ecx, #mem_ReAlloc; |
122 | mov ecx, #mem_ReAlloc; |
120 | mov edx, #dll_Load; |
123 | mov edx, #dll_Load; |
121 | call SSDWORD[EBP+8] |
124 | call SSDWORD[EBP+8] |
122 | popad |
125 | popad |
123 | leave |
126 | leave |
124 | ret 4 |
127 | ret 4 |
125 | } |
128 | } |
126 | } |
129 | } |
127 | 130 | ||
128 | 131 | ||
129 | // stdcall with 2 parameters |
132 | // stdcall with 2 parameters |
130 | void dll_GetProcAddress(){ |
133 | void dll_GetProcAddress(){ |
131 | asm { |
134 | asm { |
132 | push ebp |
135 | push ebp |
133 | mov ebp, esp |
136 | mov ebp, esp |
134 | mov edx, CSDWORD[EBP+8] |
137 | mov edx, CSDWORD[EBP+8] |
135 | xor eax, eax |
138 | xor eax, eax |
136 | 139 | ||
137 | @next: |
140 | @next: |
138 | or edx, edx |
141 | or edx, edx |
139 | jz end |
142 | jz end |
140 | cmp CSDWORD[edx], 0 |
143 | cmp CSDWORD[edx], 0 |
141 | jz end |
144 | jz end |
142 | 145 | ||
143 | push CSDWORD[EBP+12] |
146 | push CSDWORD[EBP+12] |
144 | push CSDWORD[EDX] |
147 | push CSDWORD[EDX] |
145 | call dll_StrCmp |
148 | call dll_StrCmp |
146 | test eax, eax |
149 | test eax, eax |
147 | jz ok |
150 | jz ok |
148 | add edx, 8 |
151 | add edx, 8 |
149 | jmp next |
152 | jmp next |
150 | @ok: |
153 | @ok: |
151 | mov eax, DSDWORD[EDX+4] |
154 | mov eax, DSDWORD[EDX+4] |
152 | @end: |
155 | @end: |
153 | leave |
156 | leave |
154 | ret 8 |
157 | ret 8 |
155 | } |
158 | } |
156 | } |
159 | } |
157 | 160 | ||
158 | 161 | ||
159 | // stdcall with 2 parameters |
162 | // stdcall with 2 parameters |
160 | void dll_StrCmp() { |
163 | void dll_StrCmp() { |
161 | asm { |
164 | asm { |
162 | push ebp |
165 | push ebp |
163 | mov ebp, esp |
166 | mov ebp, esp |
164 | push esi |
167 | push esi |
165 | push edi |
168 | push edi |
166 | mov esi, CSDWORD[EBP+8] |
169 | mov esi, CSDWORD[EBP+8] |
167 | mov edi, CSDWORD[EBP+12] |
170 | mov edi, CSDWORD[EBP+12] |
168 | xor eax, eax |
171 | xor eax, eax |
169 | @label1: |
172 | @label1: |
170 | lodsb |
173 | lodsb |
171 | scasb |
174 | scasb |
172 | jne fail |
175 | jne fail |
173 | or al, al |
176 | or al, al |
174 | jnz label1 |
177 | jnz label1 |
175 | jmp label_ok |
178 | jmp label_ok |
176 | @fail: |
179 | @fail: |
177 | or eax, -1 |
180 | or eax, -1 |
178 | @label_ok: |
181 | @label_ok: |
179 | pop edi |
182 | pop edi |
180 | pop esi |
183 | pop esi |
181 | leave |
184 | leave |
182 | ret 8 |
185 | ret 8 |
183 | } |
186 | } |
184 | } |
187 | } |
185 | 188 | ||
186 | int load_dll2(dword dllname, import_table, byte need_init) |
189 | int load_dll2(dword dllname, import_table, byte need_init) |
187 | { |
190 | { |
188 | //dword dllentry=0; |
191 | //dword dllentry=0; |
189 | // load DLL |
192 | // load DLL |
190 | $mov eax, 68 |
193 | $mov eax, 68 |
191 | $mov ebx, 19 |
194 | $mov ebx, 19 |
192 | ECX=dllname; |
195 | ECX=dllname; |
193 | $int 0x40 |
196 | $int 0x40 |
194 | $test eax, eax |
197 | $test eax, eax |
195 | $jz exit01 |
198 | $jz exit01 |
196 | 199 | ||
197 | // initialize import |
200 | // initialize import |
198 | $mov edx,eax |
201 | $mov edx,eax |
199 | ESI=import_table; |
202 | ESI=import_table; |
200 | 203 | ||
201 | @import_loop01: |
204 | @import_loop01: |
202 | $lodsd |
205 | $lodsd |
203 | $test eax,eax |
206 | $test eax,eax |
204 | $jz import_done01 |
207 | $jz import_done01 |
205 | $push edx |
208 | $push edx |
206 | @import_find01: |
209 | @import_find01: |
207 | $mov ebx,DSDWORD[EDX] |
210 | $mov ebx,DSDWORD[EDX] |
208 | $test ebx, ebx |
211 | $test ebx, ebx |
209 | $jz exit01 |
212 | $jz exit01 |
210 | $push eax |
213 | $push eax |
211 | @nex101: |
214 | @nex101: |
212 | $mov cl,DSBYTE[EAX]; |
215 | $mov cl,DSBYTE[EAX]; |
213 | $cmp cl,DSBYTE[EBX]; |
216 | $cmp cl,DSBYTE[EBX]; |
214 | $jnz import_find_next01 |
217 | $jnz import_find_next01 |
215 | $test cl,cl |
218 | $test cl,cl |
216 | $jz import_found01 |
219 | $jz import_found01 |
217 | $inc eax |
220 | $inc eax |
218 | $inc ebx |
221 | $inc ebx |
219 | $jmp nex101 |
222 | $jmp nex101 |
220 | @import_find_next01: |
223 | @import_find_next01: |
221 | $pop eax |
224 | $pop eax |
222 | $add edx, 8 |
225 | $add edx, 8 |
223 | $jmp import_find01 |
226 | $jmp import_find01 |
224 | @import_found01: |
227 | @import_found01: |
225 | $pop eax |
228 | $pop eax |
226 | $mov eax,DSDWORD[edx+4] |
229 | $mov eax,DSDWORD[edx+4] |
227 | $mov DSDWORD[esi-4],eax |
230 | $mov DSDWORD[esi-4],eax |
228 | $pop edx |
231 | $pop edx |
229 | 232 | ||
230 | $jmp import_loop01 |
233 | $jmp import_loop01 |
231 | @import_done01: |
234 | @import_done01: |
232 | IF (need_init) dll_Init (DSDWORD[EDX+4]); |
235 | IF (need_init) dll_Init (DSDWORD[EDX+4]); |
233 | return 0; |
236 | return 0; |
234 | @exit01: |
237 | @exit01: |
235 | return -1; |
238 | return -1; |
236 | //error_init(dllname); |
239 | //error_init(dllname); |
237 | } |
240 | } |
238 | 241 | ||
- | 242 | ||
- | 243 | #endif |
|
- | 244 | ||
239 | 245 |