Subversion Repositories Kolibri OS

Rev

Rev 164 | Rev 198 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 164 Rev 188
Line 293... Line 293...
293
	     counter  dd ?
293
	     counter  dd ?
294
	    endl
294
           endl
Line 295... Line 295...
295
 
295
 
296
	    mov eax, [sz_name]
296
           mov eax, [sz_name]
-
 
297
           test eax, eax
297
	    test eax, eax
298
           jnz @F
298
	    jz .fail
299
           ret
299
 
300
@@:
300
	    mov [srv_ptr], srv_tab
301
           mov [srv_ptr], srv_tab
301
	    mov [counter], 16
302
           mov [counter], 16
302
@@:
303
@@:
303
	    stdcall strncmp, [srv_ptr], [sz_name], 16
304
           stdcall strncmp, [srv_ptr], [sz_name], 16
Line 306... Line 307...
306
 
307
 
307
	    add [srv_ptr], SRV_SIZE
308
           add [srv_ptr], SRV_SIZE
308
	    dec [counter]
309
           dec [counter]
309
	    jnz @B
310
           jnz @B
310
.not_load:
-
 
311
 
311
.not_load:
312
           stdcall find_service, [sz_name]
312
           stdcall find_service, [sz_name]
313
           test eax, eax
313
           test eax, eax
314
           jz .fail
-
 
315
 
-
 
316
           stdcall load_lib, eax
-
 
317
           test eax, eax
314
           jnz @F
318
           jz .fail
-
 
319
 
-
 
320
            mov [srv_ptr], srv_tab
-
 
321
	    mov [counter], 16
315
           ret
322
@@:
-
 
323
	    stdcall strncmp, [srv_ptr], [sz_name], 16
316
@@:
324
	    test eax, eax
-
 
325
	    je .ok
-
 
326
 
-
 
327
	    add [srv_ptr], SRV_SIZE
-
 
328
	    dec [counter]
-
 
329
	    jnz @B
-
 
330
.fail:
-
 
331
	    xor eax, eax
317
           stdcall load_driver, eax
332
	    ret
318
           ret
333
.ok:
319
.ok:
334
	    mov eax, [srv_ptr]
320
           mov eax, [srv_ptr]
335
	    ret
321
           ret
Line 421... Line 407...
421
.end:
407
.end:
422
           ret
408
           ret
423
endp
409
endp
Line 424... Line 410...
424
 
410
 
425
align 4
-
 
426
proc link_dll stdcall, exp:dword, imp:dword
-
 
427
           mov esi, [imp]
-
 
428
.next:
-
 
429
           mov eax, [esi]
-
 
430
           test eax, eax
-
 
431
           jz .end
-
 
432
 
-
 
433
           push esi
-
 
434
           stdcall get_proc, [exp], eax
-
 
435
           pop esi
-
 
436
 
-
 
437
           test eax, eax
-
 
438
           jz @F
-
 
439
 
-
 
440
           mov [esi], eax
-
 
441
@@:
-
 
442
           add esi, 4
-
 
443
           jmp .next
-
 
444
.end:
-
 
445
           ret
-
 
446
endp
-
 
447
 
-
 
448
align 4
411
align 4
Line 449... Line 412...
449
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
450
 
413
 
451
@@:
414
@@:
Line 462... Line 425...
462
	   mov eax, [ebx+8]
425
	   mov eax, [ebx+8]
463
	   ret
426
	   ret
464
endp
427
endp
Line 465... Line 428...
465
 
428
 
-
 
429
align 4
-
 
430
proc get_curr_task
-
 
431
           mov eax,[CURRENT_TASK]
-
 
432
           shl eax, 8
-
 
433
           ret
-
 
434
endp
-
 
435
 
466
align 4
436
align 4
467
proc load_lib stdcall, name:dword
437
proc get_fileinfo stdcall, file_name:dword, info:dword
468
	   locals
438
           locals
469
	     lib   dd ?
439
             cmd     dd ?
-
 
440
             offset  dd ?
-
 
441
                     dd ?
-
 
442
             count   dd ?
-
 
443
             buff    dd ?
470
	     base  dd ?
444
                     db ?
