Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. align 4
  3.  
  4. proc load_PE stdcall, file_name:dword
  5.            locals
  6.              image  dd ?
  7.            endl
  8.  
  9.            stdcall load_file, [file_name]
  10.            test eax, eax
  11.            jz .fail
  12.  
  13.            mov [image], eax
  14.  
  15.            mov edx, [eax+60]
  16.  
  17.            stdcall kernel_alloc, [eax+80+edx]
  18.            test eax, eax
  19.            jz .cleanup
  20.  
  21.            stdcall map_PE, eax, [image]
  22.            ret
  23. .cleanup:
  24.            stdcall kernel_free,[image]
  25. .fail:
  26.            xor eax, eax
  27.            ret
  28. endp
  29.  
  30.  
  31. align 4
  32. map_PE:                    ;stdcall base:dword, image:dword
  33.            cld
  34.            push    ebp
  35.            push    edi
  36.            push    esi
  37.            push    ebx
  38.            sub     esp, 28
  39.  
  40.            mov     edx, [esp+52]
  41.            mov     ebx, [esp+48]
  42.            mov     dword [esp+20], 0
  43.            add     edx, [edx+60]
  44.            movzx   eax, word [edx+6]
  45.            mov     [esp+16], edx
  46.            mov      [esp+12], eax
  47.            jmp     .L6
  48. .L7:
  49.            mov     eax, [edx+264]
  50.            mov     ebp, [edx+260]
  51.            mov     esi, [esp+52]
  52.            add     esi, [edx+268]
  53.            mov     ecx, eax
  54.            lea     edi, [ebx+ebp]
  55.  
  56.            shr ecx, 2
  57.            rep movsd
  58.  
  59.            mov     ecx, [edx+256]
  60.            cmp     ecx, eax
  61.            jbe     .L8
  62.            sub     ecx, eax
  63.  
  64.            xor eax, eax
  65.            rep stosb
  66.  
  67. .L8:
  68.            inc     dword [esp+20]
  69.            add     edx, 40
  70. .L6:
  71.            mov     eax, [esp+12]
  72.            cmp     [esp+20], eax
  73.            jne     .L7
  74.  
  75.            mov     edx, [esp+16]
  76.            cmp     dword [edx+164], 0
  77.            je      .L11
  78.  
  79.            mov     edi, ebx
  80.            mov     ecx, ebx
  81.            sub     edi, [edx+52]
  82.            add     ecx, [edx+160]
  83.            mov     eax, edi
  84.            shr     eax, 16
  85.            mov     [esp+4], eax
  86.            jmp     .L13
  87. .L14:
  88.            lea     esi, [eax-8]
  89.            xor     ebp, ebp
  90.            shr     esi,1
  91.            jmp     .L15
  92. .L16:
  93.            movzx   eax, word [ecx+8+ebp*2]
  94.            mov     edx, eax
  95.            shr     eax, 12
  96.            and     edx, 4095
  97.            add     edx, [ecx]
  98.            cmp     ax, 2
  99.            je      .L19
  100.  
  101.            cmp     ax, 3
  102.            je      .L20
  103.  
  104.            dec     ax
  105.            jne     .L17
  106.  
  107.            mov     eax, [esp+4]
  108.            add     word [edx+ebx], ax
  109. .L19:
  110.            add     word [edx+ebx], di
  111. .L20:
  112.            add     [edx+ebx], edi
  113. .L17:
  114.            inc     ebp
  115. .L15:
  116.            cmp     ebp, esi
  117.            jne     .L16
  118.            add     ecx, [ecx+4]
  119. .L13:
  120.            mov     eax, [ecx+4]
  121.            test    eax, eax
  122.            jne     .L14
  123. .L11:
  124.            mov     edx, [esp+16]
  125.            cmp     dword [edx+132], 0
  126.            je      .L22
  127.  
  128.            mov     eax, ebx
  129.            add     eax, [edx+128]
  130.            lea     esi, [eax+20]
  131. .L24:
  132.            cmp     dword [esi-16], 0
  133.            jne     .L25
  134.  
  135.            cmp     dword [esi-8], 0
  136.            je      .L22
  137. .L25:
  138.            mov     ecx, [esi-20]
  139.            mov     ebp, ebx
  140.            add     ebp, [esi-4]
  141.            add     ecx, ebx
  142.            mov     [esp+24], ecx
  143. .L27:
  144.            mov     edx, [esp+24]
  145.            mov     eax, [edx]
  146.            test    eax, eax
  147.            je      .L28
  148.  
  149.            test    eax, eax
  150.            js      .L28
  151.  
  152.            lea     eax, [eax+2+ebx]
  153.            mov     edi, kernel_export
  154.            mov     dword [ebp], -1
  155.            mov     [esp+8], eax
  156. .L31:
  157.            push    ecx
  158.            push    16
  159.            push    dword [edi]
  160.            push    dword [esp+20]
  161.            call    strncmp
  162.            pop     edx
  163.            test    eax, eax
  164.            jne     .L32
  165.  
  166.            mov     eax, [edi+4]
  167.            mov     [ebp], eax
  168.            jmp     .L34
  169. .L32:
  170.            add     edi, 8
  171.            cmp     dword [edi], 0
  172.            jne     .L31
  173. .L34:
  174.            add     dword [esp+24], 4
  175.            add     ebp, 4
  176.            jmp     .L27
  177. .L28:
  178.            add     esi, 20
  179.            jmp     .L24
  180. .L22:
  181.  
  182.            mov     ecx, [esp+16]
  183.            add     ebx, [ecx+40]
  184.  
  185.            add     esp, 28
  186.            mov     eax, ebx
  187.  
  188.            pop     ebx
  189.            pop     esi
  190.            pop     edi
  191.            pop     ebp
  192.  
  193.            ret     8
  194.