Subversion Repositories Kolibri OS

Rev

Rev 2434 | Rev 3232 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
750 victor 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2465 Serge 3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
750 victor 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 2465 $
757 serge 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
 
2434 Serge 21
        stdcall load_file, [file_name]
22
        test    eax, eax
23
        jz      .fail
757 serge 24
 
2434 Serge 25
        mov     [image], eax
757 serge 26
 
2434 Serge 27
        mov     edx, [eax+60]
757 serge 28
 
2434 Serge 29
        stdcall kernel_alloc, [eax+80+edx]
30
        test    eax, eax
31
        jz      .cleanup
757 serge 32
 
2434 Serge 33
        mov     [base], eax
757 serge 34
 
2434 Serge 35
        stdcall map_PE, eax, [image]
757 serge 36
 
2434 Serge 37
        mov     [entry], eax
38
        test    eax, eax
39
        jnz     .cleanup
757 serge 40
 
2434 Serge 41
        stdcall kernel_free, [base]
757 serge 42
.cleanup:
2434 Serge 43
        stdcall kernel_free, [image]
44
        mov     eax, [entry]
45
        ret
757 serge 46
.fail:
2434 Serge 47
        xor     eax, eax
48
        ret
757 serge 49
endp
50
 
51
DWORD equ dword
52
PTR   equ
53
 
54
align 4
55
map_PE:                    ;stdcall base:dword, image:dword
2434 Serge 56
        cld
757 serge 57
        push    ebp
2434 Serge 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]
757 serge 70
 
2434 Serge 71
        shr     ecx, 2
72
        rep movsd
757 serge 73
 
2434 Serge 74
        movzx   eax, WORD PTR [edx+6]
75
        mov     DWORD PTR [esp+36], 0
76
        mov     DWORD PTR [esp+16], eax
77
        jmp     L2
757 serge 78
L3:
2434 Serge 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]
757 serge 87
 
2434 Serge 88
        shr     ecx, 2
89
        rep movsd
757 serge 90
 
91
L4:
2434 Serge 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]
757 serge 100
 
2434 Serge 101
        xor     eax, eax
102
        rep stosb
757 serge 103
 
104
L6:
2434 Serge 105
        inc     DWORD PTR [esp+36]
106
        add     edx, 40
757 serge 107
L2:
2434 Serge 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
757 serge 122
L12:
2434 Serge 123
        lea     ebx, [eax-8]
124
        xor     edi, edi
125
        shr     ebx, 1
126
        jmp     L13
757 serge 127
L14:
2434 Serge 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
757 serge 141
L17:
2434 Serge 142
        add     WORD PTR [edx+ebp], si
757 serge 143
L18:
2434 Serge 144
        add     DWORD PTR [edx+ebp], esi
757 serge 145
L15:
2434 Serge 146
        inc     edi
757 serge 147
L13:
2434 Serge 148
        cmp     edi, ebx
149
        jne     L14
150
        add     ecx, DWORD PTR [ecx+4]
757 serge 151
L11:
2434 Serge 152
        mov     eax, DWORD PTR [ecx+4]
153
        test    eax, eax
154
        jne     L12
757 serge 155
L9:
2434 Serge 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
757 serge 164
L22:
2434 Serge 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
757 serge 170
L23:
171
        mov     edi, DWORD PTR [__exports+32]
172
        mov     esi, DWORD PTR [__exports+28]
2434 Serge 173
        mov     eax, DWORD PTR [esp+56]
174
        mov     DWORD PTR [esp+20], edi
884 serge 175
        add     edi, OS_BASE
176
        add     esi, OS_BASE
2434 Serge 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
757 serge 186
L26:
2434 Serge 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]
884 serge 203
        add     eax, OS_BASE
2434 Serge 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
757 serge 212
L33:
2434 Serge 213
        push    ecx
214
        push    32
215
        mov     ecx, DWORD PTR [esp+28]
884 serge 216
        mov     eax, DWORD PTR [ecx+OS_BASE+ebx*4]
217
        add     eax, OS_BASE
2434 Serge 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]
884 serge 228
        add     eax, OS_BASE
2434 Serge 229
        mov     DWORD PTR [ecx+edx*4], eax
230
        jmp     L36
757 serge 231
L34:
2434 Serge 232
        inc     ebx
757 serge 233
L32:
234
        cmp     ebx, DWORD PTR [__exports+24]
2434 Serge 235
        jb      L33
757 serge 236
L36:
237
        cmp     ebx, DWORD PTR [__exports+24]
2434 Serge 238
        jne     L37
757 serge 239
 
