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