Subversion Repositories Kolibri OS

Rev

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

Rev 202 Rev 206
1
;
1
;
2
;   This file is part of the Infinity sound AC97 driver.
2
;   This file is part of the Infinity sound AC97 driver.
3
;   (C) copyright Serge 2006
3
;   (C) copyright Serge 2006
4
;   email: infinity_sound@mail.ru
4
;   email: infinity_sound@mail.ru
5
;
5
;
6
;   This program is free software; you can redistribute it and/or modify
6
;   This program is free software; you can redistribute it and/or modify
7
;   it under the terms of the GNU General Public License as published by
7
;   it under the terms of the GNU General Public License as published by
8
;   the Free Software Foundation; either version 2 of the License, or
8
;   the Free Software Foundation; either version 2 of the License, or
9
;   (at your option) any later version.
9
;   (at your option) any later version.
10
;
10
;
11
;   This program is distributed in the hope that it will be useful,
11
;   This program is distributed in the hope that it will be useful,
12
;   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
;   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
;   GNU General Public License for more details.
14
;   GNU General Public License for more details.
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, os_data
137
	   mov	 bx, 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
 
146
 
147
.exit:
147
.exit:
148
	   restore_ring3_context
148
	   restore_ring3_context
149
 
149
 
150
           cmp eax, 8
150
           cmp eax, 8
151
	   mov al, 0x20
151
	   mov al, 0x20
152
           jb @f
152
           jb @f
153
	   out 0xa0, al
153
	   out 0xa0, al
154
@@:
154
@@:
155
           out 0x20, al
155
           out 0x20, al
156
 
156
 
157
           pop eax
157
           pop eax
158
	   iret
158
	   iret
159
 
159
 
160
align 4
160
align 4
161
proc get_notify stdcall, p_ev:dword
161
proc get_notify stdcall, p_ev:dword
162
 
162
 
163
.wait:
163
.wait:
164
           mov ebx,[CURRENT_TASK]
164
           mov ebx,[CURRENT_TASK]
165
           shl ebx,8
165
           shl ebx,8
166
           test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
166
           test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
167
	   jz @f
167
	   jz @f
168
           and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
168
           and dword [ebx+PROC_BASE+0xA8], 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+PROC_BASE+APPDATA.event]
