Subversion Repositories Kolibri OS

Rev

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

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