Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. proc dll.Load, import_table:dword
  3.                 mov     esi,[import_table]
  4.   .next_lib:    mov     edx,[esi]
  5.                 or      edx,edx
  6.                 jz      .exit
  7.                 push    esi
  8.                 mov     esi,[esi+4]
  9.                 mov     edi,s_libdir.fname
  10.             @@: lodsb
  11.                 stosb
  12.                 or      al,al
  13.                 jnz     @b
  14.                 mcall   68,19,s_libdir
  15.                 or      eax,eax
  16.                 jz      .fail
  17.                 stdcall dll.Link,eax,edx
  18.                 push    eax
  19.                 mov     eax, [eax]
  20.                 cmp     dword [eax], 'lib_'
  21.                 pop     eax
  22.                 jnz     @f
  23.                 stdcall dll.Init,[eax+4]
  24.             @@:
  25.                 pop     esi
  26.                 add     esi,8
  27.                 jmp     .next_lib
  28.   .exit:        xor     eax,eax
  29.                 ret
  30.   .fail:        add     esp,4
  31.                 xor     eax,eax
  32.                 inc     eax
  33.                 ret
  34. endp
  35.  
  36. proc dll.Link, exp:dword,imp:dword
  37.                 push    eax
  38.                 mov     esi,[imp]
  39.                 test    esi,esi
  40.                 jz      .done
  41.   .next:        lodsd
  42.                 test    eax,eax
  43.                 jz      .done
  44.                 stdcall dll.GetProcAddress,[exp],eax
  45.                 or      eax,eax
  46.                 jz      @f
  47.                 mov     [esi-4],eax
  48.                 jmp     .next
  49.             @@: mov     dword[esp],0
  50.   .done:        pop     eax
  51.                 ret
  52. endp
  53.  
  54. proc dll.Init, dllentry:dword
  55.                 pushad
  56.                 mov     eax,mem.Alloc
  57.                 mov     ebx,mem.Free
  58.                 mov     ecx,mem.ReAlloc
  59.                 mov     edx,dll.Load
  60.                 stdcall [dllentry]
  61.                 popad
  62.                 ret
  63. endp
  64.  
  65. proc dll.GetProcAddress, exp:dword,sz_name:dword
  66.                 mov     edx,[exp]
  67.                 xor     eax,eax
  68.   .next:        or      edx,edx
  69.                 jz      .end
  70.                 cmp     dword[edx],0
  71.                 jz      .end
  72.                 stdcall strcmp,[edx],[sz_name]
  73.                 test    eax,eax
  74.                 jz      .ok
  75.                 add     edx,8
  76.                 jmp     .next
  77.   .ok:          mov     eax,[edx+4]
  78.   .end:         ret
  79. endp
  80.  
  81. proc strcmp, str1:dword,str2:dword
  82.                 push    esi edi
  83.                 mov     esi,[str1]
  84.                 mov     edi,[str2]
  85.                 xor     eax,eax
  86.             @@: lodsb
  87.                 scasb
  88.                 jne     .fail
  89.                 or      al,al
  90.                 jnz     @b
  91.                 jmp     .ok
  92.   .fail:        or      eax,-1
  93.   .ok:          pop     edi esi
  94.                 ret
  95. endp
  96.  
  97. s_libdir:
  98.   db '/sys/lib/'
  99.   .fname rb 32
  100.