Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
750 victor 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 $
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
 
21
           stdcall load_file, [file_name]
22
           test eax, eax
23
           jz .fail
24
 
25
           mov [image], eax
26
 
864 serge 27
           mov ebx, [eax+60]
28
           mov ecx, [eax+80+edx]
29
           mov edx, PG_SW
30
           call @mem_alloc@8
757 serge 31
           test eax, eax
864 serge 32
           mov [base], eax
757 serge 33
           jz .cleanup
34
 
35
           stdcall map_PE, eax, [image]
36
 
37
           mov [entry], eax
38
           test eax, eax
39
           jnz .cleanup
40
 
887 serge 41
           mov ecx, [base]
42
           call @mem_free@4
43
 
757 serge 44
.cleanup:
887 serge 45
           mov ecx, [image]
46
           call @mem_free@4
47
 
757 serge 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
887 serge 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]
757 serge 74
 
887 serge 75
           shr ecx, 2
76
           rep movsd
757 serge 77
 
887 serge 78
           movzx   eax, WORD PTR [edx+6]
79
           mov DWORD PTR [esp+36], 0
80
           mov DWORD PTR [esp+16], eax
81
           jmp L2
757 serge 82
L3:
887 serge 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]
757 serge 91
 
887 serge 92
           shr ecx, 2
93
           rep movsd
757 serge 94
 
95
L4:
887 serge 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]
757 serge 104
 
887 serge 105
           xor eax, eax
106
           rep stosb
757 serge 107
 
108
L6:
887 serge 109
           inc DWORD PTR [esp+36]
110
           add edx, 40
757 serge 111
L2:
887 serge 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
757 serge 126
L12:
887 serge 127
           lea ebx, [eax-8]
128
           xor edi, edi
129
           shr     ebx,1
130
           jmp L13
757 serge 131
L14:
887 serge 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
757 serge 145
L17:
887 serge 146
           add WORD PTR [edx+ebp], si
757 serge 147
L18:
887 serge 148
           add DWORD PTR [edx+ebp], esi
757 serge 149
L15:
887 serge 150
           inc edi
757 serge 151
L13:
887 serge 152
           cmp edi, ebx
153
           jne L14
154
           add ecx, DWORD PTR [ecx+4]
757 serge 155
L11:
887 serge 156
           mov eax, DWORD PTR [ecx+4]
157
           test    eax, eax
158
           jne L12
757 serge 159
L9:
887 serge 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
757 serge 168
L22:
887 serge 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
757 serge 174
L23:
887 serge 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
757 serge 190
L26:
887 serge 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
757 serge 216
L33:
887 serge 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
757 serge 235
L34:
887 serge 236
           inc ebx
757 serge 237
L32:
887 serge 238
           cmp ebx, DWORD PTR [__exports+24]
239
           jb  L33
757 serge 240
L36:
887 serge 241
           cmp ebx, DWORD PTR [__exports+24]
242
           jne L37
757 serge 243
 
887 serge 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
757 serge 250
 
887 serge 251
           mov DWORD PTR [esp+40], 1
252
           jmp L37
757 serge 253
L30:
887 serge 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
757 serge 261
L37:
887 serge 262
           inc DWORD PTR [esp+52]
263
           jmp L26
757 serge 264
L27:
887 serge 265
           add DWORD PTR [esp+56], 20
266
           jmp L22
757 serge 267
L25:
887 serge 268
           xor eax, eax
269
           cmp DWORD PTR [esp+40], 0
270
           jne L40
757 serge 271
L20:
887 serge 272
           mov ecx, DWORD PTR [esp+32]
273
           mov eax, ebp
274
           add eax, DWORD PTR [ecx+40]
757 serge 275
L40:
887 serge 276
           add esp, 60
277
           pop ebx
278
           pop esi
279
           pop edi
280
           pop ebp
281
           ret     8
757 serge 282
 
283
 align 16
284
__exports:
887 serge 285
                 export 'KERNEL',   \
286
                 commit_pages,          'CommitPages',        \      ; eax, ebx, ecx
792 serge 287
          create_kernel_object,  'CreateObject',       \
819 serge 288
          create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
792 serge 289
          destroy_kernel_object, 'DestroyObject',      \
290
          free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
291
          malloc,                'Kmalloc',            \
292
          free,                  'Kfree',              \
293
          map_io_mem,            'MapIoMem',           \      ; stdcall
819 serge 294
          get_pg_addr,           'GetPgAddr',          \      ; eax
757 serge 295
\
792 serge 296
          select_hw_cursor,      'SelectHwCursor',     \      ; stdcall
297
          set_hw_cursor,         'SetHwCursor',        \      ; stdcall
298
          hw_restore,            'HwCursorRestore',    \      ;
299
          create_cursor,         'HwCursorCreate',     \      ;
757 serge 300
\
792 serge 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
\
819 serge 310
          reg_service,           'RegService',         \      ; stdcall
792 serge 311
          user_alloc,            'UserAlloc',          \      ; stdcall
312
          user_free,             'UserFree',           \      ; stdcall
819 serge 313
          unmap_pages,           'UnmapPages',         \      ; eax, ecx
792 serge 314
          sys_msg_board_str,     'SysMsgBoardStr'
757 serge 315