471
	     pSym  dd ?
445
             name    dd ?
Line 472... Line 446...
472
	   endl
446
           endl
473
 
447
 
474
	   mov eax, [name]
448
           xor eax, eax
475
	   mov	  ebx, 1		 ;index of first block
449
           mov ebx, [file_name]
476
           mov    ecx, 32                ;number of blocks
450
           sub ebx, new_app_base
477
	   mov	  edx, TMP_BUFF 	 ;temp area
451
           mov ecx, [info]
-
 
452
           sub ecx, new_app_base
-
 
453
 
-
 
454
           mov [cmd], 5
-
 
455
           mov [offset], eax
-
 
456
           mov [offset+4], eax
478
	   mov	  esi, 12		 ;file name length
457
           mov [count], eax
-
 
458
           mov [buff], ecx
479
 
459
           mov byte [buff+4], al
480
	   call   fileread		;read file from RD
460
           mov [name], ebx
-
 
461
 
-
 
462
           mov eax, 70
-
 
463
           lea ebx, [cmd]
481
 
464
           sub ebx, new_app_base
-
 
465
           int 0x40
Line -... Line 466...
-
 
466
           ret
-
 
467
endp
482
	   cmp	  eax,0
468
 
-
 
469
align 4
-
 
470
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
-
 
471
                                     bytes:dword
-
 
472
           locals
-
 
473
             cmd     dd ?
483
	   jne	  .err
474
             offset  dd ?
484
 
475
                     dd ?
-
 
476
             count   dd ?
-
 
477
             buff    dd ?
Line -... Line 478...
-
 
478
                     db ?
-
 
479
             name    dd ?
-
 
480
           endl
-
 
481
 
-
 
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
485
;           mov eax, [TMP_BUFF+CFH.pSymTable]
488
           sub esi, new_app_base
-
 
489
 
-
 
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]
Line -... Line 500...
-
 
500
           sub ebx, new_app_base
486
;           add eax, TMP_BUFF
501
           int 0x40
487
;           mov [pSym], eax
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 ?
Line 488... Line -...
488
 
-
 
489
;           mov [TMP_BUFF+20+CFS.VirtualAddress], eax
-
 
490
 
-
 
491
	   stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData]
-
 
492
	   mov [base], eax
-
 
493
 
-
 
494
           test eax, eax
-
 
495
           jnz @f
-
 
496
@@:
-
 
497
	   mov [TMP_BUFF+20+CFS.VirtualAddress], eax
-
 
498
	   mov ebx, [TMP_BUFF+CFH.pSymTable]
-
 
499
	   add ebx, TMP_BUFF
512
             acc_time   dd ?
500
	   mov [pSym], ebx
513
             acc_date   dd ?
501
 
-
 
502
	   stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx
-
 
503
 
-
 
504
	   mov edi, [base]
-
 
505
           test edi, edi
-
 
Line 506... Line 514...
506
           jnz @f
514
             mod_time   dd ?
-
 
515
             mod_date   dd ?
507
@@:
516
             file_size  dd ?
508
	   mov esi, [TMP_BUFF+20+CFS.PtrRawData]
517
 
509
	   add esi, TMP_BUFF
-
 
510
	   mov ecx, [TMP_BUFF+20+CFS.SizeOfRawData]
-
 
Line 511... Line -...
511
	   rep movsb
-
 
512
 
-
 
513
	   call alloc_dll
-
 
514
           test eax, eax
-
 
515
           jnz @f
-
 
516
@@:
-
 
517
	   mov [lib], eax
-
 
518
 
-
 
519
	   mov edi, eax
518
             file       dd ?
520
	   mov esi, [name]
-
 
521
	   mov ecx, 16
519
           endl
Line 522... Line 520...
522
	   rep movsb
520
 
-
 
521
           lea eax, [attr]
-
 
522
           stdcall get_fileinfo, [file_name], eax
523
 
523
           test eax, eax
524
	   stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols],szSTART
524
           jnz .fail
-
 
525
 
-
 
526
           stdcall kernel_alloc, [file_size]
-
 
527
           mov [file], eax
525
	   mov edi, [lib]
528
 
