Subversion Repositories Kolibri OS

Rev

Rev 617 | Go to most recent revision | 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.                 stdcall dll.Init,[eax+4]
  19.                 pop     esi
  20.                 add     esi,8
  21.                 jmp     .next_lib
  22.   .exit:        xor     eax,eax
  23.                 ret
  24.   .fail:        add     esp,4
  25.                 xor     eax,eax
  26.                 inc     eax
  27.                 ret
  28. endp
  29.  
  30. proc dll.Link, exp:dword,imp:dword
  31.                 push    eax
  32.                 mov     esi,[imp]
  33.                 test    esi,esi
  34.                 jz      .done
  35.   .next:        lodsd
  36.                 test    eax,eax
  37.                 jz      .done
  38.                 stdcall dll.GetProcAddress,[exp],eax
  39.                 or      eax,eax
  40.                 jz      @f
  41.                 mov     [esi-4],eax
  42.                 jmp     .next
  43.             @@: mov     dword[esp],0
  44.   .done:        pop     eax
  45.                 ret
  46. endp
  47.  
  48. proc dll.Init, dllentry:dword
  49.                 pushad
  50.                 mov     eax,mem.Alloc
  51.                 mov     ebx,mem.Free
  52.                 mov     ecx,mem.ReAlloc
  53.                 mov     edx,dll.Load
  54.                 stdcall [dllentry]
  55.                 popad
  56.                 ret
  57. endp
  58.  
  59. proc dll.GetProcAddress, exp:dword,sz_name:dword
  60.                 mov     edx,[exp]
  61.                 xor     eax,eax
  62.   .next:        or      edx,edx
  63.                 jz      .end
  64.                 cmp     dword[edx],0
  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:
  92.   db '/sys/lib/'
  93.   .fname rb 32
  94.