Subversion Repositories Kolibri OS

Rev

Rev 529 | Rev 535 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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