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