Subversion Repositories Kolibri OS

Rev

Rev 519 | Rev 529 | 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
    __#name#_library_name__ db fname,0
19
}
20
 
21
macro import lname,[name,sname]
22
{
23
  common
24
    align 4
25
    __#lname#_library_table__:
26
  forward
27
    name dd __#name#_import_name__
28
  common
29
    dd 0
30
  forward
31
    __#name#_import_name__ db sname,0
32
}
33
 
34
macro export [name,sname]
35
{
521 diamond 36
align 4
488 spraid 37
  forward
38
    dd __#name#_export_name__,name
39
  common
40
    dd 0
41
  forward
42
    __#name#_export_name__ db sname,0
43
}
44
 
45
 
46
 
47
align 4            ; загрузка библиотеки с условием, что будит использываться из ядра
48
proc load_k_library stdcall, file_name:dword
49
           locals
50
             coff      dd ?
51
             sym       dd ?
52
             strings   dd ?
53
             img_size  dd ?
54
             img_base  dd ?
55
             exports   dd ?
56
           endl
519 serge 57
 
488 spraid 58
		   cli
519 serge 59
 
488 spraid 60
           stdcall load_file, [file_name]
61
           test eax, eax
62
           jz .fail
63
 
64
           mov [coff], eax
65
           movzx ecx, [eax+CFH.nSections]
66
           xor ebx, ebx
67
 
68
           lea edx, [eax+20]
69
@@:
70
           add ebx, [edx+CFS.SizeOfRawData]
71
           add ebx, 15
72
           and ebx, not 15
73
           add edx, COFF_SECTION_SIZE
74
           dec ecx
75
           jnz @B
76
           mov [img_size], ebx
77
 
78
           stdcall kernel_alloc, [img_size]
79
 
80
           test eax, eax
81
           jz .fail
82
           mov [img_base], eax
83
 
84
           mov edx, [coff]
85
           movzx ebx, [edx+CFH.nSections]
86
           mov edi, [img_base]
87
           lea eax, [edx+20]
88
@@:
89
           mov [eax+CFS.VirtualAddress], edi
90
           mov esi, [eax+CFS.PtrRawData]
91
           test esi, esi
92
           jnz .copy
93
           add edi, [eax+CFS.SizeOfRawData]
94
           jmp .next
95
.copy:
96
           add esi, edx
97
           mov ecx, [eax+CFS.SizeOfRawData]
98
           cld
99
           rep movsb
100
.next:
101
           add edi, 15
102
           and edi, not 15
103
           add eax, COFF_SECTION_SIZE
104
           dec ebx
105
           jnz @B
106
 
107
           mov ebx, [edx+CFH.pSymTable]
108
           add ebx, edx
109
           mov [sym], ebx
110
           mov ecx, [edx+CFH.nSymbols]
111
           add ecx,ecx
112
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
113
           add ecx, [sym]
114
           mov [strings], ecx
115
 
116
           lea eax, [edx+20]
519 serge 117
 
488 spraid 118
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
119
                                     [strings], dword 0
120
           test eax, eax
121
           jnz @F
122
 
123
@@:
124
           mov edx, [coff]
125
           movzx ebx, [edx+CFH.nSections]
126
           mov edi, 0
127
           lea eax, [edx+20]
128
@@:
129
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
130
           add eax, COFF_SECTION_SIZE
131
           dec ebx
132
           jnz @B
133
 
134
           add edx, 20
135
           stdcall fix_coff_relocs, [coff], edx, [sym]
136
 
137
           mov ebx, [coff]
138
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
139
           mov [exports], eax
140
 
141
           stdcall kernel_free, [coff]
142
 
143
           mov eax, [exports]
144
           ret
145
.fail:
146
           xor eax, eax
147
           ret
148
endp
149
 
150
 
151
proc dll.Load, import_table:dword
152
		mov	esi,[import_table]
153
  .next_lib:	mov	edx,[esi]
154
		or	edx,edx
155
		jz	.exit
156
		push	esi
157
 
158
		mov	edi,s_libname
519 serge 159
 
521 diamond 160
		mov     al, '/'
161
		stosb
162
		mov esi,sysdir_path
488 spraid 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
 
521 diamond 309
uglobal
488 spraid 310
s_libname  db 64 dup (0)
521 diamond 311
endg