Rev 593 | Rev 663 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 593 | Rev 662 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 593 $ |
8 | $Revision: 662 $ |
9 | 9 | ||
10 | 10 | ||
11 | DRV_COMPAT equ 5 ;minimal required drivers version |
11 | DRV_COMPAT equ 5 ;minimal required drivers version |
12 | DRV_CURRENT equ 5 ;current drivers model version |
12 | DRV_CURRENT equ 5 ;current drivers model version |
13 | 13 | ||
14 | DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT |
14 | DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT |
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, app_data ;os_data |
137 | mov bx, app_data ;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 | mov [check_idle_semaphore],5 |
146 | mov [check_idle_semaphore],5 |
147 | 147 | ||
148 | .exit: |
148 | .exit: |
149 | restore_ring3_context |
149 | restore_ring3_context |
150 | 150 | ||
151 | cmp eax, 8 |
151 | cmp eax, 8 |
152 | mov al, 0x20 |
152 | mov al, 0x20 |
153 | jb @f |
153 | jb @f |
154 | out 0xa0, al |
154 | out 0xa0, al |
155 | @@: |
155 | @@: |
156 | out 0x20, al |
156 | out 0x20, al |
157 | 157 | ||
158 | pop eax |
158 | pop eax |
159 | iret |
159 | iret |
160 | 160 | ||
161 | align 4 |
161 | align 4 |
162 | proc get_notify stdcall, p_ev:dword |
162 | proc get_notify stdcall, p_ev:dword |
163 | 163 | ||
164 | .wait: |
164 | .wait: |
165 | mov ebx,[current_slot] |
165 | mov ebx,[current_slot] |
166 | test dword [ebx+APPDATA.event_mask],EVENT_NOTIFY |
166 | test dword [ebx+APPDATA.event_mask],EVENT_NOTIFY |
167 | jz @f |
167 | jz @f |
168 | and dword [ebx+APPDATA.event_mask], not EVENT_NOTIFY |
168 | and dword [ebx+APPDATA.event_mask], 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+APPDATA.event] |
171 | mov eax, [ebx+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_read16 stdcall, bus:dword, devfn:dword, reg:dword |
192 | proc pci_read16 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, 5 |
196 | mov al, 5 |
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_read8 stdcall, bus:dword, devfn:dword, reg:dword |
204 | proc pci_read8 stdcall, bus:dword, devfn:dword, reg: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, 4 |
208 | mov al, 4 |
209 | mov bh, byte [devfn] |
209 | mov bh, byte [devfn] |
210 | mov bl, byte [reg] |
210 | mov bl, byte [reg] |
211 | call pci_read_reg |
211 | call pci_read_reg |
212 | ret |
212 | ret |
213 | endp |
213 | endp |
214 | 214 | ||
215 | align 4 |
215 | align 4 |
216 | proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
216 | proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
217 | xor eax, eax |
217 | xor eax, eax |
218 | xor ebx, ebx |
218 | xor ebx, ebx |
219 | mov ah, byte [bus] |
219 | mov ah, byte [bus] |
220 | mov al, 8 |
220 | mov al, 8 |
221 | mov bh, byte [devfn] |
221 | mov bh, byte [devfn] |
222 | mov bl, byte [reg] |
222 | mov bl, byte [reg] |
223 | mov ecx, [val] |
223 | mov ecx, [val] |
224 | call pci_write_reg |
224 | call pci_write_reg |
225 | ret |
225 | ret |
226 | endp |
226 | endp |
227 | 227 | ||
228 | align 4 |
228 | align 4 |
229 | proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
229 | proc pci_write16 stdcall, bus:dword, devfn:dword, reg:dword, val:dword |
230 | xor eax, eax |
230 | xor eax, eax |
231 | xor ebx, ebx |
231 | xor ebx, ebx |
232 | mov ah, byte [bus] |
232 | mov ah, byte [bus] |
233 | mov al, 9 |
233 | mov al, 9 |
234 | mov bh, byte [devfn] |
234 | mov bh, byte [devfn] |
235 | mov bl, byte [reg] |
235 | mov bl, byte [reg] |
236 | mov ecx, [val] |
236 | mov ecx, [val] |
237 | call pci_write_reg |
237 | call pci_write_reg |
238 | ret |
238 | ret |
239 | endp |
239 | endp |
240 | 240 | ||
241 | handle equ IOCTL.handle |
241 | handle equ IOCTL.handle |
242 | io_code equ IOCTL.io_code |
242 | io_code equ IOCTL.io_code |
243 | input equ IOCTL.input |
243 | input equ IOCTL.input |
244 | inp_size equ IOCTL.inp_size |
244 | inp_size equ IOCTL.inp_size |
245 | output equ IOCTL.output |
245 | output equ IOCTL.output |
246 | out_size equ IOCTL.out_size |
246 | out_size equ IOCTL.out_size |
247 | 247 | ||
248 | 248 | ||
249 | align 4 |
249 | align 4 |
250 | proc srv_handler stdcall, ioctl:dword |
250 | proc srv_handler stdcall, ioctl:dword |
251 | mov esi, [ioctl] |
251 | mov esi, [ioctl] |
252 | test esi, esi |
252 | test esi, esi |
253 | jz .err |
253 | jz .err |
254 | 254 | ||
255 | mov edi, [esi+handle] |
255 | mov edi, [esi+handle] |
256 | cmp [edi+SRV.magic], ' SRV' |
256 | cmp [edi+SRV.magic], ' SRV' |
257 | jne .fail |
257 | jne .fail |
258 | 258 | ||
259 | cmp [edi+SRV.size], SRV_SIZE |
259 | cmp [edi+SRV.size], SRV_SIZE |
260 | jne .fail |
260 | jne .fail |
261 | 261 | ||
262 | stdcall [edi+SRV.srv_proc], esi |
262 | stdcall [edi+SRV.srv_proc], esi |
263 | ret |
263 | ret |
264 | .fail: |
264 | .fail: |
265 | xor eax, eax |
265 | xor eax, eax |
266 | not eax |
266 | not eax |
267 | mov [esi+output], eax |
267 | mov [esi+output], eax |
268 | mov [esi+out_size], 4 |
268 | mov [esi+out_size], 4 |
269 | ret |
269 | ret |
270 | .err: |
270 | .err: |
271 | xor eax, eax |
271 | xor eax, eax |
272 | not eax |
272 | not eax |
273 | ret |
273 | ret |
274 | endp |
274 | endp |
275 | 275 | ||
276 | ; param |
276 | ; param |
277 | ; ebx= io_control |
277 | ; ebx= io_control |
278 | ; |
278 | ; |
279 | ; retval |
279 | ; retval |
280 | ; eax= error code |
280 | ; eax= error code |
281 | 281 | ||
282 | align 4 |
282 | align 4 |
283 | srv_handlerEx: |
283 | srv_handlerEx: |
284 | cmp ebx, OS_BASE |
284 | cmp ebx, OS_BASE |
285 | jae .fail |
285 | jae .fail |
286 | 286 | ||
287 | mov eax, [ebx+handle] |
287 | mov eax, [ebx+handle] |
288 | cmp [eax+SRV.magic], ' SRV' |
288 | cmp [eax+SRV.magic], ' SRV' |
289 | jne .fail |
289 | jne .fail |
290 | 290 | ||
291 | cmp [eax+SRV.size], SRV_SIZE |
291 | cmp [eax+SRV.size], SRV_SIZE |
292 | jne .fail |
292 | jne .fail |
293 | 293 | ||
294 | stdcall [eax+SRV.srv_proc], ebx |
294 | stdcall [eax+SRV.srv_proc], ebx |
295 | ret |
295 | ret |
296 | .fail: |
296 | .fail: |
297 | or eax, -1 |
297 | or eax, -1 |
298 | ret |
298 | ret |
299 | 299 | ||
300 | restore handle |
300 | restore handle |
301 | restore io_code |
301 | restore io_code |
302 | restore input |
302 | restore input |
303 | restore inp_size |
303 | restore inp_size |
304 | restore output |
304 | restore output |
305 | restore out_size |
305 | restore out_size |
306 | 306 | ||
307 | align 4 |
307 | align 4 |
308 | proc get_service stdcall, sz_name:dword |
308 | proc get_service stdcall, sz_name:dword |
309 | mov eax, [sz_name] |
309 | mov eax, [sz_name] |
310 | test eax, eax |
310 | test eax, eax |
311 | jnz @F |
311 | jnz @F |
312 | ret |
312 | ret |
313 | @@: |
313 | @@: |
314 | mov edx, [srv.fd] |
314 | mov edx, [srv.fd] |
315 | @@: |
315 | @@: |
316 | cmp edx, srv.fd-SRV_FD_OFFSET |
316 | cmp edx, srv.fd-SRV_FD_OFFSET |
317 | je .not_load |
317 | je .not_load |
318 | 318 | ||
319 | stdcall strncmp, edx, [sz_name], 16 |
319 | stdcall strncmp, edx, [sz_name], 16 |
320 | test eax, eax |
320 | test eax, eax |
321 | je .ok |
321 | je .ok |
322 | 322 | ||
323 | mov edx, [edx+SRV.fd] |
323 | mov edx, [edx+SRV.fd] |
324 | jmp @B |
324 | jmp @B |
325 | .not_load: |
325 | .not_load: |
326 | pop ebp |
326 | pop ebp |
327 | jmp load_driver |
327 | jmp load_driver |
328 | .ok: |
328 | .ok: |
329 | mov eax, edx |
329 | mov eax, edx |
330 | ret |
330 | ret |
331 | endp |
331 | endp |
332 | 332 | ||
333 | align 4 |
333 | align 4 |
334 | reg_service: |
334 | reg_service: |
335 | .sz_name equ esp+4 |
335 | .sz_name equ esp+4 |
336 | .handler equ esp+8 |
336 | .handler equ esp+8 |
337 | mov eax, [.sz_name] |
337 | mov eax, [.sz_name] |
338 | test eax, eax |
338 | test eax, eax |
339 | jz .fail |
339 | jz .fail |
340 | 340 | ||
341 | mov ebx, [.handler] |
341 | mov ebx, [.handler] |
342 | test ebx, ebx |
342 | test ebx, ebx |
343 | jz .fail |
343 | jz .fail |
344 | 344 | ||
345 | mov eax, SRV_SIZE |
345 | mov eax, SRV_SIZE |
346 | call malloc ;call alloc_service |
346 | call malloc ;call alloc_service |
347 | test eax, eax |
347 | test eax, eax |
348 | jz .fail |
348 | jz .fail |
349 | 349 | ||
350 | mov edi, eax |
350 | mov edi, eax |
351 | mov esi, [.sz_name] |
351 | mov esi, [.sz_name] |
352 | mov ecx, 16/4 |
352 | mov ecx, 16/4 |
353 | rep movsd |
353 | rep movsd |
354 | 354 | ||
355 | mov [eax+SRV.magic], ' SRV' |
355 | mov [eax+SRV.magic], ' SRV' |
356 | mov [eax+SRV.size], SRV_SIZE |
356 | mov [eax+SRV.size], SRV_SIZE |
357 | 357 | ||
358 | mov ebx, srv.fd-SRV_FD_OFFSET |
358 | mov ebx, srv.fd-SRV_FD_OFFSET |
359 | mov edx, [ebx+SRV.fd] |
359 | mov edx, [ebx+SRV.fd] |
360 | mov [eax+SRV.fd], edx |
360 | mov [eax+SRV.fd], edx |
361 | mov [eax+SRV.bk], ebx |
361 | mov [eax+SRV.bk], ebx |
362 | mov [ebx+SRV.fd], eax |
362 | mov [ebx+SRV.fd], eax |
363 | mov [edx+SRV.bk], eax |
363 | mov [edx+SRV.bk], eax |
364 | 364 | ||
365 | mov ecx, [.handler] |
365 | mov ecx, [.handler] |
366 | mov [eax+SRV.srv_proc], ecx |
366 | mov [eax+SRV.srv_proc], ecx |
367 | ret 8 |
367 | ret 8 |
368 | .fail: |
368 | .fail: |
369 | xor eax, eax |
369 | xor eax, eax |
370 | ret 8 |
370 | ret 8 |
371 | 371 | ||
372 | align 4 |
372 | align 4 |
373 | proc get_proc stdcall, exp:dword, sz_name:dword |
373 | proc get_proc stdcall, exp:dword, sz_name:dword |
374 | 374 | ||
375 | mov edx, [exp] |
375 | mov edx, [exp] |
376 | .next: |
376 | .next: |
377 | mov eax, [edx] |
377 | mov eax, [edx] |
378 | test eax, eax |
378 | test eax, eax |
379 | jz .end |
379 | jz .end |
380 | 380 | ||
381 | push edx |
381 | push edx |
382 | stdcall strncmp, eax, [sz_name], 16 |
382 | stdcall strncmp, eax, [sz_name], 16 |
383 | pop edx |
383 | pop edx |
384 | test eax, eax |
384 | test eax, eax |
385 | jz .ok |
385 | jz .ok |
386 | 386 | ||
387 | add edx,8 |
387 | add edx,8 |
388 | jmp .next |
388 | jmp .next |
389 | .ok: |
389 | .ok: |
390 | mov eax, [edx+4] |
390 | mov eax, [edx+4] |
391 | .end: |
391 | .end: |
392 | ret |
392 | ret |
393 | endp |
393 | endp |
394 | 394 | ||
395 | align 4 |
395 | align 4 |
396 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
396 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
397 | 397 | ||
398 | @@: |
398 | @@: |
399 | stdcall strncmp, [pSym], [sz_sym], 8 |
399 | stdcall strncmp, [pSym], [sz_sym], 8 |
400 | test eax,eax |
400 | test eax,eax |
401 | jz .ok |
401 | jz .ok |
402 | add [pSym], 18 |
402 | add [pSym], 18 |
403 | dec [count] |
403 | dec [count] |
404 | jnz @b |
404 | jnz @b |
405 | xor eax, eax |
405 | xor eax, eax |
406 | ret |
406 | ret |
407 | .ok: |
407 | .ok: |
408 | mov ebx, [pSym] |
408 | mov ebx, [pSym] |
409 | mov eax, [ebx+8] |
409 | mov eax, [ebx+8] |
410 | ret |
410 | ret |
411 | endp |
411 | endp |
412 | 412 | ||
413 | align 4 |
413 | align 4 |
414 | proc get_curr_task |
414 | proc get_curr_task |
415 | mov eax,[CURRENT_TASK] |
415 | mov eax,[CURRENT_TASK] |
416 | shl eax, 8 |
416 | shl eax, 8 |
417 | ret |
417 | ret |
418 | endp |
418 | endp |
419 | 419 | ||
420 | align 4 |
420 | align 4 |
421 | proc get_fileinfo stdcall, file_name:dword, info:dword |
421 | proc get_fileinfo stdcall, file_name:dword, info:dword |
422 | locals |
422 | locals |
423 | cmd dd ? |
423 | cmd dd ? |
424 | offset dd ? |
424 | offset dd ? |
425 | dd ? |
425 | dd ? |
426 | count dd ? |
426 | count dd ? |
427 | buff dd ? |
427 | buff dd ? |
428 | db ? |
428 | db ? |
429 | name dd ? |
429 | name dd ? |
430 | endl |
430 | endl |
431 | 431 | ||
432 | xor eax, eax |
432 | xor eax, eax |
433 | mov ebx, [file_name] |
433 | mov ebx, [file_name] |
434 | ; sub ebx, new_app_base |
- | |
435 | mov ecx, [info] |
434 | mov ecx, [info] |
436 | ; sub ecx, new_app_base |
- | |
437 | 435 | ||
438 | mov [cmd], 5 |
436 | mov [cmd], 5 |
439 | mov [offset], eax |
437 | mov [offset], eax |
440 | mov [offset+4], eax |
438 | mov [offset+4], eax |
441 | mov [count], eax |
439 | mov [count], eax |
442 | mov [buff], ecx |
440 | mov [buff], ecx |
443 | mov byte [buff+4], al |
441 | mov byte [buff+4], al |
444 | mov [name], ebx |
442 | mov [name], ebx |
445 | 443 | ||
446 | mov eax, 70 |
444 | mov eax, 70 |
447 | lea ebx, [cmd] |
445 | lea ebx, [cmd] |
448 | ; sub ebx, new_app_base |
- | |
449 | int 0x40 |
446 | int 0x40 |
450 | ret |
447 | ret |
451 | endp |
448 | endp |
452 | 449 | ||
453 | align 4 |
450 | align 4 |
454 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
451 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
455 | bytes:dword |
452 | bytes:dword |
456 | locals |
453 | locals |
457 | cmd dd ? |
454 | cmd dd ? |
458 | offset dd ? |
455 | offset dd ? |
459 | dd ? |
456 | dd ? |
460 | count dd ? |
457 | count dd ? |
461 | buff dd ? |
458 | buff dd ? |
462 | db ? |
459 | db ? |
463 | name dd ? |
460 | name dd ? |
464 | endl |
461 | endl |
465 | 462 | ||
466 | xor eax, eax |
463 | xor eax, eax |
467 | mov ebx, [file_name] |
464 | mov ebx, [file_name] |
468 | mov ecx, [off] |
465 | mov ecx, [off] |
469 | mov edx, [bytes] |
466 | mov edx, [bytes] |
470 | mov esi, [buffer] |
467 | mov esi, [buffer] |
471 | 468 | ||
472 | mov [cmd], eax |
469 | mov [cmd], eax |
473 | mov [offset], ecx |
470 | mov [offset], ecx |
474 | mov [offset+4], eax |
471 | mov [offset+4], eax |
475 | mov [count], edx |
472 | mov [count], edx |
476 | mov [buff], esi |
473 | mov [buff], esi |
477 | mov byte [buff+4], al |
474 | mov byte [buff+4], al |
478 | mov [name], ebx |
475 | mov [name], ebx |
479 | 476 | ||
480 | pushad |
477 | pushad |
481 | push eax |
478 | push eax |
482 | lea eax, [cmd] |
479 | lea eax, [cmd] |
483 | call file_system_lfn |
480 | call file_system_lfn |
484 | pop eax |
481 | pop eax |
485 | popad |
482 | popad |
486 | ret |
483 | ret |
487 | endp |
484 | endp |
488 | 485 | ||
489 | ; description |
486 | ; description |
490 | ; allocate kernel memory and loads the specified file |
487 | ; allocate kernel memory and loads the specified file |
491 | ; |
488 | ; |
492 | ; param |
489 | ; param |
493 | ; file_name= full path to file |
490 | ; file_name= full path to file |
494 | ; |
491 | ; |
495 | ; retval |
492 | ; retval |
496 | ; eax= file image in kernel memory |
493 | ; eax= file image in kernel memory |
497 | ; ebx= size of file |
494 | ; ebx= size of file |
498 | ; |
495 | ; |
499 | ; warging |
496 | ; warging |
500 | ; You mast call kernel_free() to delete each file |
497 | ; You mast call kernel_free() to delete each file |
501 | ; loaded by the load_file() function |
498 | ; loaded by the load_file() function |
502 | 499 | ||
503 | align 4 |
500 | align 4 |
504 | proc load_file stdcall, file_name:dword |
501 | proc load_file stdcall, file_name:dword |
505 | locals |
502 | locals |
506 | attr dd ? |
503 | attr dd ? |
507 | flags dd ? |
504 | flags dd ? |
508 | cr_time dd ? |
505 | cr_time dd ? |
509 | cr_date dd ? |
506 | cr_date dd ? |
510 | acc_time dd ? |
507 | acc_time dd ? |
511 | acc_date dd ? |
508 | acc_date dd ? |
512 | mod_time dd ? |
509 | mod_time dd ? |
513 | mod_date dd ? |
510 | mod_date dd ? |
514 | file_size dd ? |
511 | file_size dd ? |
515 | 512 | ||
516 | file dd ? |
513 | file dd ? |
517 | file2 dd ? |
514 | file2 dd ? |
518 | endl |
515 | endl |
- | 516 | ||
- | 517 | push ebx |
|
- | 518 | push esi |
|
- | 519 | push edi |
|
519 | 520 | ||
520 | lea eax, [attr] |
521 | lea eax, [attr] |
521 | stdcall get_fileinfo, [file_name], eax |
522 | stdcall get_fileinfo, [file_name], eax |
522 | test eax, eax |
523 | test eax, eax |
523 | jnz .fail |
524 | jnz .fail |
524 | 525 | ||
525 | mov eax, [file_size] |
526 | mov eax, [file_size] |
526 | cmp eax, 1024*1024*16 |
527 | cmp eax, 1024*1024*16 |
527 | ja .fail |
528 | ja .fail |
528 | 529 | ||
529 | stdcall kernel_alloc, [file_size] |
530 | stdcall kernel_alloc, [file_size] |
530 | mov [file], eax |
531 | mov [file], eax |
531 | 532 | ||
532 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
533 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
533 | cmp ebx, [file_size] |
534 | cmp ebx, [file_size] |
534 | jne .cleanup |
535 | jne .cleanup |
535 | 536 | ||
536 | mov eax, [file] |
537 | mov eax, [file] |
537 | cmp dword [eax], 0x4B43504B |
538 | cmp dword [eax], 0x4B43504B |
538 | jne .exit |
539 | jne .exit |
539 | mov ebx, [eax+4] |
540 | mov ebx, [eax+4] |
540 | mov [file_size], ebx |
541 | mov [file_size], ebx |
541 | stdcall kernel_alloc, ebx |
542 | stdcall kernel_alloc, ebx |
542 | 543 | ||
543 | test eax, eax |
544 | test eax, eax |
544 | jz .cleanup |
545 | jz .cleanup |
545 | 546 | ||
546 | mov [file2], eax |
547 | mov [file2], eax |
547 | stdcall unpack, [file], eax |
548 | stdcall unpack, [file], eax |
548 | stdcall kernel_free, [file] |
549 | stdcall kernel_free, [file] |
549 | mov eax, [file2] |
550 | mov eax, [file2] |
550 | mov ebx, [file_size] |
551 | mov ebx, [file_size] |
551 | .exit: |
552 | .exit: |
552 | push eax |
553 | push eax |
553 | lea edi, [eax+ebx] ;cleanup remain space |
554 | lea edi, [eax+ebx] ;cleanup remain space |
554 | mov ecx, 4096 ;from file end |
555 | mov ecx, 4096 ;from file end |
555 | and ebx, 4095 |
556 | and ebx, 4095 |
556 | jz @f |
557 | jz @f |
557 | sub ecx, ebx |
558 | sub ecx, ebx |
558 | xor eax, eax |
559 | xor eax, eax |
559 | cld |
560 | cld |
560 | rep stosb |
561 | rep stosb |
561 | @@: |
562 | @@: |
562 | mov ebx, [file_size] |
563 | mov ebx, [file_size] |
563 | pop eax |
564 | pop eax |
- | 565 | pop edi |
|
- | 566 | pop esi |
|
- | 567 | pop ebx |
|
564 | ret |
568 | ret |
565 | .cleanup: |
569 | .cleanup: |
566 | stdcall kernel_free, [file] |
570 | stdcall kernel_free, [file] |
567 | .fail: |
571 | .fail: |
568 | xor eax, eax |
572 | xor eax, eax |
569 | xor ebx, ebx |
573 | xor ebx, ebx |
- | 574 | pop edi |
|
- | 575 | pop esi |
|
- | 576 | pop ebx |
|
570 | ret |
577 | ret |
571 | endp |
578 | endp |
572 | 579 | ||
573 | align 4 |
580 | align 4 |
574 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
581 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
575 | 582 | ||
576 | .look_up: |
583 | .look_up: |
577 | mov edx, [imports] |
584 | mov edx, [imports] |
578 | test edx, edx |
585 | test edx, edx |
579 | jz .end |
586 | jz .end |
580 | mov edx, [edx] |
587 | mov edx, [edx] |
581 | test edx, edx |
588 | test edx, edx |
582 | jz .end |
589 | jz .end |
583 | .next: |
590 | .next: |
584 | mov eax, [edx] |
591 | mov eax, [edx] |
585 | test eax, eax |
592 | test eax, eax |
586 | jz .next_table |
593 | jz .next_table |
587 | 594 | ||
588 | push edx |
595 | push edx |
589 | stdcall strncmp, eax, [proc_name], 16 |
596 | stdcall strncmp, eax, [proc_name], 16 |
590 | pop edx |
597 | pop edx |
591 | test eax, eax |
598 | test eax, eax |
592 | jz .ok |
599 | jz .ok |
593 | 600 | ||
594 | add edx,8 |
601 | add edx,8 |
595 | jmp .next |
602 | jmp .next |
596 | .next_table: |
603 | .next_table: |
597 | add [imports], 4 |
604 | add [imports], 4 |
598 | jmp .look_up |
605 | jmp .look_up |
599 | .ok: |
606 | .ok: |
600 | mov eax, [edx+4] |
607 | mov eax, [edx+4] |
601 | ret |
608 | ret |
602 | .end: |
609 | .end: |
603 | xor eax, eax |
610 | xor eax, eax |
604 | ret |
611 | ret |
605 | endp |
612 | endp |
606 | 613 | ||
607 | align 4 |
614 | align 4 |
608 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
615 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
609 | sym_count:dword, strings:dword, imports:dword |
616 | sym_count:dword, strings:dword, imports:dword |
610 | locals |
617 | locals |
611 | retval dd ? |
618 | retval dd ? |
612 | endl |
619 | endl |
613 | 620 | ||
614 | mov edi, [symbols] |
621 | mov edi, [symbols] |
615 | mov [retval], 1 |
622 | mov [retval], 1 |
616 | .fix: |
623 | .fix: |
617 | movzx ebx, [edi+CSYM.SectionNumber] |
624 | movzx ebx, [edi+CSYM.SectionNumber] |
618 | test ebx, ebx |
625 | test ebx, ebx |
619 | jnz .internal |
626 | jnz .internal |
620 | mov eax, dword [edi+CSYM.Name] |
627 | mov eax, dword [edi+CSYM.Name] |
621 | test eax, eax |
628 | test eax, eax |
622 | jnz @F |
629 | jnz @F |
623 | 630 | ||
624 | mov edi, [edi+4] |
631 | mov edi, [edi+4] |
625 | add edi, [strings] |
632 | add edi, [strings] |
626 | @@: |
633 | @@: |
627 | push edi |
634 | push edi |
628 | stdcall get_proc_ex, edi,[imports] |
635 | stdcall get_proc_ex, edi,[imports] |
629 | pop edi |
636 | pop edi |
630 | 637 | ||
631 | xor ebx, ebx |
638 | xor ebx, ebx |
632 | test eax, eax |
639 | test eax, eax |
633 | jnz @F |
640 | jnz @F |
634 | 641 | ||
635 | mov esi, msg_unresolved |
642 | mov esi, msg_unresolved |
636 | call sys_msg_board_str |
643 | call sys_msg_board_str |
637 | mov esi, edi |
644 | mov esi, edi |
638 | call sys_msg_board_str |
645 | call sys_msg_board_str |
639 | mov esi, msg_CR |
646 | mov esi, msg_CR |
640 | call sys_msg_board_str |
647 | call sys_msg_board_str |
641 | 648 | ||
642 | mov [retval],0 |
649 | mov [retval],0 |
643 | @@: |
650 | @@: |
644 | mov edi, [symbols] |
651 | mov edi, [symbols] |
645 | mov [edi+CSYM.Value], eax |
652 | mov [edi+CSYM.Value], eax |
646 | jmp .next |
653 | jmp .next |
647 | .internal: |
654 | .internal: |
648 | cmp bx, -1 |
655 | cmp bx, -1 |
649 | je .next |
656 | je .next |
650 | cmp bx, -2 |
657 | cmp bx, -2 |
651 | je .next |
658 | je .next |
652 | 659 | ||
653 | dec ebx |
660 | dec ebx |
654 | shl ebx, 3 |
661 | shl ebx, 3 |
655 | lea ebx, [ebx+ebx*4] |
662 | lea ebx, [ebx+ebx*4] |
656 | add ebx, [sec] |
663 | add ebx, [sec] |
657 | 664 | ||
658 | mov eax, [ebx+CFS.VirtualAddress] |
665 | mov eax, [ebx+CFS.VirtualAddress] |
659 | add [edi+CSYM.Value], eax |
666 | add [edi+CSYM.Value], eax |
660 | .next: |
667 | .next: |
661 | add edi, CSYM_SIZE |
668 | add edi, CSYM_SIZE |
662 | mov [symbols], edi |
669 | mov [symbols], edi |
663 | dec [sym_count] |
670 | dec [sym_count] |
664 | jnz .fix |
671 | jnz .fix |
665 | mov eax, [retval] |
672 | mov eax, [retval] |
666 | ret |
673 | ret |
667 | endp |
674 | endp |
668 | 675 | ||
669 | align 4 |
676 | align 4 |
670 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
677 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
671 | locals |
678 | locals |
672 | n_sec dd ? |
679 | n_sec dd ? |
673 | endl |
680 | endl |
674 | 681 | ||
675 | mov eax, [coff] |
682 | mov eax, [coff] |
676 | movzx ebx, [eax+CFH.nSections] |
683 | movzx ebx, [eax+CFH.nSections] |
677 | mov [n_sec], ebx |
684 | mov [n_sec], ebx |
678 | .fix_sec: |
685 | .fix_sec: |
679 | mov esi, [sec] |
686 | mov esi, [sec] |
680 | mov edi, [esi+CFS.PtrReloc] |
687 | mov edi, [esi+CFS.PtrReloc] |
681 | add edi, [coff] |
688 | add edi, [coff] |
682 | 689 | ||
683 | movzx ecx, [esi+CFS.NumReloc] |
690 | movzx ecx, [esi+CFS.NumReloc] |
684 | test ecx, ecx |
691 | test ecx, ecx |
685 | jz .next |
692 | jz .next |
686 | .next_reloc: |
693 | .next_reloc: |
687 | mov ebx, [edi+CRELOC.SymIndex] |
694 | mov ebx, [edi+CRELOC.SymIndex] |
688 | add ebx,ebx |
695 | add ebx,ebx |
689 | lea ebx,[ebx+ebx*8] |
696 | lea ebx,[ebx+ebx*8] |
690 | add ebx, [sym] |
697 | add ebx, [sym] |
691 | 698 | ||
692 | mov edx, [ebx+CSYM.Value] |
699 | mov edx, [ebx+CSYM.Value] |
693 | 700 | ||
694 | cmp [edi+CRELOC.Type], 6 |
701 | cmp [edi+CRELOC.Type], 6 |
695 | je .dir_32 |
702 | je .dir_32 |
696 | 703 | ||
697 | cmp [edi+CRELOC.Type], 20 |
704 | cmp [edi+CRELOC.Type], 20 |
698 | jne .next_reloc |
705 | jne .next_reloc |
699 | .rel_32: |
706 | .rel_32: |
700 | mov eax, [edi+CRELOC.VirtualAddress] |
707 | mov eax, [edi+CRELOC.VirtualAddress] |
701 | add eax, [esi+CFS.VirtualAddress] |
708 | add eax, [esi+CFS.VirtualAddress] |
702 | sub edx, eax |
709 | sub edx, eax |
703 | sub edx, 4 |
710 | sub edx, 4 |
704 | jmp .fix |
711 | jmp .fix |
705 | .dir_32: |
712 | .dir_32: |
706 | mov eax, [edi+CRELOC.VirtualAddress] |
713 | mov eax, [edi+CRELOC.VirtualAddress] |
707 | add eax, [esi+CFS.VirtualAddress] |
714 | add eax, [esi+CFS.VirtualAddress] |
708 | .fix: |
715 | .fix: |
709 | add [eax], edx |
716 | add [eax], edx |
710 | add edi, 10 |
717 | add edi, 10 |
711 | dec ecx |
718 | dec ecx |
712 | jnz .next_reloc |
719 | jnz .next_reloc |
713 | .next: |
720 | .next: |
714 | add [sec], COFF_SECTION_SIZE |
721 | add [sec], COFF_SECTION_SIZE |
715 | dec [n_sec] |
722 | dec [n_sec] |
716 | jnz .fix_sec |
723 | jnz .fix_sec |
717 | .exit: |
724 | .exit: |
718 | ret |
725 | ret |
719 | endp |
726 | endp |
720 | 727 | ||
721 | align 4 |
728 | align 4 |
722 | proc load_driver stdcall, driver_name:dword |
729 | proc load_driver stdcall, driver_name:dword |
723 | locals |
730 | locals |
724 | coff dd ? |
731 | coff dd ? |
725 | sym dd ? |
732 | sym dd ? |
726 | strings dd ? |
733 | strings dd ? |
727 | img_size dd ? |
734 | img_size dd ? |
728 | img_base dd ? |
735 | img_base dd ? |
729 | start dd ? |
736 | start dd ? |
730 | 737 | ||
731 | exports dd ? ;fake exports table |
738 | exports dd ? ;fake exports table |
732 | dd ? |
739 | dd ? |
733 | file_name rb 13+16+4+1 ; '/sys/drivers/ |
740 | file_name rb 13+16+4+1 ; '/sys/drivers/ |
734 | endl |
741 | endl |
735 | 742 | ||
736 | lea edx, [file_name] |
743 | lea edx, [file_name] |
737 | mov dword [edx], '/sys' |
744 | mov dword [edx], '/sys' |
738 | mov dword [edx+4], '/dri' |
745 | mov dword [edx+4], '/dri' |
739 | mov dword [edx+8], 'vers' |
746 | mov dword [edx+8], 'vers' |
740 | mov byte [edx+12], '/' |
747 | mov byte [edx+12], '/' |
741 | mov esi, [driver_name] |
748 | mov esi, [driver_name] |
742 | lea edi, [edx+13] |
749 | lea edi, [edx+13] |
743 | mov ecx, 16 |
750 | mov ecx, 16 |
744 | @@: |
751 | @@: |
745 | lodsb |
752 | lodsb |
746 | test al, al |
753 | test al, al |
747 | jz @f |
754 | jz @f |
748 | stosb |
755 | stosb |
749 | loop @b |
756 | loop @b |
750 | @@: |
757 | @@: |
751 | mov dword [edi], '.obj' |
758 | mov dword [edi], '.obj' |
752 | mov byte [edi+4], 0 |
759 | mov byte [edi+4], 0 |
753 | stdcall load_file, edx |
760 | stdcall load_file, edx |
754 | 761 | ||
755 | test eax, eax |
762 | test eax, eax |
756 | jz .exit |
763 | jz .exit |
757 | 764 | ||
758 | mov [coff], eax |
765 | mov [coff], eax |
759 | 766 | ||
760 | movzx ecx, [eax+CFH.nSections] |
767 | movzx ecx, [eax+CFH.nSections] |
761 | xor ebx, ebx |
768 | xor ebx, ebx |
762 | 769 | ||
763 | lea edx, [eax+20] |
770 | lea edx, [eax+20] |
764 | @@: |
771 | @@: |
765 | add ebx, [edx+CFS.SizeOfRawData] |
772 | add ebx, [edx+CFS.SizeOfRawData] |
766 | add ebx, 15 |
773 | add ebx, 15 |
767 | and ebx, not 15 |
774 | and ebx, not 15 |
768 | add edx, COFF_SECTION_SIZE |
775 | add edx, COFF_SECTION_SIZE |
769 | dec ecx |
776 | dec ecx |
770 | jnz @B |
777 | jnz @B |
771 | mov [img_size], ebx |
778 | mov [img_size], ebx |
772 | 779 | ||
773 | stdcall kernel_alloc, ebx |
780 | stdcall kernel_alloc, ebx |
774 | test eax, eax |
781 | test eax, eax |
775 | jz .fail |
782 | jz .fail |
776 | mov [img_base], eax |
783 | mov [img_base], eax |
777 | 784 | ||
778 | mov edi, eax |
785 | mov edi, eax |
779 | xor eax, eax |
786 | xor eax, eax |
780 | mov ecx, [img_size] |
787 | mov ecx, [img_size] |
781 | add ecx, 4095 |
788 | add ecx, 4095 |
782 | and ecx, not 4095 |
789 | and ecx, not 4095 |
783 | shr ecx, 2 |
790 | shr ecx, 2 |
784 | cld |
791 | cld |
785 | rep stosd |
792 | rep stosd |
786 | 793 | ||
787 | mov edx, [coff] |
794 | mov edx, [coff] |
788 | movzx ebx, [edx+CFH.nSections] |
795 | movzx ebx, [edx+CFH.nSections] |
789 | mov edi, [img_base] |
796 | mov edi, [img_base] |
790 | lea eax, [edx+20] |
797 | lea eax, [edx+20] |
791 | @@: |
798 | @@: |
792 | mov [eax+CFS.VirtualAddress], edi |
799 | mov [eax+CFS.VirtualAddress], edi |
793 | mov esi, [eax+CFS.PtrRawData] |
800 | mov esi, [eax+CFS.PtrRawData] |
794 | test esi, esi |
801 | test esi, esi |
795 | jnz .copy |
802 | jnz .copy |
796 | add edi, [eax+CFS.SizeOfRawData] |
803 | add edi, [eax+CFS.SizeOfRawData] |
797 | jmp .next |
804 | jmp .next |
798 | .copy: |
805 | .copy: |
799 | add esi, edx |
806 | add esi, edx |
800 | mov ecx, [eax+CFS.SizeOfRawData] |
807 | mov ecx, [eax+CFS.SizeOfRawData] |
801 | cld |
808 | cld |
802 | rep movsb |
809 | rep movsb |
803 | .next: |
810 | .next: |
804 | add edi, 15 |
811 | add edi, 15 |
805 | and edi, not 15 |
812 | and edi, not 15 |
806 | add eax, COFF_SECTION_SIZE |
813 | add eax, COFF_SECTION_SIZE |
807 | dec ebx |
814 | dec ebx |
808 | jnz @B |
815 | jnz @B |
809 | 816 | ||
810 | mov ebx, [edx+CFH.pSymTable] |
817 | mov ebx, [edx+CFH.pSymTable] |
811 | add ebx, edx |
818 | add ebx, edx |
812 | mov [sym], ebx |
819 | mov [sym], ebx |
813 | mov ecx, [edx+CFH.nSymbols] |
820 | mov ecx, [edx+CFH.nSymbols] |
814 | add ecx,ecx |
821 | add ecx,ecx |
815 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
822 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
816 | add ecx, [sym] |
823 | add ecx, [sym] |
817 | mov [strings], ecx |
824 | mov [strings], ecx |
818 | 825 | ||
819 | lea ebx, [exports] |
826 | lea ebx, [exports] |
820 | mov dword [ebx], kernel_export |
827 | mov dword [ebx], kernel_export |
821 | mov dword [ebx+4], 0 |
828 | mov dword [ebx+4], 0 |
822 | lea eax, [edx+20] |
829 | lea eax, [edx+20] |
823 | 830 | ||
824 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
831 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
825 | [strings], ebx |
832 | [strings], ebx |
826 | test eax, eax |
833 | test eax, eax |
827 | jz .link_fail |
834 | jz .link_fail |
828 | 835 | ||
829 | mov ebx, [coff] |
836 | mov ebx, [coff] |
830 | add ebx, 20 |
837 | add ebx, 20 |
831 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
838 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
832 | 839 | ||
833 | mov ebx, [coff] |
840 | mov ebx, [coff] |
834 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion |
841 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion |
835 | test eax, eax |
842 | test eax, eax |
836 | jz .link_fail |
843 | jz .link_fail |
837 | 844 | ||
838 | mov eax, [eax] |
845 | mov eax, [eax] |
839 | shr eax, 16 |
846 | shr eax, 16 |
840 | cmp eax, DRV_COMPAT |
847 | cmp eax, DRV_COMPAT |
841 | jb .ver_fail |
848 | jb .ver_fail |
842 | 849 | ||
843 | cmp eax, DRV_CURRENT |
850 | cmp eax, DRV_CURRENT |
844 | ja .ver_fail |
851 | ja .ver_fail |
845 | 852 | ||
846 | mov ebx, [coff] |
853 | mov ebx, [coff] |
847 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
854 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
848 | mov [start], eax |
855 | mov [start], eax |
849 | 856 | ||
850 | stdcall kernel_free, [coff] |
857 | stdcall kernel_free, [coff] |
851 | 858 | ||
852 | mov ebx, [start] |
859 | mov ebx, [start] |
853 | stdcall ebx, DRV_ENTRY |
860 | stdcall ebx, DRV_ENTRY |
854 | test eax, eax |
861 | test eax, eax |
855 | jnz .ok |
862 | jnz .ok |
856 | 863 | ||
857 | stdcall kernel_free, [img_base] |
864 | stdcall kernel_free, [img_base] |
858 | xor eax, eax |
865 | xor eax, eax |
859 | ret |
866 | ret |
860 | .ok: |
867 | .ok: |
861 | mov ebx, [img_base] |
868 | mov ebx, [img_base] |
862 | mov [eax+SRV.base], ebx |
869 | mov [eax+SRV.base], ebx |
863 | mov ecx, [start] |
870 | mov ecx, [start] |
864 | mov [eax+SRV.entry], ecx |
871 | mov [eax+SRV.entry], ecx |
865 | ret |
872 | ret |
866 | 873 | ||
867 | .ver_fail: |
874 | .ver_fail: |
868 | mov esi, msg_CR |
875 | mov esi, msg_CR |
869 | call sys_msg_board_str |
876 | call sys_msg_board_str |
870 | mov esi, [driver_name] |
877 | mov esi, [driver_name] |
871 | call sys_msg_board_str |
878 | call sys_msg_board_str |
872 | mov esi, msg_CR |
879 | mov esi, msg_CR |
873 | call sys_msg_board_str |
880 | call sys_msg_board_str |
874 | mov esi, msg_version |
881 | mov esi, msg_version |
875 | call sys_msg_board_str |
882 | call sys_msg_board_str |
876 | mov esi, msg_www |
883 | mov esi, msg_www |
877 | call sys_msg_board_str |
884 | call sys_msg_board_str |
878 | jmp .cleanup |
885 | jmp .cleanup |
879 | 886 | ||
880 | .link_fail: |
887 | .link_fail: |
881 | mov esi, msg_module |
888 | mov esi, msg_module |
882 | call sys_msg_board_str |
889 | call sys_msg_board_str |
883 | mov esi, [driver_name] |
890 | mov esi, [driver_name] |
884 | call sys_msg_board_str |
891 | call sys_msg_board_str |
885 | mov esi, msg_CR |
892 | mov esi, msg_CR |
886 | call sys_msg_board_str |
893 | call sys_msg_board_str |
887 | .cleanup: |
894 | .cleanup: |
888 | stdcall kernel_free,[img_base] |
895 | stdcall kernel_free,[img_base] |
889 | .fail: |
896 | .fail: |
890 | stdcall kernel_free, [coff] |
897 | stdcall kernel_free, [coff] |
891 | .exit: |
898 | .exit: |
892 | xor eax, eax |
899 | xor eax, eax |
893 | ret |
900 | ret |
894 | endp |
901 | endp |
895 | 902 | ||
896 | align 4 |
903 | align 4 |
897 | proc load_library stdcall, file_name:dword |
904 | proc load_library stdcall, file_name:dword |
898 | locals |
905 | locals |
899 | coff dd ? |
906 | coff dd ? |
900 | sym dd ? |
907 | sym dd ? |
901 | strings dd ? |
908 | strings dd ? |
902 | img_size dd ? |
909 | img_size dd ? |
903 | img_base dd ? |
910 | img_base dd ? |
904 | exports dd ? |
911 | exports dd ? |
905 | endl |
912 | endl |
906 | 913 | ||
907 | cli |
914 | cli |
908 | 915 | ||
909 | stdcall load_file, [file_name] |
916 | stdcall load_file, [file_name] |
910 | test eax, eax |
917 | test eax, eax |
911 | jz .fail |
918 | jz .fail |
912 | 919 | ||
913 | mov [coff], eax |
920 | mov [coff], eax |
914 | movzx ecx, [eax+CFH.nSections] |
921 | movzx ecx, [eax+CFH.nSections] |
915 | xor ebx, ebx |
922 | xor ebx, ebx |
916 | 923 | ||
917 | lea edx, [eax+20] |
924 | lea edx, [eax+20] |
918 | @@: |
925 | @@: |
919 | add ebx, [edx+CFS.SizeOfRawData] |
926 | add ebx, [edx+CFS.SizeOfRawData] |
920 | add ebx, 15 |
927 | add ebx, 15 |
921 | and ebx, not 15 |
928 | and ebx, not 15 |
922 | add edx, COFF_SECTION_SIZE |
929 | add edx, COFF_SECTION_SIZE |
923 | dec ecx |
930 | dec ecx |
924 | jnz @B |
931 | jnz @B |
925 | mov [img_size], ebx |
932 | mov [img_size], ebx |
926 | 933 | ||
927 | call init_heap |
934 | call init_heap |
928 | stdcall user_alloc, [img_size] |
935 | stdcall user_alloc, [img_size] |
929 | 936 | ||
930 | test eax, eax |
937 | test eax, eax |
931 | jz .fail |
938 | jz .fail |
932 | mov [img_base], eax |
939 | mov [img_base], eax |
933 | 940 | ||
934 | mov edx, [coff] |
941 | mov edx, [coff] |
935 | movzx ebx, [edx+CFH.nSections] |
942 | movzx ebx, [edx+CFH.nSections] |
936 | mov edi, [img_base] |
943 | mov edi, [img_base] |
937 | lea eax, [edx+20] |
944 | lea eax, [edx+20] |
938 | @@: |
945 | @@: |
939 | mov [eax+CFS.VirtualAddress], edi |
946 | mov [eax+CFS.VirtualAddress], edi |
940 | mov esi, [eax+CFS.PtrRawData] |
947 | mov esi, [eax+CFS.PtrRawData] |
941 | test esi, esi |
948 | test esi, esi |
942 | jnz .copy |
949 | jnz .copy |
943 | add edi, [eax+CFS.SizeOfRawData] |
950 | add edi, [eax+CFS.SizeOfRawData] |
944 | jmp .next |
951 | jmp .next |
945 | .copy: |
952 | .copy: |
946 | add esi, edx |
953 | add esi, edx |
947 | ; add edi, new_app_base |
954 | ; add edi, new_app_base |
948 | mov ecx, [eax+CFS.SizeOfRawData] |
955 | mov ecx, [eax+CFS.SizeOfRawData] |
949 | cld |
956 | cld |
950 | rep movsb |
957 | rep movsb |
951 | .next: |
958 | .next: |
952 | add edi, 15 ;-new_app_base |
959 | add edi, 15 ;-new_app_base |
953 | and edi, -16 |
960 | and edi, -16 |
954 | add eax, COFF_SECTION_SIZE |
961 | add eax, COFF_SECTION_SIZE |
955 | dec ebx |
962 | dec ebx |
956 | jnz @B |
963 | jnz @B |
957 | 964 | ||
958 | mov ebx, [edx+CFH.pSymTable] |
965 | mov ebx, [edx+CFH.pSymTable] |
959 | add ebx, edx |
966 | add ebx, edx |
960 | mov [sym], ebx |
967 | mov [sym], ebx |
961 | mov ecx, [edx+CFH.nSymbols] |
968 | mov ecx, [edx+CFH.nSymbols] |
962 | add ecx,ecx |
969 | add ecx,ecx |
963 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
970 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
964 | add ecx, [sym] |
971 | add ecx, [sym] |
965 | mov [strings], ecx |
972 | mov [strings], ecx |
966 | 973 | ||
967 | lea eax, [edx+20] |
974 | lea eax, [edx+20] |
968 | 975 | ||
969 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
976 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
970 | [strings], dword 0 |
977 | [strings], dword 0 |
971 | test eax, eax |
978 | test eax, eax |
972 | jnz @F |
979 | jnz @F |
973 | 980 | ||
974 | @@: |
981 | @@: |
975 | mov edx, [coff] |
982 | mov edx, [coff] |
976 | movzx ebx, [edx+CFH.nSections] |
983 | movzx ebx, [edx+CFH.nSections] |
977 | mov edi, new_app_base |
984 | mov edi, new_app_base |
978 | lea eax, [edx+20] |
985 | lea eax, [edx+20] |
979 | @@: |
986 | @@: |
980 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
987 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
981 | add eax, COFF_SECTION_SIZE |
988 | add eax, COFF_SECTION_SIZE |
982 | dec ebx |
989 | dec ebx |
983 | jnz @B |
990 | jnz @B |
984 | 991 | ||
985 | add edx, 20 |
992 | add edx, 20 |
986 | stdcall fix_coff_relocs, [coff], edx, [sym] |
993 | stdcall fix_coff_relocs, [coff], edx, [sym] |
987 | 994 | ||
988 | mov ebx, [coff] |
995 | mov ebx, [coff] |
989 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
996 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
990 | mov [exports], eax |
997 | mov [exports], eax |
991 | 998 | ||
992 | stdcall kernel_free, [coff] |
999 | stdcall kernel_free, [coff] |
993 | mov eax, [exports] |
1000 | mov eax, [exports] |
994 | ret |
1001 | ret |
995 | .fail: |
1002 | .fail: |
996 | xor eax, eax |
1003 | xor eax, eax |
997 | ret |
1004 | ret |
998 | endp |
1005 | endp |
999 | 1006 | ||
1000 | align 4 |
1007 | align 4 |
1001 | proc stop_all_services |
1008 | proc stop_all_services |
1002 | 1009 | ||
1003 | mov edx, [srv.fd] |
1010 | mov edx, [srv.fd] |
1004 | .next: |
1011 | .next: |
1005 | cmp edx, srv.fd-SRV_FD_OFFSET |
1012 | cmp edx, srv.fd-SRV_FD_OFFSET |
1006 | je .done |
1013 | je .done |
1007 | cmp [edx+SRV.magic], ' SRV' |
1014 | cmp [edx+SRV.magic], ' SRV' |
1008 | jne .next |
1015 | jne .next |
1009 | cmp [edx+SRV.size], SRV_SIZE |
1016 | cmp [edx+SRV.size], SRV_SIZE |
1010 | jne .next |
1017 | jne .next |
1011 | mov ebx, [edx+SRV.entry] |
1018 | mov ebx, [edx+SRV.entry] |
1012 | mov edx, [edx+SRV.fd] |
1019 | mov edx, [edx+SRV.fd] |
1013 | push edx |
1020 | push edx |
1014 | stdcall ebx, dword -1 |
1021 | stdcall ebx, dword -1 |
1015 | pop edx |
1022 | pop edx |
1016 | jmp .next |
1023 | jmp .next |
1017 | .done: |
1024 | .done: |
1018 | ret |
1025 | ret |
1019 | endp |
1026 | endp |
1020 | 1027 | ||
1021 | ; param |
1028 | ; param |
1022 | ; eax= size |
1029 | ; eax= size |
1023 | ; ebx= pid |
1030 | ; ebx= pid |
1024 | 1031 | ||
1025 | align 4 |
1032 | align 4 |
1026 | create_kernel_object: |
1033 | create_kernel_object: |
1027 | 1034 | ||
1028 | push ebx |
1035 | push ebx |
1029 | call malloc |
1036 | call malloc |
1030 | pop ebx |
1037 | pop ebx |
1031 | test eax, eax |
1038 | test eax, eax |
1032 | jz .fail |
1039 | jz .fail |
1033 | 1040 | ||
1034 | mov ecx,[current_slot] |
1041 | mov ecx,[current_slot] |
1035 | add ecx, APP_OBJ_OFFSET |
1042 | add ecx, APP_OBJ_OFFSET |
1036 | 1043 | ||
1037 | pushfd |
1044 | pushfd |
1038 | cli |
1045 | cli |
1039 | mov edx, [ecx+APPOBJ.fd] |
1046 | mov edx, [ecx+APPOBJ.fd] |
1040 | mov [eax+APPOBJ.fd], edx |
1047 | mov [eax+APPOBJ.fd], edx |
1041 | mov [eax+APPOBJ.bk], ecx |
1048 | mov [eax+APPOBJ.bk], ecx |
1042 | mov [eax+APPOBJ.pid], ebx |
1049 | mov [eax+APPOBJ.pid], ebx |
1043 | 1050 | ||
1044 | mov [ecx+APPOBJ.fd], eax |
1051 | mov [ecx+APPOBJ.fd], eax |
1045 | mov [edx+APPOBJ.bk], eax |
1052 | mov [edx+APPOBJ.bk], eax |
1046 | popfd |
1053 | popfd |
1047 | .fail: |
1054 | .fail: |
1048 | ret |
1055 | ret |
1049 | 1056 | ||
1050 | ; param |
1057 | ; param |
1051 | ; eax= object |
1058 | ; eax= object |
1052 | 1059 | ||
1053 | align 4 |
1060 | align 4 |
1054 | destroy_kernel_object: |
1061 | destroy_kernel_object: |
1055 | 1062 | ||
1056 | pushfd |
1063 | pushfd |
1057 | cli |
1064 | cli |
1058 | mov ebx, [eax+APPOBJ.fd] |
1065 | mov ebx, [eax+APPOBJ.fd] |
1059 | mov ecx, [eax+APPOBJ.bk] |
1066 | mov ecx, [eax+APPOBJ.bk] |
1060 | mov [ebx+APPOBJ.bk], ecx |
1067 | mov [ebx+APPOBJ.bk], ecx |
1061 | mov [ecx+APPOBJ.fd], ebx |
1068 | mov [ecx+APPOBJ.fd], ebx |
1062 | popfd |
1069 | popfd |
1063 | 1070 | ||
1064 | xor edx, edx ;clear common header |
1071 | xor edx, edx ;clear common header |
1065 | mov [eax], edx |
1072 | mov [eax], edx |
1066 | mov [eax+4], edx |
1073 | mov [eax+4], edx |
1067 | mov [eax+8], edx |
1074 | mov [eax+8], edx |
1068 | mov [eax+12], edx |
1075 | mov [eax+12], edx |
1069 | mov [eax+16], edx |
1076 | mov [eax+16], edx |
1070 | 1077 | ||
1071 | call free ;release object memory |
1078 | call free ;release object memory |
1072 | ret |
1079 | ret |
1073 | 1080 | ||
1074 | 1081 | ||
1075 | 1082 | ||
1076 | if 0 |
1083 | if 0 |
1077 | 1084 | ||
1078 | irq: |
1085 | irq: |
1079 | 1086 | ||
1080 | .irq0: |
1087 | .irq0: |
1081 | pusfd |
1088 | pusfd |
1082 | pushad |
1089 | pushad |
1083 | push IRQ_0 |
1090 | push IRQ_0 |
1084 | jmp .master |
1091 | jmp .master |
1085 | .irq_1: |
1092 | .irq_1: |
1086 | pusfd |
1093 | pusfd |
1087 | pushad |
1094 | pushad |
1088 | push IRQ_1 |
1095 | push IRQ_1 |
1089 | jmp .master |
1096 | jmp .master |
1090 | 1097 | ||
1091 | .master: |
1098 | .master: |
1092 | mov ax, app_data |
1099 | mov ax, app_data |
1093 | mov ds, eax |
1100 | mov ds, eax |
1094 | mov es, eax |
1101 | mov es, eax |
1095 | mov ebx, [esp+4] ;IRQ_xx |
1102 | mov ebx, [esp+4] ;IRQ_xx |
1096 | mov eax, [irq_handlers+ebx+4] |
1103 | mov eax, [irq_handlers+ebx+4] |
1097 | call intr_handler |
1104 | call intr_handler |
1098 | mov ecx, [esp+4] |
1105 | mov ecx, [esp+4] |
1099 | cmp [irq_actids+ecx*4], 0 |
1106 | cmp [irq_actids+ecx*4], 0 |
1100 | je @F |
1107 | je @F |
1101 | in al, 0x21 |
1108 | in al, 0x21 |
1102 | bts eax, ecx |
1109 | bts eax, ecx |
1103 | out 0x21, al |
1110 | out 0x21, al |
1104 | mov al, 0x20 |
1111 | mov al, 0x20 |
1105 | out 0x20, al |
1112 | out 0x20, al |
1106 | jmp .restart |
1113 | jmp .restart |
1107 | 1114 | ||
1108 | .slave: |
1115 | .slave: |
1109 | mov ax, app_data |
1116 | mov ax, app_data |
1110 | mov ds, eax |
1117 | mov ds, eax |
1111 | mov es, eax |
1118 | mov es, eax |
1112 | mov ebx, [esp+4] ;IRQ_xx |
1119 | mov ebx, [esp+4] ;IRQ_xx |
1113 | mov eax, [irq_handlers+ebx+4] |
1120 | mov eax, [irq_handlers+ebx+4] |
1114 | call intr_handler |
1121 | call intr_handler |
1115 | mov ecx, [esp+4] |
1122 | mov ecx, [esp+4] |
1116 | sub ecx, 8 |
1123 | sub ecx, 8 |
1117 | cmp [irq_actids+ecx*4], 0 |
1124 | cmp [irq_actids+ecx*4], 0 |
1118 | je @F |
1125 | je @F |
1119 | in al, 0xA1 |
1126 | in al, 0xA1 |
1120 | bts eax, ecx |
1127 | bts eax, ecx |
1121 | out 0xA1, al |
1128 | out 0xA1, al |
1122 | mov al, 0x20 |
1129 | mov al, 0x20 |
1123 | out 0xA0, al |
1130 | out 0xA0, al |
1124 | out 0x20, al |
1131 | out 0x20, al |
1125 | .restart: |
1132 | .restart: |
1126 | mov ebx, [next_slot] |
1133 | mov ebx, [next_slot] |
1127 | test ebx, ebx |
1134 | test ebx, ebx |
1128 | jz @F |
1135 | jz @F |
1129 | mov [next_task],0 |
1136 | mov [next_task],0 |
1130 | mov esi, [prev_slot] |
1137 | mov esi, [prev_slot] |
1131 | call do_change_task |
1138 | call do_change_task |
1132 | add esp, 4 |
1139 | add esp, 4 |
1133 | iretd |
1140 | iretd |
1134 | 1141 | ||
1135 | end if |
1142 | end if |