Rev 188 | Rev 202 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 188 | Rev 198 | ||
---|---|---|---|
Line 541... | Line 541... | ||
541 | align 4 |
541 | align 4 |
542 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
542 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
Line 543... | Line 543... | ||
543 | 543 | ||
544 | .look_up: |
544 | .look_up: |
- | 545 | mov edx, [imports] |
|
- | 546 | test edx, edx |
|
545 | mov edx, [imports] |
547 | jz .end |
546 | mov edx, [edx] |
548 | mov edx, [edx] |
547 | test edx, edx |
549 | test edx, edx |
548 | jz .end |
550 | jz .end |
549 | .next: |
551 | .next: |
Line 804... | Line 806... | ||
804 | .fail: |
806 | .fail: |
805 | xor eax, eax |
807 | xor eax, eax |
806 | ret |
808 | ret |
807 | endp |
809 | endp |
Line -... | Line 810... | ||
- | 810 | ||
- | 811 | align 4 |
|
- | 812 | proc load_library stdcall, file_name:dword |
|
- | 813 | locals |
|
- | 814 | coff dd ? |
|
- | 815 | sym dd ? |
|
- | 816 | strings dd ? |
|
- | 817 | img_size dd ? |
|
- | 818 | img_base dd ? |
|
- | 819 | exports dd ? |
|
- | 820 | endl |
|
- | 821 | ||
- | 822 | cli |
|
- | 823 | ||
- | 824 | stdcall load_file, [file_name] |
|
- | 825 | ||
- | 826 | test eax, eax |
|
- | 827 | jz .fail |
|
- | 828 | ||
- | 829 | mov [coff], eax |
|
- | 830 | movzx ecx, [eax+CFH.nSections] |
|
- | 831 | xor ebx, ebx |
|
- | 832 | ||
- | 833 | lea edx, [eax+20] |
|
- | 834 | @@: |
|
- | 835 | add ebx, [edx+CFS.SizeOfRawData] |
|
- | 836 | add ebx, 15 |
|
- | 837 | and ebx, not 15 |
|
- | 838 | add edx, 18 |
|
- | 839 | dec ecx |
|
- | 840 | jnz @B |
|
- | 841 | mov [img_size], ebx |
|
- | 842 | ||
- | 843 | call init_heap |
|
- | 844 | stdcall user_alloc, [img_size] |
|
- | 845 | ||
- | 846 | test eax, eax |
|
- | 847 | jz .fail |
|
- | 848 | mov [img_base], eax |
|
- | 849 | ||
- | 850 | mov edx, [coff] |
|
- | 851 | movzx ebx, [edx+CFH.nSections] |
|
- | 852 | mov edi, [img_base] |
|
- | 853 | lea eax, [edx+20] |
|
- | 854 | @@: |
|
- | 855 | mov [eax+CFS.VirtualAddress], edi |
|
- | 856 | mov esi, [eax+CFS.PtrRawData] |
|
- | 857 | test esi, esi |
|
- | 858 | jnz .copy |
|
- | 859 | add edi, [eax+CFS.SizeOfRawData] |
|
- | 860 | jmp .next |
|
- | 861 | .copy: |
|
- | 862 | add esi, edx |
|
- | 863 | add edi, new_app_base |
|
- | 864 | mov ecx, [eax+CFS.SizeOfRawData] |
|
- | 865 | cld |
|
- | 866 | rep movsb |
|
- | 867 | .next: |
|
- | 868 | add edi, 15-new_app_base |
|
- | 869 | and edi, not 15 |
|
- | 870 | add eax, 40 |
|
- | 871 | dec ebx |
|
- | 872 | jnz @B |
|
- | 873 | ||
- | 874 | mov ebx, [edx+CFH.pSymTable] |
|
- | 875 | add ebx, edx |
|
- | 876 | mov [sym], ebx |
|
- | 877 | mov ecx, [edx+CFH.nSymbols] |
|
- | 878 | add ecx,ecx |
|
- | 879 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
|
- | 880 | add ecx, [sym] |
|
- | 881 | mov [strings], ecx |
|
- | 882 | ||
- | 883 | lea eax, [edx+20] |
|
- | 884 | ||
- | 885 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
|
- | 886 | [strings], dword 0 |
|
- | 887 | test eax, eax |
|
- | 888 | jnz @F |
|
- | 889 | ||
- | 890 | @@: |
|
- | 891 | mov edx, [coff] |
|
- | 892 | movzx ebx, [edx+CFH.nSections] |
|
- | 893 | mov edi, new_app_base |
|
- | 894 | lea eax, [edx+20] |
|
- | 895 | @@: |
|
- | 896 | add [eax+CFS.VirtualAddress], edi ;patch user space offset |
|
- | 897 | add eax, 40 |
|
- | 898 | dec ebx |
|
- | 899 | jnz @B |
|
- | 900 | ||
- | 901 | add edx, 20 |
|
- | 902 | stdcall fix_coff_relocs, [coff], edx, [sym] |
|
- | 903 | ||
- | 904 | mov ebx, [coff] |
|
- | 905 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS |
|
- | 906 | mov [exports], eax |
|
- | 907 | ||
- | 908 | stdcall kernel_free, [coff] |
|
- | 909 | mov eax, [exports] |
|
- | 910 | ret |
|
- | 911 | .fail: |
|
- | 912 | xor eax, eax |
|
- | 913 | ret |
|
- | 914 | endp |
|
- | 915 | ||
808 | 916 | ||
809 | drv_sound db '/rd/1/unisound.obj', 0 |
917 | drv_sound db '/rd/1/unisound.obj', 0 |
Line 810... | Line 918... | ||
810 | drv_infinity db '/rd/1/infinity.obj', 0 |
918 | drv_infinity db '/rd/1/infinity.obj', 0 |
811 | 919 |