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 |