Subversion Repositories Kolibri OS

Rev

Rev 3908 | Rev 5201 | 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: 4423 $
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
 
4423 Serge 88
        add     ecx, 3
2434 Serge 89
        shr     ecx, 2
90
        rep movsd
757 serge 91
 
92
L4:
2434 Serge 93
        mov     ecx, DWORD PTR [edx+256]
94
        cmp     ecx, eax
95
        jbe     L6
96
        sub     ecx, eax
97
        add     eax, DWORD PTR [edx+260]
98
        lea     edi, [eax+ebp]
757 serge 99
 
2434 Serge 100
        xor     eax, eax
101
        rep stosb
757 serge 102
 
103
L6:
2434 Serge 104
        inc     DWORD PTR [esp+36]
105
        add     edx, 40
757 serge 106
L2:
2434 Serge 107
        mov     esi, DWORD PTR [esp+16]
108
        cmp     DWORD PTR [esp+36], esi
109
        jne     L3
110
        mov     edi, DWORD PTR [esp+32]
111
        cmp     DWORD PTR [edi+164], 0
112
        je      L9
4423 Serge 113
        pushd   [edi+164]
2434 Serge 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
4423 Serge 120
        mov     DWORD PTR [esp+16], eax
757 serge 121
L12:
4423 Serge 122
        mov     eax, [ecx+4]
123
        sub     [esp], eax
2434 Serge 124
        lea     ebx, [eax-8]
125
        xor     edi, edi
126
        shr     ebx, 1
127
        jmp     L13
757 serge 128
L14:
2434 Serge 129
        movzx   eax, WORD PTR [ecx+8+edi*2]
130
        mov     edx, eax
131
        shr     eax, 12
132
        and     edx, 4095
133
        add     edx, DWORD PTR [ecx]
134
        cmp     ax, 2
135
        je      L17
136
        cmp     ax, 3
137
        je      L18
138
        dec     ax
139
        jne     L15
4423 Serge 140
        mov     eax, DWORD PTR [esp+16]
2434 Serge 141
        add     WORD PTR [edx+ebp], ax
757 serge 142
L17:
2434 Serge 143
        add     WORD PTR [edx+ebp], si
757 serge 144
L18:
2434 Serge 145
        add     DWORD PTR [edx+ebp], esi
757 serge 146
L15:
2434 Serge 147
        inc     edi
757 serge 148
L13:
2434 Serge 149
        cmp     edi, ebx
150
        jne     L14
151
        add     ecx, DWORD PTR [ecx+4]
757 serge 152
L11:
4423 Serge 153
        cmp     dword [esp], 0
154
        jg      L12
155
        pop     eax
757 serge 156
L9:
2434 Serge 157
        mov     edx, DWORD PTR [esp+32]
158
        cmp     DWORD PTR [edx+132], 0
159
        je      L20
160
        mov     eax, ebp
161
        add     eax, DWORD PTR [edx+128]
162
        mov     DWORD PTR [esp+40], 0
163
        add     eax, 20
164
        mov     DWORD PTR [esp+56], eax
757 serge 165
L22:
2434 Serge 166
        mov     ecx, DWORD PTR [esp+56]
167
        cmp     DWORD PTR [ecx-16], 0
168
        jne     L23
169
        cmp     DWORD PTR [ecx-8], 0
170
        je      L25
757 serge 171
L23:
172
        mov     edi, DWORD PTR [__exports+32]
173
        mov     esi, DWORD PTR [__exports+28]
2434 Serge 174
        mov     eax, DWORD PTR [esp+56]
175
        mov     DWORD PTR [esp+20], edi
884 serge 176
        add     edi, OS_BASE
177
        add     esi, OS_BASE
2434 Serge 178
        mov     DWORD PTR [esp+44], esi
179
        mov     ecx, DWORD PTR [eax-4]
180
        mov     DWORD PTR [esp+48], edi
181
        mov     edx, DWORD PTR [eax-20]
4423 Serge 182
        test    edx, edx
183
        jnz     @f
184
        mov     edx, ecx