-
 
529
           stdcall read_file, [file_name], eax, dword 0, [file_size]
-
 
530
           cmp ebx, [file_size]
Line 526... Line -...
526
	   add eax, [base]
-
 
527
	   mov [edi+LIB.lib_start], eax
-
 
528
	   mov ebx, [base]
531
           jne .cleanup
529
	   mov [edi+LIB.lib_base], ebx
532
           mov eax, [file]
Line -... Line 533...
-
 
533
           ret
530
 
534
.cleanup:
-
 
535
           stdcall kernel_free, [file]
-
 
536
.fail:
-
 
537
           xor eax, eax
-
 
538
           ret
-
 
539
endp
-
 
540
 
-
 
541
align 4
Line -... Line 542...
-
 
542
proc get_proc_ex stdcall, proc_name:dword, imports:dword
-
 
543
 
531
	   stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS
544
.look_up:
532
	   mov edi, [lib]
545
           mov edx, [imports]
-
 
546
           mov edx, [edx]
Line -... Line 547...
-
 
547
           test edx, edx
-
 
548
           jz .end
-
 
549
.next:
-
 
550
           mov eax, [edx]
-
 
551
           test eax, eax
-
 
552
           jz .next_table
533
	   add eax, [base]
553
 
534
	   mov [edi+LIB.export], eax
554
           push edx
535
 
555
           stdcall strncmp, eax, [proc_name], 16
536
	   stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS
556
           pop edx
537
	   mov edi, [lib]
557
           test eax, eax
538
	   add eax, [base]
-
 
539
	   mov [edi+LIB.import], eax
558
           jz .ok
Line 540... Line 559...
540
 
559
 
541
	   stdcall link_dll, kernel_export, eax
560
           add edx,8
-
 
561
           jmp .next
542
 
562
.next_table:
543
	   mov edi, [lib]
563
           add [imports], 4
544
           call [edi+LIB.lib_start]
564
           jmp .look_up
Line 545... Line 565...
545
 
565
.ok:
-
 
566
           mov eax, [edx+4]
-
 
567
           ret
546
	   mov eax, [lib]
568
.end:
547
	   ret
569
           xor eax, eax
-
 
570
           ret
-
 
571
endp
548
.err:
572
 
-
 
573
align 4
Line 549... Line 574...
549
	   xor eax, eax
574
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
550
	   ret
575
                      sym_count:dword, strings:dword, imports:dword
-
 
576
           locals
-
 
577
             retval dd ?
-
 
578
           endl
-
 
579
 
-
 
580
           mov edi, [symbols]
-
 
581
           mov [retval], 1
-
 
582
.fix:
-
 
583
           movzx ebx, [edi+CSYM.SectionNumber]
-
 
584
           test ebx, ebx
-
 
585
           jnz .internal
-
 
586
           mov eax, dword [edi+CSYM.Name]
-
 
587
           test eax, eax
-
 
588
           jnz @F
-
 
589
 
-
 
590
           mov edi, [edi+4]
-
 
591
           add edi, [strings]
-
 
592
@@:
-
 
593
           push edi
-
 
594
           stdcall get_proc_ex, edi,[imports]
-
 
595
           pop edi
-
 
596
 
-
 
597
           xor ebx, ebx
-
 
598
           test eax, eax
-
 
599
           jnz @F
-
 
600
 
-
 
601
           mov esi, msg_unresolved
-
 
602
           call sys_msg_board_str
-
 
603
           mov esi, edi
-
 
604
           call sys_msg_board_str
-
 
605
           mov esi, msg_CR
-
 
606
           call sys_msg_board_str
-
 
607
 
-
 
608
           mov [retval],0
-
 
609
@@:
-
 
610
           mov edi, [symbols]
-
 
611
           mov [edi+CSYM.Value], eax
-
 
612
           jmp .next
Line -... Line 613...
-
 
613
.internal:
-
 
614
           dec ebx
-
 
615
           shl ebx, 3
551
 
616
           lea ebx, [ebx+ebx*4]
552
endp
617
           add ebx, [sec]
-
 
618
 
553
 
619
           mov eax, [ebx+CFS.VirtualAddress]
