Subversion Repositories Kolibri OS

Rev

Rev 819 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 837 $
  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.         shr ecx, 2
  89.         rep movsd
  90.  
  91. L4:
  92.         mov     ecx, DWORD PTR [edx+256]
  93.         add     ecx, 4095
  94.         and     ecx, -4096
  95.         cmp     ecx, eax
  96.         jbe     L6
  97.         sub     ecx, eax
  98.         add     eax, DWORD PTR [edx+260]
  99.         lea     edi, [eax+ebp]
  100.  
  101.         xor eax, eax
  102.         rep stosb
  103.  
  104. L6:
  105.         inc     DWORD PTR [esp+36]
  106.         add     edx, 40
  107. L2:
  108.         mov     esi, DWORD PTR [esp+16]
  109.         cmp     DWORD PTR [esp+36], esi
  110.         jne     L3
  111.         mov     edi, DWORD PTR [esp+32]
  112.         cmp     DWORD PTR [edi+164], 0
  113.         je      L9
  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+12], eax
  121.         jmp     L11
  122. L12:
  123.         lea     ebx, [eax-8]
  124.         xor     edi, edi
  125.         shr     ebx,1
  126.         jmp     L13
  127. L14:
  128.         movzx   eax, WORD PTR [ecx+8+edi*2]
  129.         mov     edx, eax
  130.         shr     eax, 12
  131.         and     edx, 4095
  132.         add     edx, DWORD PTR [ecx]
  133.         cmp     ax, 2
  134.         je      L17
  135.         cmp     ax, 3
  136.         je      L18
  137.         dec     ax
  138.         jne     L15
  139.         mov     eax, DWORD PTR [esp+12]
  140.         add     WORD PTR [edx+ebp], ax
  141. L17:
  142.         add     WORD PTR [edx+ebp], si
  143. L18:
  144.         add     DWORD PTR [edx+ebp], esi
  145. L15:
  146.         inc     edi
  147. L13:
  148.         cmp     edi, ebx
  149.         jne     L14
  150.         add     ecx, DWORD PTR [ecx+4]
  151. L11:
  152.         mov     eax, DWORD PTR [ecx+4]
  153.         test    eax, eax
  154.         jne     L12
  155. L9:
  156.         mov     edx, DWORD PTR [esp+32]
  157.         cmp     DWORD PTR [edx+132], 0
  158.         je      L20
  159.         mov     eax, ebp
  160.         add     eax, DWORD PTR [edx+128]
  161.         mov     DWORD PTR [esp+40], 0
  162.         add     eax, 20
  163.         mov     DWORD PTR [esp+56], eax
  164. L22:
  165.         mov     ecx, DWORD PTR [esp+56]
  166.         cmp     DWORD PTR [ecx-16], 0
  167.         jne     L23
  168.         cmp     DWORD PTR [ecx-8], 0
  169.         je      L25
  170. L23:
  171.         mov     edi, DWORD PTR [__exports+32]
  172.         mov     esi, DWORD PTR [__exports+28]
  173.         mov     eax, DWORD PTR [esp+56]
  174.         mov     DWORD PTR [esp+20], edi
  175.         add     edi, OS_BASE
  176.         add     esi, OS_BASE
  177.         mov     DWORD PTR [esp+44], esi
  178.         mov     ecx, DWORD PTR [eax-4]
  179.         mov     DWORD PTR [esp+48], edi
  180.         mov     edx, DWORD PTR [eax-20]
  181.         mov     DWORD PTR [esp+52], 0
  182.         add     ecx, ebp
  183.         add     edx, ebp
  184.         mov     DWORD PTR [esp+24], edx
  185.         mov     DWORD PTR [esp+28], ecx
  186. L26:
  187.         mov     esi, DWORD PTR [esp+52]
  188.         mov     edi, DWORD PTR [esp+24]
  189.         mov     eax, DWORD PTR [edi+esi*4]
  190.         test    eax, eax
  191.         je      L27
  192.         test    eax, eax
  193.         js      L27
  194.         lea     edi, [ebp+eax]
  195.         mov     eax, DWORD PTR [esp+28]
  196.         mov     DWORD PTR [eax+esi*4], 0
  197.         lea     esi, [edi+2]
  198.         push    eax
  199.         push    32
  200.         movzx   eax, WORD PTR [edi]
  201.         mov     edx, DWORD PTR [esp+56]
  202.         mov     eax, DWORD PTR [edx+eax*4]
  203.         add     eax, OS_BASE
  204.         push    eax
  205.         push    esi
  206.         call    strncmp
  207.         pop     ebx
  208.         xor     ebx, ebx
  209.         test    eax, eax
  210.         jne     L32
  211.         jmp     L30
  212. L33:
  213.         push    ecx
  214.         push    32
  215.         mov     ecx, DWORD PTR [esp+28]
  216.         mov     eax, DWORD PTR [ecx+OS_BASE+ebx*4]
  217.         add     eax, OS_BASE
  218.         push    eax
  219.         push    esi
  220.         call    strncmp
  221.         pop     edx
  222.         test    eax, eax
  223.         jne     L34
  224.         mov     esi, DWORD PTR [esp+44]
  225.         mov     edx, DWORD PTR [esp+52]
  226.         mov     ecx, DWORD PTR [esp+28]
  227.         mov     eax, DWORD PTR [esi+ebx*4]
  228.         add     eax, OS_BASE
  229.         mov     DWORD PTR [ecx+edx*4], eax
  230.         jmp     L36
  231. L34:
  232.         inc     ebx
  233. L32:
  234.         cmp     ebx, DWORD PTR [__exports+24]
  235.         jb      L33
  236. L36:
  237.         cmp     ebx, DWORD PTR [__exports+24]
  238.         jne     L37
  239.  
  240.         mov     esi, msg_unresolved
  241.         call    sys_msg_board_str
  242.         lea     esi, [edi+2]
  243.         call    sys_msg_board_str
  244.         mov     esi, msg_CR
  245.         call    sys_msg_board_str
  246.  
  247.         mov     DWORD PTR [esp+40], 1
  248.         jmp     L37
  249. L30:
  250.         movzx   eax, WORD PTR [edi]
  251.         mov     esi, DWORD PTR [esp+44]
  252.         mov     edi, DWORD PTR [esp+52]
  253.         mov     edx, DWORD PTR [esp+28]
  254.         mov     eax, DWORD PTR [esi+eax*4]
  255.         add     eax, OS_BASE
  256.         mov     DWORD PTR [edx+edi*4], eax
  257. L37:
  258.         inc     DWORD PTR [esp+52]
  259.         jmp     L26
  260. L27:
  261.         add     DWORD PTR [esp+56], 20
  262.         jmp     L22
  263. L25:
  264.         xor     eax, eax
  265.         cmp     DWORD PTR [esp+40], 0
  266.         jne     L40
  267. L20:
  268.         mov     ecx, DWORD PTR [esp+32]
  269.         mov     eax, ebp
  270.         add     eax, DWORD PTR [ecx+40]
  271. L40:
  272.         add     esp, 60
  273.         pop     ebx
  274.         pop     esi
  275.         pop     edi
  276.         pop     ebp
  277.         ret     8
  278.  
  279.  align 16
  280. __exports:
  281.           export 'KERNEL',   \
  282.           alloc_kernel_space,    'AllocKernelSpace',   \      ; stdcall
  283.           commit_pages,          'CommitPages',        \      ; eax, ebx, ecx
  284.           create_kernel_object,  'CreateObject',       \
  285.           create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
  286.           destroy_kernel_object, 'DestroyObject',      \
  287.           free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
  288.           kernel_alloc,          'KernelAlloc',        \      ; stdcall
  289.           kernel_free,           'KernelFree',         \      ; stdcall
  290.           malloc,                'Kmalloc',            \
  291.           free,                  'Kfree',              \
  292.           map_io_mem,            'MapIoMem',           \      ; stdcall
  293.           get_pg_addr,           'GetPgAddr',          \      ; eax
  294. \
  295.           select_hw_cursor,      'SelectHwCursor',     \      ; stdcall
  296.           set_hw_cursor,         'SetHwCursor',        \      ; stdcall
  297.           hw_restore,            'HwCursorRestore',    \      ;
  298.           create_cursor,         'HwCursorCreate',     \      ;
  299. \
  300.           set_screen,            'SetScreen',          \
  301.           pci_api,               'PciApi',             \
  302.           pci_read8,             'PciRead8',           \      ; stdcall
  303.           pci_read16,            'PciRead16',          \      ; stdcall
  304.           pci_read32,            'PciRead32',          \      ; stdcall
  305.           pci_write8,            'PciWrite8',          \      ; stdcall
  306.           pci_write16,           'PciWrite16',         \      ; stdcall
  307.           pci_write32,           'PciWrite32',         \      ; stdcall
  308. \
  309.           reg_service,           'RegService',         \      ; stdcall
  310.           user_alloc,            'UserAlloc',          \      ; stdcall
  311.           user_free,             'UserFree',           \      ; stdcall
  312.           unmap_pages,           'UnmapPages',         \      ; eax, ecx
  313.           sys_msg_board_str,     'SysMsgBoardStr'
  314.  
  315.  
  316.  
  317.