185
@@:
2434 Serge 186
        mov     DWORD PTR [esp+52], 0
187
        add     ecx, ebp
188
        add     edx, ebp
189
        mov     DWORD PTR [esp+24], edx
190
        mov     DWORD PTR [esp+28], ecx
757 serge 191
L26:
2434 Serge 192
        mov     esi, DWORD PTR [esp+52]
193
        mov     edi, DWORD PTR [esp+24]
194
        mov     eax, DWORD PTR [edi+esi*4]
195
        test    eax, eax
196
        je      L27
197
        test    eax, eax
198
        js      L27
199
        lea     edi, [ebp+eax]
200
        mov     eax, DWORD PTR [esp+28]
201
        mov     DWORD PTR [eax+esi*4], 0
202
        lea     esi, [edi+2]
203
        push    eax
204
        push    32
205
        movzx   eax, WORD PTR [edi]
206
        mov     edx, DWORD PTR [esp+56]
207
        mov     eax, DWORD PTR [edx+eax*4]
884 serge 208
        add     eax, OS_BASE
2434 Serge 209
        push    eax
210
        push    esi
211
        call    strncmp
212
        pop     ebx
213
        xor     ebx, ebx
214
        test    eax, eax
215
        jne     L32
216
        jmp     L30
757 serge 217
L33:
2434 Serge 218
        push    ecx
219
        push    32
220
        mov     ecx, DWORD PTR [esp+28]
884 serge 221
        mov     eax, DWORD PTR [ecx+OS_BASE+ebx*4]
222
        add     eax, OS_BASE
2434 Serge 223
        push    eax
224
        push    esi
225
        call    strncmp
226
        pop     edx
227
        test    eax, eax
228
        jne     L34
229
        mov     esi, DWORD PTR [esp+44]
230
        mov     edx, DWORD PTR [esp+52]
231
        mov     ecx, DWORD PTR [esp+28]
232
        mov     eax, DWORD PTR [esi+ebx*4]
884 serge 233
        add     eax, OS_BASE
2434 Serge 234
        mov     DWORD PTR [ecx+edx*4], eax
235
        jmp     L36
757 serge 236
L34:
2434 Serge 237
        inc     ebx
757 serge 238
L32:
239
        cmp     ebx, DWORD PTR [__exports+24]
2434 Serge 240
        jb      L33
757 serge 241
L36:
242
        cmp     ebx, DWORD PTR [__exports+24]
2434 Serge 243
        jne     L37
757 serge 244
 
245
        mov     esi, msg_unresolved
246
        call    sys_msg_board_str
2434 Serge 247
        lea     esi, [edi+2]
757 serge 248
        call    sys_msg_board_str
249
        mov     esi, msg_CR
250
        call    sys_msg_board_str
251
 
2434 Serge 252
        mov     DWORD PTR [esp+40], 1
253
        jmp     L37
757 serge 254
L30:
2434 Serge 255
        movzx   eax, WORD PTR [edi]
256
        mov     esi, DWORD PTR [esp+44]
257
        mov     edi, DWORD PTR [esp+52]
258
        mov     edx, DWORD PTR [esp+28]
259
        mov     eax, DWORD PTR [esi+eax*4]
884 serge 260
        add     eax, OS_BASE
2434 Serge 261
        mov     DWORD PTR [edx+edi*4], eax
757 serge 262
L37:
2434 Serge 263
        inc     DWORD PTR [esp+52]
264
        jmp     L26
757 serge 265
L27:
2434 Serge 266
        add     DWORD PTR [esp+56], 20
267
        jmp     L22
757 serge 268
L25:
2434 Serge 269
        xor     eax, eax
270
        cmp     DWORD PTR [esp+40], 0
271
        jne     L40
757 serge 272
L20:
2434 Serge 273
        mov     ecx, DWORD PTR [esp+32]
274
        mov     eax, ebp
275
        add     eax, DWORD PTR [ecx+40]
757 serge 276
L40:
2434 Serge 277
        add     esp, 60
278
        pop     ebx
279
        pop     esi
280
        pop     edi
281
        pop     ebp
757 serge 282
        ret     8