Subversion Repositories Kolibri OS

Rev

Rev 593 | Rev 1289 | 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
 
488 spraid 8
;============================================================================
9
;
530 mikedld 10
;   External kernel dependencies (libraries) loading
488 spraid 11
;
12
;============================================================================
593 mikedld 13
 
14
$Revision: 750 $
15
 
16
 
488 spraid 17
macro library [name,fname]
18
{
19
  forward
20
    dd __#name#_library_table__,__#name#_library_name__
21
  common
22
    dd 0
23
  forward
24
    __#name#_library_name__ db fname,0
25
}
26
 
27
macro import lname,[name,sname]
28
{
29
  common
30
    align 4
31
    __#lname#_library_table__:
32
  forward
33
    name dd __#name#_import_name__
34
  common
35
    dd 0
36
  forward
37
    __#name#_import_name__ db sname,0
38
}
39
 
40
macro export [name,sname]
41
{
521 diamond 42
align 4
488 spraid 43
  forward
44
    dd __#name#_export_name__,name
45
  common
46
    dd 0
47
  forward
48
    __#name#_export_name__ db sname,0
49
}
50
 
51
 
52
 
535 spraid 53
align 4            ; loading library (use kernel functions)
488 spraid 54
proc load_k_library stdcall, file_name:dword
55
           locals
56
             coff      dd ?
57
             sym       dd ?
58
             strings   dd ?
59
             img_size  dd ?
60
             img_base  dd ?
61
             exports   dd ?
62
           endl
519 serge 63
 
488 spraid 64
		   cli
519 serge 65
 
488 spraid 66
           stdcall load_file, [file_name]
67
           test eax, eax
68
           jz .fail
69
 
70
           mov [coff], eax
71
           movzx ecx, [eax+CFH.nSections]
72
           xor ebx, ebx
73
 
74
           lea edx, [eax+20]
75
@@:
76
           add ebx, [edx+CFS.SizeOfRawData]
77
           add ebx, 15
78
           and ebx, not 15
79
           add edx, COFF_SECTION_SIZE
80
           dec ecx
81
           jnz @B
82
           mov [img_size], ebx
83
 
84
           stdcall kernel_alloc, [img_size]
85
 
86
           test eax, eax
87
           jz .fail
88
           mov [img_base], eax
89
 
90
           mov edx, [coff]
91
           movzx ebx, [edx+CFH.nSections]
92
           mov edi, [img_base]
93
           lea eax, [edx+20]
94
@@:
95
           mov [eax+CFS.VirtualAddress], edi
96
           mov esi, [eax+CFS.PtrRawData]
97
           test esi, esi
98
           jnz .copy
99
           add edi, [eax+CFS.SizeOfRawData]
100
           jmp .next
101
.copy:
102
           add esi, edx
103
           mov ecx, [eax+CFS.SizeOfRawData]
104
           cld
105
           rep movsb
106
.next:
107
           add edi, 15
108
           and edi, not 15
109
           add eax, COFF_SECTION_SIZE
110
           dec ebx
111
           jnz @B
112
 
113
           mov ebx, [edx+CFH.pSymTable]
114
           add ebx, edx
115
           mov [sym], ebx
116
           mov ecx, [edx+CFH.nSymbols]
117
           add ecx,ecx
118
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
119
           add ecx, [sym]
120
           mov [strings], ecx
121
 
122
           lea eax, [edx+20]
519 serge 123
 
488 spraid 124
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
125
                                     [strings], dword 0
126
           test eax, eax
127
           jnz @F
128
 
129
@@:
130
           mov edx, [coff]
131
           movzx ebx, [edx+CFH.nSections]
132
           mov edi, 0
133
           lea eax, [edx+20]
134
@@:
135
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
136
           add eax, COFF_SECTION_SIZE
137
           dec ebx
138
           jnz @B
139
 
140
           add edx, 20
141
           stdcall fix_coff_relocs, [coff], edx, [sym]
142
 
143
           mov ebx, [coff]
144
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
145
           mov [exports], eax
146
 
147
           stdcall kernel_free, [coff]
148
 
149
           mov eax, [exports]
150
           ret
151
.fail:
152
           xor eax, eax
153
           ret
154
endp
155
 
156
 
157
proc dll.Load, import_table:dword
158
		mov	esi,[import_table]
159
  .next_lib:	mov	edx,[esi]
160
		or	edx,edx
161
		jz	.exit
162
		push	esi
163
 
164
		mov	edi,s_libname
519 serge 165
 
521 diamond 166
		mov     al, '/'
167
		stosb
168
		mov esi,sysdir_path
488 spraid 169
	    @@: lodsb
170
		stosb
171
		or	al,al
