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