Subversion Repositories Kolibri OS

Rev

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

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