Subversion Repositories Kolibri OS

Rev

Rev 529 | Rev 535 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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