Rev 202 | Rev 211 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 202 | Rev 206 | ||
---|---|---|---|
1 | ; |
1 | ; |
2 | ; This file is part of the Infinity sound AC97 driver. |
2 | ; This file is part of the Infinity sound AC97 driver. |
3 | ; (C) copyright Serge 2006 |
3 | ; (C) copyright Serge 2006 |
4 | ; email: infinity_sound@mail.ru |
4 | ; email: infinity_sound@mail.ru |
5 | ; |
5 | ; |
6 | ; This program is free software; you can redistribute it and/or modify |
6 | ; This program is free software; you can redistribute it and/or modify |
7 | ; it under the terms of the GNU General Public License as published by |
7 | ; it under the terms of the GNU General Public License as published by |
8 | ; the Free Software Foundation; either version 2 of the License, or |
8 | ; the Free Software Foundation; either version 2 of the License, or |
9 | ; (at your option) any later version. |
9 | ; (at your option) any later version. |
10 | ; |
10 | ; |
11 | ; This program is distributed in the hope that it will be useful, |
11 | ; This program is distributed in the hope that it will be useful, |
12 | ; but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | ; but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | ; GNU General Public License for more details. |
14 | ; GNU General Public License for more details. |
15 | 15 | ||
16 | align 4 |
16 | align 4 |
17 | proc attach_int_handler stdcall, irq:dword, handler:dword |
17 | proc attach_int_handler stdcall, irq:dword, handler:dword |
18 | 18 | ||
19 | mov ebx, [irq] ;irq num |
19 | mov ebx, [irq] ;irq num |
20 | test ebx, ebx |
20 | test ebx, ebx |
21 | jz .err |
21 | jz .err |
22 | mov eax, [handler] |
22 | mov eax, [handler] |
23 | test eax, eax |
23 | test eax, eax |
24 | jz .err |
24 | jz .err |
25 | mov [irq_tab+ebx*4], eax |
25 | mov [irq_tab+ebx*4], eax |
26 | stdcall enable_irq, [irq] |
26 | stdcall enable_irq, [irq] |
27 | ret |
27 | ret |
28 | .err: |
28 | .err: |
29 | xor eax, eax |
29 | xor eax, eax |
30 | ret |
30 | ret |
31 | endp |
31 | endp |
32 | 32 | ||
33 | align 4 |
33 | align 4 |
34 | proc detach_int_handler |
34 | proc detach_int_handler |
35 | 35 | ||
36 | ret |
36 | ret |
37 | endp |
37 | endp |
38 | 38 | ||
39 | align 4 |
39 | align 4 |
40 | proc enable_irq stdcall, irq_line:dword |
40 | proc enable_irq stdcall, irq_line:dword |
41 | mov ebx, [irq_line] |
41 | mov ebx, [irq_line] |
42 | mov edx, 0x21 |
42 | mov edx, 0x21 |
43 | cmp ebx, 8 |
43 | cmp ebx, 8 |
44 | jb @F |
44 | jb @F |
45 | mov edx, 0xA1 |
45 | mov edx, 0xA1 |
46 | sub ebx,8 |
46 | sub ebx,8 |
47 | @@: |
47 | @@: |
48 | in al,dx |
48 | in al,dx |
49 | btr eax, ebx |
49 | btr eax, ebx |
50 | out dx, al |
50 | out dx, al |
51 | ret |
51 | ret |
52 | endp |
52 | endp |
53 | 53 | ||
54 | align 16 |
54 | align 16 |
55 | ;; proc irq_serv |
55 | ;; proc irq_serv |
56 | 56 | ||
57 | irq_serv: |
57 | irq_serv: |
58 | 58 | ||
59 | .irq_1: |
59 | .irq_1: |
60 | push eax |
60 | push eax |
61 | mov eax, 1 |
61 | mov eax, 1 |
62 | jmp .main |
62 | jmp .main |
63 | align 4 |
63 | align 4 |
64 | .irq_2: |
64 | .irq_2: |
65 | push eax |
65 | push eax |
66 | mov eax, 2 |
66 | mov eax, 2 |
67 | jmp .main |
67 | jmp .main |
68 | align 4 |
68 | align 4 |
69 | .irq_3: |
69 | .irq_3: |
70 | push eax |
70 | push eax |
71 | mov eax, 3 |
71 | mov eax, 3 |
72 | jmp .main |
72 | jmp .main |
73 | align 4 |
73 | align 4 |
74 | .irq_4: |
74 | .irq_4: |
75 | push eax |
75 | push eax |
76 | mov eax, 4 |
76 | mov eax, 4 |
77 | jmp .main |
77 | jmp .main |
78 | align 4 |
78 | align 4 |
79 | .irq_5: |
79 | .irq_5: |
80 | push eax |
80 | push eax |
81 | mov eax, 5 |
81 | mov eax, 5 |
82 | jmp .main |
82 | jmp .main |
83 | align 4 |
83 | align 4 |
84 | .irq_6: |
84 | .irq_6: |
85 | push eax |
85 | push eax |
86 | mov eax, 6 |
86 | mov eax, 6 |
87 | jmp .main |
87 | jmp .main |
88 | align 4 |
88 | align 4 |
89 | .irq_7: |
89 | .irq_7: |
90 | push eax |
90 | push eax |
91 | mov eax, 7 |
91 | mov eax, 7 |
92 | jmp .main |
92 | jmp .main |
93 | align 4 |
93 | align 4 |
94 | .irq_8: |
94 | .irq_8: |
95 | push eax |
95 | push eax |
96 | mov eax, 8 |
96 | mov eax, 8 |
97 | jmp .main |
97 | jmp .main |
98 | align 4 |
98 | align 4 |
99 | .irq_9: |
99 | .irq_9: |
100 | push eax |
100 | push eax |
101 | mov eax, 9 |
101 | mov eax, 9 |
102 | jmp .main |
102 | jmp .main |
103 | align 4 |
103 | align 4 |
104 | .irq_10: |
104 | .irq_10: |
105 | push eax |
105 | push eax |
106 | mov eax, 10 |
106 | mov eax, 10 |
107 | jmp .main |
107 | jmp .main |
108 | align 4 |
108 | align 4 |
109 | .irq_11: |
109 | .irq_11: |
110 | push eax |
110 | push eax |
111 | mov eax, 11 |
111 | mov eax, 11 |
112 | jmp .main |
112 | jmp .main |
113 | align 4 |
113 | align 4 |
114 | .irq_12: |
114 | .irq_12: |
115 | push eax |
115 | push eax |
116 | mov eax, 12 |
116 | mov eax, 12 |
117 | jmp .main |
117 | jmp .main |
118 | align 4 |
118 | align 4 |
119 | .irq_13: |
119 | .irq_13: |
120 | push eax |
120 | push eax |
121 | mov eax, 13 |
121 | mov eax, 13 |
122 | jmp .main |
122 | jmp .main |
123 | align 4 |
123 | align 4 |
124 | .irq_14: |
124 | .irq_14: |
125 | push eax |
125 | push eax |
126 | mov eax, 14 |
126 | mov eax, 14 |
127 | jmp .main |
127 | jmp .main |
128 | align 4 |
128 | align 4 |
129 | .irq_15: |
129 | .irq_15: |
130 | push eax |
130 | push eax |
131 | mov eax, 15 |
131 | mov eax, 15 |
132 | jmp .main |
132 | jmp .main |
133 | 133 | ||
134 | align 16 |
134 | align 16 |
135 | .main: |
135 | .main: |
136 | save_ring3_context |
136 | save_ring3_context |
137 | mov bx, os_data |
137 | mov bx, os_data |
138 | mov ds, bx |
138 | mov ds, bx |
139 | mov es, bx |
139 | mov es, bx |
140 | 140 | ||
141 | mov ebx, [irq_tab+eax*4] |
141 | mov ebx, [irq_tab+eax*4] |
142 | test ebx, ebx |
142 | test ebx, ebx |
143 | jz .exit |
143 | jz .exit |
144 | 144 | ||
145 | call ebx |
145 | call ebx |
146 | 146 | ||
147 | .exit: |
147 | .exit: |
148 | restore_ring3_context |
148 | restore_ring3_context |
149 | 149 | ||
150 | cmp eax, 8 |
150 | cmp eax, 8 |
151 | mov al, 0x20 |
151 | mov al, 0x20 |
152 | jb @f |
152 | jb @f |
153 | out 0xa0, al |
153 | out 0xa0, al |
154 | @@: |
154 | @@: |
155 | out 0x20, al |
155 | out 0x20, al |
156 | 156 | ||
157 | pop eax |
157 | pop eax |
158 | iret |
158 | iret |
159 | 159 | ||
160 | align 4 |
160 | align 4 |
161 | proc get_notify stdcall, p_ev:dword |
161 | proc get_notify stdcall, p_ev:dword |
162 | 162 | ||
163 | .wait: |
163 | .wait: |
164 | mov ebx,[CURRENT_TASK] |
164 | mov ebx,[CURRENT_TASK] |
165 | shl ebx,8 |
165 | shl ebx,8 |
166 | test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY |
166 | test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY |
167 | jz @f |
167 | jz @f |
168 | and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY |
168 | and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY |
169 | mov edi, [p_ev] |
169 | mov edi, [p_ev] |
170 | mov dword [edi], EV_INTR |
170 | mov dword [edi], EV_INTR |
171 | mov eax, [ebx+PROC_BASE+APPDATA.event] |
171 | mov eax, [ebx+PROC_BASE+APPDATA.event] |
172 | mov dword [edi+4], eax |
172 | mov dword [edi+4], eax |
173 | ret |
173 | ret |
174 | @@: |
174 | @@: |
175 | call change_task |
175 | call change_task |
176 | jmp .wait |
176 | jmp .wait |
177 | endp |
177 | endp |
178 | 178 | ||
179 | align 4 |
179 | align 4 |
180 | proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword |
180 | proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword |
181 | xor eax, eax |
181 | xor eax, eax |
182 | xor ebx, ebx |
182 | xor ebx, ebx |
183 | mov ah, byte [bus] |
183 | mov ah, byte [bus] |
184 | mov al, 6 |
184 | mov al, 6 |
185 | mov bh, byte [devfn] |
185 | mov bh, byte [devfn] |
186 | mov bl, byte [reg] |
186 | mov bl, byte [reg] |
187 | call pci_read_reg |
187 | call pci_read_reg |
188 | ret |
188 | ret |
189 | endp |
189 | endp |
190 | 190 | ||
191 | align 4 |
191 | align 4 |
192 | proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword |
192 | proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword |
193 | xor eax, eax |
193 | xor eax, eax |
194 | xor ebx, ebx |
194 | xor ebx, ebx |
195 | mov ah, byte [bus] |
195 | mov ah, byte [bus] |
196 | mov al, 4 |
196 | mov al, 4 |
197 | mov bh, byte [devfn] |
197 | mov bh, byte [devfn] |
198 | mov bl, byte [reg] |
198 | mov bl, byte [reg] |
199 | call pci_read_reg |
199 | call pci_read_reg |
200 | ret |
200 | ret |
201 | endp |
201 | endp |
202 | 202 | ||
203 | align 4 |
203 | align 4 |
204 | proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
204 | proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
205 | xor eax, eax |
205 | xor eax, eax |
206 | xor ebx, ebx |
206 | xor ebx, ebx |
207 | mov ah, byte [bus] |
207 | mov ah, byte [bus] |
208 | mov al, 8 |
208 | mov al, 8 |
209 | mov bh, byte [devfn] |
209 | mov bh, byte [devfn] |
210 | mov bl, byte [reg] |
210 | mov bl, byte [reg] |
211 | mov ecx, [val] |
211 | mov ecx, [val] |
212 | call pci_write_reg |
212 | call pci_write_reg |
213 | ret |
213 | ret |
214 | endp |
214 | endp |
215 | 215 | ||
216 | handle equ IOCTL.handle |
216 | handle equ IOCTL.handle |
217 | io_code equ IOCTL.io_code |
217 | io_code equ IOCTL.io_code |
218 | input equ IOCTL.input |
218 | input equ IOCTL.input |
219 | inp_size equ IOCTL.inp_size |
219 | inp_size equ IOCTL.inp_size |
220 | output equ IOCTL.output |
220 | output equ IOCTL.output |
221 | out_size equ IOCTL.out_size |
221 | out_size equ IOCTL.out_size |
222 | 222 | ||
223 | 223 | ||
224 | align 4 |
224 | align 4 |
225 | proc srv_handler stdcall, ioctl:dword |
225 | proc srv_handler stdcall, ioctl:dword |
226 | mov esi, [ioctl] |
226 | mov esi, [ioctl] |
227 | test esi, esi |
227 | test esi, esi |
228 | jz .err |
228 | jz .err |
229 | 229 | ||
230 | mov edi, [esi+handle] |
230 | mov edi, [esi+handle] |
231 | cmp [edi+SRV.magic], ' SRV' |
231 | cmp [edi+SRV.magic], ' SRV' |
232 | jne .fail |
232 | jne .fail |
233 | 233 | ||
234 | cmp [edi+SRV.size], SRV_SIZE |
234 | cmp [edi+SRV.size], SRV_SIZE |
235 | jne .fail |
235 | jne .fail |
236 | 236 | ||
237 | stdcall [edi+SRV.srv_proc], esi |
237 | stdcall [edi+SRV.srv_proc], esi |
238 | ret |
238 | ret |
239 | .fail: |
239 | .fail: |
240 | xor eax, eax |
240 | xor eax, eax |
241 | not eax |
241 | not eax |
242 | mov [esi+output], eax |
242 | mov [esi+output], eax |
243 | mov [esi+out_size], 4 |
243 | mov [esi+out_size], 4 |
244 | ret |
244 | ret |
245 | .err: |
245 | .err: |
246 | xor eax, eax |
246 | xor eax, eax |
247 | not eax |
247 | not eax |
248 | ret |
248 | ret |
249 | endp |
249 | endp |
250 | 250 | ||
251 | align 4 |
251 | align 4 |
252 | proc srv_handlerEx stdcall, ioctl:dword |
252 | proc srv_handlerEx stdcall, ioctl:dword |
253 | mov esi, [ioctl] |
253 | mov esi, [ioctl] |
254 | test esi, esi |
254 | test esi, esi |
255 | jz .err |
255 | jz .err |
256 | add esi, new_app_base |
256 | add esi, new_app_base |
257 | 257 | ||
258 | mov edi, [esi+handle] |
258 | mov edi, [esi+handle] |
259 | cmp [edi+SRV.magic], ' SRV' |
259 | cmp [edi+SRV.magic], ' SRV' |
260 | jne .fail |
260 | jne .fail |
261 | 261 | ||
262 | cmp [edi+SRV.size], SRV_SIZE |
262 | cmp [edi+SRV.size], SRV_SIZE |
263 | jne .fail |
263 | jne .fail |
264 | 264 | ||
265 | add [esi+input], new_app_base |
265 | add [esi+input], new_app_base |
266 | add [esi+output], new_app_base |
266 | add [esi+output], new_app_base |
267 | 267 | ||
268 | stdcall [edi+SRV.srv_proc], esi |
268 | stdcall [edi+SRV.srv_proc], esi |
269 | ret |
269 | ret |
270 | .fail: |
270 | .fail: |
271 | xor eax, eax |
271 | xor eax, eax |
272 | not eax |
272 | not eax |
273 | mov [esi+output], eax |
273 | mov [esi+output], eax |
274 | mov [esi+out_size], 4 |
274 | mov [esi+out_size], 4 |
275 | ret |
275 | ret |
276 | .err: |
276 | .err: |
277 | xor eax, eax |
277 | xor eax, eax |
278 | not eax |
278 | not eax |
279 | ret |
279 | ret |
280 | endp |
280 | endp |
281 | 281 | ||
282 | restore handle |
282 | restore handle |
283 | restore io_code |
283 | restore io_code |
284 | restore input |
284 | restore input |
285 | restore inp_size |
285 | restore inp_size |
286 | restore output |
286 | restore output |
287 | restore out_size |
287 | restore out_size |
288 | 288 | ||
289 | align 4 |
289 | align 4 |
290 | proc get_service stdcall, sz_name:dword |
290 | proc get_service stdcall, sz_name:dword |
291 | locals |
291 | locals |
292 | srv_ptr dd ? |
292 | srv_ptr dd ? |
293 | counter dd ? |
293 | counter dd ? |
294 | endl |
294 | endl |
295 | 295 | ||
296 | mov eax, [sz_name] |
296 | mov eax, [sz_name] |
297 | test eax, eax |
297 | test eax, eax |
298 | jnz @F |
298 | jnz @F |
299 | ret |
299 | ret |
300 | @@: |
300 | @@: |
301 | mov [srv_ptr], srv_tab |
301 | mov [srv_ptr], srv_tab |
302 | mov [counter], 16 |
302 | mov [counter], 16 |
303 | @@: |
303 | @@: |
304 | stdcall strncmp, [srv_ptr], [sz_name], 16 |
304 | stdcall strncmp, [srv_ptr], [sz_name], 16 |
305 | test eax, eax |
305 | test eax, eax |
306 | je .ok |
306 | je .ok |
307 | 307 | ||
308 | add [srv_ptr], SRV_SIZE |
308 | add [srv_ptr], SRV_SIZE |
309 | dec [counter] |
309 | dec [counter] |
310 | jnz @B |
310 | jnz @B |
311 | .not_load: |
311 | .not_load: |
312 | stdcall find_service, [sz_name] |
312 | stdcall find_service, [sz_name] |
313 | test eax, eax |
313 | test eax, eax |
314 | jnz @F |
314 | jnz @F |
315 | ret |
315 | ret |
316 | @@: |
316 | @@: |
317 | stdcall load_driver, eax |
317 | stdcall load_driver, eax |
318 | ret |
318 | ret |
319 | .ok: |
319 | .ok: |
320 | mov eax, [srv_ptr] |
320 | mov eax, [srv_ptr] |
321 | ret |
321 | ret |
322 | endp |
322 | endp |
323 | 323 | ||
324 | align 4 |
324 | align 4 |
325 | proc find_service stdcall ,sz_name:dword |
325 | proc find_service stdcall ,sz_name:dword |
326 | 326 | ||
327 | mov eax, [sz_name] |
327 | mov eax, [sz_name] |
328 | test eax, eax |
328 | test eax, eax |
329 | jz .fail |
329 | jz .fail |
330 | 330 | ||
331 | mov esi, services |
331 | mov esi, services |
332 | @@: |
332 | @@: |
333 | mov eax, [esi] |
333 | mov eax, [esi] |
334 | test eax, eax |
334 | test eax, eax |
335 | jz .fail |
335 | jz .fail |
336 | push esi |
336 | push esi |
337 | stdcall strncmp, eax, [sz_name], 16 |
337 | stdcall strncmp, eax, [sz_name], 16 |
338 | pop esi |
338 | pop esi |
339 | test eax, eax |
339 | test eax, eax |
340 | je .ok |
340 | je .ok |
341 | 341 | ||
342 | add esi, 8 |
342 | add esi, 8 |
343 | jmp @B |
343 | jmp @B |
344 | .ok: |
344 | .ok: |
345 | mov eax, [esi+4] |
345 | mov eax, [esi+4] |
346 | ret |
346 | ret |
347 | .fail: |
347 | .fail: |
348 | xor eax, eax |
348 | xor eax, eax |
349 | ret |
349 | ret |
350 | endp |
350 | endp |
351 | 351 | ||
352 | align 4 |
352 | align 4 |
353 | proc reg_service stdcall, sz_name:dword, handler:dword |
353 | proc reg_service stdcall, sz_name:dword, handler:dword |
354 | locals |
354 | locals |
355 | srv dd ? |
355 | srv dd ? |
356 | endl |
356 | endl |
357 | 357 | ||
358 | mov eax, [sz_name] |
358 | mov eax, [sz_name] |
359 | test eax, eax |
359 | test eax, eax |
360 | jz .fail |
360 | jz .fail |
361 | 361 | ||
362 | mov ebx, [handler] |
362 | mov ebx, [handler] |
363 | test ebx, ebx |
363 | test ebx, ebx |
364 | jz .fail |
364 | jz .fail |
365 | 365 | ||
366 | call alloc_service |
366 | call alloc_service |
367 | test eax, eax |
367 | test eax, eax |
368 | jz .fail |
368 | jz .fail |
369 | 369 | ||
370 | mov [srv], eax |
370 | mov [srv], eax |
371 | mov edi, eax |
371 | mov edi, eax |
372 | mov esi, [sz_name] |
372 | mov esi, [sz_name] |
373 | mov ecx, 16 |
373 | mov ecx, 16 |
374 | rep movsb |
374 | rep movsb |
375 | 375 | ||
376 | mov edi, eax |
376 | mov edi, eax |
377 | mov [edi+SRV.magic], ' SRV' |
377 | mov [edi+SRV.magic], ' SRV' |
378 | mov [edi+SRV.size], SRV_SIZE |
378 | mov [edi+SRV.size], SRV_SIZE |
379 | mov ebx, [handler] |
379 | mov ebx, [handler] |
380 | mov [edi+SRV.srv_proc], ebx |
380 | mov [edi+SRV.srv_proc], ebx |
381 | mov eax, [srv] |
381 | mov eax, [srv] |
382 | ret |
382 | ret |
383 | .fail: |
383 | .fail: |
384 | xor eax, eax |
384 | xor eax, eax |
385 | ret |
385 | ret |
386 | endp |
386 | endp |
387 | 387 | ||
388 | align 4 |
388 | align 4 |
389 | proc get_proc stdcall, exp:dword, sz_name:dword |
389 | proc get_proc stdcall, exp:dword, sz_name:dword |
390 | 390 | ||
391 | mov edx, [exp] |
391 | mov edx, [exp] |
392 | .next: |
392 | .next: |
393 | mov eax, [edx] |
393 | mov eax, [edx] |
394 | test eax, eax |
394 | test eax, eax |
395 | jz .end |
395 | jz .end |
396 | 396 | ||
397 | push edx |
397 | push edx |
398 | stdcall strncmp, eax, [sz_name], 16 |
398 | stdcall strncmp, eax, [sz_name], 16 |
399 | pop edx |
399 | pop edx |
400 | test eax, eax |
400 | test eax, eax |
401 | jz .ok |
401 | jz .ok |
402 | 402 | ||
403 | add edx,8 |
403 | add edx,8 |
404 | jmp .next |
404 | jmp .next |
405 | .ok: |
405 | .ok: |
406 | mov eax, [edx+4] |
406 | mov eax, [edx+4] |
407 | .end: |
407 | .end: |
408 | ret |
408 | ret |
409 | endp |
409 | endp |
410 | 410 | ||
411 | align 4 |
411 | align 4 |
412 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
412 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
413 | 413 | ||
414 | @@: |
414 | @@: |
415 | stdcall strncmp, [pSym], [sz_sym], 8 |
415 | stdcall strncmp, [pSym], [sz_sym], 8 |
416 | test eax,eax |
416 | test eax,eax |
417 | jz .ok |
417 | jz .ok |
418 | add [pSym], 18 |
418 | add [pSym], 18 |
419 | dec [count] |
419 | dec [count] |
420 | jnz @b |
420 | jnz @b |
421 | xor eax, eax |
421 | xor eax, eax |
422 | ret |
422 | ret |
423 | .ok: |
423 | .ok: |
424 | mov ebx, [pSym] |
424 | mov ebx, [pSym] |
425 | mov eax, [ebx+8] |
425 | mov eax, [ebx+8] |
426 | ret |
426 | ret |
427 | endp |
427 | endp |
428 | 428 | ||
429 | align 4 |
429 | align 4 |
430 | proc get_curr_task |
430 | proc get_curr_task |
431 | mov eax,[CURRENT_TASK] |
431 | mov eax,[CURRENT_TASK] |
432 | shl eax, 8 |
432 | shl eax, 8 |
433 | ret |
433 | ret |
434 | endp |
434 | endp |
435 | 435 | ||
436 | align 4 |
436 | align 4 |
437 | proc get_fileinfo stdcall, file_name:dword, info:dword |
437 | proc get_fileinfo stdcall, file_name:dword, info:dword |
438 | locals |
438 | locals |
439 | cmd dd ? |
439 | cmd dd ? |
440 | offset dd ? |
440 | offset dd ? |
441 | dd ? |
441 | dd ? |
442 | count dd ? |
442 | count dd ? |
443 | buff dd ? |
443 | buff dd ? |
444 | db ? |
444 | db ? |
445 | name dd ? |
445 | name dd ? |
446 | endl |
446 | endl |
447 | 447 | ||
448 | xor eax, eax |
448 | xor eax, eax |
449 | mov ebx, [file_name] |
449 | mov ebx, [file_name] |
450 | sub ebx, new_app_base |
450 | sub ebx, new_app_base |
451 | mov ecx, [info] |
451 | mov ecx, [info] |
452 | sub ecx, new_app_base |
452 | sub ecx, new_app_base |
453 | 453 | ||
454 | mov [cmd], 5 |
454 | mov [cmd], 5 |
455 | mov [offset], eax |
455 | mov [offset], eax |
456 | mov [offset+4], eax |
456 | mov [offset+4], eax |
457 | mov [count], eax |
457 | mov [count], eax |
458 | mov [buff], ecx |
458 | mov [buff], ecx |
459 | mov byte [buff+4], al |
459 | mov byte [buff+4], al |
460 | mov [name], ebx |
460 | mov [name], ebx |
461 | 461 | ||
462 | mov eax, 70 |
462 | mov eax, 70 |
463 | lea ebx, [cmd] |
463 | lea ebx, [cmd] |
464 | sub ebx, new_app_base |
464 | sub ebx, new_app_base |
465 | int 0x40 |
465 | int 0x40 |
466 | ret |
466 | ret |
467 | endp |
467 | endp |
468 | 468 | ||
469 | align 4 |
469 | align 4 |
470 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
470 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
471 | bytes:dword |
471 | bytes:dword |
472 | locals |
472 | locals |
473 | cmd dd ? |
473 | cmd dd ? |
474 | offset dd ? |
474 | offset dd ? |
475 | dd ? |
475 | dd ? |
476 | count dd ? |
476 | count dd ? |
477 | buff dd ? |
477 | buff dd ? |
478 | db ? |
478 | db ? |
479 | name dd ? |
479 | name dd ? |
480 | endl |
480 | endl |
481 | 481 | ||
482 | xor eax, eax |
482 | xor eax, eax |
483 | mov ebx, [file_name] |
483 | mov ebx, [file_name] |
484 | mov ecx, [off] |
484 | mov ecx, [off] |
485 | mov edx, [bytes] |
485 | mov edx, [bytes] |
486 | mov esi, [buffer] |
486 | mov esi, [buffer] |
487 | sub ebx, new_app_base |
487 | sub ebx, new_app_base |
488 | sub esi, new_app_base |
488 | sub esi, new_app_base |
489 | 489 | ||
490 | mov [cmd], eax |
490 | mov [cmd], eax |
491 | mov [offset], ecx |
491 | mov [offset], ecx |
492 | mov [offset+4], eax |
492 | mov [offset+4], eax |
493 | mov [count], edx |
493 | mov [count], edx |
494 | mov [buff], esi |
494 | mov [buff], esi |
495 | mov byte [buff+4], al |
495 | mov byte [buff+4], al |
496 | mov [name], ebx |
496 | mov [name], ebx |
497 | 497 | ||
498 | mov eax, 70 |
498 | mov eax, 70 |
499 | lea ebx, [cmd] |
499 | lea ebx, [cmd] |
500 | sub ebx, new_app_base |
500 | sub ebx, new_app_base |
501 | int 0x40 |
501 | int 0x40 |
502 | ret |
502 | ret |
503 | endp |
503 | endp |
504 | 504 | ||
505 | align 4 |
505 | align 4 |
506 | proc load_file stdcall, file_name:dword |
506 | proc load_file stdcall, file_name:dword |
507 | locals |
507 | locals |
508 | attr dd ? |
508 | attr dd ? |
509 | flags dd ? |
509 | flags dd ? |
510 | cr_time dd ? |
510 | cr_time dd ? |
511 | cr_date dd ? |
511 | cr_date dd ? |
512 | acc_time dd ? |
512 | acc_time dd ? |
513 | acc_date dd ? |
513 | acc_date dd ? |
514 | mod_time dd ? |
514 | mod_time dd ? |
515 | mod_date dd ? |
515 | mod_date dd ? |
516 | file_size dd ? |
516 | file_size dd ? |
517 | 517 | ||
518 | file dd ? |
518 | file dd ? |
519 | endl |
519 | endl |
520 | 520 | ||
521 | lea eax, [attr] |
521 | lea eax, [attr] |
522 | stdcall get_fileinfo, [file_name], eax |
522 | stdcall get_fileinfo, [file_name], eax |
523 | test eax, eax |
523 | test eax, eax |
524 | jnz .fail |
524 | jnz .fail |
- | 525 | ||
- | 526 | mov eax, [file_size] |
|
525 | 527 | ||
526 | stdcall kernel_alloc, [file_size] |
528 | stdcall kernel_alloc, [file_size] |
527 | mov [file], eax |
529 | mov [file], eax |
528 | 530 | ||
529 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
531 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
530 | cmp ebx, [file_size] |
532 | cmp ebx, [file_size] |
531 | jne .cleanup |
533 | jne .cleanup |
532 | mov eax, [file] |
534 | mov eax, [file] |
533 | ret |
535 | ret |
534 | .cleanup: |
536 | .cleanup: |
535 | stdcall kernel_free, [file] |
537 | stdcall kernel_free, [file] |
536 | .fail: |
538 | .fail: |
537 | xor eax, eax |
539 | xor eax, eax |
538 | ret |
540 | ret |
539 | endp |
541 | endp |
540 | 542 | ||
541 | align 4 |
543 | align 4 |
542 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
544 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
543 | 545 | ||
544 | .look_up: |
546 | .look_up: |
545 | mov edx, [imports] |
547 | mov edx, [imports] |
546 | test edx, edx |
548 | test edx, edx |
547 | jz .end |
549 | jz .end |
548 | mov edx, [edx] |
550 | mov edx, [edx] |
549 | test edx, edx |
551 | test edx, edx |
550 | jz .end |
552 | jz .end |
551 | .next: |
553 | .next: |
552 | mov eax, [edx] |
554 | mov eax, [edx] |
553 | test eax, eax |
555 | test eax, eax |
554 | jz .next_table |
556 | jz .next_table |
555 | 557 | ||
556 | push edx |
558 | push edx |
557 | stdcall strncmp, eax, [proc_name], 16 |
559 | stdcall strncmp, eax, [proc_name], 16 |
558 | pop edx |
560 | pop edx |
559 | test eax, eax |
561 | test eax, eax |
560 | jz .ok |
562 | jz .ok |
561 | 563 | ||
562 | add edx,8 |
564 | add edx,8 |
563 | jmp .next |
565 | jmp .next |
564 | .next_table: |
566 | .next_table: |
565 | add [imports], 4 |
567 | add [imports], 4 |
566 | jmp .look_up |
568 | jmp .look_up |
567 | .ok: |
569 | .ok: |
568 | mov eax, [edx+4] |
570 | mov eax, [edx+4] |
569 | ret |
571 | ret |
570 | .end: |
572 | .end: |
571 | xor eax, eax |
573 | xor eax, eax |
572 | ret |
574 | ret |
573 | endp |
575 | endp |
574 | 576 | ||
575 | align 4 |
577 | align 4 |
576 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
578 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
577 | sym_count:dword, strings:dword, imports:dword |
579 | sym_count:dword, strings:dword, imports:dword |
578 | locals |
580 | locals |
579 | retval dd ? |
581 | retval dd ? |
580 | endl |
582 | endl |
581 | 583 | ||
582 | mov edi, [symbols] |
584 | mov edi, [symbols] |
583 | mov [retval], 1 |
585 | mov [retval], 1 |
584 | .fix: |
586 | .fix: |
585 | movzx ebx, [edi+CSYM.SectionNumber] |
587 | movzx ebx, [edi+CSYM.SectionNumber] |
586 | test ebx, ebx |
588 | test ebx, ebx |
587 | jnz .internal |
589 | jnz .internal |
588 | mov eax, dword [edi+CSYM.Name] |
590 | mov eax, dword [edi+CSYM.Name] |
589 | test eax, eax |
591 | test eax, eax |
590 | jnz @F |
592 | jnz @F |
591 | 593 | ||
592 | mov edi, [edi+4] |
594 | mov edi, [edi+4] |
593 | add edi, [strings] |
595 | add edi, [strings] |
594 | @@: |
596 | @@: |
595 | push edi |
597 | push edi |
596 | stdcall get_proc_ex, edi,[imports] |
598 | stdcall get_proc_ex, edi,[imports] |
597 | pop edi |
599 | pop edi |
598 | 600 | ||
599 | xor ebx, ebx |
601 | xor ebx, ebx |
600 | test eax, eax |
602 | test eax, eax |
601 | jnz @F |
603 | jnz @F |
602 | 604 | ||
603 | mov esi, msg_unresolved |
605 | mov esi, msg_unresolved |
604 | call sys_msg_board_str |
606 | call sys_msg_board_str |
605 | mov esi, edi |
607 | mov esi, edi |
606 | call sys_msg_board_str |
608 | call sys_msg_board_str |
607 | mov esi, msg_CR |
609 | mov esi, msg_CR |
608 | call sys_msg_board_str |
610 | call sys_msg_board_str |
609 | 611 | ||
610 | mov [retval],0 |
612 | mov [retval],0 |
611 | @@: |
613 | @@: |
612 | mov edi, [symbols] |
614 | mov edi, [symbols] |
613 | mov [edi+CSYM.Value], eax |
615 | mov [edi+CSYM.Value], eax |
614 | jmp .next |
616 | jmp .next |
615 | .internal: |
617 | .internal: |
616 | dec ebx |
618 | dec ebx |
617 | shl ebx, 3 |
619 | shl ebx, 3 |
618 | lea ebx, [ebx+ebx*4] |
620 | lea ebx, [ebx+ebx*4] |
619 | add ebx, [sec] |
621 | add ebx, [sec] |
620 | 622 | ||
621 | mov eax, [ebx+CFS.VirtualAddress] |
623 | mov eax, [ebx+CFS.VirtualAddress] |
622 | add [edi+CSYM.Value], eax |
624 | add [edi+CSYM.Value], eax |
623 | .next: |
625 | .next: |
624 | add edi, CSYM_SIZE |
626 | add edi, CSYM_SIZE |
625 | mov [symbols], edi |
627 | mov [symbols], edi |
626 | dec [sym_count] |
628 | dec [sym_count] |
627 | jnz .fix |
629 | jnz .fix |
628 | mov eax, [retval] |
630 | mov eax, [retval] |
629 | ret |
631 | ret |
630 | endp |
632 | endp |
631 | 633 | ||
632 | align 4 |
634 | align 4 |
633 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
635 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
634 | locals |
636 | locals |
635 | n_sec dd ? |
637 | n_sec dd ? |
636 | endl |
638 | endl |
637 | 639 | ||
638 | mov eax, [coff] |
640 | mov eax, [coff] |
639 | movzx ebx, [eax+CFH.nSections] |
641 | movzx ebx, [eax+CFH.nSections] |
640 | mov [n_sec], ebx |
642 | mov [n_sec], ebx |
641 | .fix_sec: |
643 | .fix_sec: |
642 | mov esi, [sec] |
644 | mov esi, [sec] |
643 | mov edi, [esi+CFS.PtrReloc] |
645 | mov edi, [esi+CFS.PtrReloc] |
644 | add edi, [coff] |
646 | add edi, [coff] |
645 | 647 | ||
646 | movzx ecx, [esi+CFS.NumReloc] |
648 | movzx ecx, [esi+CFS.NumReloc] |
647 | test ecx, ecx |
649 | test ecx, ecx |
648 | jz .next |
650 | jz .next |
649 | .next_reloc: |
651 | .next_reloc: |
650 | mov ebx, [edi+CRELOC.SymIndex] |
652 | mov ebx, [edi+CRELOC.SymIndex] |
651 | add ebx,ebx |
653 | add ebx,ebx |
652 | lea ebx,[ebx+ebx*8] |
654 | lea ebx,[ebx+ebx*8] |
653 | add ebx, [sym] |
655 | add ebx, [sym] |
654 | 656 | ||
655 | mov edx, [ebx+CSYM.Value] |
657 | mov edx, [ebx+CSYM.Value] |
656 | 658 | ||
657 | cmp [edi+CRELOC.Type], 6 |
659 | cmp [edi+CRELOC.Type], 6 |
658 | je .dir_32 |
660 | je .dir_32 |
659 | 661 | ||
660 | cmp [edi+CRELOC.Type], 20 |
662 | cmp [edi+CRELOC.Type], 20 |
661 | jne .next_reloc |
663 | jne .next_reloc |
662 | .rel_32: |
664 | .rel_32: |
663 | mov eax, [edi+CRELOC.VirtualAddress] |
665 | mov eax, [edi+CRELOC.VirtualAddress] |
664 | add eax, [esi+CFS.VirtualAddress] |
666 | add eax, [esi+CFS.VirtualAddress] |
665 | sub edx, eax |
667 | sub edx, eax |
666 | sub edx, 4 |
668 | sub edx, 4 |
667 | jmp .fix |
669 | jmp .fix |
668 | .dir_32: |
670 | .dir_32: |
669 | mov eax, [edi+CRELOC.VirtualAddress] |
671 | mov eax, [edi+CRELOC.VirtualAddress] |
670 | add eax, [esi+CFS.VirtualAddress] |
672 | add eax, [esi+CFS.VirtualAddress] |
671 | .fix: |
673 | .fix: |
672 | add [eax], edx |
674 | add [eax], edx |
673 | add edi, 10 |
675 | add edi, 10 |
674 | dec ecx |
676 | dec ecx |
675 | jnz .next_reloc |
677 | jnz .next_reloc |
676 | .next: |
678 | .next: |
677 | add [sec], 40 |
679 | add [sec], COFF_SECTION_SIZE |
678 | dec [n_sec] |
680 | dec [n_sec] |
679 | jnz .fix_sec |
681 | jnz .fix_sec |
680 | .exit: |
682 | .exit: |
681 | ret |
683 | ret |
682 | endp |
684 | endp |
683 | 685 | ||
684 | align 4 |
686 | align 4 |
685 | proc load_driver stdcall, file_name:dword |
687 | proc load_driver stdcall, file_name:dword |
686 | locals |
688 | locals |
687 | coff dd ? |
689 | coff dd ? |
688 | sym dd ? |
690 | sym dd ? |
689 | strings dd ? |
691 | strings dd ? |
690 | img_size dd ? |
692 | img_size dd ? |
691 | img_base dd ? |
693 | img_base dd ? |
692 | start dd ? |
694 | start dd ? |
693 | 695 | ||
694 | exports dd ? ;fake exports table |
696 | exports dd ? ;fake exports table |
695 | dd ? |
697 | dd ? |
696 | endl |
698 | endl |
697 | 699 | ||
698 | stdcall load_file, [file_name] |
700 | stdcall load_file, [file_name] |
699 | test eax, eax |
701 | test eax, eax |
700 | jz .fail |
702 | jz .fail |
701 | 703 | ||
702 | mov [coff], eax |
704 | mov [coff], eax |
703 | 705 | ||
704 | movzx ecx, [eax+CFH.nSections] |
706 | movzx ecx, [eax+CFH.nSections] |
705 | xor ebx, ebx |
707 | xor ebx, ebx |
706 | 708 | ||
707 | lea edx, [eax+20] |
709 | lea edx, [eax+20] |
708 | @@: |
710 | @@: |
709 | add ebx, [edx+CFS.SizeOfRawData] |
711 | add ebx, [edx+CFS.SizeOfRawData] |
710 | add ebx, 15 |
712 | add ebx, 15 |
711 | and ebx, not 15 |
713 | and ebx, not 15 |
712 | add edx, 18 |
714 | add edx, COFF_SECTION_SIZE |
713 | dec ecx |
715 | dec ecx |
714 | jnz @B |
716 | jnz @B |
715 | mov [img_size], ebx |
717 | mov [img_size], ebx |
716 | 718 | ||
717 | stdcall kernel_alloc, ebx |
719 | stdcall kernel_alloc, ebx |
718 | test eax, eax |
720 | test eax, eax |
719 | jz .fail |
721 | jz .fail |
720 | mov [img_base], eax |
722 | mov [img_base], eax |
721 | 723 | ||
722 | mov edi, eax |
724 | mov edi, eax |
723 | xor eax, eax |
725 | xor eax, eax |
724 | mov ecx, [img_size] |
726 | mov ecx, [img_size] |
725 | add ecx, 4095 |
727 | add ecx, 4095 |
726 | and ecx, not 4095 |
728 | and ecx, not 4095 |
727 | shr ecx, 2 |
729 | shr ecx, 2 |
728 | cld |
730 | cld |
729 | rep stosd |
731 | rep stosd |
730 | 732 | ||
731 | mov edx, [coff] |
733 | mov edx, [coff] |
732 | movzx ebx, [edx+CFH.nSections] |
734 | movzx ebx, [edx+CFH.nSections] |
733 | mov edi, [img_base] |
735 | mov edi, [img_base] |
734 | lea eax, [edx+20] |
736 | lea eax, [edx+20] |
735 | @@: |
737 | @@: |
736 | mov [eax+CFS.VirtualAddress], edi |
738 | mov [eax+CFS.VirtualAddress], edi |
737 | mov esi, [eax+CFS.PtrRawData] |
739 | mov esi, [eax+CFS.PtrRawData] |
738 | test esi, esi |
740 | test esi, esi |
739 | jnz .copy |
741 | jnz .copy |
740 | add edi, [eax+CFS.SizeOfRawData] |
742 | add edi, [eax+CFS.SizeOfRawData] |
741 | jmp .next |
743 | jmp .next |
742 | .copy: |
744 | .copy: |
743 | add esi, edx |
745 | add esi, edx |
744 | mov ecx, [eax+CFS.SizeOfRawData] |
746 | mov ecx, [eax+CFS.SizeOfRawData] |
745 | cld |
747 | cld |
746 | rep movsb |
748 | rep movsb |
747 | .next: |
749 | .next: |
748 | add edi, 15 |
750 | add edi, 15 |
749 | and edi, not 15 |
751 | and edi, not 15 |
750 | add eax, 40 |
752 | add eax, COFF_SECTION_SIZE |
751 | dec ebx |
753 | dec ebx |
752 | jnz @B |
754 | jnz @B |
753 | 755 | ||
754 | mov ebx, [edx+CFH.pSymTable] |
756 | mov ebx, [edx+CFH.pSymTable] |
755 | add ebx, edx |
757 | add ebx, edx |
756 | mov [sym], ebx |
758 | mov [sym], ebx |
757 | mov ecx, [edx+CFH.nSymbols] |
759 | mov ecx, [edx+CFH.nSymbols] |
758 | add ecx,ecx |
760 | add ecx,ecx |
759 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
761 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
760 | add ecx, [sym] |
762 | add ecx, [sym] |
761 | mov [strings], ecx |
763 | mov [strings], ecx |
762 | 764 | ||
763 | lea ebx, [exports] |
765 | lea ebx, [exports] |
764 | mov dword [ebx], kernel_export |
766 | mov dword [ebx], kernel_export |
765 | mov dword [ebx+4], 0 |
767 | mov dword [ebx+4], 0 |
766 | lea eax, [edx+20] |
768 | lea eax, [edx+20] |
767 | 769 | ||
768 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
770 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
769 | [strings], ebx |
771 | [strings], ebx |
770 | test eax, eax |
772 | test eax, eax |
771 | jnz @F |
773 | jnz @F |
772 | 774 | ||
773 | mov esi, msg_module |
775 | mov esi, msg_module |
774 | call sys_msg_board_str |
776 | call sys_msg_board_str |
775 | mov esi, [file_name] |
777 | mov esi, [file_name] |
776 | call sys_msg_board_str |
778 | call sys_msg_board_str |
777 | mov esi, msg_CR |
779 | mov esi, msg_CR |
778 | call sys_msg_board_str |
780 | call sys_msg_board_str |
779 | 781 | ||
780 | stdcall kernel_free,[coff] |
782 | stdcall kernel_free,[coff] |
781 | xor eax, eax |
783 | xor eax, eax |
782 | ret |
784 | ret |
783 | @@: |
785 | @@: |
784 | mov ebx, [coff] |
786 | mov ebx, [coff] |
785 | add ebx, 20 |
787 | add ebx, 20 |
786 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
788 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
787 | 789 | ||
788 | mov ebx, [coff] |
790 | mov ebx, [coff] |
789 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
791 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
790 | mov [start], eax |
792 | mov [start], eax |
791 | 793 | ||
792 | stdcall kernel_free, [coff] |
794 | stdcall kernel_free, [coff] |
793 | 795 | ||
794 | mov ebx, [start] |
796 | mov ebx, [start] |
795 | call ebx |
797 | call ebx |
796 | test eax, eax |
798 | test eax, eax |
797 | jnz .ok |
799 | jnz .ok |
798 | 800 | ||
799 | stdcall kernel_free, [img_base] |
801 | stdcall kernel_free, [img_base] |
800 | xor eax, eax |
802 | xor eax, eax |
801 | ret |
803 | ret |
802 | .ok: |
804 | .ok: |
803 | mov ebx, [img_base] |
805 | mov ebx, [img_base] |
804 | mov [eax+SRV.base], ebx |
806 | mov [eax+SRV.base], ebx |
805 | ret |
807 | ret |
806 | .fail: |
808 | .fail: |
807 | xor eax, eax |
809 | xor eax, eax |
808 | ret |
810 | ret |
809 | endp |
811 | endp |
810 | 812 | ||
811 | align 4 |
813 | align 4 |
812 | proc load_library stdcall, file_name:dword |
814 | proc load_library stdcall, file_name:dword |
813 | locals |
815 | locals |
814 | coff dd ? |
816 | coff dd ? |
815 | sym dd ? |
817 | sym dd ? |
816 | strings dd ? |
818 | strings dd ? |
817 | img_size dd ? |
819 | img_size dd ? |
818 | img_base dd ? |
820 | img_base dd ? |
819 | exports dd ? |
821 | exports dd ? |
820 | endl |
822 | endl |
821 | 823 | ||
822 | cli |
824 | cli |
823 | 825 | ||
824 | stdcall load_file, [file_name] |
826 | stdcall load_file, [file_name] |
825 | 827 | ||
826 | test eax, eax |
828 | test eax, eax |
827 | jz .fail |
829 | jz .fail |
828 | 830 | ||
829 | mov [coff], eax |
831 | mov [coff], eax |
830 | movzx ecx, [eax+CFH.nSections] |
832 | movzx ecx, [eax+CFH.nSections] |
831 | xor ebx, ebx |
833 | xor ebx, ebx |
832 | 834 | ||
833 | lea edx, [eax+20] |
835 | lea edx, [eax+20] |
834 | @@: |
836 | @@: |
835 | add ebx, [edx+CFS.SizeOfRawData] |
837 | add ebx, [edx+CFS.SizeOfRawData] |
836 | add ebx, 15 |
838 | add ebx, 15 |
837 | and ebx, not 15 |
839 | and ebx, not 15 |
838 | add edx, 18 |
840 | add edx, COFF_SECTION_SIZE |
839 | dec ecx |
841 | dec ecx |
840 | jnz @B |
842 | jnz @B |
841 | mov [img_size], ebx |
843 | mov [img_size], ebx |
842 | 844 | ||
843 | call init_heap |
845 | call init_heap |
844 | stdcall user_alloc, [img_size] |
846 | stdcall user_alloc, [img_size] |
845 | 847 | ||
846 | test eax, eax |
848 | test eax, eax |
847 | jz .fail |
849 | jz .fail |
848 | mov [img_base], eax |
850 | mov [img_base], eax |
849 | 851 | ||
850 | mov edx, [coff] |
852 | mov edx, [coff] |
851 | movzx ebx, [edx+CFH.nSections] |
853 | movzx ebx, [edx+CFH.nSections] |
852 | mov edi, [img_base] |
854 | mov edi, [img_base] |
853 | lea eax, [edx+20] |
855 | lea eax, [edx+20] |
854 | @@: |
856 | @@: |
855 | mov [eax+CFS.VirtualAddress], edi |
857 | mov [eax+CFS.VirtualAddress], edi |
856 | mov esi, [eax+CFS.PtrRawData] |
858 | mov esi, [eax+CFS.PtrRawData] |
857 | test esi, esi |
859 | test esi, esi |
858 | jnz .copy |
860 | jnz .copy |
859 | add edi, [eax+CFS.SizeOfRawData] |
861 | add edi, [eax+CFS.SizeOfRawData] |
860 | jmp .next |
862 | jmp .next |
861 | .copy: |
863 | .copy: |
862 | add esi, edx |
864 | add esi, edx |
863 | add edi, new_app_base |
865 | add edi, new_app_base |
864 | mov ecx, [eax+CFS.SizeOfRawData] |
866 | mov ecx, [eax+CFS.SizeOfRawData] |
865 | cld |
867 | cld |
866 | rep movsb |
868 | rep movsb |
867 | .next: |
869 | .next: |
868 | add edi, 15-new_app_base |
870 | add edi, 15-new_app_base |
869 | and edi, not 15 |
871 | and edi, not 15 |
870 | add eax, 40 |
872 | add eax, COFF_SECTION_SIZE |
871 | dec ebx |
873 | dec ebx |
872 | jnz @B |
874 | jnz @B |
873 | 875 | ||
874 | mov ebx, [edx+CFH.pSymTable] |
876 | mov ebx, [edx+CFH.pSymTable] |
875 | add ebx, edx |
877 | add ebx, edx |
876 | mov [sym], ebx |
878 | mov [sym], ebx |
877 | mov ecx, [edx+CFH.nSymbols] |
879 | mov ecx, [edx+CFH.nSymbols] |
878 | add ecx,ecx |
880 | add ecx,ecx |
879 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
881 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
880 | add ecx, [sym] |
882 | add ecx, [sym] |
881 | mov [strings], ecx |
883 | mov [strings], ecx |
882 | 884 | ||
883 | lea eax, [edx+20] |
885 | lea eax, [edx+20] |
884 | 886 | ||
885 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
887 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
886 | [strings], dword 0 |
888 | [strings], dword 0 |
887 | test eax, eax |
889 | test eax, eax |
888 | jnz @F |
890 | jnz @F |
889 | 891 | ||
890 | @@: |
892 | @@: |
891 | mov edx, [coff] |
893 | mov edx, [coff] |
892 | movzx ebx, [edx+CFH.nSections] |
894 | movzx ebx, [edx+CFH.nSections] |
893 | mov edi, new_app_base |
895 | mov edi, new_app_base |
894 | lea eax, [edx+20] |
896 | lea eax, [edx+20] |
895 | @@: |
897 | @@: |
896 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
898 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
897 | add eax, 40 |
899 | add eax, COFF_SECTION_SIZE |
898 | dec ebx |
900 | dec ebx |
899 | jnz @B |
901 | jnz @B |
900 | 902 | ||
901 | add edx, 20 |
903 | add edx, 20 |
902 | stdcall fix_coff_relocs, [coff], edx, [sym] |
904 | stdcall fix_coff_relocs, [coff], edx, [sym] |
903 | 905 | ||
904 | mov ebx, [coff] |
906 | mov ebx, [coff] |
905 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
907 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
906 | mov [exports], eax |
908 | mov [exports], eax |
907 | 909 | ||
908 | stdcall kernel_free, [coff] |
910 | stdcall kernel_free, [coff] |
909 | mov eax, [exports] |
911 | mov eax, [exports] |
910 | ret |
912 | ret |
911 | .fail: |
913 | .fail: |
912 | xor eax, eax |
914 | xor eax, eax |
913 | ret |
915 | ret |
914 | endp |
916 | endp |
915 | 917 | ||
916 | 918 | ||
917 | drv_sound db '/rd/1/drivers/unisound.obj', 0 |
919 | drv_sound db '/rd/1/drivers/unisound.obj', 0 |
918 | drv_infinity db '/rd/1/drivers/infinity.obj', 0 |
920 | drv_infinity db '/rd/1/drivers/infinity.obj', 0 |
919 | 921 | ||
920 | szSound db 'SOUND',0 |
922 | szSound db 'SOUND',0 |
921 | szInfinity db 'INFINITY',0 |
923 | szInfinity db 'INFINITY',0 |
922 | 924 | ||
923 | szSTART db 'START',0 |
925 | szSTART db 'START',0 |
924 | szEXPORTS db 'EXPORTS',0 |
926 | szEXPORTS db 'EXPORTS',0 |
925 | szIMPORTS db 'IMPORTS',0 |
927 | szIMPORTS db 'IMPORTS',0 |
926 | 928 | ||
927 | msg_unresolved db 'unresolved ',0 |
929 | msg_unresolved db 'unresolved ',0 |
928 | msg_module db 'in module ',0 |
930 | msg_module db 'in module ',0 |
929 | msg_CR db 13,10,0 |
931 | msg_CR db 13,10,0 |
930 | 932 | ||
931 | align 16 |
933 | align 16 |
932 | services: |
934 | services: |
933 | dd szSound, drv_sound |
935 | dd szSound, drv_sound |
934 | dd szInfinity, drv_infinity |
936 | dd szInfinity, drv_infinity |
935 | dd 0 |
937 | dd 0 |