Subversion Repositories Kolibri OS

Rev

Rev 1434 | Rev 1614 | Go to most recent revision | Details | Compare with Previous | 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: 1612 $
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
 
27
           mov edx, [eax+60]
28
 
29
           stdcall kernel_alloc, [eax+80+edx]
30
           test eax, eax
31
           jz .cleanup
32
 
33
           mov [base], eax
34
 
35
           stdcall map_PE, eax, [image]
36
 
37
           mov [entry], eax
38
           test eax, eax
39
           jnz .cleanup
40
 
41
           stdcall kernel_free, [base]
42
.cleanup:
43
           stdcall kernel_free, [image]
44
           mov eax, [entry]
45
           ret
46
.fail:
47
           xor eax, eax
48
           ret
49
endp
50
 
51
DWORD equ dword
52
PTR   equ
53
 
54
align 4
55
map_PE:                    ;stdcall base:dword, image:dword
56
           cld
57
        push    ebp
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]
70
 
71
	shr ecx, 2
72
	rep movsd
73
 
74
	movzx	eax, WORD PTR [edx+6]
75
	mov	DWORD PTR [esp+36], 0
76
	mov	DWORD PTR [esp+16], eax
77
	jmp	L2
78
L3:
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]
87
 
88
	shr ecx, 2
89
	rep movsd
90
 
91
L4:
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]
100
 
101
	xor eax, eax
102
	rep stosb
103
 
104
L6:
105
	inc	DWORD PTR [esp+36]
106
	add	edx, 40
107
L2:
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
122
L12:
123
	lea	ebx, [eax-8]
124
	xor	edi, edi
125
        shr     ebx,1
126
	jmp	L13
127
L14:
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
141
L17:
142
	add	WORD PTR [edx+ebp], si
143
L18:
144
	add	DWORD PTR [edx+ebp], esi
145
L15:
146
	inc	edi
147
L13:
148
	cmp	edi, ebx
149
	jne	L14
150
	add	ecx, DWORD PTR [ecx+4]
151
L11:
152
	mov	eax, DWORD PTR [ecx+4]
153
	test	eax, eax
154
	jne	L12
155
L9:
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
164
L22:
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
170
L23:
171
        mov     edi, DWORD PTR [__exports+32]
172
        mov     esi, DWORD PTR [__exports+28]
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
757 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
186
L26:
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
757 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
212
L33:
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
757 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
757 serge 229
	mov	DWORD PTR [ecx+edx*4], eax
230
	jmp	L36
231
L34:
232
	inc	ebx
233
L32:
234
        cmp     ebx, DWORD PTR [__exports+24]
235
	jb	L33
236
L36:
237
        cmp     ebx, DWORD PTR [__exports+24]
238
	jne	L37
239
 
240
        mov     esi, msg_unresolved
241
        call    sys_msg_board_str
242
	lea	esi, [edi+2]
243
        call    sys_msg_board_str
244
        mov     esi, msg_CR
245
        call    sys_msg_board_str
246
 
247
	mov	DWORD PTR [esp+40], 1
248
	jmp	L37
249
L30:
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
757 serge 256
	mov	DWORD PTR [edx+edi*4], eax
257
L37:
258
	inc	DWORD PTR [esp+52]
259
	jmp	L26
260
L27:
261
	add	DWORD PTR [esp+56], 20
262
	jmp	L22
263
L25:
264
	xor	eax, eax
265
	cmp	DWORD PTR [esp+40], 0
266
	jne	L40
267
L20:
268
	mov	ecx, DWORD PTR [esp+32]
269
	mov	eax, ebp
270
	add	eax, DWORD PTR [ecx+40]
271
L40:
272
	add	esp, 60
273
	pop	ebx
274
	pop	esi
275
	pop	edi
276
	pop	ebp
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
288
          raise_event,           'RaiseEvent',         \      ; eax, ebx, edx, esi
289
          wait_event,            'WaitEvent',          \      ; eax, ebx
290
          get_event_ex,          'GetEvent',           \      ; edi
291
\
792 serge 292
          create_kernel_object,  'CreateObject',       \
819 serge 293
          create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
792 serge 294
          destroy_kernel_object, 'DestroyObject',      \
295
          free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
296
          kernel_alloc,          'KernelAlloc',        \      ; stdcall
297
          kernel_free,           'KernelFree',         \      ; stdcall
298
          malloc,                'Kmalloc',            \
299
          free,                  'Kfree',              \
300
          map_io_mem,            'MapIoMem',           \      ; stdcall
819 serge 301
          get_pg_addr,           'GetPgAddr',          \      ; eax
757 serge 302
\
1434 serge 303
          mutex_init,            'MutexInit',          \      ; gcc fastcall
304
          mutex_lock,            'MutexLock',          \      ; gcc fastcall
305
          mutex_unlock,          'MutexUnlock',        \      ; gcc fastcall
306
\
1316 serge 307
          get_display,           'GetDisplay',         \
792 serge 308
          set_screen,            'SetScreen',          \
309
          pci_api,               'PciApi',             \
310
          pci_read8,             'PciRead8',           \      ; stdcall
311
          pci_read16,            'PciRead16',          \      ; stdcall
312
          pci_read32,            'PciRead32',          \      ; stdcall
313
          pci_write8,            'PciWrite8',          \      ; stdcall
314
          pci_write16,           'PciWrite16',         \      ; stdcall
315
          pci_write32,           'PciWrite32',         \      ; stdcall
316
\
1275 serge 317
          get_service,           'GetService',         \      ;
819 serge 318
          reg_service,           'RegService',         \      ; stdcall
978 serge 319
          attach_int_handler,    'AttachIntHandler',   \      ; stdcall
792 serge 320
          user_alloc,            'UserAlloc',          \      ; stdcall
321
          user_free,             'UserFree',           \      ; stdcall
819 serge 322
          unmap_pages,           'UnmapPages',         \      ; eax, ecx
924 serge 323
          sys_msg_board_str,     'SysMsgBoardStr',     \
324
          delay_hs,              'Delay',              \      ; ebx
325
          set_mouse_data,        'SetMouseData'
757 serge 326