Rev 188 | Rev 202 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 188 | Rev 198 | ||
---|---|---|---|
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 | 525 | ||
526 | stdcall kernel_alloc, [file_size] |
526 | stdcall kernel_alloc, [file_size] |
527 | mov [file], eax |
527 | mov [file], eax |
528 | 528 | ||
529 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
529 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
530 | cmp ebx, [file_size] |
530 | cmp ebx, [file_size] |
531 | jne .cleanup |
531 | jne .cleanup |
532 | mov eax, [file] |
532 | mov eax, [file] |
533 | ret |
533 | ret |
534 | .cleanup: |
534 | .cleanup: |
535 | stdcall kernel_free, [file] |
535 | stdcall kernel_free, [file] |
536 | .fail: |
536 | .fail: |
537 | xor eax, eax |
537 | xor eax, eax |
538 | ret |
538 | ret |
539 | endp |
539 | endp |
540 | 540 | ||
541 | align 4 |
541 | align 4 |
542 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
542 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
543 | 543 | ||
544 | .look_up: |
544 | .look_up: |
545 | mov edx, [imports] |
545 | mov edx, [imports] |
- | 546 | test edx, edx |
|
- | 547 | jz .end |
|
546 | mov edx, [edx] |
548 | mov edx, [edx] |
547 | test edx, edx |
549 | test edx, edx |
548 | jz .end |
550 | jz .end |
549 | .next: |
551 | .next: |
550 | mov eax, [edx] |
552 | mov eax, [edx] |
551 | test eax, eax |
553 | test eax, eax |
552 | jz .next_table |
554 | jz .next_table |
553 | 555 | ||
554 | push edx |
556 | push edx |
555 | stdcall strncmp, eax, [proc_name], 16 |
557 | stdcall strncmp, eax, [proc_name], 16 |
556 | pop edx |
558 | pop edx |
557 | test eax, eax |
559 | test eax, eax |
558 | jz .ok |
560 | jz .ok |
559 | 561 | ||
560 | add edx,8 |
562 | add edx,8 |
561 | jmp .next |
563 | jmp .next |
562 | .next_table: |
564 | .next_table: |
563 | add [imports], 4 |
565 | add [imports], 4 |
564 | jmp .look_up |
566 | jmp .look_up |
565 | .ok: |
567 | .ok: |
566 | mov eax, [edx+4] |
568 | mov eax, [edx+4] |
567 | ret |
569 | ret |
568 | .end: |
570 | .end: |
569 | xor eax, eax |
571 | xor eax, eax |
570 | ret |
572 | ret |
571 | endp |
573 | endp |
572 | 574 | ||
573 | align 4 |
575 | align 4 |
574 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
576 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
575 | sym_count:dword, strings:dword, imports:dword |
577 | sym_count:dword, strings:dword, imports:dword |
576 | locals |
578 | locals |
577 | retval dd ? |
579 | retval dd ? |
578 | endl |
580 | endl |
579 | 581 | ||
580 | mov edi, [symbols] |
582 | mov edi, [symbols] |
581 | mov [retval], 1 |
583 | mov [retval], 1 |
582 | .fix: |
584 | .fix: |
583 | movzx ebx, [edi+CSYM.SectionNumber] |
585 | movzx ebx, [edi+CSYM.SectionNumber] |
584 | test ebx, ebx |
586 | test ebx, ebx |
585 | jnz .internal |
587 | jnz .internal |
586 | mov eax, dword [edi+CSYM.Name] |
588 | mov eax, dword [edi+CSYM.Name] |
587 | test eax, eax |
589 | test eax, eax |
588 | jnz @F |
590 | jnz @F |
589 | 591 | ||
590 | mov edi, [edi+4] |
592 | mov edi, [edi+4] |
591 | add edi, [strings] |
593 | add edi, [strings] |
592 | @@: |
594 | @@: |
593 | push edi |
595 | push edi |
594 | stdcall get_proc_ex, edi,[imports] |
596 | stdcall get_proc_ex, edi,[imports] |
595 | pop edi |
597 | pop edi |
596 | 598 | ||
597 | xor ebx, ebx |
599 | xor ebx, ebx |
598 | test eax, eax |
600 | test eax, eax |
599 | jnz @F |
601 | jnz @F |
600 | 602 | ||
601 | mov esi, msg_unresolved |
603 | mov esi, msg_unresolved |
602 | call sys_msg_board_str |
604 | call sys_msg_board_str |
603 | mov esi, edi |
605 | mov esi, edi |
604 | call sys_msg_board_str |
606 | call sys_msg_board_str |
605 | mov esi, msg_CR |
607 | mov esi, msg_CR |
606 | call sys_msg_board_str |
608 | call sys_msg_board_str |
607 | 609 | ||
608 | mov [retval],0 |
610 | mov [retval],0 |
609 | @@: |
611 | @@: |
610 | mov edi, [symbols] |
612 | mov edi, [symbols] |
611 | mov [edi+CSYM.Value], eax |
613 | mov [edi+CSYM.Value], eax |
612 | jmp .next |
614 | jmp .next |
613 | .internal: |
615 | .internal: |
614 | dec ebx |
616 | dec ebx |
615 | shl ebx, 3 |
617 | shl ebx, 3 |
616 | lea ebx, [ebx+ebx*4] |
618 | lea ebx, [ebx+ebx*4] |
617 | add ebx, [sec] |
619 | add ebx, [sec] |
618 | 620 | ||
619 | mov eax, [ebx+CFS.VirtualAddress] |
621 | mov eax, [ebx+CFS.VirtualAddress] |
620 | add [edi+CSYM.Value], eax |
622 | add [edi+CSYM.Value], eax |
621 | .next: |
623 | .next: |
622 | add edi, CSYM_SIZE |
624 | add edi, CSYM_SIZE |
623 | mov [symbols], edi |
625 | mov [symbols], edi |
624 | dec [sym_count] |
626 | dec [sym_count] |
625 | jnz .fix |
627 | jnz .fix |
626 | mov eax, [retval] |
628 | mov eax, [retval] |
627 | ret |
629 | ret |
628 | endp |
630 | endp |
629 | 631 | ||
630 | align 4 |
632 | align 4 |
631 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
633 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
632 | locals |
634 | locals |
633 | n_sec dd ? |
635 | n_sec dd ? |
634 | endl |
636 | endl |
635 | 637 | ||
636 | mov eax, [coff] |
638 | mov eax, [coff] |
637 | movzx ebx, [eax+CFH.nSections] |
639 | movzx ebx, [eax+CFH.nSections] |
638 | mov [n_sec], ebx |
640 | mov [n_sec], ebx |
639 | .fix_sec: |
641 | .fix_sec: |
640 | mov esi, [sec] |
642 | mov esi, [sec] |
641 | mov edi, [esi+CFS.PtrReloc] |
643 | mov edi, [esi+CFS.PtrReloc] |
642 | add edi, [coff] |
644 | add edi, [coff] |
643 | 645 | ||
644 | movzx ecx, [esi+CFS.NumReloc] |
646 | movzx ecx, [esi+CFS.NumReloc] |
645 | test ecx, ecx |
647 | test ecx, ecx |
646 | jz .next |
648 | jz .next |
647 | .next_reloc: |
649 | .next_reloc: |
648 | mov ebx, [edi+CRELOC.SymIndex] |
650 | mov ebx, [edi+CRELOC.SymIndex] |
649 | add ebx,ebx |
651 | add ebx,ebx |
650 | lea ebx,[ebx+ebx*8] |
652 | lea ebx,[ebx+ebx*8] |
651 | add ebx, [sym] |
653 | add ebx, [sym] |
652 | 654 | ||
653 | mov edx, [ebx+CSYM.Value] |
655 | mov edx, [ebx+CSYM.Value] |
654 | 656 | ||
655 | cmp [edi+CRELOC.Type], 6 |
657 | cmp [edi+CRELOC.Type], 6 |
656 | je .dir_32 |
658 | je .dir_32 |
657 | 659 | ||
658 | cmp [edi+CRELOC.Type], 20 |
660 | cmp [edi+CRELOC.Type], 20 |
659 | jne .next_reloc |
661 | jne .next_reloc |
660 | .rel_32: |
662 | .rel_32: |
661 | mov eax, [edi+CRELOC.VirtualAddress] |
663 | mov eax, [edi+CRELOC.VirtualAddress] |
662 | add eax, [esi+CFS.VirtualAddress] |
664 | add eax, [esi+CFS.VirtualAddress] |
663 | sub edx, eax |
665 | sub edx, eax |
664 | sub edx, 4 |
666 | sub edx, 4 |
665 | jmp .fix |
667 | jmp .fix |
666 | .dir_32: |
668 | .dir_32: |
667 | mov eax, [edi+CRELOC.VirtualAddress] |
669 | mov eax, [edi+CRELOC.VirtualAddress] |
668 | add eax, [esi+CFS.VirtualAddress] |
670 | add eax, [esi+CFS.VirtualAddress] |
669 | .fix: |
671 | .fix: |
670 | add [eax], edx |
672 | add [eax], edx |
671 | add edi, 10 |
673 | add edi, 10 |
672 | dec ecx |
674 | dec ecx |
673 | jnz .next_reloc |
675 | jnz .next_reloc |
674 | .next: |
676 | .next: |
675 | add [sec], 40 |
677 | add [sec], 40 |
676 | dec [n_sec] |
678 | dec [n_sec] |
677 | jnz .fix_sec |
679 | jnz .fix_sec |
678 | .exit: |
680 | .exit: |
679 | ret |
681 | ret |
680 | endp |
682 | endp |
681 | 683 | ||
682 | align 4 |
684 | align 4 |
683 | proc load_driver stdcall, file_name:dword |
685 | proc load_driver stdcall, file_name:dword |
684 | locals |
686 | locals |
685 | coff dd ? |
687 | coff dd ? |
686 | sym dd ? |
688 | sym dd ? |
687 | strings dd ? |
689 | strings dd ? |
688 | img_size dd ? |
690 | img_size dd ? |
689 | img_base dd ? |
691 | img_base dd ? |
690 | start dd ? |
692 | start dd ? |
691 | 693 | ||
692 | exports dd ? ;fake exports table |
694 | exports dd ? ;fake exports table |
693 | dd ? |
695 | dd ? |
694 | endl |
696 | endl |
695 | 697 | ||
696 | stdcall load_file, [file_name] |
698 | stdcall load_file, [file_name] |
697 | test eax, eax |
699 | test eax, eax |
698 | jz .fail |
700 | jz .fail |
699 | 701 | ||
700 | mov [coff], eax |
702 | mov [coff], eax |
701 | 703 | ||
702 | movzx ecx, [eax+CFH.nSections] |
704 | movzx ecx, [eax+CFH.nSections] |
703 | xor ebx, ebx |
705 | xor ebx, ebx |
704 | 706 | ||
705 | lea edx, [eax+20] |
707 | lea edx, [eax+20] |
706 | @@: |
708 | @@: |
707 | add ebx, [edx+CFS.SizeOfRawData] |
709 | add ebx, [edx+CFS.SizeOfRawData] |
708 | add ebx, 15 |
710 | add ebx, 15 |
709 | and ebx, not 15 |
711 | and ebx, not 15 |
710 | add edx, 18 |
712 | add edx, 18 |
711 | dec ecx |
713 | dec ecx |
712 | jnz @B |
714 | jnz @B |
713 | mov [img_size], ebx |
715 | mov [img_size], ebx |
714 | 716 | ||
715 | stdcall kernel_alloc, ebx |
717 | stdcall kernel_alloc, ebx |
716 | test eax, eax |
718 | test eax, eax |
717 | jz .fail |
719 | jz .fail |
718 | mov [img_base], eax |
720 | mov [img_base], eax |
719 | 721 | ||
720 | mov edi, eax |
722 | mov edi, eax |
721 | xor eax, eax |
723 | xor eax, eax |
722 | mov ecx, [img_size] |
724 | mov ecx, [img_size] |
723 | add ecx, 4095 |
725 | add ecx, 4095 |
724 | and ecx, not 4095 |
726 | and ecx, not 4095 |
725 | shr ecx, 2 |
727 | shr ecx, 2 |
726 | cld |
728 | cld |
727 | rep stosd |
729 | rep stosd |
728 | 730 | ||
729 | mov edx, [coff] |
731 | mov edx, [coff] |
730 | movzx ebx, [edx+CFH.nSections] |
732 | movzx ebx, [edx+CFH.nSections] |
731 | mov edi, [img_base] |
733 | mov edi, [img_base] |
732 | lea eax, [edx+20] |
734 | lea eax, [edx+20] |
733 | @@: |
735 | @@: |
734 | mov [eax+CFS.VirtualAddress], edi |
736 | mov [eax+CFS.VirtualAddress], edi |
735 | mov esi, [eax+CFS.PtrRawData] |
737 | mov esi, [eax+CFS.PtrRawData] |
736 | test esi, esi |
738 | test esi, esi |
737 | jnz .copy |
739 | jnz .copy |
738 | add edi, [eax+CFS.SizeOfRawData] |
740 | add edi, [eax+CFS.SizeOfRawData] |
739 | jmp .next |
741 | jmp .next |
740 | .copy: |
742 | .copy: |
741 | add esi, edx |
743 | add esi, edx |
742 | mov ecx, [eax+CFS.SizeOfRawData] |
744 | mov ecx, [eax+CFS.SizeOfRawData] |
743 | cld |
745 | cld |
744 | rep movsb |
746 | rep movsb |
745 | .next: |
747 | .next: |
746 | add edi, 15 |
748 | add edi, 15 |
747 | and edi, not 15 |
749 | and edi, not 15 |
748 | add eax, 40 |
750 | add eax, 40 |
749 | dec ebx |
751 | dec ebx |
750 | jnz @B |
752 | jnz @B |
751 | 753 | ||
752 | mov ebx, [edx+CFH.pSymTable] |
754 | mov ebx, [edx+CFH.pSymTable] |
753 | add ebx, edx |
755 | add ebx, edx |
754 | mov [sym], ebx |
756 | mov [sym], ebx |
755 | mov ecx, [edx+CFH.nSymbols] |
757 | mov ecx, [edx+CFH.nSymbols] |
756 | add ecx,ecx |
758 | add ecx,ecx |
757 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
759 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
758 | add ecx, [sym] |
760 | add ecx, [sym] |
759 | mov [strings], ecx |
761 | mov [strings], ecx |
760 | 762 | ||
761 | lea ebx, [exports] |
763 | lea ebx, [exports] |
762 | mov dword [ebx], kernel_export |
764 | mov dword [ebx], kernel_export |
763 | mov dword [ebx+4], 0 |
765 | mov dword [ebx+4], 0 |
764 | lea eax, [edx+20] |
766 | lea eax, [edx+20] |
765 | 767 | ||
766 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
768 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
767 | [strings], ebx |
769 | [strings], ebx |
768 | test eax, eax |
770 | test eax, eax |
769 | jnz @F |
771 | jnz @F |
770 | 772 | ||
771 | mov esi, msg_module |
773 | mov esi, msg_module |
772 | call sys_msg_board_str |
774 | call sys_msg_board_str |
773 | mov esi, [file_name] |
775 | mov esi, [file_name] |
774 | call sys_msg_board_str |
776 | call sys_msg_board_str |
775 | mov esi, msg_CR |
777 | mov esi, msg_CR |
776 | call sys_msg_board_str |
778 | call sys_msg_board_str |
777 | 779 | ||
778 | stdcall kernel_free,[coff] |
780 | stdcall kernel_free,[coff] |
779 | xor eax, eax |
781 | xor eax, eax |
780 | ret |
782 | ret |
781 | @@: |
783 | @@: |
782 | mov ebx, [coff] |
784 | mov ebx, [coff] |
783 | add ebx, 20 |
785 | add ebx, 20 |
784 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
786 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
785 | 787 | ||
786 | mov ebx, [coff] |
788 | mov ebx, [coff] |
787 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
789 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
788 | mov [start], eax |
790 | mov [start], eax |
789 | 791 | ||
790 | stdcall kernel_free, [coff] |
792 | stdcall kernel_free, [coff] |
791 | 793 | ||
792 | mov ebx, [start] |
794 | mov ebx, [start] |
793 | call ebx |
795 | call ebx |
794 | test eax, eax |
796 | test eax, eax |
795 | jnz .ok |
797 | jnz .ok |
796 | 798 | ||
797 | stdcall kernel_free, [img_base] |
799 | stdcall kernel_free, [img_base] |
798 | xor eax, eax |
800 | xor eax, eax |
799 | ret |
801 | ret |
800 | .ok: |
802 | .ok: |
801 | mov ebx, [img_base] |
803 | mov ebx, [img_base] |
802 | mov [eax+SRV.base], ebx |
804 | mov [eax+SRV.base], ebx |
803 | ret |
805 | ret |
804 | .fail: |
806 | .fail: |
805 | xor eax, eax |
807 | xor eax, eax |
806 | ret |
808 | ret |
807 | endp |
809 | endp |
- | 810 | ||
- | 811 | align 4 |
|
- | 812 | proc load_library stdcall, file_name:dword |
|
- | 813 | locals |
|
- | 814 | coff dd ? |
|
- | 815 | sym dd ? |
|
- | 816 | strings dd ? |
|
- | 817 | img_size dd ? |
|
- | 818 | img_base dd ? |
|
- | 819 | exports dd ? |
|
- | 820 | endl |
|
- | 821 | ||
- | 822 | cli |
|
- | 823 | ||
- | 824 | stdcall load_file, [file_name] |
|
- | 825 | ||
- | 826 | test eax, eax |
|
- | 827 | jz .fail |
|
- | 828 | ||
- | 829 | mov [coff], eax |
|
- | 830 | movzx ecx, [eax+CFH.nSections] |
|
- | 831 | xor ebx, ebx |
|
- | 832 | ||
- | 833 | lea edx, [eax+20] |
|
- | 834 | @@: |
|
- | 835 | add ebx, [edx+CFS.SizeOfRawData] |
|
- | 836 | add ebx, 15 |
|
- | 837 | and ebx, not 15 |
|
- | 838 | add edx, 18 |
|
- | 839 | dec ecx |
|
- | 840 | jnz @B |
|
- | 841 | mov [img_size], ebx |
|
- | 842 | ||
- | 843 | call init_heap |
|
- | 844 | stdcall user_alloc, [img_size] |
|
- | 845 | ||
- | 846 | test eax, eax |
|
- | 847 | jz .fail |
|
- | 848 | mov [img_base], eax |
|
- | 849 | ||
- | 850 | mov edx, [coff] |
|
- | 851 | movzx ebx, [edx+CFH.nSections] |
|
- | 852 | mov edi, [img_base] |
|
- | 853 | lea eax, [edx+20] |
|
- | 854 | @@: |
|
- | 855 | mov [eax+CFS.VirtualAddress], edi |
|
- | 856 | mov esi, [eax+CFS.PtrRawData] |
|
- | 857 | test esi, esi |
|
- | 858 | jnz .copy |
|
- | 859 | add edi, [eax+CFS.SizeOfRawData] |
|
- | 860 | jmp .next |
|
- | 861 | .copy: |
|
- | 862 | add esi, edx |
|
- | 863 | add edi, new_app_base |
|
- | 864 | mov ecx, [eax+CFS.SizeOfRawData] |
|
- | 865 | cld |
|
- | 866 | rep movsb |
|
- | 867 | .next: |
|
- | 868 | add edi, 15-new_app_base |
|
- | 869 | and edi, not 15 |
|
- | 870 | add eax, 40 |
|
- | 871 | dec ebx |
|
- | 872 | jnz @B |
|
- | 873 | ||
- | 874 | mov ebx, [edx+CFH.pSymTable] |
|
- | 875 | add ebx, edx |
|
- | 876 | mov [sym], ebx |
|
- | 877 | mov ecx, [edx+CFH.nSymbols] |
|
- | 878 | add ecx,ecx |
|
- | 879 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
|
- | 880 | add ecx, [sym] |
|
- | 881 | mov [strings], ecx |
|
- | 882 | ||
- | 883 | lea eax, [edx+20] |
|
- | 884 | ||
- | 885 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
|
- | 886 | [strings], dword 0 |
|
- | 887 | test eax, eax |
|
- | 888 | jnz @F |
|
- | 889 | ||
- | 890 | @@: |
|
- | 891 | mov edx, [coff] |
|
- | 892 | movzx ebx, [edx+CFH.nSections] |
|
- | 893 | mov edi, new_app_base |
|
- | 894 | lea eax, [edx+20] |
|
- | 895 | @@: |
|
- | 896 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
|
- | 897 | add eax, 40 |
|
- | 898 | dec ebx |
|
- | 899 | jnz @B |
|
- | 900 | ||
- | 901 | add edx, 20 |
|
- | 902 | stdcall fix_coff_relocs, [coff], edx, [sym] |
|
- | 903 | ||
- | 904 | mov ebx, [coff] |
|
- | 905 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
|
- | 906 | mov [exports], eax |
|
- | 907 | ||
- | 908 | stdcall kernel_free, [coff] |
|
- | 909 | mov eax, [exports] |
|
- | 910 | ret |
|
- | 911 | .fail: |
|
- | 912 | xor eax, eax |
|
- | 913 | ret |
|
- | 914 | endp |
|
- | 915 | ||
808 | 916 | ||
809 | drv_sound db '/rd/1/unisound.obj', 0 |
917 | drv_sound db '/rd/1/unisound.obj', 0 |
810 | drv_infinity db '/rd/1/infinity.obj', 0 |
918 | drv_infinity db '/rd/1/infinity.obj', 0 |
811 | 919 | ||
812 | szSound db 'SOUND',0 |
920 | szSound db 'SOUND',0 |
813 | szInfinity db 'INFINITY',0 |
921 | szInfinity db 'INFINITY',0 |
814 | 922 | ||
815 | szSTART db 'START',0 |
923 | szSTART db 'START',0 |
816 | szEXPORTS db 'EXPORTS',0 |
924 | szEXPORTS db 'EXPORTS',0 |
817 | szIMPORTS db 'IMPORTS',0 |
925 | szIMPORTS db 'IMPORTS',0 |
818 | 926 | ||
819 | msg_unresolved db 'unresolved ',0 |
927 | msg_unresolved db 'unresolved ',0 |
820 | msg_module db 'in module ',0 |
928 | msg_module db 'in module ',0 |
821 | msg_CR db 13,10,0 |
929 | msg_CR db 13,10,0 |
822 | 930 | ||
823 | align 16 |
931 | align 16 |
824 | services: |
932 | services: |
825 | dd szSound, drv_sound |
933 | dd szSound, drv_sound |
826 | dd szInfinity, drv_infinity |
934 | dd szInfinity, drv_infinity |
827 | dd 0 |
935 | dd 0 |