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 |