554
align 4
620
           add [edi+CSYM.Value], eax
555
proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword
621
.next:
556
	   locals
622
           add edi, CSYM_SIZE
557
	     pCode     dd ?
623
           mov [symbols], edi
558
	   endl
624
           dec [sym_count]
-
 
625
           jnz .fix
Line -... Line 626...
-
 
626
           mov eax, [retval]
-
 
627
           ret
-
 
628
endp
-
 
629
 
559
 
630
align 4
560
	   mov esi, [pSec]
631
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
561
	   mov eax, [esi+CFS.PtrRawData]
632
	   locals
-
 
633
             n_sec     dd ?
Line 562... Line 634...
562
	   add eax, [pCoff]
634
	   endl
Line 563... Line 635...
563
	   mov [pCode], eax
635
 
564
 
636
           mov eax, [coff]
Line -... Line 637...
-
 
637
           movzx ebx, [eax+CFH.nSections]
-
 
638
           mov [n_sec], ebx
-
 
639
.fix_sec:
565
	   mov edi, [esi+CFS.PtrReloc]
640
           mov esi, [sec]
-
 
641
	   mov edi, [esi+CFS.PtrReloc]
-
 
642
           add edi, [coff]
-
 
643
 
566
	   add edi, [pCoff]
644
           movzx ecx, [esi+CFS.NumReloc]
-
 
645
           test ecx, ecx
-
 
646
           jz .next
-
 
647
.next_reloc:
-
 
648
	   mov ebx, [edi+CRELOC.SymIndex]
567
 
649
	   add ebx,ebx
568
	   movzx edx, [esi+CFS.NumReloc]
650
	   lea ebx,[ebx+ebx*8]
569
	   mov eax, edx
651
           add ebx, [sym]
-
 
652
 
570
	   lea edx, [edx+edx*8]
653
           mov edx, [ebx+CSYM.Value]
-
 
654
 
-
 
655
           cmp [edi+CRELOC.Type], 6
-
 
656
           je .dir_32
571
	   add edx, eax
657
 
572
	   add edx, edi
658
           cmp [edi+CRELOC.Type], 20
573
.l_0:
659
           jne .next_reloc
Line -... Line 660...
-
 
660
.rel_32:
-
 
661
	   mov eax, [edi+CRELOC.VirtualAddress]
574
	   cmp edi, edx
662
           add eax, [esi+CFS.VirtualAddress]
-
 
663
           sub edx, eax
-
 
664
           sub edx, 4
-
 
665
           jmp .fix
-
 
666
.dir_32:
-
 
667
	   mov eax, [edi+CRELOC.VirtualAddress]
-
 
668
           add eax, [esi+CFS.VirtualAddress]
-
 
669
.fix:
-
 
670
           add [eax], edx
-
 
671
           add edi, 10
-
 
672
           dec ecx
-
 
673
           jnz .next_reloc
-
 
674
.next:
-
 
675
           add [sec], 40
-
 
676
           dec [n_sec]
-
 
677
           jnz .fix_sec
-
 
678
.exit:
-
 
679
	   ret
-
 
680
endp
-
 
681
 
-
 
682
align 4
-
 
683
proc load_driver stdcall, file_name:dword
-
 
684
           locals
-
 
685
             coff      dd ?
-
 
686
             sym       dd ?
-
 
687
             strings   dd ?
-
 
688
             img_size  dd ?
-
 
689
             img_base  dd ?
-
 
690
             start     dd ?
-
 
691
 
-
 
692
             exports   dd ?   ;fake exports table
-
 
693
                       dd ?
-
 
694
           endl
-
 
695
 
-
 
696
           stdcall load_file, [file_name]
-
 
697
           test eax, eax
-
 
698
           jz .fail
-
 
699
 
575
	   jae .exit
700
           mov [coff], eax
-
 
701
 
-
 
702
           movzx ecx, [eax+CFH.nSections]
576
 
703
           xor ebx, ebx
-
 
704
 
-
 
705
           lea edx, [eax+20]
-
 
706
@@:
-
 
707
           add ebx, [edx+CFS.SizeOfRawData]
-
 
708
           add ebx, 15
