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