Subversion Repositories Kolibri OS

Rev

Rev 1161 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. ;============================================================================
  9. ;
  10. ;   External kernel dependencies (libraries) loading
  11. ;
  12. ;============================================================================
  13.  
  14. $Revision: 1206 $
  15.  
  16.  
  17. macro library [name,fname]
  18. {
  19.   forward
  20.     dd __#name#_library_table__,__#name#_library_name__
  21.   common
  22.     dd 0
  23.   forward
  24.     __#name#_library_name__ db fname,0
  25. }
  26.  
  27. macro import lname,[name,sname]
  28. {
  29.   common
  30.     align 4
  31.     __#lname#_library_table__:
  32.   forward
  33.     name dd __#name#_import_name__
  34.   common
  35.     dd 0
  36.   forward
  37.     __#name#_import_name__ db sname,0
  38. }
  39.  
  40. macro export [name,sname]
  41. {
  42. align 4
  43.   forward
  44.     dd __#name#_export_name__,name
  45.   common
  46.     dd 0
  47.   forward
  48.     __#name#_export_name__ db sname,0
  49. }
  50.  
  51.  
  52.  
  53. align 4            ; loading library (use kernel functions)
  54. proc load_k_library stdcall, file_name:dword
  55.            locals
  56.              coff      dd ?
  57.              sym       dd ?
  58.              strings   dd ?
  59.              img_size  dd ?
  60.              img_base  dd ?
  61.              exports   dd ?
  62.            endl
  63.  
  64.                    cli
  65.  
  66.            stdcall load_file, [file_name]
  67.            test eax, eax
  68.            jz .fail
  69.  
  70.            mov [coff], eax
  71.            movzx ecx, [eax+CFH.nSections]
  72.            xor ebx, ebx
  73.  
  74.            lea edx, [eax+20]
  75. @@:
  76.            add ebx, [edx+CFS.SizeOfRawData]
  77.            add ebx, 15
  78.            and ebx, not 15
  79.            add edx, COFF_SECTION_SIZE
  80.            dec ecx
  81.            jnz @B
  82.            mov [img_size], ebx
  83.  
  84.            stdcall kernel_alloc, [img_size]
  85.  
  86.            test eax, eax
  87.            jz .fail
  88.            mov [img_base], eax
  89.  
  90.            mov edx, [coff]
  91.            movzx ebx, [edx+CFH.nSections]
  92.            mov edi, [img_base]
  93.            lea eax, [edx+20]
  94. @@:
  95.            mov [eax+CFS.VirtualAddress], edi
  96.            mov esi, [eax+CFS.PtrRawData]
  97.            test esi, esi
  98.            jnz .copy
  99.            add edi, [eax+CFS.SizeOfRawData]
  100.            jmp .next
  101. .copy:
  102.            add esi, edx
  103.            mov ecx, [eax+CFS.SizeOfRawData]
  104.            cld
  105.            rep movsb
  106. .next:
  107.            add edi, 15
  108.            and edi, not 15
  109.            add eax, COFF_SECTION_SIZE
  110.            dec ebx
  111.            jnz @B
  112.  
  113.            mov ebx, [edx+CFH.pSymTable]
  114.            add ebx, edx
  115.            mov [sym], ebx
  116.            mov ecx, [edx+CFH.nSymbols]
  117.            add ecx,ecx
  118.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  119.            add ecx, [sym]
  120.            mov [strings], ecx
  121.  
  122.            lea eax, [edx+20]
  123.  
  124.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  125.                                      [strings], dword 0
  126.            test eax, eax
  127.            jnz @F
  128.  
  129. @@:
  130.            mov edx, [coff]
  131.            movzx ebx, [edx+CFH.nSections]
  132.            mov edi, 0
  133.            lea eax, [edx+20]
  134. @@:
  135.            add [eax+CFS.VirtualAddress], edi  ;patch user space offset
  136.            add eax, COFF_SECTION_SIZE
  137.            dec ebx
  138.            jnz @B
  139.  
  140.            add edx, 20
  141.            stdcall fix_coff_relocs, [coff], edx, [sym]
  142.  
  143.            mov ebx, [coff]
  144.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
  145.            mov [exports], eax
  146.  
  147.            stdcall kernel_free, [coff]
  148.  
  149.            mov eax, [exports]
  150.            ret
  151. .fail:
  152.            xor eax, eax
  153.            ret
  154. endp
  155.  
  156.  
  157. proc dll.Load, import_table:dword
  158.                 mov     esi,[import_table]
  159.   .next_lib:    mov     edx,[esi]
  160.                 or      edx,edx
  161.                 jz      .exit
  162.                 push    esi
  163.  
  164.                 mov     edi,s_libname
  165.  
  166.                 mov     al, '/'
  167.                 stosb
  168.                 mov esi,sysdir_path
  169.             @@: lodsb
  170.                 stosb
  171.                 or      al,al
  172.                 jnz     @b
  173.                 dec edi
  174.                 mov [edi], dword '/lib'
  175.                 mov [edi+4],byte '/'
  176.                 add edi,5
  177.                 pop esi
  178.                 push esi
  179.                 mov     esi,[esi+4]
  180.             @@: lodsb
  181.                 stosb
  182.                 or      al,al
  183.                 jnz     @b
  184.  
  185.                 pushad
  186.                 stdcall load_k_library,s_libname
  187.                 mov [esp+28],eax
  188.                 popad
  189.                 or      eax,eax
  190.                 jz      .fail
  191.                 stdcall dll.Link,eax,edx
  192.                 stdcall dll.Init,[eax+4]
  193.                 pop     esi
  194.                 add     esi,8
  195.                 jmp     .next_lib
  196.   .exit:        xor     eax,eax
  197.                 ret
  198.   .fail:        add     esp,4
  199.                 xor     eax,eax
  200.                 inc     eax
  201.                 ret
  202. endp
  203.  
  204. proc dll.Link, exp:dword,imp:dword
  205.                 push    eax
  206.                 mov     esi,[imp]
  207.                 test    esi,esi
  208.                 jz      .done
  209.   .next:        lodsd
  210.                 test    eax,eax
  211.                 jz      .done
  212.                 stdcall dll.GetProcAddress,[exp],eax
  213.                 or      eax,eax
  214.                 jz      @f
  215.                 mov     [esi-4],eax
  216.                 jmp     .next
  217.             @@: mov     dword[esp],0
  218.   .done:        pop     eax
  219.                 ret
  220. endp
  221.  
  222. proc dll.Init, dllentry:dword
  223.                 pushad
  224.                 mov     eax,mem.Alloc
  225.                 mov     ebx,mem.Free
  226.                 mov     ecx,mem.ReAlloc
  227.                 mov     edx,dll.Load
  228.                 stdcall [dllentry]
  229.                 popad
  230.                 ret
  231. endp
  232.  
  233. proc dll.GetProcAddress, exp:dword,sz_name:dword
  234.                 mov     edx,[exp]
  235.   .next:        test    edx,edx
  236.                 jz      .end
  237.                 stdcall strncmp,[edx],[sz_name], dword -1
  238.                 test    eax,eax
  239.                 jz      .ok
  240.                 add     edx,8
  241.                 jmp     .next
  242.   .ok:          mov     eax,[edx+4]
  243.   .end:         ret
  244. endp
  245.  
  246. ;-----------------------------------------------------------------------------
  247. proc mem.Alloc size ;/////////////////////////////////////////////////////////
  248. ;-----------------------------------------------------------------------------
  249.         push    ebx ecx
  250. ;       mov     eax,[size]
  251. ;       lea     ecx,[eax+4+4095]
  252. ;       and     ecx,not 4095
  253. ;       stdcall kernel_alloc, ecx
  254. ;       add     ecx,-4
  255. ;       mov     [eax],ecx
  256. ;       add     eax,4
  257.  
  258.         stdcall kernel_alloc, [size]
  259.  
  260.         pop     ecx ebx
  261.         ret
  262. endp
  263.  
  264. ;-----------------------------------------------------------------------------
  265. proc mem.ReAlloc mptr,size;///////////////////////////////////////////////////
  266. ;-----------------------------------------------------------------------------
  267.         push    ebx ecx esi edi eax
  268.         mov     eax,[mptr]
  269.         mov     ebx,[size]
  270.         or      eax,eax
  271.         jz      @f
  272.         lea     ecx,[ebx+4+4095]
  273.         and     ecx,not 4095
  274.         add     ecx,-4
  275.         cmp     ecx,[eax-4]
  276.         je      .exit
  277.     @@: mov     eax,ebx
  278.         call    mem.Alloc
  279.         xchg    eax,[esp]
  280.         or      eax,eax
  281.         jz      .exit
  282.         mov     esi,eax
  283.         xchg    eax,[esp]
  284.         mov     edi,eax
  285.         mov     ecx,[esi-4]
  286.         cmp     ecx,[edi-4]
  287.         jbe     @f
  288.         mov     ecx,[edi-4]
  289.     @@: add     ecx,3
  290.         shr     ecx,2
  291.         cld
  292.         rep     movsd
  293.         xchg    eax,[esp]
  294.         call    mem.Free
  295.   .exit:
  296.         pop     eax edi esi ecx ebx
  297.         ret
  298. endp
  299.  
  300. ;-----------------------------------------------------------------------------
  301. proc mem.Free mptr ;//////////////////////////////////////////////////////////
  302. ;-----------------------------------------------------------------------------
  303. ;       mov     eax,[mptr]
  304. ;       or      eax,eax
  305. ;       jz      @f
  306. ;       push    ebx ecx
  307. ;       lea     ecx,[eax-4]
  308. ;       stdcall kernel_free, ecx
  309. ;       pop     ecx ebx
  310. ;    @@: ret
  311.         stdcall kernel_free, [mptr]
  312.         ret
  313. endp
  314.  
  315. uglobal
  316. s_libname  db 64 dup (0)
  317. endg
  318.