Subversion Repositories Kolibri OS

Rev

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

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