Subversion Repositories Kolibri OS

Rev

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

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