Subversion Repositories Kolibri OS

Rev

Rev 864 | Go to most recent revision | Blame | 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: 887 $
  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 ebx, [eax+60]
  28.            mov ecx, [eax+80+edx]
  29.            mov edx, PG_SW
  30.            call @mem_alloc@8
  31.            test eax, eax
  32.            mov [base], eax
  33.            jz .cleanup
  34.  
  35.            stdcall map_PE, eax, [image]
  36.  
  37.            mov [entry], eax
  38.            test eax, eax
  39.            jnz .cleanup
  40.  
  41.            mov ecx, [base]
  42.            call @mem_free@4
  43.  
  44. .cleanup:
  45.            mov ecx, [image]
  46.            call @mem_free@4
  47.  
  48.            mov eax, [entry]
  49.            ret
  50. .fail:
  51.            xor eax, eax
  52.            ret
  53. endp
  54.  
  55. DWORD equ dword
  56. PTR   equ
  57.  
  58. align 4
  59. map_PE:                    ;stdcall base:dword, image:dword
  60.            cld
  61.            push    ebp
  62.            push    edi
  63.            push    esi
  64.            push    ebx
  65.            sub esp, 60
  66.            mov ebx, DWORD PTR [esp+84]
  67.            mov ebp, DWORD PTR [esp+80]
  68.            mov edx, ebx
  69.            mov esi, ebx
  70.            add edx, DWORD PTR [ebx+60]
  71.            mov edi, ebp
  72.            mov DWORD PTR [esp+32], edx
  73.            mov ecx, DWORD PTR [edx+84]
  74.  
  75.            shr ecx, 2
  76.            rep movsd
  77.  
  78.            movzx   eax, WORD PTR [edx+6]
  79.            mov DWORD PTR [esp+36], 0
  80.            mov DWORD PTR [esp+16], eax
  81.            jmp L2
  82. L3:
  83.            mov eax, DWORD PTR [edx+264]
  84.            test    eax, eax
  85.            je  L4
  86.            mov esi, ebx
  87.            mov edi, ebp
  88.            add esi, DWORD PTR [edx+268]
  89.            mov ecx, eax
  90.            add edi, DWORD PTR [edx+260]
  91.  
  92.            shr ecx, 2
  93.            rep movsd
  94.  
  95. L4:
  96.            mov ecx, DWORD PTR [edx+256]
  97.            add ecx, 4095
  98.            and ecx, -4096
  99.            cmp ecx, eax
  100.            jbe L6
  101.            sub ecx, eax
  102.            add eax, DWORD PTR [edx+260]
  103.            lea edi, [eax+ebp]
  104.  
  105.            xor eax, eax
  106.            rep stosb
  107.  
  108. L6:
  109.            inc DWORD PTR [esp+36]
  110.            add edx, 40
  111. L2:
  112.            mov esi, DWORD PTR [esp+16]
  113.            cmp DWORD PTR [esp+36], esi
  114.            jne L3
  115.            mov edi, DWORD PTR [esp+32]
  116.            cmp DWORD PTR [edi+164], 0
  117.            je  L9
  118.            mov esi, ebp
  119.            mov ecx, ebp
  120.            sub esi, DWORD PTR [edi+52]
  121.            add ecx, DWORD PTR [edi+160]
  122.            mov eax, esi
  123.            shr eax, 16
  124.            mov DWORD PTR [esp+12], eax
  125.            jmp L11
  126. L12:
  127.            lea ebx, [eax-8]
  128.            xor edi, edi
  129.            shr     ebx,1
  130.            jmp L13
  131. L14:
  132.            movzx   eax, WORD PTR [ecx+8+edi*2]
  133.            mov edx, eax
  134.            shr eax, 12
  135.            and edx, 4095
  136.            add edx, DWORD PTR [ecx]
  137.            cmp ax, 2
  138.            je  L17
  139.            cmp ax, 3
  140.            je  L18
  141.            dec ax
  142.            jne L15
  143.            mov eax, DWORD PTR [esp+12]
  144.            add WORD PTR [edx+ebp], ax
  145. L17:
  146.            add WORD PTR [edx+ebp], si
  147. L18:
  148.            add DWORD PTR [edx+ebp], esi
  149. L15:
  150.            inc edi
  151. L13:
  152.            cmp edi, ebx
  153.            jne L14
  154.            add ecx, DWORD PTR [ecx+4]
  155. L11:
  156.            mov eax, DWORD PTR [ecx+4]
  157.            test    eax, eax
  158.            jne L12
  159. L9:
  160.            mov edx, DWORD PTR [esp+32]
  161.            cmp DWORD PTR [edx+132], 0
  162.            je  L20
  163.            mov eax, ebp
  164.            add eax, DWORD PTR [edx+128]
  165.            mov DWORD PTR [esp+40], 0
  166.            add eax, 20
  167.            mov DWORD PTR [esp+56], eax
  168. L22:
  169.            mov ecx, DWORD PTR [esp+56]
  170.            cmp DWORD PTR [ecx-16], 0
  171.            jne L23
  172.            cmp DWORD PTR [ecx-8], 0
  173.            je  L25
  174. L23:
  175.            mov     edi, DWORD PTR [__exports+32]
  176.            mov     esi, DWORD PTR [__exports+28]
  177.            mov eax, DWORD PTR [esp+56]
  178.            mov DWORD PTR [esp+20], edi
  179.            add     edi, OS_BASE
  180.            add     esi, OS_BASE
  181.            mov DWORD PTR [esp+44], esi
  182.            mov ecx, DWORD PTR [eax-4]
  183.            mov DWORD PTR [esp+48], edi
  184.            mov edx, DWORD PTR [eax-20]
  185.            mov DWORD PTR [esp+52], 0
  186.            add ecx, ebp
  187.            add edx, ebp
  188.            mov DWORD PTR [esp+24], edx
  189.            mov DWORD PTR [esp+28], ecx
  190. L26:
  191.            mov esi, DWORD PTR [esp+52]
  192.            mov edi, DWORD PTR [esp+24]
  193.            mov eax, DWORD PTR [edi+esi*4]
  194.            test    eax, eax
  195.            je  L27
  196.            test    eax, eax
  197.            js  L27
  198.            lea edi, [ebp+eax]
  199.            mov eax, DWORD PTR [esp+28]
  200.            mov DWORD PTR [eax+esi*4], 0
  201.            lea esi, [edi+2]
  202.            push    eax
  203.            push    32
  204.            movzx   eax, WORD PTR [edi]
  205.            mov edx, DWORD PTR [esp+56]
  206.            mov eax, DWORD PTR [edx+eax*4]
  207.                add     eax, OS_BASE
  208.            push    eax
  209.            push    esi
  210.            call    strncmp
  211.            pop ebx
  212.            xor ebx, ebx
  213.            test    eax, eax
  214.            jne L32
  215.            jmp L30
  216. L33:
  217.            push    ecx
  218.            push    32
  219.            mov ecx, DWORD PTR [esp+28]
  220.            mov     eax, DWORD PTR [ecx+OS_BASE+ebx*4]
  221.            add     eax, OS_BASE
  222.            push    eax
  223.            push    esi
  224.            call    strncmp
  225.            pop edx
  226.            test    eax, eax
  227.            jne L34
  228.            mov esi, DWORD PTR [esp+44]
  229.            mov edx, DWORD PTR [esp+52]
  230.            mov ecx, DWORD PTR [esp+28]
  231.            mov eax, DWORD PTR [esi+ebx*4]
  232.                add     eax, OS_BASE
  233.            mov DWORD PTR [ecx+edx*4], eax
  234.            jmp L36
  235. L34:
  236.            inc ebx
  237. L32:
  238.            cmp ebx, DWORD PTR [__exports+24]
  239.            jb  L33
  240. L36:
  241.            cmp ebx, DWORD PTR [__exports+24]
  242.            jne L37
  243.  
  244.            mov     esi, msg_unresolved
  245.            call    sys_msg_board_str
  246.            lea esi, [edi+2]
  247.            call    sys_msg_board_str
  248.            mov     esi, msg_CR
  249.            call    sys_msg_board_str
  250.  
  251.            mov DWORD PTR [esp+40], 1
  252.            jmp L37
  253. L30:
  254.            movzx   eax, WORD PTR [edi]
  255.            mov esi, DWORD PTR [esp+44]
  256.            mov edi, DWORD PTR [esp+52]
  257.            mov edx, DWORD PTR [esp+28]
  258.            mov eax, DWORD PTR [esi+eax*4]
  259.            add     eax, OS_BASE
  260.            mov DWORD PTR [edx+edi*4], eax
  261. L37:
  262.            inc DWORD PTR [esp+52]
  263.            jmp L26
  264. L27:
  265.            add DWORD PTR [esp+56], 20
  266.            jmp L22
  267. L25:
  268.            xor eax, eax
  269.            cmp DWORD PTR [esp+40], 0
  270.            jne L40
  271. L20:
  272.            mov ecx, DWORD PTR [esp+32]
  273.            mov eax, ebp
  274.            add eax, DWORD PTR [ecx+40]
  275. L40:
  276.            add esp, 60
  277.            pop ebx
  278.            pop esi
  279.            pop edi
  280.            pop ebp
  281.            ret     8
  282.  
  283.  align 16
  284. __exports:
  285.                  export 'KERNEL',   \
  286.                  commit_pages,          'CommitPages',        \      ; eax, ebx, ecx
  287.           create_kernel_object,  'CreateObject',       \
  288.           create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
  289.           destroy_kernel_object, 'DestroyObject',      \
  290.           free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
  291.           malloc,                'Kmalloc',            \
  292.           free,                  'Kfree',              \
  293.           map_io_mem,            'MapIoMem',           \      ; stdcall
  294.           get_pg_addr,           'GetPgAddr',          \      ; eax
  295. \
  296.           select_hw_cursor,      'SelectHwCursor',     \      ; stdcall
  297.           set_hw_cursor,         'SetHwCursor',        \      ; stdcall
  298.           hw_restore,            'HwCursorRestore',    \      ;
  299.           create_cursor,         'HwCursorCreate',     \      ;
  300. \
  301.           set_screen,            'SetScreen',          \
  302.           pci_api,               'PciApi',             \
  303.           pci_read8,             'PciRead8',           \      ; stdcall
  304.           pci_read16,            'PciRead16',          \      ; stdcall
  305.           pci_read32,            'PciRead32',          \      ; stdcall
  306.           pci_write8,            'PciWrite8',          \      ; stdcall
  307.           pci_write16,           'PciWrite16',         \      ; stdcall
  308.           pci_write32,           'PciWrite32',         \      ; stdcall
  309. \
  310.           reg_service,           'RegService',         \      ; stdcall
  311.           user_alloc,            'UserAlloc',          \      ; stdcall
  312.           user_free,             'UserFree',           \      ; stdcall
  313.           unmap_pages,           'UnmapPages',         \      ; eax, ecx
  314.           sys_msg_board_str,     'SysMsgBoardStr'
  315.  
  316.  
  317.  
  318.