Subversion Repositories Kolibri OS

Rev

Rev 529 | Rev 535 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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