Rev 2288 | Rev 2454 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2288 | Rev 2384 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2009. 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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 2288 $ |
8 | $Revision: 2384 $ |
9 | 9 | ||
Line 137... | Line 137... | ||
137 | 137 | ||
138 | mov edi, [esi+handle] |
138 | mov edi, [esi+handle] |
139 | cmp [edi+SRV.magic], ' SRV' |
139 | cmp [edi+SRV.magic], ' SRV' |
Line 140... | Line 140... | ||
140 | jne .fail |
140 | jne .fail |
141 | 141 | ||
Line 142... | Line 142... | ||
142 | cmp [edi+SRV.size], SRV.sizeof |
142 | cmp [edi+SRV.size], sizeof.SRV |
143 | jne .fail |
143 | jne .fail |
144 | 144 | ||
Line 169... | Line 169... | ||
169 | 169 | ||
170 | mov eax, [ecx+handle] |
170 | mov eax, [ecx+handle] |
171 | cmp [eax+SRV.magic], ' SRV' |
171 | cmp [eax+SRV.magic], ' SRV' |
Line 172... | Line 172... | ||
172 | jne .fail |
172 | jne .fail |
173 | 173 | ||
Line 174... | Line 174... | ||
174 | cmp [eax+SRV.size], SRV.sizeof |
174 | cmp [eax+SRV.size], sizeof.SRV |
175 | jne .fail |
175 | jne .fail |
176 | 176 | ||
Line 194... | Line 194... | ||
194 | jnz @F |
194 | jnz @F |
195 | ret |
195 | ret |
196 | @@: |
196 | @@: |
197 | mov edx, [srv.fd] |
197 | mov edx, [srv.fd] |
198 | @@: |
198 | @@: |
199 | cmp edx, srv.fd-SRV_FD_OFFSET |
199 | cmp edx, srv.fd-SRV.fd |
200 | je .not_load |
200 | je .not_load |
Line 201... | Line 201... | ||
201 | 201 | ||
202 | stdcall strncmp, edx, [sz_name], 16 |
202 | stdcall strncmp, edx, [sz_name], 16 |
203 | test eax, eax |
203 | test eax, eax |
Line 224... | Line 224... | ||
224 | je .fail |
224 | je .fail |
Line 225... | Line 225... | ||
225 | 225 | ||
226 | cmp [handler], eax |
226 | cmp [handler], eax |
Line 227... | Line 227... | ||
227 | je .fail |
227 | je .fail |
228 | 228 | ||
229 | mov eax, SRV.sizeof |
229 | mov eax, sizeof.SRV |
230 | call malloc |
230 | call malloc |
Line 231... | Line 231... | ||
231 | test eax, eax |
231 | test eax, eax |
Line 241... | Line 241... | ||
241 | movsd |
241 | movsd |
242 | pop edi |
242 | pop edi |
243 | pop esi |
243 | pop esi |
Line 244... | Line 244... | ||
244 | 244 | ||
245 | mov [eax+SRV.magic], ' SRV' |
245 | mov [eax+SRV.magic], ' SRV' |
Line 246... | Line 246... | ||
246 | mov [eax+SRV.size], SRV.sizeof |
246 | mov [eax+SRV.size], sizeof.SRV |
247 | 247 | ||
248 | mov ebx, srv.fd-SRV_FD_OFFSET |
248 | mov ebx, srv.fd-SRV.fd |
249 | mov edx, [ebx+SRV.fd] |
249 | mov edx, [ebx+SRV.fd] |
250 | mov [eax+SRV.fd], edx |
250 | mov [eax+SRV.fd], edx |
251 | mov [eax+SRV.bk], ebx |
251 | mov [eax+SRV.bk], ebx |
Line 512... | Line 512... | ||
512 | endl |
512 | endl |
Line 513... | Line 513... | ||
513 | 513 | ||
514 | mov edi, [symbols] |
514 | mov edi, [symbols] |
515 | mov [retval], 1 |
515 | mov [retval], 1 |
516 | .fix: |
516 | .fix: |
517 | movzx ebx, [edi+CSYM.SectionNumber] |
517 | movzx ebx, [edi+COFF_SYM.SectionNumber] |
518 | test ebx, ebx |
518 | test ebx, ebx |
519 | jnz .internal |
519 | jnz .internal |
520 | mov eax, dword [edi+CSYM.Name] |
520 | mov eax, dword [edi+COFF_SYM.Name] |
521 | test eax, eax |
521 | test eax, eax |
Line 522... | Line 522... | ||
522 | jnz @F |
522 | jnz @F |
523 | 523 | ||
Line 540... | Line 540... | ||
540 | call sys_msg_board_str |
540 | call sys_msg_board_str |
Line 541... | Line 541... | ||
541 | 541 | ||
542 | mov [retval], 0 |
542 | mov [retval], 0 |
543 | @@: |
543 | @@: |
544 | mov edi, [symbols] |
544 | mov edi, [symbols] |
545 | mov [edi+CSYM.Value], eax |
545 | mov [edi+COFF_SYM.Value], eax |
546 | jmp .next |
546 | jmp .next |
547 | .internal: |
547 | .internal: |
548 | cmp bx, -1 |
548 | cmp bx, -1 |
549 | je .next |
549 | je .next |
Line 553... | Line 553... | ||
553 | dec ebx |
553 | dec ebx |
554 | shl ebx, 3 |
554 | shl ebx, 3 |
555 | lea ebx, [ebx+ebx*4] |
555 | lea ebx, [ebx+ebx*4] |
556 | add ebx, [sec] |
556 | add ebx, [sec] |
Line 557... | Line 557... | ||
557 | 557 | ||
558 | mov eax, [ebx+CFS.VirtualAddress] |
558 | mov eax, [ebx+COFF_SECTION.VirtualAddress] |
559 | add [edi+CSYM.Value], eax |
559 | add [edi+COFF_SYM.Value], eax |
560 | .next: |
560 | .next: |
561 | add edi, CSYM_SIZE |
561 | add edi, sizeof.COFF_SYM |
562 | mov [symbols], edi |
562 | mov [symbols], edi |
563 | dec [sym_count] |
563 | dec [sym_count] |
564 | jnz .fix |
564 | jnz .fix |
565 | mov eax, [retval] |
565 | mov eax, [retval] |
Line 572... | Line 572... | ||
572 | locals |
572 | locals |
573 | n_sec dd ? |
573 | n_sec dd ? |
574 | endl |
574 | endl |
Line 575... | Line 575... | ||
575 | 575 | ||
576 | mov eax, [coff] |
576 | mov eax, [coff] |
577 | movzx ebx, [eax+CFH.nSections] |
577 | movzx ebx, [eax+COFF_HEADER.nSections] |
578 | mov [n_sec], ebx |
578 | mov [n_sec], ebx |
579 | lea esi, [eax+20] |
579 | lea esi, [eax+20] |
580 | .fix_sec: |
580 | .fix_sec: |
581 | mov edi, [esi+CFS.PtrReloc] |
581 | mov edi, [esi+COFF_SECTION.PtrReloc] |
Line 582... | Line 582... | ||
582 | add edi, [coff] |
582 | add edi, [coff] |
583 | 583 | ||
584 | movzx ecx, [esi+CFS.NumReloc] |
584 | movzx ecx, [esi+COFF_SECTION.NumReloc] |
585 | test ecx, ecx |
585 | test ecx, ecx |
586 | jz .next |
586 | jz .next |
587 | .reloc_loop: |
587 | .reloc_loop: |
588 | mov ebx, [edi+CRELOC.SymIndex] |
588 | mov ebx, [edi+COFF_RELOC.SymIndex] |
589 | add ebx, ebx |
589 | add ebx, ebx |
Line 590... | Line 590... | ||
590 | lea ebx, [ebx+ebx*8] |
590 | lea ebx, [ebx+ebx*8] |
Line 591... | Line 591... | ||
591 | add ebx, [sym] |
591 | add ebx, [sym] |
592 | 592 | ||
Line 593... | Line 593... | ||
593 | mov edx, [ebx+CSYM.Value] |
593 | mov edx, [ebx+COFF_SYM.Value] |
594 | 594 | ||
595 | cmp [edi+CRELOC.Type], 6 |
595 | cmp [edi+COFF_RELOC.Type], 6 |
596 | je .dir_32 |
596 | je .dir_32 |
597 | 597 | ||
598 | cmp [edi+CRELOC.Type], 20 |
598 | cmp [edi+COFF_RELOC.Type], 20 |
599 | jne .next_reloc |
599 | jne .next_reloc |
600 | .rel_32: |
600 | .rel_32: |
601 | mov eax, [edi+CRELOC.VirtualAddress] |
601 | mov eax, [edi+COFF_RELOC.VirtualAddress] |
602 | add eax, [esi+CFS.VirtualAddress] |
602 | add eax, [esi+COFF_SECTION.VirtualAddress] |
603 | sub edx, eax |
603 | sub edx, eax |
604 | sub edx, 4 |
604 | sub edx, 4 |
605 | jmp .fix |
605 | jmp .fix |
606 | .dir_32: |
606 | .dir_32: |
607 | mov eax, [edi+CRELOC.VirtualAddress] |
607 | mov eax, [edi+COFF_RELOC.VirtualAddress] |
608 | add eax, [esi+CFS.VirtualAddress] |
608 | add eax, [esi+COFF_SECTION.VirtualAddress] |
609 | .fix: |
609 | .fix: |
610 | add eax, [delta] |
610 | add eax, [delta] |
611 | add [eax], edx |
611 | add [eax], edx |
612 | .next_reloc: |
612 | .next_reloc: |
613 | add edi, 10 |
613 | add edi, 10 |
614 | dec ecx |
614 | dec ecx |
615 | jnz .reloc_loop |
615 | jnz .reloc_loop |
616 | .next: |
616 | .next: |
617 | add esi, COFF_SECTION_SIZE |
617 | add esi, sizeof.COFF_SECTION |
Line 627... | Line 627... | ||
627 | locals |
627 | locals |
628 | n_sec dd ? |
628 | n_sec dd ? |
629 | endl |
629 | endl |
Line 630... | Line 630... | ||
630 | 630 | ||
631 | mov eax, [coff] |
631 | mov eax, [coff] |
632 | movzx ebx, [eax+CFH.nSections] |
632 | movzx ebx, [eax+COFF_HEADER.nSections] |
633 | mov [n_sec], ebx |
633 | mov [n_sec], ebx |
634 | lea esi, [eax+20] |
634 | lea esi, [eax+20] |
635 | mov edx, [delta] |
635 | mov edx, [delta] |
636 | .fix_sec: |
636 | .fix_sec: |
637 | mov edi, [esi+CFS.PtrReloc] |
637 | mov edi, [esi+COFF_SECTION.PtrReloc] |
Line 638... | Line 638... | ||
638 | add edi, [coff] |
638 | add edi, [coff] |
639 | 639 | ||
640 | movzx ecx, [esi+CFS.NumReloc] |
640 | movzx ecx, [esi+COFF_SECTION.NumReloc] |
641 | test ecx, ecx |
641 | test ecx, ecx |
642 | jz .next |
642 | jz .next |
643 | .reloc_loop: |
643 | .reloc_loop: |
644 | cmp [edi+CRELOC.Type], 6 |
644 | cmp [edi+COFF_RELOC.Type], 6 |
645 | jne .next_reloc |
645 | jne .next_reloc |
646 | .dir_32: |
646 | .dir_32: |
647 | mov eax, [edi+CRELOC.VirtualAddress] |
647 | mov eax, [edi+COFF_RELOC.VirtualAddress] |
648 | add eax, [esi+CFS.VirtualAddress] |
648 | add eax, [esi+COFF_SECTION.VirtualAddress] |
649 | add [eax+edx], edx |
649 | add [eax+edx], edx |
650 | .next_reloc: |
650 | .next_reloc: |
651 | add edi, 10 |
651 | add edi, 10 |
652 | dec ecx |
652 | dec ecx |
653 | jnz .reloc_loop |
653 | jnz .reloc_loop |
654 | .next: |
654 | .next: |
655 | add esi, COFF_SECTION_SIZE |
655 | add esi, sizeof.COFF_SECTION |
656 | dec [n_sec] |
656 | dec [n_sec] |
657 | jnz .fix_sec |
657 | jnz .fix_sec |
658 | .exit: |
658 | .exit: |
Line 698... | Line 698... | ||
698 | test eax, eax |
698 | test eax, eax |
699 | jz .exit |
699 | jz .exit |
Line 700... | Line 700... | ||
700 | 700 | ||
Line 701... | Line 701... | ||
701 | mov [coff], eax |
701 | mov [coff], eax |
702 | 702 | ||
Line 703... | Line 703... | ||
703 | movzx ecx, [eax+CFH.nSections] |
703 | movzx ecx, [eax+COFF_HEADER.nSections] |
704 | xor ebx, ebx |
704 | xor ebx, ebx |
705 | 705 | ||
706 | lea edx, [eax+20] |
706 | lea edx, [eax+20] |
707 | @@: |
707 | @@: |
708 | add ebx, [edx+CFS.SizeOfRawData] |
708 | add ebx, [edx+COFF_SECTION.SizeOfRawData] |
709 | add ebx, 15 |
709 | add ebx, 15 |
710 | and ebx, not 15 |
710 | and ebx, not 15 |
711 | add edx, COFF_SECTION_SIZE |
711 | add edx, sizeof.COFF_SECTION |
Line 712... | Line 712... | ||
712 | dec ecx |
712 | dec ecx |
Line 726... | Line 726... | ||
726 | shr ecx, 2 |
726 | shr ecx, 2 |
727 | cld |
727 | cld |
728 | rep stosd |
728 | rep stosd |
Line 729... | Line 729... | ||
729 | 729 | ||
730 | mov edx, [coff] |
730 | mov edx, [coff] |
731 | movzx ebx, [edx+CFH.nSections] |
731 | movzx ebx, [edx+COFF_HEADER.nSections] |
732 | mov edi, [img_base] |
732 | mov edi, [img_base] |
733 | lea eax, [edx+20] |
733 | lea eax, [edx+20] |
734 | @@: |
734 | @@: |
735 | mov [eax+CFS.VirtualAddress], edi |
735 | mov [eax+COFF_SECTION.VirtualAddress], edi |
736 | mov esi, [eax+CFS.PtrRawData] |
736 | mov esi, [eax+COFF_SECTION.PtrRawData] |
737 | test esi, esi |
737 | test esi, esi |
738 | jnz .copy |
738 | jnz .copy |
739 | add edi, [eax+CFS.SizeOfRawData] |
739 | add edi, [eax+COFF_SECTION.SizeOfRawData] |
740 | jmp .next |
740 | jmp .next |
741 | .copy: |
741 | .copy: |
742 | add esi, edx |
742 | add esi, edx |
743 | mov ecx, [eax+CFS.SizeOfRawData] |
743 | mov ecx, [eax+COFF_SECTION.SizeOfRawData] |
744 | cld |
744 | cld |
745 | rep movsb |
745 | rep movsb |
746 | .next: |
746 | .next: |
747 | add edi, 15 |
747 | add edi, 15 |
748 | and edi, not 15 |
748 | and edi, not 15 |
749 | add eax, COFF_SECTION_SIZE |
749 | add eax, sizeof.COFF_SECTION |
750 | dec ebx |
750 | dec ebx |
Line 751... | Line 751... | ||
751 | jnz @B |
751 | jnz @B |
752 | 752 | ||
753 | mov ebx, [edx+CFH.pSymTable] |
753 | mov ebx, [edx+COFF_HEADER.pSymTable] |
754 | add ebx, edx |
754 | add ebx, edx |
755 | mov [sym], ebx |
755 | mov [sym], ebx |
756 | mov ecx, [edx+CFH.nSymbols] |
756 | mov ecx, [edx+COFF_HEADER.nSymbols] |
757 | add ecx, ecx |
757 | add ecx, ecx |
758 | lea ecx, [ecx+ecx*8];ecx*=18 = nSymbols*CSYM_SIZE |
758 | lea ecx, [ecx+ecx*8];ecx*=18 = nSymbols*CSYM_SIZE |
Line 759... | Line 759... | ||
759 | add ecx, [sym] |
759 | add ecx, [sym] |
760 | mov [strings], ecx |
760 | mov [strings], ecx |
761 | 761 | ||
762 | lea ebx, [exports] |
762 | lea ebx, [exports] |
Line 763... | Line 763... | ||
763 | mov dword [ebx], kernel_export |
763 | mov dword [ebx], kernel_export |
764 | mov dword [ebx+4], 0 |
764 | mov dword [ebx+4], 0 |
765 | lea eax, [edx+20] |
765 | lea eax, [edx+20] |
766 | 766 | ||
Line 767... | Line 767... | ||
767 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols], \ |
767 | stdcall fix_coff_symbols, eax, [sym], [edx+COFF_HEADER.nSymbols], \ |
768 | [strings], ebx |
768 | [strings], ebx |
Line 769... | Line 769... | ||
769 | test eax, eax |
769 | test eax, eax |
770 | jz .link_fail |
770 | jz .link_fail |
771 | 771 | ||
Line 772... | Line 772... | ||
772 | mov ebx, [coff] |
772 | mov ebx, [coff] |
773 | stdcall fix_coff_relocs, ebx, [sym], 0 |
773 | stdcall fix_coff_relocs, ebx, [sym], 0 |
Line 783... | Line 783... | ||
783 | 783 | ||
784 | cmp eax, DRV_CURRENT |
784 | cmp eax, DRV_CURRENT |
Line 785... | Line 785... | ||
785 | ja .ver_fail |
785 | ja .ver_fail |
786 | 786 | ||
787 | mov ebx, [coff] |
787 | mov ebx, [coff] |
Line 788... | Line 788... | ||
788 | stdcall get_coff_sym, [sym], [ebx+CFH.nSymbols], szSTART |
788 | stdcall get_coff_sym, [sym], [ebx+COFF_HEADER.nSymbols], szSTART |
Line 789... | Line 789... | ||
789 | mov [start], eax |
789 | mov [start], eax |
Line 849... | Line 849... | ||
849 | ; Rules: |
849 | ; Rules: |
850 | ; - if alignment is not given, use default = 4K; |
850 | ; - if alignment is not given, use default = 4K; |
851 | ; - if alignment is given and is no more than 4K, use it; |
851 | ; - if alignment is given and is no more than 4K, use it; |
852 | ; - if alignment is more than 4K, revert to 4K. |
852 | ; - if alignment is more than 4K, revert to 4K. |
853 | push ecx |
853 | push ecx |
854 | mov cl, byte [edx+CFS.Characteristics+2] |
854 | mov cl, byte [edx+COFF_SECTION.Characteristics+2] |
855 | mov eax, 1 |
855 | mov eax, 1 |
856 | shr cl, 4 |
856 | shr cl, 4 |
857 | dec cl |
857 | dec cl |
858 | js .default |
858 | js .default |
859 | cmp cl, 12 |
859 | cmp cl, 12 |
Line 953... | Line 953... | ||
953 | mov esi, edi |
953 | mov esi, edi |
954 | mov ecx, -1 |
954 | mov ecx, -1 |
955 | xor eax, eax |
955 | xor eax, eax |
956 | repnz scasb |
956 | repnz scasb |
957 | not ecx |
957 | not ecx |
958 | lea eax, [ecx+DLLDESCR.sizeof] |
958 | lea eax, [ecx+sizeof.DLLDESCR] |
959 | push ecx |
959 | push ecx |
960 | call malloc |
960 | call malloc |
961 | pop ecx |
961 | pop ecx |
962 | test eax, eax |
962 | test eax, eax |
963 | jz .fail_and_free_coff |
963 | jz .fail_and_free_coff |
Line 977... | Line 977... | ||
977 | mov [esi+DLLDESCR.bk], eax |
977 | mov [esi+DLLDESCR.bk], eax |
978 | mov [eax+DLLDESCR.fd], esi |
978 | mov [eax+DLLDESCR.fd], esi |
Line 979... | Line 979... | ||
979 | 979 | ||
980 | ; calculate size of loaded DLL |
980 | ; calculate size of loaded DLL |
981 | mov edx, [coff] |
981 | mov edx, [coff] |
982 | movzx ecx, [edx+CFH.nSections] |
982 | movzx ecx, [edx+COFF_HEADER.nSections] |
Line 983... | Line 983... | ||
983 | xor ebx, ebx |
983 | xor ebx, ebx |
984 | 984 | ||
985 | add edx, 20 |
985 | add edx, 20 |
986 | @@: |
986 | @@: |
987 | call coff_get_align |
987 | call coff_get_align |
988 | add ebx, eax |
988 | add ebx, eax |
989 | not eax |
989 | not eax |
990 | and ebx, eax |
990 | and ebx, eax |
991 | add ebx, [edx+CFS.SizeOfRawData] |
991 | add ebx, [edx+COFF_SECTION.SizeOfRawData] |
992 | add edx, COFF_SECTION_SIZE |
992 | add edx, sizeof.COFF_SECTION |
993 | dec ecx |
993 | dec ecx |
994 | jnz @B |
994 | jnz @B |
995 | ; it must be nonzero and not too big |
995 | ; it must be nonzero and not too big |
Line 1017... | Line 1017... | ||
1017 | mov [dll_cur_addr], edx |
1017 | mov [dll_cur_addr], edx |
Line 1018... | Line 1018... | ||
1018 | 1018 | ||
1019 | ; copy sections and set correct values for VirtualAddress'es in headers |
1019 | ; copy sections and set correct values for VirtualAddress'es in headers |
1020 | push esi |
1020 | push esi |
1021 | mov edx, [coff] |
1021 | mov edx, [coff] |
1022 | movzx ebx, [edx+CFH.nSections] |
1022 | movzx ebx, [edx+COFF_HEADER.nSections] |
1023 | mov edi, eax |
1023 | mov edi, eax |
1024 | add edx, 20 |
1024 | add edx, 20 |
1025 | cld |
1025 | cld |
1026 | @@: |
1026 | @@: |
1027 | call coff_get_align |
1027 | call coff_get_align |
1028 | add ecx, eax |
1028 | add ecx, eax |
1029 | add edi, eax |
1029 | add edi, eax |
1030 | not eax |
1030 | not eax |
1031 | and ecx, eax |
1031 | and ecx, eax |
1032 | and edi, eax |
1032 | and edi, eax |
1033 | mov [edx+CFS.VirtualAddress], ecx |
1033 | mov [edx+COFF_SECTION.VirtualAddress], ecx |
1034 | add ecx, [edx+CFS.SizeOfRawData] |
1034 | add ecx, [edx+COFF_SECTION.SizeOfRawData] |
1035 | mov esi, [edx+CFS.PtrRawData] |
1035 | mov esi, [edx+COFF_SECTION.PtrRawData] |
1036 | push ecx |
1036 | push ecx |
1037 | mov ecx, [edx+CFS.SizeOfRawData] |
1037 | mov ecx, [edx+COFF_SECTION.SizeOfRawData] |
1038 | test esi, esi |
1038 | test esi, esi |
1039 | jnz .copy |
1039 | jnz .copy |
1040 | xor eax, eax |
1040 | xor eax, eax |
1041 | rep stosb |
1041 | rep stosb |
1042 | jmp .next |
1042 | jmp .next |
1043 | .copy: |
1043 | .copy: |
1044 | add esi, [coff] |
1044 | add esi, [coff] |
1045 | rep movsb |
1045 | rep movsb |
1046 | .next: |
1046 | .next: |
1047 | pop ecx |
1047 | pop ecx |
1048 | add edx, COFF_SECTION_SIZE |
1048 | add edx, sizeof.COFF_SECTION |
1049 | dec ebx |
1049 | dec ebx |
1050 | jnz @B |
1050 | jnz @B |
Line 1051... | Line 1051... | ||
1051 | pop esi |
1051 | pop esi |
1052 | 1052 | ||
1053 | ; save some additional data from COFF file |
1053 | ; save some additional data from COFF file |
1054 | ; later we will use COFF header, headers for sections and symbol table |
1054 | ; later we will use COFF header, headers for sections and symbol table |
1055 | ; and also relocations table for all sections |
1055 | ; and also relocations table for all sections |
1056 | mov edx, [coff] |
1056 | mov edx, [coff] |
1057 | mov ebx, [edx+CFH.pSymTable] |
1057 | mov ebx, [edx+COFF_HEADER.pSymTable] |
1058 | mov edi, dword [fileinfo+32] |
1058 | mov edi, dword [fileinfo+32] |
1059 | sub edi, ebx |
1059 | sub edi, ebx |
1060 | jc .fail_and_free_data |
1060 | jc .fail_and_free_data |
1061 | mov [esi+DLLDESCR.symbols_lim], edi |
1061 | mov [esi+DLLDESCR.symbols_lim], edi |
1062 | add ebx, edx |
1062 | add ebx, edx |
1063 | movzx ecx, [edx+CFH.nSections] |
1063 | movzx ecx, [edx+COFF_HEADER.nSections] |
1064 | lea ecx, [ecx*5] |
1064 | lea ecx, [ecx*5] |
1065 | lea edi, [edi+ecx*8+20] |
1065 | lea edi, [edi+ecx*8+20] |
1066 | add edx, 20 |
1066 | add edx, 20 |
1067 | @@: |
1067 | @@: |
1068 | movzx eax, [edx+CFS.NumReloc] |
1068 | movzx eax, [edx+COFF_SECTION.NumReloc] |
1069 | lea eax, [eax*5] |
1069 | lea eax, [eax*5] |
1070 | lea edi, [edi+eax*2] |
1070 | lea edi, [edi+eax*2] |
1071 | add edx, COFF_SECTION_SIZE |
1071 | add edx, sizeof.COFF_SECTION |
1072 | sub ecx, 5 |
1072 | sub ecx, 5 |
1073 | jnz @b |
1073 | jnz @b |
1074 | stdcall kernel_alloc, edi |
1074 | stdcall kernel_alloc, edi |
1075 | test eax, eax |
1075 | test eax, eax |
1076 | jz .fail_and_free_data |
1076 | jz .fail_and_free_data |
1077 | mov edx, [coff] |
1077 | mov edx, [coff] |
1078 | movzx ecx, [edx+CFH.nSections] |
1078 | movzx ecx, [edx+COFF_HEADER.nSections] |
1079 | lea ecx, [ecx*5] |
1079 | lea ecx, [ecx*5] |
1080 | lea ecx, [ecx*2+5] |
1080 | lea ecx, [ecx*2+5] |
1081 | mov [esi+DLLDESCR.coff_hdr], eax |
1081 | mov [esi+DLLDESCR.coff_hdr], eax |
1082 | push esi |
1082 | push esi |
1083 | mov esi, edx |
1083 | mov esi, edx |
1084 | mov edi, eax |
1084 | mov edi, eax |
1085 | rep movsd |
1085 | rep movsd |
1086 | pop esi |
1086 | pop esi |
1087 | mov [esi+DLLDESCR.symbols_ptr], edi |
1087 | mov [esi+DLLDESCR.symbols_ptr], edi |
1088 | push esi |
1088 | push esi |
1089 | mov ecx, [edx+CFH.nSymbols] |
1089 | mov ecx, [edx+COFF_HEADER.nSymbols] |
1090 | mov [esi+DLLDESCR.symbols_num], ecx |
1090 | mov [esi+DLLDESCR.symbols_num], ecx |
1091 | mov ecx, [esi+DLLDESCR.symbols_lim] |
1091 | mov ecx, [esi+DLLDESCR.symbols_lim] |
1092 | mov esi, ebx |
1092 | mov esi, ebx |
1093 | rep movsb |
1093 | rep movsb |
1094 | pop esi |
1094 | pop esi |
1095 | mov ebx, [esi+DLLDESCR.coff_hdr] |
1095 | mov ebx, [esi+DLLDESCR.coff_hdr] |
1096 | push esi |
1096 | push esi |
1097 | movzx eax, [edx+CFH.nSections] |
1097 | movzx eax, [edx+COFF_HEADER.nSections] |
1098 | lea edx, [ebx+20] |
1098 | lea edx, [ebx+20] |
1099 | @@: |
1099 | @@: |
1100 | movzx ecx, [edx+CFS.NumReloc] |
1100 | movzx ecx, [edx+COFF_SECTION.NumReloc] |
1101 | lea ecx, [ecx*5] |
1101 | lea ecx, [ecx*5] |
1102 | mov esi, [edx+CFS.PtrReloc] |
1102 | mov esi, [edx+COFF_SECTION.PtrReloc] |
1103 | mov [edx+CFS.PtrReloc], edi |
1103 | mov [edx+COFF_SECTION.PtrReloc], edi |
1104 | sub [edx+CFS.PtrReloc], ebx |
1104 | sub [edx+COFF_SECTION.PtrReloc], ebx |
1105 | add esi, [coff] |
1105 | add esi, [coff] |
1106 | shr ecx, 1 |
1106 | shr ecx, 1 |
1107 | rep movsd |
1107 | rep movsd |
1108 | adc ecx, ecx |
1108 | adc ecx, ecx |
1109 | rep movsw |
1109 | rep movsw |
1110 | add edx, COFF_SECTION_SIZE |
1110 | add edx, sizeof.COFF_SECTION |
1111 | dec eax |
1111 | dec eax |
Line 1112... | Line 1112... | ||
1112 | jnz @b |
1112 | jnz @b |
1113 | pop esi |
1113 | pop esi |
1114 | 1114 | ||
1115 | ; fixup symbols |
1115 | ; fixup symbols |
1116 | mov edx, ebx |
1116 | mov edx, ebx |
1117 | mov eax, [ebx+CFH.nSymbols] |
1117 | mov eax, [ebx+COFF_HEADER.nSymbols] |
1118 | add edx, 20 |
1118 | add edx, 20 |
1119 | mov ecx, [esi+DLLDESCR.symbols_num] |
1119 | mov ecx, [esi+DLLDESCR.symbols_num] |
Line 1126... | Line 1126... | ||
1126 | ; test eax, eax |
1126 | ; test eax, eax |
1127 | ; jnz @F |
1127 | ; jnz @F |
1128 | ; |
1128 | ; |
1129 | ;@@: |
1129 | ;@@: |
Line 1130... | Line 1130... | ||
1130 | 1130 | ||
1131 | stdcall get_coff_sym, [esi+DLLDESCR.symbols_ptr], [ebx+CFH.nSymbols], szEXPORTS |
1131 | stdcall get_coff_sym, [esi+DLLDESCR.symbols_ptr], [ebx+COFF_HEADER.nSymbols], szEXPORTS |
1132 | test eax, eax |
1132 | test eax, eax |
Line 1133... | Line 1133... | ||
1133 | jnz @F |
1133 | jnz @F |
1134 | 1134 | ||
1135 | stdcall get_coff_sym, [esi+DLLDESCR.symbols_ptr], [ebx+CFH.nSymbols], sz_EXPORTS |
1135 | stdcall get_coff_sym, [esi+DLLDESCR.symbols_ptr], [ebx+COFF_HEADER.nSymbols], sz_EXPORTS |
Line 1136... | Line 1136... | ||
1136 | @@: |
1136 | @@: |
1137 | mov [esi+DLLDESCR.exports], eax |
1137 | mov [esi+DLLDESCR.exports], eax |
Line 1158... | Line 1158... | ||
1158 | stdcall user_alloc, edi |
1158 | stdcall user_alloc, edi |
1159 | test eax, eax |
1159 | test eax, eax |
1160 | jz .fail_and_dereference |
1160 | jz .fail_and_dereference |
1161 | @@: |
1161 | @@: |
1162 | mov [img_base], eax |
1162 | mov [img_base], eax |
1163 | mov eax, HDLL.sizeof |
1163 | mov eax, sizeof.HDLL |
1164 | call malloc |
1164 | call malloc |
1165 | test eax, eax |
1165 | test eax, eax |
1166 | jz .fail_and_free_user |
1166 | jz .fail_and_free_user |
1167 | mov ebx, [CURRENT_TASK] |
1167 | mov ebx, [CURRENT_TASK] |
1168 | shl ebx, 5 |
1168 | shl ebx, 5 |
Line 1367... | Line 1367... | ||
1367 | align 4 |
1367 | align 4 |
1368 | stop_all_services: |
1368 | stop_all_services: |
1369 | push ebp |
1369 | push ebp |
1370 | mov edx, [srv.fd] |
1370 | mov edx, [srv.fd] |
1371 | .next: |
1371 | .next: |
1372 | cmp edx, srv.fd-SRV_FD_OFFSET |
1372 | cmp edx, srv.fd-SRV.fd |
1373 | je .done |
1373 | je .done |
1374 | cmp [edx+SRV.magic], ' SRV' |
1374 | cmp [edx+SRV.magic], ' SRV' |
1375 | jne .next |
1375 | jne .next |
1376 | cmp [edx+SRV.size], SRV.sizeof |
1376 | cmp [edx+SRV.size], sizeof.SRV |
1377 | jne .next |
1377 | jne .next |
Line 1378... | Line 1378... | ||
1378 | 1378 | ||
1379 | mov ebx, [edx+SRV.entry] |
1379 | mov ebx, [edx+SRV.entry] |
1380 | mov edx, [edx+SRV.fd] |
1380 | mov edx, [edx+SRV.fd] |