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 |