171
           mov eax, [ebx+PROC_BASE+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_read8 stdcall, bus:dword, devfn:dword, reg:dword
192
proc pci_read8 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, 4
196
           mov al, 4
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_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
204
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val: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, 8
208
           mov al, 8
209
	   mov bh, byte [devfn]
209
	   mov bh, byte [devfn]
210
	   mov bl, byte [reg]
210
	   mov bl, byte [reg]
211
           mov ecx, [val]
211
           mov ecx, [val]
212
           call pci_write_reg
212
           call pci_write_reg
213
	   ret
213
	   ret
214
endp
214
endp
215
 
215
 
216
handle     equ  IOCTL.handle
216
handle     equ  IOCTL.handle
217
io_code    equ  IOCTL.io_code
217
io_code    equ  IOCTL.io_code
218
input      equ  IOCTL.input
218
input      equ  IOCTL.input
219
inp_size   equ  IOCTL.inp_size
219
inp_size   equ  IOCTL.inp_size
220
output     equ  IOCTL.output
220
output     equ  IOCTL.output
221
out_size   equ  IOCTL.out_size
221
out_size   equ  IOCTL.out_size
222
 
222
 
223
 
223
 
224
align 4
224
align 4
225
proc srv_handler stdcall, ioctl:dword
225
proc srv_handler stdcall, ioctl:dword
226
           mov esi, [ioctl]
226
           mov esi, [ioctl]
227
           test esi, esi
227
           test esi, esi
228
           jz .err
228
           jz .err
229
 
229
 
230
           mov edi, [esi+handle]
230
           mov edi, [esi+handle]
231
           cmp [edi+SRV.magic], ' SRV'
231
           cmp [edi+SRV.magic], ' SRV'
232
	   jne .fail
232
	   jne .fail
233
 
233
 
234
           cmp [edi+SRV.size], SRV_SIZE
234
           cmp [edi+SRV.size], SRV_SIZE
235
	   jne .fail
235
	   jne .fail
236
 
236
 
237
           stdcall [edi+SRV.srv_proc], esi
237
           stdcall [edi+SRV.srv_proc], esi
238
           ret
238
           ret
239
.fail:
239
.fail:
240
           xor eax, eax
240
           xor eax, eax
241
           not eax
241
           not eax
242
           mov [esi+output], eax
242
           mov [esi+output], eax
243
           mov [esi+out_size], 4
243
           mov [esi+out_size], 4
244
           ret
244
           ret
245
.err:
245
.err:
246
           xor eax, eax
246
           xor eax, eax
247
           not eax
247
           not eax
248
           ret
248
           ret
249
endp
249
endp
250
 
250
 
251
align 4
251
align 4
252
proc srv_handlerEx stdcall, ioctl:dword
252
proc srv_handlerEx stdcall, ioctl:dword
253
           mov esi, [ioctl]
253
           mov esi, [ioctl]
254
           test esi, esi
254
           test esi, esi
255
           jz .err
255
           jz .err
256
           add esi, new_app_base
256
           add esi, new_app_base
257
 
257
 
258
           mov edi, [esi+handle]
258
           mov edi, [esi+handle]
259
           cmp [edi+SRV.magic], ' SRV'
259
           cmp [edi+SRV.magic], ' SRV'
260
	   jne .fail
260
	   jne .fail
261
 
261
 
262
           cmp [edi+SRV.size], SRV_SIZE
262
           cmp [edi+SRV.size], SRV_SIZE
263
	   jne .fail
263
	   jne .fail
264
 
264
 
265
           add [esi+input], new_app_base
265
           add [esi+input], new_app_base
266
           add [esi+output], new_app_base
266
           add [esi+output], new_app_base
267
 
267
 
268
           stdcall [edi+SRV.srv_proc], esi
268
           stdcall [edi+SRV.srv_proc], esi
269
           ret
269
           ret
270
.fail:
270
.fail:
271
           xor eax, eax
271
           xor eax, eax
272
           not eax
272
           not eax
273
           mov [esi+output], eax
273
           mov [esi+output], eax
274
           mov [esi+out_size], 4
274
           mov [esi+out_size], 4
275
           ret
275
           ret
276
.err:
276
.err:
277
           xor eax, eax
277
           xor eax, eax
278
           not eax
278
           not eax
279
           ret
279
           ret
280
endp
280
endp
281
 
281
 
282
restore  handle
282
restore  handle
283
restore  io_code
283
restore  io_code
284
restore  input
284
restore  input
285
restore  inp_size
285
restore  inp_size
286
restore  output
286
restore  output
287
restore  out_size
287
restore  out_size
288
 
288
 
289
align 4
289
align 4
290
proc get_service stdcall, sz_name:dword
290
proc get_service stdcall, sz_name:dword
291
	   locals
291
	   locals
292
	     srv_ptr  dd ?
292
	     srv_ptr  dd ?
293
	     counter  dd ?
293
	     counter  dd ?
294
           endl
294
           endl
295
 
295
 
296
           mov eax, [sz_name]
296
           mov eax, [sz_name]
297
           test eax, eax
297
           test eax, eax
298
           jnz @F
298
           jnz @F
299
           ret
299
           ret
300
@@:
300
@@:
301
           mov [srv_ptr], srv_tab
301
           mov [srv_ptr], srv_tab
302
           mov [counter], 16
302
           mov [counter], 16
303
@@:
303
@@:
304
           stdcall strncmp, [srv_ptr], [sz_name], 16
304
           stdcall strncmp, [srv_ptr], [sz_name], 16
305
           test eax, eax
305
           test eax, eax
306
           je .ok
306
           je .ok
307
 
307
 
308
           add [srv_ptr], SRV_SIZE
308
           add [srv_ptr], SRV_SIZE
309
           dec [counter]
309
           dec [counter]
310
           jnz @B
310
           jnz @B
311
.not_load:
311
.not_load:
312
           stdcall find_service, [sz_name]
312
           stdcall find_service, [sz_name]
313
           test eax, eax
313
           test eax, eax
314
           jnz @F
314
           jnz @F
315
           ret
315
           ret
316
@@:
316
@@:
317
           stdcall load_driver, eax
317
           stdcall load_driver, eax
318
           ret
318
           ret
319
.ok:
319
.ok:
320
           mov eax, [srv_ptr]
320
           mov eax, [srv_ptr]
321
           ret
321
           ret
322
endp
322
endp
323
 
323
 
324
align 4
324
align 4
325
proc find_service stdcall ,sz_name:dword
325
proc find_service stdcall ,sz_name:dword
326
 
326
 
327
	   mov eax, [sz_name]
327
	   mov eax, [sz_name]
328
	   test eax, eax
328
	   test eax, eax
329
	   jz .fail
329
	   jz .fail
330
 
330
 
331
           mov esi, services
331
           mov esi, services
332
@@:
332
@@:
333
           mov eax, [esi]
333
           mov eax, [esi]
334
           test eax, eax
334
           test eax, eax
335
           jz .fail
335
           jz .fail
336
           push esi
336
           push esi
337
           stdcall strncmp, eax, [sz_name], 16
337
           stdcall strncmp, eax, [sz_name], 16
338
           pop esi
338
           pop esi
339
           test eax, eax
339
           test eax, eax
340
           je .ok
340
           je .ok
341
 
341
 
342
           add esi, 8
342
           add esi, 8
343
           jmp @B
343
           jmp @B
344
.ok:
344
.ok:
345
           mov eax, [esi+4]
345
           mov eax, [esi+4]
346
           ret
346
           ret
347
.fail:
347
.fail:
348
           xor eax, eax
348
           xor eax, eax
349
           ret
349
           ret
350
endp
350
endp
351
 
351
 
352
align 4
352
align 4
353
proc reg_service stdcall, sz_name:dword, handler:dword
353
proc reg_service stdcall, sz_name:dword, handler:dword
354
	   locals
354
	   locals
355
	     srv dd ?
355
	     srv dd ?
356
	   endl
356
	   endl
357
 
357
 
358
	   mov eax, [sz_name]
358
	   mov eax, [sz_name]
359
	   test eax, eax
359
	   test eax, eax
360
	   jz .fail
360
	   jz .fail
361
 
361
 
362
	   mov ebx, [handler]
362
	   mov ebx, [handler]
363
	   test ebx, ebx
363
	   test ebx, ebx
364
	   jz .fail
364
	   jz .fail
365
 
365
 
366
	   call alloc_service
366
	   call alloc_service
367
	   test eax, eax
367
	   test eax, eax
368
	   jz .fail
368
	   jz .fail
369
 
369
 
370
	   mov [srv], eax
370
	   mov [srv], eax
371
	   mov edi, eax
371
	   mov edi, eax
372
	   mov esi, [sz_name]
372
	   mov esi, [sz_name]
373
	   mov ecx, 16
373
	   mov ecx, 16
374
	   rep movsb
374
	   rep movsb
375
 
375
 
376
	   mov edi, eax
376
	   mov edi, eax
377
	   mov [edi+SRV.magic], ' SRV'
377
	   mov [edi+SRV.magic], ' SRV'
378
	   mov [edi+SRV.size], SRV_SIZE
378
	   mov [edi+SRV.size], SRV_SIZE
379
	   mov ebx, [handler]
379
	   mov ebx, [handler]
380
	   mov [edi+SRV.srv_proc], ebx
380
	   mov [edi+SRV.srv_proc], ebx
381
           mov eax, [srv]
381
           mov eax, [srv]
382
	   ret
382
	   ret
383
.fail:
383
.fail:
384
	   xor eax, eax
384
	   xor eax, eax
385
	   ret
385
	   ret
386
endp
386
endp
387
 
387
 
388
align 4
388
align 4
389
proc get_proc stdcall, exp:dword, sz_name:dword
389
proc get_proc stdcall, exp:dword, sz_name:dword
390
 
390
 
391
           mov edx, [exp]
391
           mov edx, [exp]
392
.next:
392
.next:
393
           mov eax, [edx]
393
           mov eax, [edx]
394
           test eax, eax
394
           test eax, eax
395
           jz .end
395
           jz .end
396
 
396
 
397
           push edx
397
           push edx
398
           stdcall strncmp, eax, [sz_name], 16
398
           stdcall strncmp, eax, [sz_name], 16
399
           pop edx
399
           pop edx
400
           test eax, eax
400
           test eax, eax
401
           jz .ok
401
           jz .ok
402
 
402
 
403
           add edx,8
403
           add edx,8
404
           jmp .next
404
           jmp .next
405
.ok:
405
.ok:
406
           mov eax, [edx+4]
406
           mov eax, [edx+4]
407
.end:
407
.end:
408
           ret
408
           ret
409
endp
409
endp
410
 
410
 
411
align 4
411
align 4
412
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
412
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
413
 
413
 
414
@@:
414
@@:
415
	   stdcall strncmp, [pSym], [sz_sym], 8
415
	   stdcall strncmp, [pSym], [sz_sym], 8
416
	   test eax,eax
416
	   test eax,eax
417
	   jz .ok
417
	   jz .ok
418
	   add [pSym], 18
418
	   add [pSym], 18
419
	   dec [count]
419
	   dec [count]
420
	   jnz @b
420
	   jnz @b
421
	   xor eax, eax
421
	   xor eax, eax
422
	   ret
422
	   ret
423
.ok:
423
.ok:
424
	   mov ebx, [pSym]
424
	   mov ebx, [pSym]
425
	   mov eax, [ebx+8]
425
	   mov eax, [ebx+8]
426
	   ret
426
	   ret
427
endp
427
endp
428
 
428
 
429
align 4
429
align 4
430
proc get_curr_task
430
proc get_curr_task
431
           mov eax,[CURRENT_TASK]
431
           mov eax,[CURRENT_TASK]
432
           shl eax, 8
432
           shl eax, 8
433
           ret
433
           ret
434
endp
434
endp
435
 
435
 
436
align 4
436
align 4
437
proc get_fileinfo stdcall, file_name:dword, info:dword
437
proc get_fileinfo stdcall, file_name:dword, info:dword
438
           locals
438
           locals
439
             cmd     dd ?
439
             cmd     dd ?
440
             offset  dd ?
440
             offset  dd ?
441
                     dd ?
441
                     dd ?
442
             count   dd ?
442
             count   dd ?
443
             buff    dd ?
443
             buff    dd ?
444
                     db ?
444
                     db ?
445
             name    dd ?
445
             name    dd ?
446
           endl
446
           endl
447
 
447
 
448
           xor eax, eax
448
           xor eax, eax
449
           mov ebx, [file_name]
449
           mov ebx, [file_name]
450
           sub ebx, new_app_base
450
           sub ebx, new_app_base
451
           mov ecx, [info]
451
           mov ecx, [info]
452
           sub ecx, new_app_base
452
           sub ecx, new_app_base
453
 
453
 
454
           mov [cmd], 5
454
           mov [cmd], 5
455
           mov [offset], eax
455
           mov [offset], eax
456
           mov [offset+4], eax
456
           mov [offset+4], eax
457
           mov [count], eax
457
           mov [count], eax
458
           mov [buff], ecx
458
           mov [buff], ecx
459
           mov byte [buff+4], al
459
           mov byte [buff+4], al
460
           mov [name], ebx
460
           mov [name], ebx
461
 
461
 
462
           mov eax, 70
462
           mov eax, 70
463
           lea ebx, [cmd]
463
           lea ebx, [cmd]
464
           sub ebx, new_app_base
464
           sub ebx, new_app_base
465
           int 0x40
465
           int 0x40
466
           ret
466
           ret
467
endp
467
endp
468
 
468
 
469
align 4
469
align 4
470
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
470
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
471
                                     bytes:dword
471
                                     bytes:dword
472
           locals
472
           locals
473
             cmd     dd ?
473
             cmd     dd ?
474
             offset  dd ?
474
             offset  dd ?
475
                     dd ?
475
                     dd ?
476
             count   dd ?
476
             count   dd ?
477
             buff    dd ?
477
             buff    dd ?
478
                     db ?
478
                     db ?
479
             name    dd ?
479
             name    dd ?
480
           endl
480
           endl
481
 
481
 
482
           xor eax, eax
482
           xor eax, eax
483
           mov ebx, [file_name]
483
           mov ebx, [file_name]
484
           mov ecx, [off]
484
           mov ecx, [off]
485
           mov edx, [bytes]
485
           mov edx, [bytes]
486
           mov esi, [buffer]
486
           mov esi, [buffer]
487
           sub ebx, new_app_base
487
           sub ebx, new_app_base
488
           sub esi, new_app_base
488
           sub esi, new_app_base
489
 
489
 
490
           mov [cmd], eax
490
           mov [cmd], eax
491
           mov [offset], ecx
491
           mov [offset], ecx
492
           mov [offset+4], eax
492
           mov [offset+4], eax
493
           mov [count], edx
493
           mov [count], edx
494
           mov [buff], esi
494
           mov [buff], esi
495
           mov byte [buff+4], al
495
           mov byte [buff+4], al
496
           mov [name], ebx
496
           mov [name], ebx
497
 
497
 
498
           mov eax, 70
498
           mov eax, 70
499
           lea ebx, [cmd]
499
           lea ebx, [cmd]
500
           sub ebx, new_app_base
500
           sub ebx, new_app_base
501
           int 0x40
501
           int 0x40
502
           ret
502
           ret
503
endp
503
endp
504
 
504
 
505
align 4
505
align 4
506
proc load_file stdcall, file_name:dword
506
proc load_file stdcall, file_name:dword
507
           locals
507
           locals
508
             attr       dd ?
508
             attr       dd ?
509
             flags      dd ?
509
             flags      dd ?
510
             cr_time    dd ?
510
             cr_time    dd ?
511
             cr_date    dd ?
511
             cr_date    dd ?
512
             acc_time   dd ?
512
             acc_time   dd ?
513
             acc_date   dd ?
513
             acc_date   dd ?
514
             mod_time   dd ?
514
             mod_time   dd ?
515
             mod_date   dd ?
515
             mod_date   dd ?
516
             file_size  dd ?
516
             file_size  dd ?
517
 
517
 
518
             file       dd ?
518
             file       dd ?
519
           endl
519
           endl
520
 
520
 
521
           lea eax, [attr]
521
           lea eax, [attr]
522
           stdcall get_fileinfo, [file_name], eax
522
           stdcall get_fileinfo, [file_name], eax
523
           test eax, eax
523
           test eax, eax
524
           jnz .fail
524
           jnz .fail
-
 
525
 
-
 
526
           mov eax, [file_size]
525
 
527
 
526
           stdcall kernel_alloc, [file_size]
528
           stdcall kernel_alloc, [file_size]
527
           mov [file], eax
529
           mov [file], eax
528
 
530
 
529
           stdcall read_file, [file_name], eax, dword 0, [file_size]
531
           stdcall read_file, [file_name], eax, dword 0, [file_size]
530
           cmp ebx, [file_size]
532
           cmp ebx, [file_size]
531
           jne .cleanup
533
           jne .cleanup
532
           mov eax, [file]
534
           mov eax, [file]
533
           ret
535
           ret
534
.cleanup:
536
.cleanup:
535
           stdcall kernel_free, [file]
537
           stdcall kernel_free, [file]
536
.fail:
538
.fail:
537
           xor eax, eax
539
           xor eax, eax
538
           ret
540
           ret
539
endp
541
endp
540
 
542
 
541
align 4
543
align 4
542
proc get_proc_ex stdcall, proc_name:dword, imports:dword
544
proc get_proc_ex stdcall, proc_name:dword, imports:dword
543
 
545
 
544
.look_up:
546
.look_up:
545
           mov edx, [imports]
547
           mov edx, [imports]
546
           test edx, edx
548
           test edx, edx
547
           jz .end
549
           jz .end
548
           mov edx, [edx]
550
           mov edx, [edx]
549
           test edx, edx
551
           test edx, edx
550
           jz .end
552
           jz .end
551
.next:
553
.next:
552
           mov eax, [edx]
554
           mov eax, [edx]
553
           test eax, eax
555
           test eax, eax
554
           jz .next_table
556
           jz .next_table
555
 
557
 
556
           push edx
558
           push edx
557
           stdcall strncmp, eax, [proc_name], 16
559
           stdcall strncmp, eax, [proc_name], 16
558
           pop edx
560
           pop edx
559
           test eax, eax
561
           test eax, eax
560
           jz .ok
562
           jz .ok
561
 
563
 
562
           add edx,8
564
           add edx,8
563
           jmp .next
565
           jmp .next
564
.next_table:
566
.next_table:
565
           add [imports], 4
567
           add [imports], 4
566
           jmp .look_up
568
           jmp .look_up
567
.ok:
569
.ok:
568
           mov eax, [edx+4]
570
           mov eax, [edx+4]
569
           ret
571
           ret
570
.end:
572
.end:
571
           xor eax, eax
573
           xor eax, eax
572
           ret
574
           ret
573
endp
575
endp
574
 
576
 
575
align 4
577
align 4
576
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
578
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
577
                      sym_count:dword, strings:dword, imports:dword
579
                      sym_count:dword, strings:dword, imports:dword
578
           locals
580
           locals
579
             retval dd ?
581
             retval dd ?
580
           endl
582
           endl
581
 
583
 
582
           mov edi, [symbols]
584
           mov edi, [symbols]
583
           mov [retval], 1
585
           mov [retval], 1
584
.fix:
586
.fix:
585
           movzx ebx, [edi+CSYM.SectionNumber]
587
           movzx ebx, [edi+CSYM.SectionNumber]
586
           test ebx, ebx
588
           test ebx, ebx
587
           jnz .internal
589
           jnz .internal
588
           mov eax, dword [edi+CSYM.Name]
590
           mov eax, dword [edi+CSYM.Name]
589
           test eax, eax
591
           test eax, eax
590
           jnz @F
592
           jnz @F
591
 
593
 
592
           mov edi, [edi+4]
594
           mov edi, [edi+4]
593
           add edi, [strings]
595
           add edi, [strings]
594
@@:
596
@@:
595
           push edi
597
           push edi
596
           stdcall get_proc_ex, edi,[imports]
598
           stdcall get_proc_ex, edi,[imports]
597
           pop edi
599
           pop edi
598
 
600
 
599
           xor ebx, ebx
601
           xor ebx, ebx
600
           test eax, eax
602
           test eax, eax
601
           jnz @F
603
           jnz @F
602
 
604
 
603
           mov esi, msg_unresolved
605
           mov esi, msg_unresolved
604
           call sys_msg_board_str
606
           call sys_msg_board_str
605
           mov esi, edi
607
           mov esi, edi
606
           call sys_msg_board_str
608
           call sys_msg_board_str
607
           mov esi, msg_CR
609
           mov esi, msg_CR
608
           call sys_msg_board_str
610
           call sys_msg_board_str
609
 
611
 
610
           mov [retval],0
612
           mov [retval],0
611
@@:
613
@@:
612
           mov edi, [symbols]
614
           mov edi, [symbols]
613
           mov [edi+CSYM.Value], eax
615
           mov [edi+CSYM.Value], eax
614
           jmp .next
616
           jmp .next
615
.internal:
617
.internal:
616
           dec ebx
618
           dec ebx
617
           shl ebx, 3
619
           shl ebx, 3
618
           lea ebx, [ebx+ebx*4]
620
           lea ebx, [ebx+ebx*4]
619
           add ebx, [sec]
621
           add ebx, [sec]
620
 
622
 
621
           mov eax, [ebx+CFS.VirtualAddress]
623
           mov eax, [ebx+CFS.VirtualAddress]
622
           add [edi+CSYM.Value], eax
624
           add [edi+CSYM.Value], eax
623
.next:
625
.next:
624
           add edi, CSYM_SIZE
626
           add edi, CSYM_SIZE
625
           mov [symbols], edi
627
           mov [symbols], edi
626
           dec [sym_count]
628
           dec [sym_count]
627
           jnz .fix
629
           jnz .fix
628
           mov eax, [retval]
630
           mov eax, [retval]
629
           ret
631
           ret
630
endp
632
endp
631
 
633
 
632
align 4
634
align 4
633
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
635
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
634
	   locals
636
	   locals
635
             n_sec     dd ?
637
             n_sec     dd ?
636
	   endl
638
	   endl
637
 
639
 
638
           mov eax, [coff]
640
           mov eax, [coff]
639
           movzx ebx, [eax+CFH.nSections]
641
           movzx ebx, [eax+CFH.nSections]
640
           mov [n_sec], ebx
642
           mov [n_sec], ebx
641
.fix_sec:
643
.fix_sec:
642
           mov esi, [sec]
644
           mov esi, [sec]
643
	   mov edi, [esi+CFS.PtrReloc]
645
	   mov edi, [esi+CFS.PtrReloc]
644
           add edi, [coff]
646
           add edi, [coff]
645
 
647
 
646
           movzx ecx, [esi+CFS.NumReloc]
648
           movzx ecx, [esi+CFS.NumReloc]
647
           test ecx, ecx
649
           test ecx, ecx
648
           jz .next
650
           jz .next
649
.next_reloc:
651
.next_reloc:
650
	   mov ebx, [edi+CRELOC.SymIndex]
652
	   mov ebx, [edi+CRELOC.SymIndex]
651
	   add ebx,ebx
653
	   add ebx,ebx
652
	   lea ebx,[ebx+ebx*8]
654
	   lea ebx,[ebx+ebx*8]
653
           add ebx, [sym]
655
           add ebx, [sym]
654
 
656
 
655
           mov edx, [ebx+CSYM.Value]
657
           mov edx, [ebx+CSYM.Value]
656
 
658
 
657
           cmp [edi+CRELOC.Type], 6
659
           cmp [edi+CRELOC.Type], 6
658
           je .dir_32
660
           je .dir_32
659
 
661
 
660
           cmp [edi+CRELOC.Type], 20
662
           cmp [edi+CRELOC.Type], 20
661
           jne .next_reloc
663
           jne .next_reloc
662
.rel_32:
664
.rel_32:
663
	   mov eax, [edi+CRELOC.VirtualAddress]
665
	   mov eax, [edi+CRELOC.VirtualAddress]
664
           add eax, [esi+CFS.VirtualAddress]
666
           add eax, [esi+CFS.VirtualAddress]
665
           sub edx, eax
667
           sub edx, eax
666
           sub edx, 4
668
           sub edx, 4
667
           jmp .fix
669
           jmp .fix
668
.dir_32:
670
.dir_32:
669
	   mov eax, [edi+CRELOC.VirtualAddress]
671
	   mov eax, [edi+CRELOC.VirtualAddress]
670
           add eax, [esi+CFS.VirtualAddress]
672
           add eax, [esi+CFS.VirtualAddress]
671
.fix:
673
.fix:
672
           add [eax], edx
674
           add [eax], edx
673
           add edi, 10
675
           add edi, 10
674
           dec ecx
676
           dec ecx
675
           jnz .next_reloc
677
           jnz .next_reloc
676
.next:
678
.next:
677
           add [sec], 40
679
           add [sec], COFF_SECTION_SIZE
678
           dec [n_sec]
680
           dec [n_sec]
679
           jnz .fix_sec
681
           jnz .fix_sec
680
.exit:
682
.exit:
681
	   ret
683
	   ret
682
endp
684
endp
683
 
685
 
684
align 4
686
align 4
685
proc load_driver stdcall, file_name:dword
687
proc load_driver stdcall, file_name:dword
686
           locals
688
           locals
687
             coff      dd ?
689
             coff      dd ?
688
             sym       dd ?
690
             sym       dd ?
689
             strings   dd ?
691
             strings   dd ?
690
             img_size  dd ?
692
             img_size  dd ?
691
             img_base  dd ?
693
             img_base  dd ?
692
             start     dd ?
694
             start     dd ?
693
 
695
 
694
             exports   dd ?   ;fake exports table
696
             exports   dd ?   ;fake exports table
695
                       dd ?
697
                       dd ?
696
           endl
698
           endl
697
 
699
 
698
           stdcall load_file, [file_name]
700
           stdcall load_file, [file_name]
699
           test eax, eax
701
           test eax, eax
700
           jz .fail
702
           jz .fail
701
 
703
 
702
           mov [coff], eax
704
           mov [coff], eax
703
 
705
 
704
           movzx ecx, [eax+CFH.nSections]
706
           movzx ecx, [eax+CFH.nSections]
705
           xor ebx, ebx
707
           xor ebx, ebx
706
 
708
 
707
           lea edx, [eax+20]
709
           lea edx, [eax+20]
708
@@:
710
@@:
709
           add ebx, [edx+CFS.SizeOfRawData]
711
           add ebx, [edx+CFS.SizeOfRawData]
710
           add ebx, 15
712
           add ebx, 15
711
           and ebx, not 15
713
           and ebx, not 15
712
           add edx, 18
714
           add edx, COFF_SECTION_SIZE
713
           dec ecx
715
           dec ecx
714
           jnz @B
716
           jnz @B
715
           mov [img_size], ebx
717
           mov [img_size], ebx
716
 
718
 
717
           stdcall kernel_alloc, ebx
719
           stdcall kernel_alloc, ebx
718
           test eax, eax
720
           test eax, eax
719
           jz .fail
721
           jz .fail
720
           mov [img_base], eax
722
           mov [img_base], eax
721
 
723
 
722
           mov edi, eax
724
           mov edi, eax
723
           xor eax, eax
725
           xor eax, eax
724
           mov ecx, [img_size]
726
           mov ecx, [img_size]
725
           add ecx, 4095
727
           add ecx, 4095
726
           and ecx, not 4095
728
           and ecx, not 4095
727
           shr ecx, 2
729
           shr ecx, 2
728
           cld
730
           cld
729
           rep stosd
731
           rep stosd
730
 
732
 
731
           mov edx, [coff]
733
           mov edx, [coff]
732
           movzx ebx, [edx+CFH.nSections]
734
           movzx ebx, [edx+CFH.nSections]
733
           mov edi, [img_base]
735
           mov edi, [img_base]
734
           lea eax, [edx+20]
736
           lea eax, [edx+20]
735
@@:
737
@@:
736
           mov [eax+CFS.VirtualAddress], edi
738
           mov [eax+CFS.VirtualAddress], edi
737
           mov esi, [eax+CFS.PtrRawData]
739
           mov esi, [eax+CFS.PtrRawData]
738
           test esi, esi
740
           test esi, esi
739
           jnz .copy
741
           jnz .copy
740
           add edi, [eax+CFS.SizeOfRawData]
742
           add edi, [eax+CFS.SizeOfRawData]
741
           jmp .next
743
           jmp .next
742
.copy:
744
.copy:
743
           add esi, edx
745
           add esi, edx
744
           mov ecx, [eax+CFS.SizeOfRawData]
746
           mov ecx, [eax+CFS.SizeOfRawData]
745
           cld
747
           cld
746
           rep movsb
748
           rep movsb
747
.next:
749
.next:
748
           add edi, 15
750
           add edi, 15
749
           and edi, not 15
751
           and edi, not 15
750
           add eax, 40
752
           add eax, COFF_SECTION_SIZE
751
           dec ebx
753
           dec ebx
752
           jnz @B
754
           jnz @B
753
 
755
 
754
           mov ebx, [edx+CFH.pSymTable]
756
           mov ebx, [edx+CFH.pSymTable]
755
           add ebx, edx
757
           add ebx, edx
756
           mov [sym], ebx
758
           mov [sym], ebx
757
           mov ecx, [edx+CFH.nSymbols]
759
           mov ecx, [edx+CFH.nSymbols]
758
           add ecx,ecx
760
           add ecx,ecx
759
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
761
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
760
           add ecx, [sym]
762
           add ecx, [sym]
761
           mov [strings], ecx
763
           mov [strings], ecx
762
 
764
 
763
           lea ebx, [exports]
765
           lea ebx, [exports]
764
           mov dword [ebx], kernel_export
766
           mov dword [ebx], kernel_export
765
           mov dword [ebx+4], 0
767
           mov dword [ebx+4], 0
766
           lea eax, [edx+20]
768
           lea eax, [edx+20]
767
 
769
 
768
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
770
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
769
                                     [strings], ebx
771
                                     [strings], ebx
770
           test eax, eax
772
           test eax, eax
771
           jnz @F
773
           jnz @F
772
 
774
 
773
           mov esi, msg_module
775
           mov esi, msg_module
774
           call sys_msg_board_str
776
           call sys_msg_board_str
775
           mov esi, [file_name]
777
           mov esi, [file_name]
776
           call sys_msg_board_str
778
           call sys_msg_board_str
777
           mov esi, msg_CR
779
           mov esi, msg_CR
778
           call sys_msg_board_str
780
           call sys_msg_board_str
779
 
781
 
780
           stdcall kernel_free,[coff]
782
           stdcall kernel_free,[coff]
781
           xor eax, eax
783
           xor eax, eax
782
           ret
784
           ret
783
@@:
785
@@:
784
           mov ebx, [coff]
786
           mov ebx, [coff]
785
           add ebx, 20
787
           add ebx, 20
786
           stdcall fix_coff_relocs, [coff], ebx, [sym]
788
           stdcall fix_coff_relocs, [coff], ebx, [sym]
787
 
789
 
788
           mov ebx, [coff]
790
           mov ebx, [coff]
789
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
791
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
790
           mov [start], eax
792
           mov [start], eax
791
 
793
 
792
           stdcall kernel_free, [coff]
794
           stdcall kernel_free, [coff]
793
 
795
 
794
           mov ebx, [start]
796
           mov ebx, [start]
795
           call ebx
797
           call ebx
796
           test eax, eax
798
           test eax, eax
797
           jnz .ok
799
           jnz .ok
798
 
800
 
799
           stdcall kernel_free, [img_base]
801
           stdcall kernel_free, [img_base]
800
           xor eax, eax
802
           xor eax, eax
801
           ret
803
           ret
802
.ok:
804
.ok:
803
           mov ebx, [img_base]
805
           mov ebx, [img_base]
804
           mov [eax+SRV.base], ebx
806
           mov [eax+SRV.base], ebx
805
           ret
807
           ret
806
.fail:
808
.fail:
807
           xor eax, eax
809
           xor eax, eax
808
           ret
810
           ret
809
endp
811
endp
810
 
812
 
811
align 4
813
align 4
812
proc load_library stdcall, file_name:dword
814
proc load_library stdcall, file_name:dword
813
           locals
815
           locals
814
             coff      dd ?
816
             coff      dd ?
815
             sym       dd ?
817
             sym       dd ?
816
             strings   dd ?
818
             strings   dd ?
817
             img_size  dd ?
819
             img_size  dd ?
818
             img_base  dd ?
820
             img_base  dd ?
819
             exports   dd ?
821
             exports   dd ?
820
           endl
822
           endl
821
 
823
 
822
           cli
824
           cli
823
 
825
 
824
           stdcall load_file, [file_name]
826
           stdcall load_file, [file_name]
825
 
827
 
826
           test eax, eax
828
           test eax, eax
827
           jz .fail
829
           jz .fail
828
 
830
 
829
           mov [coff], eax
831
           mov [coff], eax
830
           movzx ecx, [eax+CFH.nSections]
832
           movzx ecx, [eax+CFH.nSections]
831
           xor ebx, ebx
833
           xor ebx, ebx
832
 
834
 
833
           lea edx, [eax+20]
835
           lea edx, [eax+20]
834
@@:
836
@@:
835
           add ebx, [edx+CFS.SizeOfRawData]
837
           add ebx, [edx+CFS.SizeOfRawData]
836
           add ebx, 15
838
           add ebx, 15
837
           and ebx, not 15
839
           and ebx, not 15
838
           add edx, 18
840
           add edx, COFF_SECTION_SIZE
839
           dec ecx
841
           dec ecx
840
           jnz @B
842
           jnz @B
841
           mov [img_size], ebx
843
           mov [img_size], ebx
842
 
844
 
843
           call init_heap
845
           call init_heap
844
           stdcall user_alloc, [img_size]
846
           stdcall user_alloc, [img_size]
845
 
847
 
846
           test eax, eax
848
           test eax, eax
847
           jz .fail
849
           jz .fail
848
           mov [img_base], eax
850
           mov [img_base], eax
849
 
851
 
850
           mov edx, [coff]
852
           mov edx, [coff]
851
           movzx ebx, [edx+CFH.nSections]
853
           movzx ebx, [edx+CFH.nSections]
852
           mov edi, [img_base]
854
           mov edi, [img_base]
853
           lea eax, [edx+20]
855
           lea eax, [edx+20]
854
@@:
856
@@:
855
           mov [eax+CFS.VirtualAddress], edi
857
           mov [eax+CFS.VirtualAddress], edi
856
           mov esi, [eax+CFS.PtrRawData]
858
           mov esi, [eax+CFS.PtrRawData]
857
           test esi, esi
859
           test esi, esi
858
           jnz .copy
860
           jnz .copy
859
           add edi, [eax+CFS.SizeOfRawData]
861
           add edi, [eax+CFS.SizeOfRawData]
860
           jmp .next
862
           jmp .next
861
.copy:
863
.copy:
862
           add esi, edx
864
           add esi, edx
863
           add edi, new_app_base
865
           add edi, new_app_base
864
           mov ecx, [eax+CFS.SizeOfRawData]
866
           mov ecx, [eax+CFS.SizeOfRawData]
865
           cld
867
           cld
866
           rep movsb
868
           rep movsb
867
.next:
869
.next:
868
           add edi, 15-new_app_base
870
           add edi, 15-new_app_base
869
           and edi, not 15
871
           and edi, not 15
870
           add eax, 40
872
           add eax, COFF_SECTION_SIZE
871
           dec ebx
873
           dec ebx
872
           jnz @B
874
           jnz @B
873
 
875
 
874
           mov ebx, [edx+CFH.pSymTable]
876
           mov ebx, [edx+CFH.pSymTable]
875
           add ebx, edx
877
           add ebx, edx
876
           mov [sym], ebx
878
           mov [sym], ebx
877
           mov ecx, [edx+CFH.nSymbols]
879
           mov ecx, [edx+CFH.nSymbols]
878
           add ecx,ecx
880
           add ecx,ecx
879
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
881
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
880
           add ecx, [sym]
882
           add ecx, [sym]
881
           mov [strings], ecx
883
           mov [strings], ecx
882
 
884
 
883
           lea eax, [edx+20]
885
           lea eax, [edx+20]
884
 
886
 
885
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
887
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
886
                                     [strings], dword 0
888
                                     [strings], dword 0
887
           test eax, eax
889
           test eax, eax
888
           jnz @F
890
           jnz @F
889
 
891
 
890
@@:
892
@@:
891
           mov edx, [coff]
893
           mov edx, [coff]
892
           movzx ebx, [edx+CFH.nSections]
894
           movzx ebx, [edx+CFH.nSections]
893
           mov edi, new_app_base
895
           mov edi, new_app_base
894
           lea eax, [edx+20]
896
           lea eax, [edx+20]
895
@@:
897
@@:
896
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
898
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
897
           add eax, 40
899
           add eax, COFF_SECTION_SIZE
898
           dec ebx
900
           dec ebx
899
           jnz @B
901
           jnz @B
900
 
902
 
901
           add edx, 20
903
           add edx, 20
902
           stdcall fix_coff_relocs, [coff], edx, [sym]
904
           stdcall fix_coff_relocs, [coff], edx, [sym]
903
 
905
 
904
           mov ebx, [coff]
906
           mov ebx, [coff]
905
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
907
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
906
           mov [exports], eax
908
           mov [exports], eax
907
 
909
 
908
           stdcall kernel_free, [coff]
910
           stdcall kernel_free, [coff]
909
           mov eax, [exports]
911
           mov eax, [exports]
910
           ret
912
           ret
911
.fail:
913
.fail:
912
           xor eax, eax
914
           xor eax, eax
913
           ret
915
           ret
914
endp
916
endp
915
 
917
 
916
 
918
 
917
drv_sound      db '/rd/1/drivers/unisound.obj', 0
919
drv_sound      db '/rd/1/drivers/unisound.obj', 0
918
drv_infinity   db '/rd/1/drivers/infinity.obj', 0
920
drv_infinity   db '/rd/1/drivers/infinity.obj', 0
919
 
921
 
920
szSound        db 'SOUND',0
922
szSound        db 'SOUND',0
921
szInfinity     db 'INFINITY',0
923
szInfinity     db 'INFINITY',0
922
 
924
 
923
szSTART        db 'START',0
925
szSTART        db 'START',0
924
szEXPORTS      db 'EXPORTS',0
926
szEXPORTS      db 'EXPORTS',0
925
szIMPORTS      db 'IMPORTS',0
927
szIMPORTS      db 'IMPORTS',0
926
 
928
 
927
msg_unresolved db 'unresolved ',0
929
msg_unresolved db 'unresolved ',0
928
msg_module     db 'in module ',0
930
msg_module     db 'in module ',0
929
msg_CR         db  13,10,0
931
msg_CR         db  13,10,0
930
 
932
 
931
align 16
933
align 16
932
services:
934
services:
933
           dd szSound,    drv_sound
935
           dd szSound,    drv_sound
934
           dd szInfinity, drv_infinity
936
           dd szInfinity, drv_infinity
935
           dd 0
937
           dd 0