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