Rev 5039 | Rev 5130 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5039 | Rev 5088 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. 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: 5039 $ |
8 | $Revision: 5088 $ |
9 | 9 | ||
Line 207... | Line 207... | ||
207 | cmp edx, srv.fd-SRV.fd |
207 | cmp edx, srv.fd-SRV.fd |
208 | je .not_load |
208 | je .not_load |
Line 209... | Line 209... | ||
209 | 209 | ||
210 | stdcall strncmp, edx, [sz_name], 16 |
210 | stdcall strncmp, edx, [sz_name], 16 |
- | 211 | test eax, eax |
|
211 | test eax, eax |
212 | mov eax, edx |
Line 212... | Line 213... | ||
212 | je .ok |
213 | je .nothing |
213 | 214 | ||
214 | mov edx, [edx+SRV.fd] |
215 | mov edx, [edx+SRV.fd] |
215 | jmp @B |
216 | jmp @B |
216 | .not_load: |
- | |
217 | mov eax, [sz_name] |
217 | .not_load: |
218 | ; Try to load .dll driver first. If not, fallback to .obj. |
218 | mov eax, [sz_name] |
219 | push edi |
219 | push edi |
220 | sub esp, 36 |
220 | sub esp, 36 |
221 | mov edi, esp |
221 | mov edi, esp |
Line 234... | Line 234... | ||
234 | mov byte [edi+16], 0 |
234 | mov byte [edi+16], 0 |
235 | mov edi, esp |
235 | mov edi, esp |
236 | stdcall load_pe_driver, edi, 0 |
236 | stdcall load_pe_driver, edi, 0 |
237 | add esp, 36 |
237 | add esp, 36 |
238 | pop edi |
238 | pop edi |
239 | test eax, eax |
- | |
240 | jnz .nothing |
- | |
241 | pop ebp |
- | |
242 | jmp load_driver |
- | |
243 | .ok: |
- | |
244 | mov eax, edx |
- | |
245 | .nothing: |
239 | .nothing: |
246 | ret |
240 | ret |
247 | endp |
241 | endp |
Line 248... | Line 242... | ||
248 | 242 | ||
Line 878... | Line 872... | ||
878 | jnz .fix_sec |
872 | jnz .fix_sec |
879 | .exit: |
873 | .exit: |
880 | ret |
874 | ret |
881 | endp |
875 | endp |
Line 882... | Line -... | ||
882 | - | ||
883 | align 4 |
- | |
884 | proc load_driver stdcall, driver_name:dword |
- | |
885 | locals |
- | |
886 | coff dd ? |
- | |
887 | sym dd ? |
- | |
888 | strings dd ? |
- | |
889 | img_size dd ? |
- | |
890 | img_base dd ? |
- | |
891 | start dd ? |
- | |
892 | - | ||
893 | file_name rb 13+16+4+1 ; '/sys/drivers/ |
- | |
894 | endl |
- | |
895 | - | ||
896 | lea edx, [file_name] |
- | |
897 | mov dword [edx], '/sys' |
- | |
898 | mov dword [edx+4], '/dri' |
- | |
899 | mov dword [edx+8], 'vers' |
- | |
900 | mov byte [edx+12], '/' |
- | |
901 | mov esi, [driver_name] |
- | |
902 | .redo: |
- | |
903 | lea edx, [file_name] |
- | |
904 | lea edi, [edx+13] |
- | |
905 | mov ecx, 16 |
- | |
906 | @@: |
- | |
907 | lodsb |
- | |
908 | test al, al |
- | |
909 | jz @f |
- | |
910 | stosb |
- | |
911 | loop @b |
- | |
912 | @@: |
- | |
913 | mov dword [edi], '.obj' |
- | |
914 | mov byte [edi+4], 0 |
- | |
915 | stdcall load_file, edx |
- | |
916 | - | ||
917 | test eax, eax |
- | |
918 | jz .exit |
- | |
919 | - | ||
920 | lea edx, [file_name] |
- | |
921 | DEBUGF 1,'K : driver %s is COFF, deprecated\n',edx |
- | |
922 | mov [coff], eax |
- | |
923 | - | ||
924 | movzx ecx, [eax+COFF_HEADER.nSections] |
- | |
925 | xor ebx, ebx |
- | |
926 | - | ||
927 | lea edx, [eax+20] |
- | |
928 | @@: |
- | |
929 | add ebx, [edx+COFF_SECTION.SizeOfRawData] |
- | |
930 | add ebx, 15 |
- | |
931 | and ebx, not 15 |
- | |
932 | add edx, sizeof.COFF_SECTION |
- | |
933 | dec ecx |
- | |
934 | jnz @B |
- | |
935 | mov [img_size], ebx |
- | |
936 | - | ||
937 | stdcall kernel_alloc, ebx |
- | |
938 | test eax, eax |
- | |
939 | jz .fail |
- | |
940 | mov [img_base], eax |
- | |
941 | - | ||
942 | mov edi, eax |
- | |
943 | xor eax, eax |
- | |
944 | mov ecx, [img_size] |
- | |
945 | add ecx, 4095 |
- | |
946 | and ecx, not 4095 |
- | |
947 | shr ecx, 2 |
- | |
948 | cld |
- | |
949 | rep stosd |
- | |
950 | - | ||
951 | mov edx, [coff] |
- | |
952 | movzx ebx, [edx+COFF_HEADER.nSections] |
- | |
953 | mov edi, [img_base] |
- | |
954 | lea eax, [edx+20] |
- | |
955 | @@: |
- | |
956 | mov [eax+COFF_SECTION.VirtualAddress], edi |
- | |
957 | mov esi, [eax+COFF_SECTION.PtrRawData] |
- | |
958 | test esi, esi |
- | |
959 | jnz .copy |
- | |
960 | add edi, [eax+COFF_SECTION.SizeOfRawData] |
- | |
961 | jmp .next |
- | |
962 | .copy: |
- | |
963 | add esi, edx |
- | |
964 | mov ecx, [eax+COFF_SECTION.SizeOfRawData] |
- | |
965 | cld |
- | |
966 | rep movsb |
- | |
967 | .next: |
- | |
968 | add edi, 15 |
- | |
969 | and edi, not 15 |
- | |
970 | add eax, sizeof.COFF_SECTION |
- | |
971 | dec ebx |
- | |
972 | jnz @B |
- | |
973 | - | ||
974 | mov ebx, [edx+COFF_HEADER.pSymTable] |
- | |
975 | add ebx, edx |
- | |
976 | mov [sym], ebx |
- | |
977 | mov ecx, [edx+COFF_HEADER.nSymbols] |
- | |
978 | add ecx, ecx |
- | |
979 | lea ecx, [ecx+ecx*8];ecx*=18 = nSymbols*CSYM_SIZE |
- | |
980 | add ecx, [sym] |
- | |
981 | mov [strings], ecx |
- | |
982 | - | ||
983 | lea eax, [edx+20] |
- | |
984 | - | ||
985 | stdcall fix_coff_symbols, eax, [sym], [edx+COFF_HEADER.nSymbols], \ |
- | |
986 | [strings], __exports |
- | |
987 | test eax, eax |
- | |
988 | jz .link_fail |
- | |
989 | - | ||
990 | mov ebx, [coff] |
- | |
991 | stdcall fix_coff_relocs, ebx, [sym], 0 |
- | |
992 | - | ||
993 | stdcall get_coff_sym, [sym], [ebx+COFF_HEADER.nSymbols], szVersion |
- | |
994 | test eax, eax |
- | |
995 | jz .link_fail |
- | |
996 | - | ||
997 | mov eax, [eax] |
- | |
998 | shr eax, 16 |
- | |
999 | cmp eax, DRV_COMPAT |
- | |
1000 | jb .ver_fail |
- | |
1001 | - | ||
1002 | cmp eax, DRV_CURRENT |
- | |
1003 | ja .ver_fail |
- | |
1004 | - | ||
1005 | mov ebx, [coff] |
- | |
1006 | stdcall get_coff_sym, [sym], [ebx+COFF_HEADER.nSymbols], szSTART |
- | |
1007 | mov [start], eax |
- | |
1008 | - | ||
1009 | stdcall kernel_free, [coff] |
- | |
1010 | - | ||
1011 | mov ebx, [start] |
- | |
1012 | stdcall ebx, DRV_ENTRY |
- | |
1013 | test eax, eax |
- | |
1014 | jnz .ok |
- | |
1015 | - | ||
1016 | stdcall kernel_free, [img_base] |
- | |
1017 | - | ||
1018 | xor eax, eax |
- | |
1019 | ret |
- | |
1020 | .ok: |
- | |
1021 | mov ebx, [img_base] |
- | |
1022 | mov [eax+SRV.base], ebx |
- | |
1023 | mov ecx, [start] |
- | |
1024 | mov [eax+SRV.entry], ecx |
- | |
1025 | ret |
- | |
1026 | - | ||
1027 | .ver_fail: |
- | |
1028 | mov esi, msg_CR |
- | |
1029 | call sys_msg_board_str |
- | |
1030 | mov esi, [driver_name] |
- | |
1031 | call sys_msg_board_str |
- | |
1032 | mov esi, msg_CR |
- | |
1033 | call sys_msg_board_str |
- | |
1034 | mov esi, msg_version |
- | |
1035 | call sys_msg_board_str |
- | |
1036 | mov esi, msg_www |
- | |
1037 | call sys_msg_board_str |
- | |
1038 | jmp .cleanup |
- | |
1039 | - | ||
1040 | .link_fail: |
- | |
1041 | mov esi, msg_module |
- | |
1042 | call sys_msg_board_str |
- | |
1043 | mov esi, [driver_name] |
- | |
1044 | call sys_msg_board_str |
- | |
1045 | mov esi, msg_CR |
- | |
1046 | call sys_msg_board_str |
- | |
1047 | .cleanup: |
- | |
1048 | stdcall kernel_free, [img_base] |
- | |
1049 | .fail: |
- | |
1050 | stdcall kernel_free, [coff] |
- | |
1051 | .exit: |
- | |
1052 | xor eax, eax |
- | |
1053 | ret |
- | |
1054 | endp |
- | |
1055 | 876 | ||
1056 | ; in: edx -> COFF_SECTION struct |
877 | ; in: edx -> COFF_SECTION struct |
1057 | ; out: eax = alignment as mask for bits to drop |
878 | ; out: eax = alignment as mask for bits to drop |
1058 | coff_get_align: |
879 | coff_get_align: |
1059 | ; Rules: |
880 | ; Rules: |