Subversion Repositories Kolibri OS

Rev

Rev 792 | Rev 884 | 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: 819 $
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
175
	sub	edi, -2147483648
176
	sub	esi, -2147483648
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]
203
	sub	eax, -2147483648
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]
216
	mov	eax, DWORD PTR [ecx-2147483648+ebx*4]
217
	sub	eax, -2147483648
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]
228
	sub	eax, -2147483648
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]
255
	sub	eax, -2147483648
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
819 serge 283
          commit_pages,          'CommitPages',        \      ; eax, ebx, ecx
792 serge 284
          create_kernel_object,  'CreateObject',       \
819 serge 285
          create_ring_buffer,    'CreateRingBuffer',   \      ; stdcall
792 serge 286
          destroy_kernel_object, 'DestroyObject',      \
287
          free_kernel_space,     'FreeKernelSpace',    \      ; stdcall
288
          kernel_alloc,          'KernelAlloc',        \      ; stdcall
289
          kernel_free,           'KernelFree',         \      ; stdcall
290
          malloc,                'Kmalloc',            \
291
          free,                  'Kfree',              \
292
          map_io_mem,            'MapIoMem',           \      ; stdcall
819 serge 293
          get_pg_addr,           'GetPgAddr',          \      ; eax
757 serge 294
\
792 serge 295
          select_hw_cursor,      'SelectHwCursor',     \      ; stdcall
296
          set_hw_cursor,         'SetHwCursor',        \      ; stdcall
297
          hw_restore,            'HwCursorRestore',    \      ;
298
          create_cursor,         'HwCursorCreate',     \      ;
757 serge 299
\
792 serge 300
          set_screen,            'SetScreen',          \
301
          pci_api,               'PciApi',             \
302
          pci_read8,             'PciRead8',           \      ; stdcall
303
          pci_read16,            'PciRead16',          \      ; stdcall
304
          pci_read32,            'PciRead32',          \      ; stdcall
305
          pci_write8,            'PciWrite8',          \      ; stdcall
306
          pci_write16,           'PciWrite16',         \      ; stdcall
307
          pci_write32,           'PciWrite32',         \      ; stdcall
308
\
819 serge 309
          reg_service,           'RegService',         \      ; stdcall
792 serge 310
          user_alloc,            'UserAlloc',          \      ; stdcall
311
          user_free,             'UserFree',           \      ; stdcall
819 serge 312
          unmap_pages,           'UnmapPages',         \      ; eax, ecx
792 serge 313
          sys_msg_board_str,     'SysMsgBoardStr'
757 serge 314