172
		jnz	@b
173
		dec edi
174
		mov [edi], dword '/lib'
175
		mov [edi+4],byte '/'
176
		add edi,5
177
		pop esi
178
		push esi
179
		mov	esi,[esi+4]
180
	    @@: lodsb
181
		stosb
182
		or	al,al
183
		jnz	@b
184
 
185
		pushad
186
		stdcall load_k_library,s_libname
187
		mov [esp+28],eax
188
		popad
189
		or	eax,eax
190
		jz	.fail
191
		stdcall dll.Link,eax,edx
192
		stdcall dll.Init,[eax+4]
193
		pop	esi
194
		add	esi,8
195
		jmp	.next_lib
196
  .exit:	xor	eax,eax
197
		ret
198
  .fail:	add	esp,4
199
		xor	eax,eax
200
		inc	eax
201
		ret
202
endp
203
 
204
proc dll.Link, exp:dword,imp:dword
205
		push	eax
206
		mov	esi,[imp]
207
		test	esi,esi
208
		jz	.done
209
  .next:	lodsd
210
		test	eax,eax
211
		jz	.done
212
		stdcall dll.GetProcAddress,[exp],eax
213
		or	eax,eax
214
		jz	@f
215
		mov	[esi-4],eax
216
		jmp	.next
217
	    @@: mov	dword[esp],0
218
  .done:	pop	eax
219
		ret
220
endp
221
 
222
proc dll.Init, dllentry:dword
223
		pushad
224
		mov	eax,mem.Alloc
225
		mov	ebx,mem.Free
226
		mov	ecx,mem.ReAlloc
227
		mov	edx,dll.Load
228
		stdcall [dllentry]
229
		popad
230
		ret
231
endp
232
 
233
proc dll.GetProcAddress, exp:dword,sz_name:dword
234
		mov	edx,[exp]
235
  .next:	test	edx,edx
236
		jz	.end
519 serge 237
                stdcall strncmp,[edx],[sz_name], dword -1
488 spraid 238
		test	eax,eax
239
		jz	.ok
240
		add	edx,8
241
		jmp	.next
242
  .ok:		mov	eax,[edx+4]
243
  .end: 	ret
244
endp
245
 
246
;-----------------------------------------------------------------------------
247
proc mem.Alloc size ;/////////////////////////////////////////////////////////
248
;-----------------------------------------------------------------------------
249
	push	ebx ecx
250
;	mov	eax,[size]
251
;	lea	ecx,[eax+4+4095]
252
;	and	ecx,not 4095
253
;	stdcall kernel_alloc, ecx
254
;	add	ecx,-4
255
;	mov	[eax],ecx
256
;	add	eax,4
257
 
258
	stdcall kernel_alloc, [size]
259
 
260
	pop	ecx ebx
261
	ret
262
endp
263
 
264
;-----------------------------------------------------------------------------
265
proc mem.ReAlloc mptr,size;///////////////////////////////////////////////////
266
;-----------------------------------------------------------------------------
267
	push	ebx ecx esi edi eax
268
	mov	eax,[mptr]
269
	mov	ebx,[size]
270
	or	eax,eax
271
	jz	@f
272
	lea	ecx,[ebx+4+4095]
273
	and	ecx,not 4095
274
	add	ecx,-4
275
	cmp	ecx,[eax-4]
276
	je	.exit
277
    @@: mov	eax,ebx
278
	call	mem.Alloc
279
	xchg	eax,[esp]
280
	or	eax,eax
281
	jz	.exit
282
	mov	esi,eax
283
	xchg	eax,[esp]
284
	mov	edi,eax
285
	mov	ecx,[esi-4]
286
	cmp	ecx,[edi-4]
287
	jbe	@f
288
	mov	ecx,[edi-4]
289
    @@: add	ecx,3
290
	shr	ecx,2
291
	cld
292
	rep	movsd
293
	xchg	eax,[esp]
294
	call	mem.Free
295
  .exit:
296
	pop	eax edi esi ecx ebx
297
	ret
298
endp
299
 
300
;-----------------------------------------------------------------------------
301
proc mem.Free mptr ;//////////////////////////////////////////////////////////
302
;-----------------------------------------------------------------------------
303
;	mov	eax,[mptr]
304
;	or	eax,eax
305
;	jz	@f
306
;	push	ebx ecx
307
;	lea	ecx,[eax-4]
308
;	stdcall kernel_free, ecx
309
;	pop	ecx ebx
310
;    @@: ret
311
	stdcall kernel_free, [mptr]
312
	ret
313
endp
314
 
521 diamond 315
uglobal
488 spraid 316
s_libname  db 64 dup (0)
521 diamond 317
endg