Subversion Repositories Kolibri OS

Rev

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