Subversion Repositories Kolibri OS

Rev

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

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