Subversion Repositories Kolibri OS

Rev

Rev 519 | Rev 529 | 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.     __#name#_library_name__ db fname,0
  19. }
  20.  
  21. macro import lname,[name,sname]
  22. {
  23.   common
  24.     align 4
  25.     __#lname#_library_table__:
  26.   forward
  27.     name dd __#name#_import_name__
  28.   common
  29.     dd 0
  30.   forward
  31.     __#name#_import_name__ db sname,0
  32. }
  33.  
  34. macro export [name,sname]
  35. {
  36. align 4
  37.   forward
  38.     dd __#name#_export_name__,name
  39.   common
  40.     dd 0
  41.   forward
  42.     __#name#_export_name__ db sname,0
  43. }
  44.  
  45.  
  46.  
  47. align 4            ; çàãðóçêà áèáëèîòåêè ñ óñëîâèåì, ÷òî áóäèò èñïîëüçûâàòüñÿ èç ÿäðà
  48. proc load_k_library stdcall, file_name:dword
  49.            locals
  50.              coff      dd ?
  51.              sym       dd ?
  52.              strings   dd ?
  53.              img_size  dd ?
  54.              img_base  dd ?
  55.              exports   dd ?
  56.            endl
  57.  
  58.                    cli
  59.  
  60.            stdcall load_file, [file_name]
  61.            test eax, eax
  62.            jz .fail
  63.  
  64.            mov [coff], eax
  65.            movzx ecx, [eax+CFH.nSections]
  66.            xor ebx, ebx
  67.  
  68.            lea edx, [eax+20]
  69. @@:
  70.            add ebx, [edx+CFS.SizeOfRawData]
  71.            add ebx, 15
  72.            and ebx, not 15
  73.            add edx, COFF_SECTION_SIZE
  74.            dec ecx
  75.            jnz @B
  76.            mov [img_size], ebx
  77.  
  78.            stdcall kernel_alloc, [img_size]
  79.  
  80.            test eax, eax
  81.            jz .fail
  82.            mov [img_base], eax
  83.  
  84.            mov edx, [coff]
  85.            movzx ebx, [edx+CFH.nSections]
  86.            mov edi, [img_base]
  87.            lea eax, [edx+20]
  88. @@:
  89.            mov [eax+CFS.VirtualAddress], edi
  90.            mov esi, [eax+CFS.PtrRawData]
  91.            test esi, esi
  92.            jnz .copy
  93.            add edi, [eax+CFS.SizeOfRawData]
  94.            jmp .next
  95. .copy:
  96.            add esi, edx
  97.            mov ecx, [eax+CFS.SizeOfRawData]
  98.            cld
  99.            rep movsb
  100. .next:
  101.            add edi, 15
  102.            and edi, not 15
  103.            add eax, COFF_SECTION_SIZE
  104.            dec ebx
  105.            jnz @B
  106.  
  107.            mov ebx, [edx+CFH.pSymTable]
  108.            add ebx, edx
  109.            mov [sym], ebx
  110.            mov ecx, [edx+CFH.nSymbols]
  111.            add ecx,ecx
  112.            lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
  113.            add ecx, [sym]
  114.            mov [strings], ecx
  115.  
  116.            lea eax, [edx+20]
  117.  
  118.            stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
  119.                                      [strings], dword 0
  120.            test eax, eax
  121.            jnz @F
  122.  
  123. @@:
  124.            mov edx, [coff]
  125.            movzx ebx, [edx+CFH.nSections]
  126.            mov edi, 0
  127.            lea eax, [edx+20]
  128. @@:
  129.            add [eax+CFS.VirtualAddress], edi  ;patch user space offset
  130.            add eax, COFF_SECTION_SIZE
  131.            dec ebx
  132.            jnz @B
  133.  
  134.            add edx, 20
  135.            stdcall fix_coff_relocs, [coff], edx, [sym]
  136.  
  137.            mov ebx, [coff]
  138.            stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
  139.            mov [exports], eax
  140.  
  141.            stdcall kernel_free, [coff]
  142.  
  143.            mov eax, [exports]
  144.            ret
  145. .fail:
  146.            xor eax, eax
  147.            ret
  148. endp
  149.  
  150.  
  151. proc dll.Load, import_table:dword
  152.                 mov     esi,[import_table]
  153.   .next_lib:    mov     edx,[esi]
  154.                 or      edx,edx
  155.                 jz      .exit
  156.                 push    esi
  157.  
  158.                 mov     edi,s_libname
  159.  
  160.                 mov     al, '/'
  161.                 stosb
  162.                 mov esi,sysdir_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 strncmp,[edx],[sz_name], dword -1
  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. uglobal
  310. s_libname  db 64 dup (0)
  311. endg
  312.