Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 4421 $
  9.  
  10. include 'export.inc'
  11.  
  12. align 4
  13.  
  14. proc load_PE stdcall, file_name:dword
  15.            locals
  16.              image  dd ?
  17.              entry  dd ?
  18.              base   dd ?
  19.            endl
  20.  
  21.         stdcall load_file, [file_name]
  22.         test    eax, eax
  23.         jz      .fail
  24.  
  25.         mov     [image], eax
  26.  
  27.         mov     edx, [eax+60]
  28.  
  29.         stdcall kernel_alloc, [eax+80+edx]
  30.         test    eax, eax
  31.         jz      .cleanup
  32.  
  33.         mov     [base], eax
  34.  
  35.         stdcall map_PE, eax, [image]
  36.  
  37.         mov     [entry], eax
  38.         test    eax, eax
  39.         jnz     .cleanup
  40.  
  41.         stdcall kernel_free, [base]
  42. .cleanup:
  43.         stdcall kernel_free, [image]
  44.         mov     eax, [entry]
  45.         ret
  46. .fail:
  47.         xor     eax, eax
  48.         ret
  49. endp
  50.  
  51. DWORD equ dword
  52. PTR   equ
  53.  
  54. align 4
  55. map_PE:                    ;stdcall base:dword, image:dword
  56.         cld
  57.         push    ebp
  58.         push    edi
  59.         push    esi
  60.         push    ebx
  61.         sub     esp, 60
  62.         mov     ebx, DWORD PTR [esp+84]
  63.         mov     ebp, DWORD PTR [esp+80]
  64.         mov     edx, ebx
  65.         mov     esi, ebx
  66.         add     edx, DWORD PTR [ebx+60]
  67.         mov     edi, ebp
  68.         mov     DWORD PTR [esp+32], edx
  69.         mov     ecx, DWORD PTR [edx+84]
  70.  
  71.         shr     ecx, 2
  72.         rep movsd
  73.  
  74.         movzx   eax, WORD PTR [edx+6]
  75.         mov     DWORD PTR [esp+36], 0
  76.         mov     DWORD PTR [esp+16], eax
  77.         jmp     L2
  78. L3:
  79.         mov     eax, DWORD PTR [edx+264]
  80.         test    eax, eax
  81.         je      L4
  82.         mov     esi, ebx
  83.         mov     edi, ebp
  84.         add     esi, DWORD PTR [edx+268]
  85.         mov     ecx, eax
  86.         add     edi, DWORD PTR [edx+260]
  87.  
  88.         add     ecx, 3
  89.         shr     ecx, 2
  90.         rep movsd
  91.  
  92. L4:
  93.         mov     ecx, DWORD PTR [edx+256]
  94.         cmp     ecx, eax
  95.         jbe     L6
  96.         sub     ecx, eax
  97.         add     eax, DWORD PTR [edx+260]
  98.         lea     edi, [eax+ebp]
  99.  
  100.         xor     eax, eax
  101.         rep stosb
  102.  
  103. L6:
  104.         inc     DWORD PTR [esp+36]
  105.         add     edx, 40
  106. L2:
  107.         mov     esi, DWORD PTR [esp+16]
  108.         cmp     DWORD PTR [esp+36], esi
  109.         jne     L3
  110.         mov     edi, DWORD PTR [esp+32]
  111.         cmp     DWORD PTR [edi+164], 0
  112.         je      L9
  113.         pushd   [edi+164]
  114.         mov     esi, ebp
  115.         mov     ecx, ebp
  116.         sub     esi, DWORD PTR [edi+52]
  117.         add     ecx, DWORD PTR [edi+160]
  118.         mov     eax, esi
  119.         shr     eax, 16
  120.         mov     DWORD PTR [esp+16], eax
  121. L12:
  122.         mov     eax, [ecx+4]
  123.         sub     [esp], eax
  124.         lea     ebx, [eax-8]
  125.         xor     edi, edi
  126.         shr     ebx, 1
  127.         jmp     L13
  128. L14:
  129.         movzx   eax, WORD PTR [ecx+8+edi*2]
  130.         mov     edx, eax
  131.         shr     eax, 12
  132.         and     edx, 4095
  133.         add     edx, DWORD PTR [ecx]
  134.         cmp     ax, 2
  135.         je      L17
  136.         cmp     ax, 3
  137.         je      L18
  138.         dec     ax
  139.         jne     L15
  140.         mov     eax, DWORD PTR [esp+16]
  141.         add     WORD PTR [edx+ebp], ax
  142. L17:
  143.         add     WORD PTR [edx+ebp], si
  144. L18:
  145.         add     DWORD PTR [edx+ebp], esi
  146. L15:
  147.         inc     edi
  148. L13:
  149.         cmp     edi, ebx
  150.         jne     L14
  151.         add     ecx, DWORD PTR [ecx+4]
  152. L11:
  153.         cmp     dword [esp], 0
  154.         jg      L12
  155.         pop     eax
  156. L9:
  157.         mov     edx, DWORD PTR [esp+32]
  158.         cmp     DWORD PTR [edx+132], 0
  159.         je      L20
  160.         mov     eax, ebp
  161.         add     eax, DWORD PTR [edx+128]
  162.         mov     DWORD PTR [esp+40], 0
  163.         add     eax, 20
  164.         mov     DWORD PTR [esp+56], eax
  165. L22:
  166.         mov     ecx, DWORD PTR [esp+56]
  167.         cmp     DWORD PTR [ecx-16], 0
  168.         jne     L23
  169.         cmp     DWORD PTR [ecx-8], 0
  170.         je      L25
  171. L23:
  172.         mov     edi, DWORD PTR [__exports+32]
  173.         mov     esi, DWORD PTR [__exports+28]
  174.         mov     eax, DWORD PTR [esp+56]
  175.         mov     DWORD PTR [esp+20], edi
  176.         add     edi, OS_BASE
  177.         add     esi, OS_BASE
  178.         mov     DWORD PTR [esp+44], esi
  179.         mov     ecx, DWORD PTR [eax-4]
  180.         mov     DWORD PTR [esp+48], edi
  181.         mov     edx, DWORD PTR [eax-20]
  182.         test    edx, edx
  183.         jnz     @f
  184.         mov     edx, ecx
  185. @@:
  186.         mov     DWORD PTR [esp+52], 0
  187.         add     ecx, ebp
  188.         add     edx, ebp
  189.         mov     DWORD PTR [esp+24], edx
  190.         mov     DWORD PTR [esp+28], ecx
  191. L26:
  192.         mov     esi, DWORD PTR [esp+52]
  193.         mov     edi, DWORD PTR [esp+24]
  194.         mov     eax, DWORD PTR [edi+esi*4]
  195.         test    eax, eax
  196.         je      L27
  197.         test    eax, eax
  198.         js      L27
  199.         lea     edi, [ebp+eax]
  200.         mov     eax, DWORD PTR [esp+28]
  201.         mov     DWORD PTR [eax+esi*4], 0
  202.         lea     esi, [edi+2]
  203.         push    eax
  204.         push    32
  205.         movzx   eax, WORD PTR [edi]
  206.         mov     edx, DWORD PTR [esp+56]
  207.         mov     eax, DWORD PTR [edx+eax*4]
  208.         add     eax, OS_BASE
  209.         push    eax
  210.         push    esi
  211.         call    strncmp
  212.         pop     ebx
  213.         xor     ebx, ebx
  214.         test    eax, eax
  215.         jne     L32
  216.         jmp     L30
  217. L33:
  218.         push    ecx
  219.         push    32
  220.         mov     ecx, DWORD PTR [esp+28]
  221.         mov     eax, DWORD PTR [ecx+OS_BASE+ebx*4]
  222.         add     eax, OS_BASE
  223.         push    eax
  224.         push    esi
  225.         call    strncmp
  226.         pop     edx
  227.         test    eax, eax
  228.         jne     L34
  229.         mov     esi, DWORD PTR [esp+44]
  230.         mov     edx, DWORD PTR [esp+52]
  231.         mov     ecx, DWORD PTR [esp+28]
  232.         mov     eax, DWORD PTR [esi+ebx*4]
  233.         add     eax, OS_BASE
  234.         mov     DWORD PTR [ecx+edx*4], eax
  235.         jmp     L36
  236. L34:
  237.         inc     ebx
  238. L32:
  239.         cmp     ebx, DWORD PTR [__exports+24]
  240.         jb      L33
  241. L36:
  242.         cmp     ebx, DWORD PTR [__exports+24]
  243.         jne     L37
  244.  
  245.         mov     esi, msg_unresolved
  246.         call    sys_msg_board_str
  247.         lea     esi, [edi+2]
  248.         call    sys_msg_board_str
  249.         mov     esi, msg_CR
  250.         call    sys_msg_board_str
  251.  
  252.         mov     DWORD PTR [esp+40], 1
  253.         jmp     L37
  254. L30:
  255.         movzx   eax, WORD PTR [edi]
  256.         mov     esi, DWORD PTR [esp+44]
  257.         mov     edi, DWORD PTR [esp+52]
  258.         mov     edx, DWORD PTR [esp+28]
  259.         mov     eax, DWORD PTR [esi+eax*4]
  260.         add     eax, OS_BASE
  261.         mov     DWORD PTR [edx+edi*4], eax
  262. L37:
  263.         inc     DWORD PTR [esp+52]
  264.         jmp     L26
  265. L27:
  266.         add     DWORD PTR [esp+56], 20
  267.         jmp     L22
  268. L25:
  269.         xor     eax, eax
  270.         cmp     DWORD PTR [esp+40], 0
  271.         jne     L40
  272. L20:
  273.         mov     ecx, DWORD PTR [esp+32]
  274.         mov     eax, ebp
  275.         add     eax, DWORD PTR [ecx+40]
  276. L40:
  277.         add     esp, 60
  278.         pop     ebx
  279.         pop     esi
  280.         pop     edi
  281.         pop     ebp
  282.         ret     8
  283.