Subversion Repositories Kolibri OS

Rev

Rev 2434 | Rev 3232 | Go to most recent revision | Blame | Compare with Previous | 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: 2465 $
  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.           alloc_page,            'AllocPage',          \      ; gcc ABI
  284.           alloc_pages,           'AllocPages',         \      ; stdcall
  285.           commit_pages,          'CommitPages',        \      ; eax, ebx, ecx
  286. \
  287.           create_event,          'CreateEvent',        \      ; ecx, esi
  288.           destroy_event,         'DestroyEvent',       \      ;
  289.           raise_event,           'RaiseEvent',         \      ; eax, ebx, edx, esi
  290.           wait_event,            'WaitEvent',          \      ; eax, ebx
  291.           get_event_ex,          'GetEvent',           \      ; edi
  292. \
  293.           create_kernel_object,  'CreateObject',       \
  294.           create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
  295.           destroy_kernel_object, 'DestroyObject',      \
  296.           free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
  297.           free_page,             'FreePage',           \      ; eax
  298.           kernel_alloc,          'KernelAlloc',        \      ; stdcall
  299.           kernel_free,           'KernelFree',         \      ; stdcall
  300.           malloc,                'Kmalloc',            \
  301.           free,                  'Kfree',              \
  302.           map_io_mem,            'MapIoMem',           \      ; stdcall
  303.           get_pg_addr,           'GetPgAddr',          \      ; eax
  304. \
  305.           mutex_init,            'MutexInit',          \      ; gcc fastcall
  306.           mutex_lock,            'MutexLock',          \      ; gcc fastcall
  307.           mutex_unlock,          'MutexUnlock',        \      ; gcc fastcall
  308. \
  309.           get_display,           'GetDisplay',         \
  310.           set_screen,            'SetScreen',          \
  311.           window._.get_rect,     'GetWindowRect',      \      ; gcc fastcall
  312.           pci_api_drv,           'PciApi',             \
  313.           pci_read8,             'PciRead8',           \      ; stdcall
  314.           pci_read16,            'PciRead16',          \      ; stdcall
  315.           pci_read32,            'PciRead32',          \      ; stdcall
  316.           pci_write8,            'PciWrite8',          \      ; stdcall
  317.           pci_write16,           'PciWrite16',         \      ; stdcall
  318.           pci_write32,           'PciWrite32',         \      ; stdcall
  319. \
  320.           get_pid,               'GetPid',             \
  321.           get_service,           'GetService',         \      ;
  322.           reg_service,           'RegService',         \      ; stdcall
  323.           attach_int_handler,    'AttachIntHandler',   \      ; stdcall
  324.           user_alloc,            'UserAlloc',          \      ; stdcall
  325.           user_free,             'UserFree',           \      ; stdcall
  326.           unmap_pages,           'UnmapPages',         \      ; eax, ecx
  327.           sys_msg_board_str,     'SysMsgBoardStr',     \
  328.           get_timer_ticks,       'GetTimerTicks',      \
  329.           get_stack_base,        'GetStackBase',       \
  330.           delay_hs,              'Delay',              \      ; ebx
  331.           set_mouse_data,        'SetMouseData',       \      ;
  332.           set_keyboard_data,     'SetKeyboardData',    \      ; gcc fastcall
  333.           timer_hs,              'TimerHs'                   ; stdcall
  334.  
  335.  
  336.  
  337.