Subversion Repositories Kolibri OS

Rev

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

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