Subversion Repositories Kolibri OS

Rev

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

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