Subversion Repositories Kolibri OS

Rev

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

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