240
        mov     esi, msg_unresolved
241
        call    sys_msg_board_str
2434 Serge 242
        lea     esi, [edi+2]
757 serge 243
        call    sys_msg_board_str
244
        mov     esi, msg_CR
245
        call    sys_msg_board_str
246
 
2434 Serge 247
        mov     DWORD PTR [esp+40], 1
248
        jmp     L37
757 serge 249
L30:
2434 Serge 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]
884 serge 255
        add     eax, OS_BASE
2434 Serge 256
        mov     DWORD PTR [edx+edi*4], eax
757 serge 257
L37:
2434 Serge 258
        inc     DWORD PTR [esp+52]
259
        jmp     L26
757 serge 260
L27:
2434 Serge 261
        add     DWORD PTR [esp+56], 20
262
        jmp     L22
757 serge 263
L25:
2434 Serge 264
        xor     eax, eax
265
        cmp     DWORD PTR [esp+40], 0
266
        jne     L40
757 serge 267
L20:
2434 Serge 268
        mov     ecx, DWORD PTR [esp+32]
269
        mov     eax, ebp
270
        add     eax, DWORD PTR [ecx+40]
757 serge 271
L40:
2434 Serge 272
        add     esp, 60
273
        pop     ebx
274
        pop     esi
275
        pop     edi
276
        pop     ebp
757 serge 277
        ret     8
278
 
279
 align 16
280
__exports:
281
          export 'KERNEL',   \
792 serge 282
          alloc_kernel_space,    'AllocKernelSpace',   \      ; stdcall
1275 serge 283
          alloc_page,            'AllocPage',          \      ; gcc ABI
284
          alloc_pages,           'AllocPages',         \      ; stdcall
819 serge 285
          commit_pages,          'CommitPages',        \      ; eax, ebx, ecx
1612 serge 286
\
287
          create_event,          'CreateEvent',        \      ; ecx, esi
2434 Serge 288
          destroy_event,         'DestroyEvent',       \      ;
1612 serge 289
          raise_event,           'RaiseEvent',         \      ; eax, ebx, edx, esi
290
          wait_event,            'WaitEvent',          \      ; eax, ebx
291
          get_event_ex,          'GetEvent',           \      ; edi
292
\
792 serge 293
          create_kernel_object,  'CreateObject',       \
819 serge 294
          create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
792 serge 295
          destroy_kernel_object, 'DestroyObject',      \
296
          free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
2434 Serge 297
          free_page,             'FreePage',           \      ; eax
792 serge 298
          kernel_alloc,          'KernelAlloc',        \      ; stdcall
299
          kernel_free,           'KernelFree',         \      ; stdcall
300
          malloc,                'Kmalloc',            \
301
          free,                  'Kfree',              \
302
          map_io_mem,            'MapIoMem',           \      ; stdcall
819 serge 303
          get_pg_addr,           'GetPgAddr',          \      ; eax
757 serge 304
\
1434 serge 305
          mutex_init,            'MutexInit',          \      ; gcc fastcall
306
          mutex_lock,            'MutexLock',          \      ; gcc fastcall
307
          mutex_unlock,          'MutexUnlock',        \      ; gcc fastcall
308
\
1316 serge 309
          get_display,           'GetDisplay',         \
792 serge 310
          set_screen,            'SetScreen',          \
2434 Serge 311
          window._.get_rect,     'GetWindowRect',      \      ; gcc fastcall
1614 serge 312
          pci_api_drv,           'PciApi',             \
792 serge 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
\
2166 serge 320
          get_pid,               'GetPid',             \
1275 serge 321
          get_service,           'GetService',         \      ;
819 serge 322
          reg_service,           'RegService',         \      ; stdcall
2106 serge 323
          attach_int_handler,    'AttachIntHandler',   \      ; stdcall
792 serge 324
          user_alloc,            'UserAlloc',          \      ; stdcall
325
          user_free,             'UserFree',           \      ; stdcall
819 serge 326
          unmap_pages,           'UnmapPages',         \      ; eax, ecx
924 serge 327
          sys_msg_board_str,     'SysMsgBoardStr',     \
1615 serge 328
          get_timer_ticks,       'GetTimerTicks',      \
2010 serge 329
          get_stack_base,        'GetStackBase',       \
924 serge 330
          delay_hs,              'Delay',              \      ; ebx
2010 serge 331
          set_mouse_data,        'SetMouseData',       \      ;
2434 Serge 332
          set_keyboard_data,     'SetKeyboardData',    \      ; gcc fastcall
333
          timer_hs,              'TimerHs'                   ; stdcall
757 serge 334