Subversion Repositories Kolibri OS

Rev

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

  1. //Asper
  2. char a_libdir[43]  = "/sys/lib/\0";
  3.  
  4.  
  5. //proc dll.Load, import_table:dword
  6. int dll_Load(dword import_table)
  7. {
  8.                 $mov     esi, import_table                                
  9.   @next_lib:    $mov     edx, DSDWORD[esi]
  10.                 $or      edx,edx
  11.                 $jz      exit_
  12.                 $push    esi                
  13.                 $mov     esi,DSDWORD[esi+4]
  14.                 $mov     edi,#a_libdir
  15.                
  16.                 $push    edi
  17.                 $push    esi
  18.                 EAX=strlen(#a_libdir);
  19.                 $pop     esi
  20.                 $pop     edi
  21.                 $add     edi, eax //9
  22.                
  23.             @loc01: $lodsb
  24.                 $stosb
  25.                 $or      al,al
  26.                 $jnz     loc01
  27.  
  28.                                 //IntToStr(EBX);
  29.                                 //$push edx    
  30.                                 //WriteDebug(#a_libdir);
  31.                                 //$pop edx
  32.                 //mcall   68,19,a_libdir
  33.                 $mov     eax, 68
  34.                 $mov     ebx, 19
  35.                 $mov     ecx,#a_libdir
  36.                 $int     0x40
  37.                
  38.                 $or      eax,eax
  39.                 $jz      fail
  40.                 //stdcall dll.Link,eax,edx
  41.                 dll_Link(EAX, EDX);
  42.                 $push    eax
  43.                 $mov     eax, DSDWORD [eax]
  44.                 $cmp     DSDWORD [eax], 'lib_'
  45.                 $pop     eax
  46.                 //$jnz     loc02
  47.                                 //IntToStr(EBX);
  48.                                 //$push    eax
  49.                                 //WriteDebug(DSDWORD[EAX]);
  50.                                 //$pop     eax
  51.                 //stdcall dll.Init,[eax+4]
  52.                 //dll_Init(DSDWORD[EAX]); //dll_Init(DSDWORD[EAX+4]);
  53.             @loc02:
  54.                 $pop     esi
  55.                 $add     esi,8
  56.                 $jmp     next_lib
  57.   @exit_:        $xor     eax,eax
  58.                 return 0;
  59.   @fail:        $add     esp,4
  60.                 $xor     eax,eax
  61.                 $inc     eax
  62.                 return -1;
  63. }
  64.  
  65. //proc dll.Link, exp:dword,imp:dword
  66. void dll_Link(dword exp, imp)
  67. {
  68.                 $push    eax
  69.                 $mov     esi, imp
  70.                 $test    esi, esi
  71.                 $jz      done
  72.   @next:        $lodsd
  73.                 $test    eax,eax
  74.                 $jz      done
  75.  
  76.                 //stdcall dll.GetProcAddress,[exp],eax
  77.                 dll_GetProcAddress(exp,EAX);
  78.                 $or      eax,eax
  79.                 $jz      loc03
  80.  
  81.                 $mov     DSDWORD[esi-4],eax
  82.                 $jmp     next
  83.   @loc03:
  84.                 $mov     DSDWORD[esp],0
  85.   @done:        $pop     eax
  86. }
  87.  
  88. //proc dll.Init, dllentry:dword
  89. void dll_Init(dword dllentry)
  90. {
  91.                 $pushad
  92.                 EAX=#mem_Alloc;
  93.                 EBX=#mem_Free;
  94.                 ECX=#mem_ReAlloc;
  95.                 EDX=#dll_Load;
  96.                 DSDWORD [dllentry+4] stdcall ();                
  97.                 $popad
  98. }
  99.  
  100. //proc dll.GetProcAddress, exp:dword,sz_name:dword
  101. dword dll_GetProcAddress(dword exp, sz_name)
  102. {
  103.                 $push esi
  104.                 $mov     edx, exp
  105.                 $xor     eax,eax
  106.   @next:        $or      edx,edx
  107.                 $jz      end_
  108.                 $cmp     edx,0
  109.                 $jz      end_
  110.                 strcmp(DSDWORD[EDX],sz_name);
  111.                 $test    eax,eax
  112.                 $jz      ok
  113.                 $add     edx,8
  114.                 $jmp     next
  115.   @ok:
  116.                 $mov     eax, DSDWORD[edx+4]
  117.   @end_:        
  118.                 $pop  esi
  119.     return EAX;
  120. }
  121.  
  122.  
  123. int load_dll2(dword dllname, import_table, byte need_init)
  124. {
  125.    //dword dllentry=0;
  126. // load DLL
  127.         $mov     eax, 68
  128.         $mov     ebx, 19
  129.         ECX=dllname;
  130.         $int     0x40
  131.         $test    eax, eax
  132.         $jz      exit01
  133.  
  134. // initialize import
  135.         $mov     edx,eax
  136.         ESI=import_table;
  137.  
  138. @import_loop01:
  139.         $lodsd
  140.         $test    eax,eax
  141.         $jz      import_done01
  142.         $push    edx
  143. @import_find01:
  144.         $mov     ebx,DSDWORD[EDX]
  145.         $test    ebx, ebx
  146.         $jz      exit01
  147.         $push    eax
  148. @nex101:
  149.         $mov     cl,DSBYTE[EAX];
  150.         $cmp     cl,DSBYTE[EBX];
  151.         $jnz     import_find_next01
  152.         $test    cl,cl
  153.         $jz      import_found01
  154.         $inc     eax
  155.         $inc     ebx
  156.         $jmp     nex101
  157. @import_find_next01:
  158.         $pop     eax
  159.         $add     edx, 8
  160.         $jmp     import_find01
  161. @import_found01:
  162.         $pop     eax
  163.         $mov     eax,DSDWORD[edx+4]
  164.         $mov     DSDWORD[esi-4],eax
  165.         $pop     edx
  166.        
  167.         $jmp     import_loop01
  168. @import_done01:
  169.         IF (need_init) dll_Init(EDX);
  170.         return 0;
  171. @exit01:
  172.         return -1;
  173. }
  174.