Subversion Repositories Kolibri OS

Rev

Rev 206 | Rev 214 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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