Subversion Repositories Kolibri OS

Rev

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/.obj'
-
 
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: