Subversion Repositories Kolibri OS

Rev

Rev 4423 | 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: 5201 $
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
 
5201 serge 27
        mov     edx, [eax+STRIPPED_PE_HEADER.SizeOfImage]
28
;        mov     cl, [eax+STRIPPED_PE_HEADER.Subsystem]
29
        cmp     word [eax], STRIPPED_PE_SIGNATURE
30
        jz      @f
31
 
2434 Serge 32
        mov     edx, [eax+60]
5201 serge 33
;        mov     cl, [eax+5Ch+edx]
34
        mov     edx, [eax+80+edx]
757 serge 35
 
5201 serge 36
@@:
37
        mov     [entry], 0
38
;        cmp     cl, 1
39
;        jnz     .cleanup
40
        stdcall kernel_alloc, edx
2434 Serge 41
        test    eax, eax
42
        jz      .cleanup
757 serge 43
 
2434 Serge 44
        mov     [base], eax
757 serge 45
 
5201 serge 46
        push    ebx ebp
47
        mov     ebx, [image]
48
        mov     ebp, eax
49
        call    map_PE
50
        pop     ebp ebx
757 serge 51
 
2434 Serge 52
        mov     [entry], eax
53
        test    eax, eax
54
        jnz     .cleanup
757 serge 55
 
2434 Serge 56
        stdcall kernel_free, [base]
757 serge 57
.cleanup:
2434 Serge 58
        stdcall kernel_free, [image]
59
        mov     eax, [entry]
60
        ret
757 serge 61
.fail:
2434 Serge 62
        xor     eax, eax
63
        ret
757 serge 64
endp
65
 
5201 serge 66
map_PE:                    ;ebp=base:dword, ebx=image:dword
2434 Serge 67
        push    edi
68
        push    esi
5201 serge 69
        sub     esp, .locals_size
70
virtual at esp
71
.numsections    dd      ?
72
.import_names   dd      ?
73
.import_targets dd      ?
74
.peheader       dd      ?
75
.bad_import     dd      ?
76
.import_idx     dd      ?
77
.import_descr   dd      ?
78
.relocs_rva     dd      ?
79
.relocs_size    dd      ?
80
.section_header_size dd ?
81
.AddressOfEntryPoint    dd ?
82
.ImageBase      dd      ?
83
.locals_size = $ - esp
84
end virtual
85
        cmp     word [ebx], STRIPPED_PE_SIGNATURE
86
        jz      .stripped
87
 
2434 Serge 88
        mov     edx, ebx
5201 serge 89
        add     edx, [ebx+60]
90
        movzx   eax, word [edx+6]
91
        mov     [.numsections], eax
92
        mov     eax, [edx+40]
93
        mov     [.AddressOfEntryPoint], eax
94
        mov     eax, [edx+52]
95
        mov     [.ImageBase], eax
96
        mov     ecx, [edx+84]
97
        mov     [.section_header_size], 40
98
        mov     eax, [edx+128]
99
        mov     [.import_descr], eax
100
        mov     eax, [edx+160]
101
        mov     [.relocs_rva], eax
102
        mov     eax, [edx+164]
103
        mov     [.relocs_size], eax
104
        add     edx, 256
105
 
106
        jmp     .common
107
.stripped:
108
        mov     eax, [ebx+STRIPPED_PE_HEADER.AddressOfEntryPoint]
109
        mov     [.AddressOfEntryPoint], eax
110
        mov     eax, [ebx+STRIPPED_PE_HEADER.ImageBase]
111
        mov     [.ImageBase], eax
112
        movzx   eax, [ebx+STRIPPED_PE_HEADER.NumberOfSections]
113
        mov     [.numsections], eax
114
        movzx   ecx, [ebx+STRIPPED_PE_HEADER.NumberOfRvaAndSizes]
115
        xor     eax, eax
116
        mov     [.relocs_rva], eax
117
        mov     [.relocs_size], eax
118
        test    ecx, ecx
119
        jz      @f
120
        mov     eax, [ebx+sizeof.STRIPPED_PE_HEADER+SPE_DIRECTORY_IMPORT*8]
121
@@:
122
        mov     [.import_descr], eax
123
        cmp     ecx, SPE_DIRECTORY_BASERELOC
124
        jbe     @f
125
        mov     eax, [ebx+sizeof.STRIPPED_PE_HEADER+SPE_DIRECTORY_BASERELOC*8]
126
        mov     [.relocs_rva], eax
127
        mov     eax, [ebx+sizeof.STRIPPED_PE_HEADER+SPE_DIRECTORY_BASERELOC*8+4]
128
        mov     [.relocs_size], eax
129
@@:
130
        mov     [.section_header_size], 28
131
        lea     edx, [ebx+ecx*8+sizeof.STRIPPED_PE_HEADER+8]
132
        mov     ecx, [ebx+STRIPPED_PE_HEADER.SizeOfHeaders]
133
 
134
.common:
2434 Serge 135
        mov     esi, ebx
136
        mov     edi, ebp
137
        shr     ecx, 2
138
        rep movsd
757 serge 139
 
5201 serge 140
        cmp     [.numsections], 0
141
        jz      .nosections
142
.copy_sections:
143
        mov     eax, [edx+8]
2434 Serge 144
        test    eax, eax
5201 serge 145
        je      .no_section_data
2434 Serge 146
        mov     esi, ebx
147
        mov     edi, ebp
5201 serge 148
        add     esi, [edx+12]
2434 Serge 149
        mov     ecx, eax
5201 serge 150
        add     edi, [edx+4]
757 serge 151
 
4423 Serge 152
        add     ecx, 3
2434 Serge 153
        shr     ecx, 2
154
        rep movsd
757 serge 155
 
5201 serge 156
.no_section_data:
157
        mov     ecx, [edx]
2434 Serge 158
        cmp     ecx, eax
5201 serge 159
        jbe     .no_section_fill
2434 Serge 160
        sub     ecx, eax
5201 serge 161
        add     eax, [edx+4]
2434 Serge 162
        lea     edi, [eax+ebp]
757 serge 163
 
2434 Serge 164
        xor     eax, eax
165
        rep stosb
757 serge 166
 
5201 serge 167
.no_section_fill:
168
        add     edx, [.section_header_size]
169
        dec     [.numsections]
170
        jnz     .copy_sections
171
.nosections:
172
        cmp     [.relocs_size], 0
173
        je      .no_relocations
2434 Serge 174
        mov     esi, ebp
175
        mov     ecx, ebp
5201 serge 176
        sub     esi, [.ImageBase]
177
        add     ecx, [.relocs_rva]
178
.relocs_block:
179
        mov     edi, [ecx]
180
        add     edi, ebp
181
        mov     ebx, [ecx+4]
182
        add     ecx, 8
183
        sub     [.relocs_size], ebx
184
        sub     ebx, 8
2434 Serge 185
        shr     ebx, 1
5201 serge 186
        jz      .relocs_next_block
187
.one_reloc:
188
        movzx   eax, word [ecx]
189
        add     ecx, 2
2434 Serge 190
        mov     edx, eax
191
        shr     eax, 12
192
        and     edx, 4095
5201 serge 193
        cmp     eax, 3
194
        jne     @f
195
        add     [edx+edi], esi
196
@@:
197
        dec     ebx
198
        jnz     .one_reloc
199
.relocs_next_block:
200
        cmp     [.relocs_size], 0
201
        jg      .relocs_block
202
.no_relocations:
203
        cmp     [.import_descr], 0
204
        je      .no_imports
205
        add     [.import_descr], ebp
206
        mov     [.bad_import], 0
207
.import_block:
208
        mov     ecx, [.import_descr]
209
        cmp     dword [ecx+4], 0
210
        jne     @f
211
        cmp     dword [ecx+12], 0
212
        je      .done_imports
213
@@:
214
        mov     edx, dword [ecx]
215
        mov     ecx, dword [ecx+16]
4423 Serge 216
        test    edx, edx
217
        jnz     @f
218
        mov     edx, ecx
219
@@:
5201 serge 220
        mov     [.import_idx], 0
2434 Serge 221
        add     ecx, ebp
222
        add     edx, ebp
5201 serge 223
        mov     [.import_names], edx
224
        mov     [.import_targets], ecx
225
.import_func:
226
        mov     esi, [.import_idx]
227
        mov     edi, [.import_names]
228
        mov     eax, [edi+esi*4]
2434 Serge 229
        test    eax, eax
5201 serge 230
        je      .next_import_block
231
        js      .next_import_block
2434 Serge 232
        lea     edi, [ebp+eax]
5201 serge 233
        mov     eax, [.import_targets]
234
        mov     dword [eax+esi*4], 0
2434 Serge 235
        lea     esi, [edi+2]
5201 serge 236
        movzx   ebx, word [edi]
2434 Serge 237
        push    32
5201 serge 238
        mov     ecx, [__exports+32]
239
        mov     eax, [ecx+OS_BASE+ebx*4]
884 serge 240
        add     eax, OS_BASE
2434 Serge 241
        push    eax
242
        push    esi
243
        call    strncmp
5201 serge 244
        test    eax, eax
245
        jz      .import_func_found
2434 Serge 246
        xor     ebx, ebx
5201 serge 247
.import_func_candidate:
2434 Serge 248
        push    32
5201 serge 249
        mov     ecx, [__exports+32]
250
        mov     eax, [ecx+OS_BASE+ebx*4]
884 serge 251
        add     eax, OS_BASE
2434 Serge 252
        push    eax
253
        push    esi
254
        call    strncmp
255
        test    eax, eax
5201 serge 256
        je      .import_func_found
2434 Serge 257
        inc     ebx
5201 serge 258
        cmp     ebx, [__exports+24]
259
        jb      .import_func_candidate
757 serge 260
 
261
        mov     esi, msg_unresolved
262
        call    sys_msg_board_str
2434 Serge 263
        lea     esi, [edi+2]
757 serge 264
        call    sys_msg_board_str
265
        mov     esi, msg_CR
266
        call    sys_msg_board_str
267
 
5201 serge 268
        mov     [.bad_import], 1
269
        jmp     .next_import_func
270
.import_func_found:
271
        mov     esi, [__exports+28]
272
        mov     edx, [.import_idx]
273
        mov     ecx, [.import_targets]
274
        mov     eax, [esi+OS_BASE+ebx*4]
884 serge 275
        add     eax, OS_BASE
5201 serge 276
        mov     [ecx+edx*4], eax
277
.next_import_func:
278
        inc     [.import_idx]
279
        jmp     .import_func
280
.next_import_block:
281
        add     [.import_descr], 20
282
        jmp     .import_block
283
.done_imports:
2434 Serge 284
        xor     eax, eax
5201 serge 285
        cmp     [.bad_import], 0
286
        jne     @f
287
.no_imports:
2434 Serge 288
        mov     eax, ebp
5201 serge 289
        add     eax, [.AddressOfEntryPoint]
290
@@:
291
        add     esp, .locals_size
2434 Serge 292
        pop     esi
293
        pop     edi
5201 serge 294
        ret