Subversion Repositories Kolibri OS

Rev

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

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