Subversion Repositories Kolibri OS

Rev

Rev 444 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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