Subversion Repositories Kolibri OS

Rev

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

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