-
 
709
           and ebx, not 15
-
 
710
           add edx, 18
-
 
711
           dec ecx
-
 
712
           jnz @B
-
 
713
           mov [img_size], ebx
-
 
714
 
-
 
715
           stdcall kernel_alloc, ebx
-
 
716
           test eax, eax
-
 
717
           jz .fail
-
 
718
           mov [img_base], eax
-
 
719
 
-
 
720
           mov edi, eax
-
 
721
           xor eax, eax
-
 
722
           mov ecx, [img_size]
-
 
723
           add ecx, 4095
-
 
724
           and ecx, not 4095
-
 
725
           shr ecx, 2
-
 
726
           cld
-
 
727
           rep stosd
-
 
728
 
-
 
729
           mov edx, [coff]
-
 
730
           movzx ebx, [edx+CFH.nSections]
-
 
731
           mov edi, [img_base]
-
 
732
           lea eax, [edx+20]
-
 
733
@@:
-
 
734
           mov [eax+CFS.VirtualAddress], edi
-
 
735
           mov esi, [eax+CFS.PtrRawData]
-
 
736
           test esi, esi
-
 
737
           jnz .copy
-
 
738
           add edi, [eax+CFS.SizeOfRawData]
-
 
739
           jmp .next
-
 
740
.copy:
-
 
741
           add esi, edx
-
 
742
           mov ecx, [eax+CFS.SizeOfRawData]
-
 
743
           cld
-
 
744
           rep movsb
-
 
745
.next:
-
 
746
           add edi, 15
-
 
747
           and edi, not 15
-
 
748
           add eax, 40
-
 
749
           dec ebx
-
 
750
           jnz @B
-
 
751
 
-
 
752
           mov ebx, [edx+CFH.pSymTable]
-
 
753
           add ebx, edx
-
 
754
           mov [sym], ebx
-
 
755
           mov ecx, [edx+CFH.nSymbols]
-
 
756
           add ecx,ecx
-
 
757
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
-
 
758
           add ecx, [sym]
-
 
759
           mov [strings], ecx
-
 
760
 
-
 
761
           lea ebx, [exports]
-
 
762
           mov dword [ebx], kernel_export
-
 
763
           mov dword [ebx+4], 0
-
 
764
           lea eax, [edx+20]
-
 
765
 
-
 
766
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
-
 
767
                                     [strings], ebx
-
 
768
           test eax, eax
-
 
769
           jnz @F
-
 
770
 
-
 
771
           mov esi, msg_module
-
 
772
           call sys_msg_board_str
-
 
773
           mov esi, [file_name]
-
 
774
           call sys_msg_board_str
-
 
775
           mov esi, msg_CR
-
 
776
           call sys_msg_board_str
-
 
777
 
-
 
778
           stdcall kernel_free,[coff]
-
 
779
           xor eax, eax
-
 
780
           ret
-
 
781
@@:
-
 
782
           mov ebx, [coff]
-
 
783
           add ebx, 20
577
	   mov ebx, [edi+CRELOC.SymIndex]
784
           stdcall fix_coff_relocs, [coff], ebx, [sym]
578
	   add ebx,ebx
785
 
Line 579... Line 786...
579
	   lea ebx,[ebx+ebx*8]
786
           mov ebx, [coff]
580
 
787
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
Line 581... Line 788...
581
	   add ebx, [pSym]
788
           mov [start], eax
582
 
789
 
Line 583... Line 790...
583
	   mov ecx, [ebx+CSYM.Value]
790
           stdcall kernel_free, [coff]
584
	   add ecx, [esi+CFS.VirtualAddress]
791
 
585
 
792
           mov ebx, [start]
Line -... Line 793...
-
 
793
           call ebx
-
 
794
           test eax, eax
-
 
795
           jnz .ok
-
 
796
 
586
	   mov eax, [edi+CRELOC.VirtualAddress]
797
           stdcall kernel_free, [img_base]
587
	   add eax, [pCode]
798
           xor eax, eax
588
	   add [eax], ecx
799
           ret
589
	   add edi, 10
800
.ok:
590
	   jmp .l_0
801
           mov ebx, [img_base]