Subversion Repositories Kolibri OS

Rev

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

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