Rev 837 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 837 | Rev 897 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 709 $ |
8 | $Revision: 897 $ |
9 | 9 | ||
10 | 10 | ||
11 | image_of_eax EQU esp+36 |
11 | image_of_eax EQU esp+36 |
12 | image_of_ebx EQU esp+24 |
12 | image_of_ebx EQU esp+24 |
13 | 13 | ||
14 | ; System function 70 - files with long names (LFN) |
14 | ; System function 70 - files with long names (LFN) |
15 | ; diamond, 2006 |
15 | ; diamond, 2006 |
16 | 16 | ||
17 | iglobal |
17 | iglobal |
18 | ; in this table names must be in lowercase |
18 | ; in this table names must be in lowercase |
19 | rootdirs: |
19 | rootdirs: |
20 | db 2,'rd' |
20 | db 2,'rd' |
21 | dd fs_OnRamdisk |
21 | dd fs_OnRamdisk |
22 | dd fs_NextRamdisk |
22 | dd fs_NextRamdisk |
23 | db 7,'ramdisk' |
23 | db 7,'ramdisk' |
24 | dd fs_OnRamdisk |
24 | dd fs_OnRamdisk |
25 | dd fs_NextRamdisk |
25 | dd fs_NextRamdisk |
26 | db 2,'fd' |
26 | db 2,'fd' |
27 | dd fs_OnFloppy |
27 | dd fs_OnFloppy |
28 | dd fs_NextFloppy |
28 | dd fs_NextFloppy |
29 | db 10,'floppydisk' |
29 | db 10,'floppydisk' |
30 | dd fs_OnFloppy |
30 | dd fs_OnFloppy |
31 | dd fs_NextFloppy |
31 | dd fs_NextFloppy |
32 | db 3,'hd0' |
32 | db 3,'hd0' |
33 | dd fs_OnHd0 |
33 | dd fs_OnHd0 |
34 | dd fs_NextHd0 |
34 | dd fs_NextHd0 |
35 | db 3,'hd1' |
35 | db 3,'hd1' |
36 | dd fs_OnHd1 |
36 | dd fs_OnHd1 |
37 | dd fs_NextHd1 |
37 | dd fs_NextHd1 |
38 | db 3,'hd2' |
38 | db 3,'hd2' |
39 | dd fs_OnHd2 |
39 | dd fs_OnHd2 |
40 | dd fs_NextHd2 |
40 | dd fs_NextHd2 |
41 | db 3,'hd3' |
41 | db 3,'hd3' |
42 | dd fs_OnHd3 |
42 | dd fs_OnHd3 |
43 | dd fs_NextHd3 |
43 | dd fs_NextHd3 |
44 | ;********************************************** |
44 | ;********************************************** |
45 | db 3,'cd0' |
45 | db 3,'cd0' |
46 | dd fs_OnCd0 |
46 | dd fs_OnCd0 |
47 | dd fs_NextCd |
47 | dd fs_NextCd |
48 | db 3,'cd1' |
48 | db 3,'cd1' |
49 | dd fs_OnCd1 |
49 | dd fs_OnCd1 |
50 | dd fs_NextCd |
50 | dd fs_NextCd |
51 | db 3,'cd2' |
51 | db 3,'cd2' |
52 | dd fs_OnCd2 |
52 | dd fs_OnCd2 |
53 | dd fs_NextCd |
53 | dd fs_NextCd |
54 | db 3,'cd3' |
54 | db 3,'cd3' |
55 | dd fs_OnCd3 |
55 | dd fs_OnCd3 |
56 | dd fs_NextCd |
56 | dd fs_NextCd |
57 | ;*********************************************** |
57 | ;*********************************************** |
58 | db 0 |
58 | db 0 |
59 | 59 | ||
60 | 60 | ||
61 | virtual_root_query: |
61 | virtual_root_query: |
62 | dd fs_HasRamdisk |
62 | dd fs_HasRamdisk |
63 | db 'rd',0 |
63 | db 'rd',0 |
64 | dd fs_HasFloppy |
64 | dd fs_HasFloppy |
65 | db 'fd',0 |
65 | db 'fd',0 |
66 | dd fs_HasHd0 |
66 | dd fs_HasHd0 |
67 | db 'hd0',0 |
67 | db 'hd0',0 |
68 | dd fs_HasHd1 |
68 | dd fs_HasHd1 |
69 | db 'hd1',0 |
69 | db 'hd1',0 |
70 | dd fs_HasHd2 |
70 | dd fs_HasHd2 |
71 | db 'hd2',0 |
71 | db 'hd2',0 |
72 | dd fs_HasHd3 |
72 | dd fs_HasHd3 |
73 | db 'hd3',0 |
73 | db 'hd3',0 |
74 | ;********************************************** |
74 | ;********************************************** |
75 | dd fs_HasCd0 |
75 | dd fs_HasCd0 |
76 | db 'cd0',0 |
76 | db 'cd0',0 |
77 | dd fs_HasCd1 |
77 | dd fs_HasCd1 |
78 | db 'cd1',0 |
78 | db 'cd1',0 |
79 | dd fs_HasCd2 |
79 | dd fs_HasCd2 |
80 | db 'cd2',0 |
80 | db 'cd2',0 |
81 | dd fs_HasCd3 |
81 | dd fs_HasCd3 |
82 | db 'cd3',0 |
82 | db 'cd3',0 |
83 | ;********************************************** |
83 | ;********************************************** |
84 | dd 0 |
84 | dd 0 |
85 | 85 | ||
86 | fs_additional_handlers: |
86 | fs_additional_handlers: |
87 | dd biosdisk_handler, biosdisk_enum_root |
87 | dd biosdisk_handler, biosdisk_enum_root |
88 | ; add new handlers here |
88 | ; add new handlers here |
89 | dd 0 |
89 | dd 0 |
90 | 90 | ||
91 | endg |
91 | endg |
92 | 92 | ||
93 | file_system_lfn: |
93 | file_system_lfn: |
94 | ; in: eax->fileinfo block |
94 | ; in: eax->fileinfo block |
95 | ; operation codes: |
95 | ; operation codes: |
96 | ; 0 : read file |
96 | ; 0 : read file |
97 | ; 1 : read folder |
97 | ; 1 : read folder |
98 | ; 2 : create/rewrite file |
98 | ; 2 : create/rewrite file |
99 | ; 3 : write/append to file |
99 | ; 3 : write/append to file |
100 | ; 4 : set end of file |
100 | ; 4 : set end of file |
101 | ; 5 : get file/directory attributes structure |
101 | ; 5 : get file/directory attributes structure |
102 | ; 6 : set file/directory attributes structure |
102 | ; 6 : set file/directory attributes structure |
103 | ; 7 : start application |
103 | ; 7 : start application |
104 | ; 8 : delete file |
104 | ; 8 : delete file |
105 | ; 9 : create directory |
105 | ; 9 : create directory |
- | 106 | ||
- | 107 | cmp dword [eax], 7 |
|
- | 108 | je .do_exec |
|
106 | 109 | ||
107 | ; parse file name |
110 | ; parse file name |
108 | xchg ebx, eax |
111 | xchg ebx, eax |
109 | lea esi, [ebx+20] |
112 | lea esi, [ebx+20] |
110 | lodsb |
113 | lodsb |
111 | test al, al |
114 | test al, al |
112 | jnz @f |
115 | jnz @f |
113 | mov esi, [esi] |
116 | mov esi, [esi] |
114 | lodsb |
117 | lodsb |
115 | @@: |
118 | @@: |
116 | cmp al, '/' |
119 | cmp al, '/' |
117 | jz .notcurdir |
120 | jz .notcurdir |
118 | dec esi |
121 | dec esi |
119 | mov ebp, esi |
122 | mov ebp, esi |
120 | test al, al |
123 | test al, al |
121 | jnz @f |
124 | jnz @f |
122 | xor ebp, ebp |
125 | xor ebp, ebp |
123 | @@: |
126 | @@: |
124 | mov esi, [current_slot] |
127 | mov esi, [current_slot] |
125 | mov esi, [esi+APPDATA.cur_dir] |
128 | mov esi, [esi+APPDATA.cur_dir] |
126 | jmp .parse_normal |
129 | jmp .parse_normal |
127 | .notcurdir: |
130 | .notcurdir: |
128 | cmp byte [esi], 0 |
131 | cmp byte [esi], 0 |
129 | jz .rootdir |
132 | jz .rootdir |
130 | call process_replace_file_name |
133 | call process_replace_file_name |
131 | .parse_normal: |
134 | .parse_normal: |
132 | cmp dword [ebx], 7 |
- | |
133 | jne @F |
- | |
134 | mov edx, [ebx+4] |
- | |
135 | mov ebx, [ebx+8] |
- | |
136 | call fs_execute ; esi+ebp, ebx, edx |
- | |
137 | mov [image_of_eax], eax |
- | |
138 | ret |
- | |
139 | @@: |
- | |
140 | mov edi, rootdirs-8 |
135 | mov edi, rootdirs-8 |
141 | xor ecx, ecx |
136 | xor ecx, ecx |
142 | push esi |
137 | push esi |
143 | .scan1: |
138 | .scan1: |
144 | pop esi |
139 | pop esi |
145 | add edi, ecx |
140 | add edi, ecx |
146 | scasd |
141 | scasd |
147 | scasd |
142 | scasd |
148 | mov cl, byte [edi] |
143 | mov cl, byte [edi] |
149 | test cl, cl |
144 | test cl, cl |
150 | jz .notfound_try |
145 | jz .notfound_try |
151 | inc edi |
146 | inc edi |
152 | push esi |
147 | push esi |
153 | @@: |
148 | @@: |
154 | lodsb |
149 | lodsb |
155 | or al, 20h |
150 | or al, 20h |
156 | scasb |
151 | scasb |
157 | loopz @b |
152 | loopz @b |
158 | jnz .scan1 |
153 | jnz .scan1 |
159 | lodsb |
154 | lodsb |
160 | cmp al, '/' |
155 | cmp al, '/' |
161 | jz .found1 |
156 | jz .found1 |
162 | test al, al |
157 | test al, al |
163 | jnz .scan1 |
158 | jnz .scan1 |
164 | pop eax |
159 | pop eax |
165 | ; directory /xxx |
160 | ; directory /xxx |
166 | .maindir: |
161 | .maindir: |
167 | mov esi, [edi+4] |
162 | mov esi, [edi+4] |
168 | .maindir_noesi: |
163 | .maindir_noesi: |
169 | cmp dword [ebx], 1 |
164 | cmp dword [ebx], 1 |
170 | jnz .access_denied |
165 | jnz .access_denied |
171 | xor eax, eax |
166 | xor eax, eax |
172 | mov ebp, [ebx+12] |
167 | mov ebp, [ebx+12] |
173 | mov edx, [ebx+16] |
168 | mov edx, [ebx+16] |
174 | ; add edx, std_application_base_address |
169 | ; add edx, std_application_base_address |
175 | push dword [ebx+4] ; first block |
170 | push dword [ebx+4] ; first block |
176 | mov ebx, [ebx+8] ; flags |
171 | mov ebx, [ebx+8] ; flags |
177 | ; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler |
172 | ; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler |
178 | mov edi, edx |
173 | mov edi, edx |
179 | push ecx |
174 | push ecx |
180 | mov ecx, 32/4 |
175 | mov ecx, 32/4 |
181 | rep stosd |
176 | rep stosd |
182 | pop ecx |
177 | pop ecx |
183 | mov byte [edx], 1 ; version |
178 | mov byte [edx], 1 ; version |
184 | .maindir_loop: |
179 | .maindir_loop: |
185 | call esi |
180 | call esi |
186 | jc .maindir_done |
181 | jc .maindir_done |
187 | inc dword [edx+8] |
182 | inc dword [edx+8] |
188 | dec dword [esp] |
183 | dec dword [esp] |
189 | jns .maindir_loop |
184 | jns .maindir_loop |
190 | dec ebp |
185 | dec ebp |
191 | js .maindir_loop |
186 | js .maindir_loop |
192 | inc dword [edx+4] |
187 | inc dword [edx+4] |
193 | mov dword [edi], 0x10 ; attributes: folder |
188 | mov dword [edi], 0x10 ; attributes: folder |
194 | mov dword [edi+4], 1 ; name type: UNICODE |
189 | mov dword [edi+4], 1 ; name type: UNICODE |
195 | push eax |
190 | push eax |
196 | xor eax, eax |
191 | xor eax, eax |
197 | add edi, 8 |
192 | add edi, 8 |
198 | push ecx |
193 | push ecx |
199 | mov ecx, 40/4-2 |
194 | mov ecx, 40/4-2 |
200 | rep stosd |
195 | rep stosd |
201 | pop ecx |
196 | pop ecx |
202 | pop eax |
197 | pop eax |
203 | push eax edx |
198 | push eax edx |
204 | ; convert number in eax to decimal UNICODE string |
199 | ; convert number in eax to decimal UNICODE string |
205 | push edi |
200 | push edi |
206 | push ecx |
201 | push ecx |
207 | push -'0' |
202 | push -'0' |
208 | mov ecx, 10 |
203 | mov ecx, 10 |
209 | @@: |
204 | @@: |
210 | xor edx, edx |
205 | xor edx, edx |
211 | div ecx |
206 | div ecx |
212 | push edx |
207 | push edx |
213 | test eax, eax |
208 | test eax, eax |
214 | jnz @b |
209 | jnz @b |
215 | @@: |
210 | @@: |
216 | pop eax |
211 | pop eax |
217 | add al, '0' |
212 | add al, '0' |
218 | stosb |
213 | stosb |
219 | test bl, 1 ; UNICODE name? |
214 | test bl, 1 ; UNICODE name? |
220 | jz .ansi2 |
215 | jz .ansi2 |
221 | mov byte [edi], 0 |
216 | mov byte [edi], 0 |
222 | inc edi |
217 | inc edi |
223 | .ansi2: |
218 | .ansi2: |
224 | test al, al |
219 | test al, al |
225 | jnz @b |
220 | jnz @b |
226 | mov byte [edi-1], 0 |
221 | mov byte [edi-1], 0 |
227 | pop ecx |
222 | pop ecx |
228 | pop edi |
223 | pop edi |
229 | ; UNICODE name length is 520 bytes, ANSI - 264 |
224 | ; UNICODE name length is 520 bytes, ANSI - 264 |
230 | add edi, 520 |
225 | add edi, 520 |
231 | test bl, 1 |
226 | test bl, 1 |
232 | jnz @f |
227 | jnz @f |
233 | sub edi, 520-264 |
228 | sub edi, 520-264 |
234 | @@: |
229 | @@: |
235 | pop edx eax |
230 | pop edx eax |
236 | jmp .maindir_loop |
231 | jmp .maindir_loop |
237 | .maindir_done: |
232 | .maindir_done: |
238 | pop eax |
233 | pop eax |
239 | mov ebx, [edx+4] |
234 | mov ebx, [edx+4] |
240 | xor eax, eax |
235 | xor eax, eax |
241 | dec ebp |
236 | dec ebp |
242 | js @f |
237 | js @f |
243 | mov al, ERROR_END_OF_FILE |
238 | mov al, ERROR_END_OF_FILE |
244 | @@: |
239 | @@: |
245 | mov [image_of_eax], eax |
240 | mov [image_of_eax], eax |
246 | mov [image_of_ebx], ebx |
241 | mov [image_of_ebx], ebx |
247 | ret |
242 | ret |
248 | ; directory / |
243 | ; directory / |
249 | .rootdir: |
244 | .rootdir: |
250 | cmp dword [ebx], 1 ; read folder? |
245 | cmp dword [ebx], 1 ; read folder? |
251 | jz .readroot |
246 | jz .readroot |
252 | .access_denied: |
247 | .access_denied: |
253 | mov dword [image_of_eax], 10 ; access denied |
248 | mov dword [image_of_eax], 10 ; access denied |
254 | ret |
249 | ret |
255 | 250 | ||
256 | .readroot: |
251 | .readroot: |
257 | ; virtual root folder - special handler |
252 | ; virtual root folder - special handler |
258 | mov esi, virtual_root_query |
253 | mov esi, virtual_root_query |
259 | mov ebp, [ebx+12] |
254 | mov ebp, [ebx+12] |
260 | mov edx, [ebx+16] |
255 | mov edx, [ebx+16] |
261 | ; add edx, std_application_base_address |
256 | ; add edx, std_application_base_address |
262 | push dword [ebx+4] ; first block |
257 | push dword [ebx+4] ; first block |
263 | mov ebx, [ebx+8] ; flags |
258 | mov ebx, [ebx+8] ; flags |
264 | xor eax, eax |
259 | xor eax, eax |
265 | ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area |
260 | ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area |
266 | mov edi, edx |
261 | mov edi, edx |
267 | mov ecx, 32/4 |
262 | mov ecx, 32/4 |
268 | rep stosd |
263 | rep stosd |
269 | mov byte [edx], 1 ; version |
264 | mov byte [edx], 1 ; version |
270 | .readroot_loop: |
265 | .readroot_loop: |
271 | cmp dword [esi], eax |
266 | cmp dword [esi], eax |
272 | jz .readroot_done_static |
267 | jz .readroot_done_static |
273 | call dword [esi] |
268 | call dword [esi] |
274 | add esi, 4 |
269 | add esi, 4 |
275 | test eax, eax |
270 | test eax, eax |
276 | jnz @f |
271 | jnz @f |
277 | .readroot_next: |
272 | .readroot_next: |
278 | or ecx, -1 |
273 | or ecx, -1 |
279 | xchg esi, edi |
274 | xchg esi, edi |
280 | repnz scasb |
275 | repnz scasb |
281 | xchg esi, edi |
276 | xchg esi, edi |
282 | jmp .readroot_loop |
277 | jmp .readroot_loop |
283 | @@: |
278 | @@: |
284 | xor eax, eax |
279 | xor eax, eax |
285 | inc dword [edx+8] |
280 | inc dword [edx+8] |
286 | dec dword [esp] |
281 | dec dword [esp] |
287 | jns .readroot_next |
282 | jns .readroot_next |
288 | dec ebp |
283 | dec ebp |
289 | js .readroot_next |
284 | js .readroot_next |
290 | inc dword [edx+4] |
285 | inc dword [edx+4] |
291 | mov dword [edi], 0x10 ; attributes: folder |
286 | mov dword [edi], 0x10 ; attributes: folder |
292 | mov dword [edi+4], ebx ; name type: UNICODE |
287 | mov dword [edi+4], ebx ; name type: UNICODE |
293 | add edi, 8 |
288 | add edi, 8 |
294 | mov ecx, 40/4-2 |
289 | mov ecx, 40/4-2 |
295 | rep stosd |
290 | rep stosd |
296 | push edi |
291 | push edi |
297 | @@: |
292 | @@: |
298 | lodsb |
293 | lodsb |
299 | stosb |
294 | stosb |
300 | test bl, 1 |
295 | test bl, 1 |
301 | jz .ansi |
296 | jz .ansi |
302 | mov byte [edi], 0 |
297 | mov byte [edi], 0 |
303 | inc edi |
298 | inc edi |
304 | .ansi: |
299 | .ansi: |
305 | test eax, eax |
300 | test eax, eax |
306 | jnz @b |
301 | jnz @b |
307 | pop edi |
302 | pop edi |
308 | add edi, 520 |
303 | add edi, 520 |
309 | test bl, 1 |
304 | test bl, 1 |
310 | jnz .readroot_loop |
305 | jnz .readroot_loop |
311 | sub edi, 520-264 |
306 | sub edi, 520-264 |
312 | jmp .readroot_loop |
307 | jmp .readroot_loop |
313 | .readroot_done_static: |
308 | .readroot_done_static: |
314 | mov esi, fs_additional_handlers-8 |
309 | mov esi, fs_additional_handlers-8 |
315 | sub esp, 16 |
310 | sub esp, 16 |
316 | .readroot_ah_loop: |
311 | .readroot_ah_loop: |
317 | add esi, 8 |
312 | add esi, 8 |
318 | cmp dword [esi], 0 |
313 | cmp dword [esi], 0 |
319 | jz .readroot_done |
314 | jz .readroot_done |
320 | xor eax, eax |
315 | xor eax, eax |
321 | .readroot_ah_loop2: |
316 | .readroot_ah_loop2: |
322 | push edi |
317 | push edi |
323 | lea edi, [esp+4] |
318 | lea edi, [esp+4] |
324 | call dword [esi+4] |
319 | call dword [esi+4] |
325 | pop edi |
320 | pop edi |
326 | test eax, eax |
321 | test eax, eax |
327 | jz .readroot_ah_loop |
322 | jz .readroot_ah_loop |
328 | inc dword [edx+8] |
323 | inc dword [edx+8] |
329 | dec dword [esp+16] |
324 | dec dword [esp+16] |
330 | jns .readroot_ah_loop2 |
325 | jns .readroot_ah_loop2 |
331 | dec ebp |
326 | dec ebp |
332 | js .readroot_ah_loop2 |
327 | js .readroot_ah_loop2 |
333 | push eax |
328 | push eax |
334 | xor eax, eax |
329 | xor eax, eax |
335 | inc dword [edx+4] |
330 | inc dword [edx+4] |
336 | mov dword [edi], 0x10 ; attributes: folder |
331 | mov dword [edi], 0x10 ; attributes: folder |
337 | mov dword [edi+4], ebx |
332 | mov dword [edi+4], ebx |
338 | add edi, 8 |
333 | add edi, 8 |
339 | mov ecx, 40/4-2 |
334 | mov ecx, 40/4-2 |
340 | rep stosd |
335 | rep stosd |
341 | push esi edi |
336 | push esi edi |
342 | lea esi, [esp+12] |
337 | lea esi, [esp+12] |
343 | @@: |
338 | @@: |
344 | lodsb |
339 | lodsb |
345 | stosb |
340 | stosb |
346 | test bl, 1 |
341 | test bl, 1 |
347 | jz .ansi3 |
342 | jz .ansi3 |
348 | mov byte [edi], 0 |
343 | mov byte [edi], 0 |
349 | inc edi |
344 | inc edi |
350 | .ansi3: |
345 | .ansi3: |
351 | test al, al |
346 | test al, al |
352 | jnz @b |
347 | jnz @b |
353 | pop edi esi eax |
348 | pop edi esi eax |
354 | add edi, 520 |
349 | add edi, 520 |
355 | test bl, 1 |
350 | test bl, 1 |
356 | jnz .readroot_ah_loop2 |
351 | jnz .readroot_ah_loop2 |
357 | sub edi, 520-264 |
352 | sub edi, 520-264 |
358 | jmp .readroot_ah_loop2 |
353 | jmp .readroot_ah_loop2 |
359 | .readroot_done: |
354 | .readroot_done: |
360 | add esp, 16 |
355 | add esp, 16 |
361 | pop eax |
356 | pop eax |
362 | mov ebx, [edx+4] |
357 | mov ebx, [edx+4] |
363 | xor eax, eax |
358 | xor eax, eax |
364 | dec ebp |
359 | dec ebp |
365 | js @f |
360 | js @f |
366 | mov al, ERROR_END_OF_FILE |
361 | mov al, ERROR_END_OF_FILE |
367 | @@: |
362 | @@: |
368 | mov [image_of_eax], eax |
363 | mov [image_of_eax], eax |
369 | mov [image_of_ebx], ebx |
364 | mov [image_of_ebx], ebx |
370 | ret |
365 | ret |
371 | .notfound_try: |
366 | .notfound_try: |
372 | mov edi, fs_additional_handlers |
367 | mov edi, fs_additional_handlers |
373 | @@: |
368 | @@: |
374 | cmp dword [edi], 0 |
369 | cmp dword [edi], 0 |
375 | jz @f |
370 | jz @f |
376 | call dword [edi] |
371 | call dword [edi] |
377 | scasd |
372 | scasd |
378 | scasd |
373 | scasd |
379 | jmp @b |
374 | jmp @b |
380 | .notfound: |
375 | .notfound: |
381 | mov dword [image_of_eax], ERROR_FILE_NOT_FOUND |
376 | mov dword [image_of_eax], ERROR_FILE_NOT_FOUND |
382 | and dword [image_of_ebx], 0 |
377 | and dword [image_of_ebx], 0 |
383 | ret |
378 | ret |
384 | 379 | ||
385 | .notfounda: |
380 | .notfounda: |
386 | cmp edi, esp |
381 | cmp edi, esp |
387 | jnz .notfound |
382 | jnz .notfound |
388 | add esp, 8 |
383 | add esp, 8 |
389 | jmp .notfound |
384 | jmp .notfound |
390 | 385 | ||
391 | .found1: |
386 | .found1: |
392 | pop eax |
387 | pop eax |
393 | cmp byte [esi], 0 |
388 | cmp byte [esi], 0 |
394 | jz .maindir |
389 | jz .maindir |
395 | .found2: |
390 | .found2: |
396 | ; read partition number |
391 | ; read partition number |
397 | xor ecx, ecx |
392 | xor ecx, ecx |
398 | xor eax, eax |
393 | xor eax, eax |
399 | @@: |
394 | @@: |
400 | lodsb |
395 | lodsb |
401 | cmp al, '/' |
396 | cmp al, '/' |
402 | jz .done1 |
397 | jz .done1 |
403 | test al, al |
398 | test al, al |
404 | jz .done1 |
399 | jz .done1 |
405 | sub al, '0' |
400 | sub al, '0' |
406 | cmp al, 9 |
401 | cmp al, 9 |
407 | ja .notfounda |
402 | ja .notfounda |
408 | lea ecx, [ecx*5] |
403 | lea ecx, [ecx*5] |
409 | lea ecx, [ecx*2+eax] |
404 | lea ecx, [ecx*2+eax] |
410 | jmp @b |
405 | jmp @b |
411 | .done1: |
406 | .done1: |
412 | jecxz .notfounda |
407 | jecxz .notfounda |
413 | test al, al |
408 | test al, al |
414 | jnz @f |
409 | jnz @f |
415 | dec esi |
410 | dec esi |
416 | @@: |
411 | @@: |
417 | cmp byte [esi], 0 |
412 | cmp byte [esi], 0 |
418 | jnz @f |
413 | jnz @f |
419 | test ebp, ebp |
414 | test ebp, ebp |
420 | jz @f |
415 | jz @f |
421 | mov esi, ebp |
416 | mov esi, ebp |
422 | xor ebp, ebp |
417 | xor ebp, ebp |
423 | @@: |
418 | @@: |
424 | ; now [edi] contains handler address, ecx - partition number, |
419 | ; now [edi] contains handler address, ecx - partition number, |
425 | ; esi points to ASCIIZ string - rest of name |
420 | ; esi points to ASCIIZ string - rest of name |
426 | jmp dword [edi] |
421 | jmp dword [edi] |
- | 422 | ||
- | 423 | .do_exec: |
|
- | 424 | lea ebx, [eax+20] |
|
- | 425 | cmp byte [ebx],0 |
|
- | 426 | jnz @F |
|
- | 427 | ||
- | 428 | mov ebx, [ebx+1] |
|
- | 429 | @@: |
|
- | 430 | push dword [eax+4] |
|
- | 431 | push dword [eax+8] |
|
- | 432 | push ebx |
|
- | 433 | ||
- | 434 | call _sys_exec |
|
- | 435 | mov [image_of_eax], eax |
|
- | 436 | add esp, 12 |
|
- | 437 | ||
- | 438 | ret |
|
427 | 439 | ||
428 | ; handlers for devices |
440 | ; handlers for devices |
429 | ; in: ecx = 0 => query virtual directory /xxx |
441 | ; in: ecx = 0 => query virtual directory /xxx |
430 | ; in: ecx = partition number |
442 | ; in: ecx = partition number |
431 | ; esi -> relative (for device) name |
443 | ; esi -> relative (for device) name |
432 | ; ebx -> fileinfo |
444 | ; ebx -> fileinfo |
433 | ; ebp = 0 or pointer to rest of name from folder addressed by esi |
445 | ; ebp = 0 or pointer to rest of name from folder addressed by esi |
434 | ; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx |
446 | ; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx |
435 | 447 | ||
436 | fs_OnRamdisk: |
448 | fs_OnRamdisk: |
437 | cmp ecx, 1 |
449 | cmp ecx, 1 |
438 | jnz file_system_lfn.notfound |
450 | jnz file_system_lfn.notfound |
439 | mov eax, [ebx] |
451 | mov eax, [ebx] |
440 | cmp eax, fs_NumRamdiskServices |
452 | cmp eax, fs_NumRamdiskServices |
441 | jae .not_impl |
453 | jae .not_impl |
442 | mov ecx, [ebx+12] |
454 | mov ecx, [ebx+12] |
443 | mov edx, [ebx+16] |
455 | mov edx, [ebx+16] |
444 | ; add edx, std_application_base_address |
456 | ; add edx, std_application_base_address |
445 | add ebx, 4 |
457 | add ebx, 4 |
446 | call dword [fs_RamdiskServices + eax*4] |
458 | call dword [fs_RamdiskServices + eax*4] |
447 | mov [image_of_eax], eax |
459 | mov [image_of_eax], eax |
448 | mov [image_of_ebx], ebx |
460 | mov [image_of_ebx], ebx |
449 | ret |
461 | ret |
450 | .not_impl: |
462 | .not_impl: |
451 | mov dword [image_of_eax], 2 ; not implemented |
463 | mov dword [image_of_eax], 2 ; not implemented |
452 | ret |
464 | ret |
453 | 465 | ||
454 | fs_NotImplemented: |
466 | fs_NotImplemented: |
455 | mov eax, 2 |
467 | mov eax, 2 |
456 | ret |
468 | ret |
457 | 469 | ||
458 | fs_RamdiskServices: |
470 | fs_RamdiskServices: |
459 | dd fs_RamdiskRead |
471 | dd fs_RamdiskRead |
460 | dd fs_RamdiskReadFolder |
472 | dd fs_RamdiskReadFolder |
461 | dd fs_RamdiskRewrite |
473 | dd fs_RamdiskRewrite |
462 | dd fs_RamdiskWrite |
474 | dd fs_RamdiskWrite |
463 | dd fs_RamdiskSetFileEnd |
475 | dd fs_RamdiskSetFileEnd |
464 | dd fs_RamdiskGetFileInfo |
476 | dd fs_RamdiskGetFileInfo |
465 | dd fs_RamdiskSetFileInfo |
477 | dd fs_RamdiskSetFileInfo |
466 | dd 0 |
478 | dd 0 |
467 | dd fs_RamdiskDelete |
479 | dd fs_RamdiskDelete |
468 | dd fs_RamdiskCreateFolder |
480 | dd fs_RamdiskCreateFolder |
469 | fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4 |
481 | fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4 |
470 | 482 | ||
471 | fs_OnFloppy: |
483 | fs_OnFloppy: |
472 | cmp ecx, 2 |
484 | cmp ecx, 2 |
473 | ja file_system_lfn.notfound |
485 | ja file_system_lfn.notfound |
474 | mov eax, [ebx] |
486 | mov eax, [ebx] |
475 | cmp eax, fs_NumFloppyServices |
487 | cmp eax, fs_NumFloppyServices |
476 | jae fs_OnRamdisk.not_impl |
488 | jae fs_OnRamdisk.not_impl |
477 | call reserve_flp |
489 | call reserve_flp |
478 | mov [flp_number], cl |
490 | mov [flp_number], cl |
479 | mov ecx, [ebx+12] |
491 | mov ecx, [ebx+12] |
480 | mov edx, [ebx+16] |
492 | mov edx, [ebx+16] |
481 | ; add edx, std_application_base_address |
493 | ; add edx, std_application_base_address |
482 | add ebx, 4 |
494 | add ebx, 4 |
483 | call dword [fs_FloppyServices + eax*4] |
495 | call dword [fs_FloppyServices + eax*4] |
484 | and [flp_status], 0 |
496 | and [flp_status], 0 |
485 | mov [image_of_eax], eax |
497 | mov [image_of_eax], eax |
486 | mov [image_of_ebx], ebx |
498 | mov [image_of_ebx], ebx |
487 | ret |
499 | ret |
488 | 500 | ||
489 | fs_FloppyServices: |
501 | fs_FloppyServices: |
490 | dd fs_FloppyRead |
502 | dd fs_FloppyRead |
491 | dd fs_FloppyReadFolder |
503 | dd fs_FloppyReadFolder |
492 | dd fs_FloppyRewrite |
504 | dd fs_FloppyRewrite |
493 | dd fs_FloppyWrite |
505 | dd fs_FloppyWrite |
494 | dd fs_FloppySetFileEnd |
506 | dd fs_FloppySetFileEnd |
495 | dd fs_FloppyGetFileInfo |
507 | dd fs_FloppyGetFileInfo |
496 | dd fs_FloppySetFileInfo |
508 | dd fs_FloppySetFileInfo |
497 | dd 0 |
509 | dd 0 |
498 | dd fs_FloppyDelete |
510 | dd fs_FloppyDelete |
499 | dd fs_FloppyCreateFolder |
511 | dd fs_FloppyCreateFolder |
500 | fs_NumFloppyServices = ($ - fs_FloppyServices)/4 |
512 | fs_NumFloppyServices = ($ - fs_FloppyServices)/4 |
501 | 513 | ||
502 | fs_OnHd0: |
514 | fs_OnHd0: |
503 | call reserve_hd1 |
515 | call reserve_hd1 |
504 | mov [hdbase], 0x1F0 |
516 | mov [hdbase], 0x1F0 |
505 | mov [hdid], 0 |
517 | mov [hdid], 0 |
506 | push 1 |
518 | push 1 |
507 | jmp fs_OnHd |
519 | jmp fs_OnHd |
508 | fs_OnHd1: |
520 | fs_OnHd1: |
509 | call reserve_hd1 |
521 | call reserve_hd1 |
510 | mov [hdbase], 0x1F0 |
522 | mov [hdbase], 0x1F0 |
511 | mov [hdid], 0x10 |
523 | mov [hdid], 0x10 |
512 | push 2 |
524 | push 2 |
513 | jmp fs_OnHd |
525 | jmp fs_OnHd |
514 | fs_OnHd2: |
526 | fs_OnHd2: |
515 | call reserve_hd1 |
527 | call reserve_hd1 |
516 | mov [hdbase], 0x170 |
528 | mov [hdbase], 0x170 |
517 | mov [hdid], 0 |
529 | mov [hdid], 0 |
518 | push 3 |
530 | push 3 |
519 | jmp fs_OnHd |
531 | jmp fs_OnHd |
520 | fs_OnHd3: |
532 | fs_OnHd3: |
521 | call reserve_hd1 |
533 | call reserve_hd1 |
522 | mov [hdbase], 0x170 |
534 | mov [hdbase], 0x170 |
523 | mov [hdid], 0x10 |
535 | mov [hdid], 0x10 |
524 | push 4 |
536 | push 4 |
525 | fs_OnHd: |
537 | fs_OnHd: |
526 | call reserve_hd_channel |
538 | call reserve_hd_channel |
527 | pop eax |
539 | pop eax |
528 | mov [hdpos], eax |
540 | mov [hdpos], eax |
529 | cmp ecx, 0x100 |
541 | cmp ecx, 0x100 |
530 | jae fs_OnHdAndBd.nf |
542 | jae fs_OnHdAndBd.nf |
531 | cmp cl, [DRIVE_DATA+1+eax] |
543 | cmp cl, [DRIVE_DATA+1+eax] |
532 | fs_OnHdAndBd: |
544 | fs_OnHdAndBd: |
533 | jbe @f |
545 | jbe @f |
534 | .nf: |
546 | .nf: |
535 | call free_hd_channel |
547 | call free_hd_channel |
536 | and [hd1_status], 0 |
548 | and [hd1_status], 0 |
537 | mov dword [image_of_eax], 5 ; not found |
549 | mov dword [image_of_eax], 5 ; not found |
538 | ret |
550 | ret |
539 | @@: |
551 | @@: |
540 | mov [fat32part], ecx |
552 | mov [fat32part], ecx |
541 | push ebx esi |
553 | push ebx esi |
542 | call choice_necessity_partition_1 |
554 | call choice_necessity_partition_1 |
543 | pop esi ebx |
555 | pop esi ebx |
544 | mov ecx, [ebx+12] |
556 | mov ecx, [ebx+12] |
545 | mov edx, [ebx+16] |
557 | mov edx, [ebx+16] |
546 | ; add edx, std_application_base_address |
558 | ; add edx, std_application_base_address |
547 | mov eax, [ebx] |
559 | mov eax, [ebx] |
548 | cmp eax, fs_NumHdServices |
560 | cmp eax, fs_NumHdServices |
549 | jae .not_impl |
561 | jae .not_impl |
550 | add ebx, 4 |
562 | add ebx, 4 |
551 | call dword [fs_HdServices + eax*4] |
563 | call dword [fs_HdServices + eax*4] |
552 | call free_hd_channel |
564 | call free_hd_channel |
553 | and [hd1_status], 0 |
565 | and [hd1_status], 0 |
554 | mov [image_of_eax], eax |
566 | mov [image_of_eax], eax |
555 | mov [image_of_ebx], ebx |
567 | mov [image_of_ebx], ebx |
556 | ret |
568 | ret |
557 | .not_impl: |
569 | .not_impl: |
558 | call free_hd_channel |
570 | call free_hd_channel |
559 | and [hd1_status], 0 |
571 | and [hd1_status], 0 |
560 | mov dword [image_of_eax], 2 ; not implemented |
572 | mov dword [image_of_eax], 2 ; not implemented |
561 | ret |
573 | ret |
562 | 574 | ||
563 | fs_HdServices: |
575 | fs_HdServices: |
564 | dd fs_HdRead |
576 | dd fs_HdRead |
565 | dd fs_HdReadFolder |
577 | dd fs_HdReadFolder |
566 | dd fs_HdRewrite |
578 | dd fs_HdRewrite |
567 | dd fs_HdWrite |
579 | dd fs_HdWrite |
568 | dd fs_HdSetFileEnd |
580 | dd fs_HdSetFileEnd |
569 | dd fs_HdGetFileInfo |
581 | dd fs_HdGetFileInfo |
570 | dd fs_HdSetFileInfo |
582 | dd fs_HdSetFileInfo |
571 | dd 0 |
583 | dd 0 |
572 | dd fs_HdDelete |
584 | dd fs_HdDelete |
573 | dd fs_HdCreateFolder |
585 | dd fs_HdCreateFolder |
574 | fs_NumHdServices = ($ - fs_HdServices)/4 |
586 | fs_NumHdServices = ($ - fs_HdServices)/4 |
575 | 587 | ||
576 | ;******************************************************* |
588 | ;******************************************************* |
577 | fs_OnCd0: |
589 | fs_OnCd0: |
578 | call reserve_cd |
590 | call reserve_cd |
579 | mov [ChannelNumber],1 |
591 | mov [ChannelNumber],1 |
580 | mov [DiskNumber],0 |
592 | mov [DiskNumber],0 |
581 | push 6 |
593 | push 6 |
582 | push 1 |
594 | push 1 |
583 | jmp fs_OnCd |
595 | jmp fs_OnCd |
584 | fs_OnCd1: |
596 | fs_OnCd1: |
585 | call reserve_cd |
597 | call reserve_cd |
586 | mov [ChannelNumber],1 |
598 | mov [ChannelNumber],1 |
587 | mov [DiskNumber],1 |
599 | mov [DiskNumber],1 |
588 | push 4 |
600 | push 4 |
589 | push 2 |
601 | push 2 |
590 | jmp fs_OnCd |
602 | jmp fs_OnCd |
591 | fs_OnCd2: |
603 | fs_OnCd2: |
592 | call reserve_cd |
604 | call reserve_cd |
593 | mov [ChannelNumber],2 |
605 | mov [ChannelNumber],2 |
594 | mov [DiskNumber],0 |
606 | mov [DiskNumber],0 |
595 | push 2 |
607 | push 2 |
596 | push 3 |
608 | push 3 |
597 | jmp fs_OnCd |
609 | jmp fs_OnCd |
598 | fs_OnCd3: |
610 | fs_OnCd3: |
599 | call reserve_cd |
611 | call reserve_cd |
600 | mov [ChannelNumber],2 |
612 | mov [ChannelNumber],2 |
601 | mov [DiskNumber],1 |
613 | mov [DiskNumber],1 |
602 | push 0 |
614 | push 0 |
603 | push 4 |
615 | push 4 |
604 | fs_OnCd: |
616 | fs_OnCd: |
605 | call reserve_cd_channel |
617 | call reserve_cd_channel |
606 | pop eax |
618 | pop eax |
607 | mov [cdpos], eax |
619 | mov [cdpos], eax |
608 | pop eax |
620 | pop eax |
609 | cmp ecx, 0x100 |
621 | cmp ecx, 0x100 |
610 | jae .nf |
622 | jae .nf |
611 | push ecx ebx |
623 | push ecx ebx |
612 | mov cl,al |
624 | mov cl,al |
613 | mov bl,[DRIVE_DATA+1] |
625 | mov bl,[DRIVE_DATA+1] |
614 | shr bl,cl |
626 | shr bl,cl |
615 | test bl,2 |
627 | test bl,2 |
616 | pop ebx ecx |
628 | pop ebx ecx |
617 | 629 | ||
618 | jnz @f |
630 | jnz @f |
619 | .nf: |
631 | .nf: |
620 | call free_cd_channel |
632 | call free_cd_channel |
621 | and [cd_status], 0 |
633 | and [cd_status], 0 |
622 | mov dword [image_of_eax], 5 ; not found |
634 | mov dword [image_of_eax], 5 ; not found |
623 | ret |
635 | ret |
624 | @@: |
636 | @@: |
625 | mov ecx, [ebx+12] |
637 | mov ecx, [ebx+12] |
626 | mov edx, [ebx+16] |
638 | mov edx, [ebx+16] |
627 | ; add edx, std_application_base_address |
639 | ; add edx, std_application_base_address |
628 | mov eax, [ebx] |
640 | mov eax, [ebx] |
629 | cmp eax,fs_NumCdServices |
641 | cmp eax,fs_NumCdServices |
630 | jae .not_impl |
642 | jae .not_impl |
631 | add ebx, 4 |
643 | add ebx, 4 |
632 | call dword [fs_CdServices + eax*4] |
644 | call dword [fs_CdServices + eax*4] |
633 | call free_cd_channel |
645 | call free_cd_channel |
634 | and [cd_status], 0 |
646 | and [cd_status], 0 |
635 | mov [image_of_eax], eax |
647 | mov [image_of_eax], eax |
636 | mov [image_of_ebx], ebx |
648 | mov [image_of_ebx], ebx |
637 | ret |
649 | ret |
638 | .not_impl: |
650 | .not_impl: |
639 | call free_cd_channel |
651 | call free_cd_channel |
640 | and [cd_status], 0 |
652 | and [cd_status], 0 |
641 | mov dword [image_of_eax], 2 ; not implemented |
653 | mov dword [image_of_eax], 2 ; not implemented |
642 | ret |
654 | ret |
643 | 655 | ||
644 | fs_CdServices: |
656 | fs_CdServices: |
645 | dd fs_CdRead |
657 | dd fs_CdRead |
646 | dd fs_CdReadFolder |
658 | dd fs_CdReadFolder |
647 | dd fs_NotImplemented |
659 | dd fs_NotImplemented |
648 | dd fs_NotImplemented |
660 | dd fs_NotImplemented |
649 | dd fs_NotImplemented |
661 | dd fs_NotImplemented |
650 | dd fs_CdGetFileInfo |
662 | dd fs_CdGetFileInfo |
651 | dd fs_NotImplemented |
663 | dd fs_NotImplemented |
652 | dd 0 |
664 | dd 0 |
653 | dd fs_NotImplemented |
665 | dd fs_NotImplemented |
654 | dd fs_NotImplemented |
666 | dd fs_NotImplemented |
655 | fs_NumCdServices = ($ - fs_CdServices)/4 |
667 | fs_NumCdServices = ($ - fs_CdServices)/4 |
656 | 668 | ||
657 | ;******************************************************* |
669 | ;******************************************************* |
658 | 670 | ||
659 | fs_HasRamdisk: |
671 | fs_HasRamdisk: |
660 | mov al, 1 ; we always have ramdisk |
672 | mov al, 1 ; we always have ramdisk |
661 | ret |
673 | ret |
662 | 674 | ||
663 | fs_HasFloppy: |
675 | fs_HasFloppy: |
664 | cmp byte [DRIVE_DATA], 0 |
676 | cmp byte [DRIVE_DATA], 0 |
665 | setnz al |
677 | setnz al |
666 | ret |
678 | ret |
667 | 679 | ||
668 | fs_HasHd0: |
680 | fs_HasHd0: |
669 | mov al, [DRIVE_DATA+1] |
681 | mov al, [DRIVE_DATA+1] |
670 | and al, 11000000b |
682 | and al, 11000000b |
671 | cmp al, 01000000b |
683 | cmp al, 01000000b |
672 | setz al |
684 | setz al |
673 | ret |
685 | ret |
674 | fs_HasHd1: |
686 | fs_HasHd1: |
675 | mov al, [DRIVE_DATA+1] |
687 | mov al, [DRIVE_DATA+1] |
676 | and al, 00110000b |
688 | and al, 00110000b |
677 | cmp al, 00010000b |
689 | cmp al, 00010000b |
678 | setz al |
690 | setz al |
679 | ret |
691 | ret |
680 | fs_HasHd2: |
692 | fs_HasHd2: |
681 | mov al, [DRIVE_DATA+1] |
693 | mov al, [DRIVE_DATA+1] |
682 | and al, 00001100b |
694 | and al, 00001100b |
683 | cmp al, 00000100b |
695 | cmp al, 00000100b |
684 | setz al |
696 | setz al |
685 | ret |
697 | ret |
686 | fs_HasHd3: |
698 | fs_HasHd3: |
687 | mov al, [DRIVE_DATA+1] |
699 | mov al, [DRIVE_DATA+1] |
688 | and al, 00000011b |
700 | and al, 00000011b |
689 | cmp al, 00000001b |
701 | cmp al, 00000001b |
690 | setz al |
702 | setz al |
691 | ret |
703 | ret |
692 | 704 | ||
693 | ;******************************************************* |
705 | ;******************************************************* |
694 | fs_HasCd0: |
706 | fs_HasCd0: |
695 | mov al, [DRIVE_DATA+1] |
707 | mov al, [DRIVE_DATA+1] |
696 | and al, 11000000b |
708 | and al, 11000000b |
697 | cmp al, 10000000b |
709 | cmp al, 10000000b |
698 | setz al |
710 | setz al |
699 | ret |
711 | ret |
700 | fs_HasCd1: |
712 | fs_HasCd1: |
701 | mov al, [DRIVE_DATA+1] |
713 | mov al, [DRIVE_DATA+1] |
702 | and al, 00110000b |
714 | and al, 00110000b |
703 | cmp al, 00100000b |
715 | cmp al, 00100000b |
704 | setz al |
716 | setz al |
705 | ret |
717 | ret |
706 | fs_HasCd2: |
718 | fs_HasCd2: |
707 | mov al, [DRIVE_DATA+1] |
719 | mov al, [DRIVE_DATA+1] |
708 | and al, 00001100b |
720 | and al, 00001100b |
709 | cmp al, 00001000b |
721 | cmp al, 00001000b |
710 | setz al |
722 | setz al |
711 | ret |
723 | ret |
712 | fs_HasCd3: |
724 | fs_HasCd3: |
713 | mov al, [DRIVE_DATA+1] |
725 | mov al, [DRIVE_DATA+1] |
714 | and al, 00000011b |
726 | and al, 00000011b |
715 | cmp al, 00000010b |
727 | cmp al, 00000010b |
716 | setz al |
728 | setz al |
717 | ret |
729 | ret |
718 | ;******************************************************* |
730 | ;******************************************************* |
719 | 731 | ||
720 | ; fs_NextXXX functions: |
732 | ; fs_NextXXX functions: |
721 | ; in: eax = partition number, from which start to scan |
733 | ; in: eax = partition number, from which start to scan |
722 | ; out: CF=1 => no more partitions |
734 | ; out: CF=1 => no more partitions |
723 | ; CF=0 => eax=next partition number |
735 | ; CF=0 => eax=next partition number |
724 | 736 | ||
725 | fs_NextRamdisk: |
737 | fs_NextRamdisk: |
726 | ; we always have /rd/1 |
738 | ; we always have /rd/1 |
727 | test eax, eax |
739 | test eax, eax |
728 | stc |
740 | stc |
729 | jnz @f |
741 | jnz @f |
730 | mov al, 1 |
742 | mov al, 1 |
731 | clc |
743 | clc |
732 | @@: |
744 | @@: |
733 | ret |
745 | ret |
734 | 746 | ||
735 | fs_NextFloppy: |
747 | fs_NextFloppy: |
736 | ; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0) |
748 | ; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0) |
737 | test byte [DRIVE_DATA], 0xF0 |
749 | test byte [DRIVE_DATA], 0xF0 |
738 | jz .no1 |
750 | jz .no1 |
739 | test eax, eax |
751 | test eax, eax |
740 | jnz .no1 |
752 | jnz .no1 |
741 | inc eax |
753 | inc eax |
742 | ret ; CF cleared |
754 | ret ; CF cleared |
743 | .no1: |
755 | .no1: |
744 | test byte [DRIVE_DATA], 0x0F |
756 | test byte [DRIVE_DATA], 0x0F |
745 | jz .no2 |
757 | jz .no2 |
746 | cmp al, 2 |
758 | cmp al, 2 |
747 | jae .no2 |
759 | jae .no2 |
748 | mov al, 2 |
760 | mov al, 2 |
749 | clc |
761 | clc |
750 | ret |
762 | ret |
751 | .no2: |
763 | .no2: |
752 | stc |
764 | stc |
753 | ret |
765 | ret |
754 | 766 | ||
755 | ; on hdx, we have partitions from 1 to [0x40002+x] |
767 | ; on hdx, we have partitions from 1 to [0x40002+x] |
756 | fs_NextHd0: |
768 | fs_NextHd0: |
757 | push 0 |
769 | push 0 |
758 | jmp fs_NextHd |
770 | jmp fs_NextHd |
759 | fs_NextHd1: |
771 | fs_NextHd1: |
760 | push 1 |
772 | push 1 |
761 | jmp fs_NextHd |
773 | jmp fs_NextHd |
762 | fs_NextHd2: |
774 | fs_NextHd2: |
763 | push 2 |
775 | push 2 |
764 | jmp fs_NextHd |
776 | jmp fs_NextHd |
765 | fs_NextHd3: |
777 | fs_NextHd3: |
766 | push 3 |
778 | push 3 |
767 | fs_NextHd: |
779 | fs_NextHd: |
768 | pop ecx |
780 | pop ecx |
769 | movzx ecx, byte [DRIVE_DATA+2+ecx] |
781 | movzx ecx, byte [DRIVE_DATA+2+ecx] |
770 | cmp eax, ecx |
782 | cmp eax, ecx |
771 | jae fs_NextFloppy.no2 |
783 | jae fs_NextFloppy.no2 |
772 | inc eax |
784 | inc eax |
773 | clc |
785 | clc |
774 | ret |
786 | ret |
775 | 787 | ||
776 | ;******************************************************* |
788 | ;******************************************************* |
777 | fs_NextCd: |
789 | fs_NextCd: |
778 | ; we always have /cdX/1 |
790 | ; we always have /cdX/1 |
779 | test eax, eax |
791 | test eax, eax |
780 | stc |
792 | stc |
781 | jnz @f |
793 | jnz @f |
782 | mov al, 1 |
794 | mov al, 1 |
783 | clc |
795 | clc |
784 | @@: |
796 | @@: |
785 | ret |
797 | ret |
786 | ;******************************************************* |
798 | ;******************************************************* |
787 | 799 | ||
788 | ; Additional FS handlers. |
800 | ; Additional FS handlers. |
789 | ; This handler gets the control each time when fn 70 is called |
801 | ; This handler gets the control each time when fn 70 is called |
790 | ; with unknown item of root subdirectory. |
802 | ; with unknown item of root subdirectory. |
791 | ; in: esi -> name |
803 | ; in: esi -> name |
792 | ; ebp = 0 or rest of name relative to esi |
804 | ; ebp = 0 or rest of name relative to esi |
793 | ; out: if the handler processes path, he must not return in file_system_lfn, |
805 | ; out: if the handler processes path, he must not return in file_system_lfn, |
794 | ; but instead pop return address and return directly to the caller |
806 | ; but instead pop return address and return directly to the caller |
795 | ; otherwise simply return |
807 | ; otherwise simply return |
796 | 808 | ||
797 | ; here we test for /bd |
809 | ; here we test for /bd |
798 | biosdisk_handler: |
810 | biosdisk_handler: |
799 | cmp [NumBiosDisks], 0 |
811 | cmp [NumBiosDisks], 0 |
800 | jz .ret |
812 | jz .ret |
801 | mov al, [esi] |
813 | mov al, [esi] |
802 | or al, 20h |
814 | or al, 20h |
803 | cmp al, 'b' |
815 | cmp al, 'b' |
804 | jnz .ret |
816 | jnz .ret |
805 | mov al, [esi+1] |
817 | mov al, [esi+1] |
806 | or al, 20h |
818 | or al, 20h |
807 | cmp al, 'd' |
819 | cmp al, 'd' |
808 | jnz .ret |
820 | jnz .ret |
809 | push esi |
821 | push esi |
810 | inc esi |
822 | inc esi |
811 | inc esi |
823 | inc esi |
812 | cmp byte [esi], '0' |
824 | cmp byte [esi], '0' |
813 | jb .ret2 |
825 | jb .ret2 |
814 | cmp byte [esi], '9' |
826 | cmp byte [esi], '9' |
815 | ja .ret2 |
827 | ja .ret2 |
816 | xor edx, edx |
828 | xor edx, edx |
817 | @@: |
829 | @@: |
818 | lodsb |
830 | lodsb |
819 | test al, al |
831 | test al, al |
820 | jz .ok |
832 | jz .ok |
821 | cmp al, '/' |
833 | cmp al, '/' |
822 | jz .ok |
834 | jz .ok |
823 | sub al, '0' |
835 | sub al, '0' |
824 | cmp al, 9 |
836 | cmp al, 9 |
825 | ja .ret2 |
837 | ja .ret2 |
826 | lea edx, [edx*5] |
838 | lea edx, [edx*5] |
827 | lea edx, [edx*2+eax] |
839 | lea edx, [edx*2+eax] |
828 | jmp @b |
840 | jmp @b |
829 | .ret2: |
841 | .ret2: |
830 | pop esi |
842 | pop esi |
831 | .ret: |
843 | .ret: |
832 | ret |
844 | ret |
833 | .ok: |
845 | .ok: |
834 | cmp al, '/' |
846 | cmp al, '/' |
835 | jz @f |
847 | jz @f |
836 | dec esi |
848 | dec esi |
837 | @@: |
849 | @@: |
838 | add dl, 80h |
850 | add dl, 80h |
839 | xor ecx, ecx |
851 | xor ecx, ecx |
840 | @@: |
852 | @@: |
841 | cmp dl, [BiosDisksData+ecx*4] |
853 | cmp dl, [BiosDisksData+ecx*4] |
842 | jz .ok2 |
854 | jz .ok2 |
843 | inc ecx |
855 | inc ecx |
844 | cmp ecx, [NumBiosDisks] |
856 | cmp ecx, [NumBiosDisks] |
845 | jb @b |
857 | jb @b |
846 | jmp .ret2 |
858 | jmp .ret2 |
847 | .ok2: |
859 | .ok2: |
848 | add esp, 8 |
860 | add esp, 8 |
849 | test al, al |
861 | test al, al |
850 | jnz @f |
862 | jnz @f |
851 | mov esi, fs_BdNext |
863 | mov esi, fs_BdNext |
852 | jmp file_system_lfn.maindir_noesi |
864 | jmp file_system_lfn.maindir_noesi |
853 | @@: |
865 | @@: |
854 | push ecx |
866 | push ecx |
855 | push fs_OnBd |
867 | push fs_OnBd |
856 | mov edi, esp |
868 | mov edi, esp |
857 | jmp file_system_lfn.found2 |
869 | jmp file_system_lfn.found2 |
858 | 870 | ||
859 | fs_BdNext: |
871 | fs_BdNext: |
860 | cmp eax, [BiosDiskPartitions+ecx*4] |
872 | cmp eax, [BiosDiskPartitions+ecx*4] |
861 | inc eax |
873 | inc eax |
862 | cmc |
874 | cmc |
863 | ret |
875 | ret |
864 | 876 | ||
865 | fs_OnBd: |
877 | fs_OnBd: |
866 | pop edx edx |
878 | pop edx edx |
867 | ; edx = disk number, ecx = partition number |
879 | ; edx = disk number, ecx = partition number |
868 | ; esi+ebp = name |
880 | ; esi+ebp = name |
869 | call reserve_hd1 |
881 | call reserve_hd1 |
870 | add edx, 0x80 |
882 | add edx, 0x80 |
871 | mov [hdpos], edx |
883 | mov [hdpos], edx |
872 | cmp ecx, [BiosDiskPartitions+(edx-0x80)*4] |
884 | cmp ecx, [BiosDiskPartitions+(edx-0x80)*4] |
873 | jmp fs_OnHdAndBd |
885 | jmp fs_OnHdAndBd |
874 | 886 | ||
875 | ; This handler is called when virtual root is enumerated |
887 | ; This handler is called when virtual root is enumerated |
876 | ; and must return all items which can be handled by this. |
888 | ; and must return all items which can be handled by this. |
877 | ; It is called several times, first time with eax=0 |
889 | ; It is called several times, first time with eax=0 |
878 | ; in: eax = 0 for first call, previously returned value for subsequent calls |
890 | ; in: eax = 0 for first call, previously returned value for subsequent calls |
879 | ; out: eax = 0 => no more items |
891 | ; out: eax = 0 => no more items |
880 | ; eax != 0 => buffer pointed to by edi contains name of item |
892 | ; eax != 0 => buffer pointed to by edi contains name of item |
881 | 893 | ||
882 | ; here we enumerate existing BIOS disks /bd |
894 | ; here we enumerate existing BIOS disks /bd |
883 | biosdisk_enum_root: |
895 | biosdisk_enum_root: |
884 | cmp eax, [NumBiosDisks] |
896 | cmp eax, [NumBiosDisks] |
885 | jae .end |
897 | jae .end |
886 | push eax |
898 | push eax |
887 | movzx eax, byte [BiosDisksData+eax*4] |
899 | movzx eax, byte [BiosDisksData+eax*4] |
888 | sub al, 80h |
900 | sub al, 80h |
889 | push eax |
901 | push eax |
890 | mov al, 'b' |
902 | mov al, 'b' |
891 | stosb |
903 | stosb |
892 | mov al, 'd' |
904 | mov al, 'd' |
893 | stosb |
905 | stosb |
894 | pop eax |
906 | pop eax |
895 | cmp al, 10 |
907 | cmp al, 10 |
896 | jae .big |
908 | jae .big |
897 | add al, '0' |
909 | add al, '0' |
898 | stosb |
910 | stosb |
899 | mov byte [edi], 0 |
911 | mov byte [edi], 0 |
900 | pop eax |
912 | pop eax |
901 | inc eax |
913 | inc eax |
902 | ret |
914 | ret |
903 | .end: |
915 | .end: |
904 | xor eax, eax |
916 | xor eax, eax |
905 | ret |
917 | ret |
906 | .big: |
918 | .big: |
907 | push ecx |
919 | push ecx |
908 | push -'0' |
920 | push -'0' |
909 | mov ecx, 10 |
921 | mov ecx, 10 |
910 | @@: |
922 | @@: |
911 | xor edx, edx |
923 | xor edx, edx |
912 | div ecx |
924 | div ecx |
913 | push edx |
925 | push edx |
914 | test eax, eax |
926 | test eax, eax |
915 | jnz @b |
927 | jnz @b |
916 | xchg eax, edx |
928 | xchg eax, edx |
917 | @@: |
929 | @@: |
918 | pop eax |
930 | pop eax |
919 | add al, '0' |
931 | add al, '0' |
920 | stosb |
932 | stosb |
921 | jnz @b |
933 | jnz @b |
922 | pop ecx |
934 | pop ecx |
923 | pop eax |
935 | pop eax |
924 | inc eax |
936 | inc eax |
925 | ret |
937 | ret |
926 | 938 | ||
927 | process_replace_file_name: |
939 | process_replace_file_name: |
928 | mov ebp, [full_file_name_table] |
940 | mov ebp, [full_file_name_table] |
929 | mov edi, [full_file_name_table.size] |
941 | mov edi, [full_file_name_table.size] |
930 | dec edi |
942 | dec edi |
931 | shl edi, 7 |
943 | shl edi, 7 |
932 | add edi, ebp |
944 | add edi, ebp |
933 | .loop: |
945 | .loop: |
934 | cmp edi, ebp |
946 | cmp edi, ebp |
935 | jb .notfound |
947 | jb .notfound |
936 | push esi edi |
948 | push esi edi |
937 | @@: |
949 | @@: |
938 | cmp byte [edi], 0 |
950 | cmp byte [edi], 0 |
939 | jz .dest_done |
951 | jz .dest_done |
940 | lodsb |
952 | lodsb |
941 | test al, al |
953 | test al, al |
942 | jz .cont |
954 | jz .cont |
943 | or al, 20h |
955 | or al, 20h |
944 | scasb |
956 | scasb |
945 | jz @b |
957 | jz @b |
946 | jmp .cont |
958 | jmp .cont |
947 | .dest_done: |
959 | .dest_done: |
948 | cmp byte [esi], 0 |
960 | cmp byte [esi], 0 |
949 | jz .found |
961 | jz .found |
950 | cmp byte [esi], '/' |
962 | cmp byte [esi], '/' |
951 | jnz .cont |
963 | jnz .cont |
952 | inc esi |
964 | inc esi |
953 | jmp .found |
965 | jmp .found |
954 | .cont: |
966 | .cont: |
955 | pop edi esi |
967 | pop edi esi |
956 | sub edi, 128 |
968 | sub edi, 128 |
957 | jmp .loop |
969 | jmp .loop |
958 | .found: |
970 | .found: |
959 | pop edi eax |
971 | pop edi eax |
960 | mov ebp, esi |
972 | mov ebp, esi |
961 | cmp byte [esi], 0 |
973 | cmp byte [esi], 0 |
962 | lea esi, [edi+64] |
974 | lea esi, [edi+64] |
963 | jnz .ret |
975 | jnz .ret |
964 | .notfound: |
976 | .notfound: |
965 | xor ebp, ebp |
977 | xor ebp, ebp |
966 | .ret: |
978 | .ret: |
967 | ret |
979 | ret |
968 | 980 | ||
969 | sys_current_directory: |
981 | sys_current_directory: |
970 | mov esi, [current_slot] |
982 | mov esi, [current_slot] |
971 | mov esi, [esi+APPDATA.cur_dir] |
983 | mov esi, [esi+APPDATA.cur_dir] |
972 | mov edx, esi |
984 | mov edx, esi |
973 | dec eax |
985 | dec eax |
974 | jz .set |
986 | jz .set |
975 | dec eax |
987 | dec eax |
976 | jz .get |
988 | jz .get |
977 | ret |
989 | ret |
978 | .get: |
990 | .get: |
979 | ; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len |
991 | ; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len |
980 | ; for our code: ebx->buffer,ecx=len |
992 | ; for our code: ebx->buffer,ecx=len |
981 | @@: |
993 | @@: |
982 | lodsb |
994 | lodsb |
983 | test al, al |
995 | test al, al |
984 | jnz @b |
996 | jnz @b |
985 | sub esi, edx |
997 | sub esi, edx |
986 | inc esi |
998 | inc esi |
987 | mov [esp+36], esi |
999 | mov [esp+36], esi |
988 | cmp ecx, esi |
1000 | cmp ecx, esi |
989 | jbe @f |
1001 | jbe @f |
990 | mov ecx, esi |
1002 | mov ecx, esi |
991 | @@: |
1003 | @@: |
992 | cmp ecx, 1 |
1004 | cmp ecx, 1 |
993 | jbe .ret |
1005 | jbe .ret |
994 | mov esi, edx |
1006 | mov esi, edx |
995 | mov edi, ebx |
1007 | mov edi, ebx |
996 | mov al, '/' |
1008 | mov al, '/' |
997 | stosb |
1009 | stosb |
998 | dec ecx |
1010 | dec ecx |
999 | dec ecx |
1011 | dec ecx |
1000 | rep movsb |
1012 | rep movsb |
1001 | mov byte [edi], 0 |
1013 | mov byte [edi], 0 |
1002 | .ret: |
1014 | .ret: |
1003 | ret |
1015 | ret |
1004 | .set: |
1016 | .set: |
1005 | ; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string |
1017 | ; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string |
1006 | ; for our code: ebx->string to set |
1018 | ; for our code: ebx->string to set |
1007 | @@: |
1019 | @@: |
1008 | inc esi |
1020 | inc esi |
1009 | cmp byte [esi-1], 0 |
1021 | cmp byte [esi-1], 0 |
1010 | jnz @b |
1022 | jnz @b |
1011 | dec esi |
1023 | dec esi |
1012 | cmp byte [ebx], '/' |
1024 | cmp byte [ebx], '/' |
1013 | jz .set_absolute |
1025 | jz .set_absolute |
1014 | ; string gives relative path |
1026 | ; string gives relative path |
1015 | .relative: |
1027 | .relative: |
1016 | cmp byte [ebx], 0 |
1028 | cmp byte [ebx], 0 |
1017 | jz .set_ok |
1029 | jz .set_ok |
1018 | cmp word [ebx], '.' |
1030 | cmp word [ebx], '.' |
1019 | jz .set_ok |
1031 | jz .set_ok |
1020 | cmp word [ebx], './' |
1032 | cmp word [ebx], './' |
1021 | jnz @f |
1033 | jnz @f |
1022 | add ebx, 2 |
1034 | add ebx, 2 |
1023 | jmp .relative |
1035 | jmp .relative |
1024 | @@: |
1036 | @@: |
1025 | cmp word [ebx], '..' |
1037 | cmp word [ebx], '..' |
1026 | jnz .doset_relative |
1038 | jnz .doset_relative |
1027 | cmp byte [ebx+2], 0 |
1039 | cmp byte [ebx+2], 0 |
1028 | jz @f |
1040 | jz @f |
1029 | cmp byte [ebx+2], '/' |
1041 | cmp byte [ebx+2], '/' |
1030 | jnz .doset_relative |
1042 | jnz .doset_relative |
1031 | @@: |
1043 | @@: |
1032 | dec esi |
1044 | dec esi |
1033 | cmp byte [esi], '/' |
1045 | cmp byte [esi], '/' |
1034 | jnz @b |
1046 | jnz @b |
1035 | mov byte [esi], 0 |
1047 | mov byte [esi], 0 |
1036 | add ebx, 3 |
1048 | add ebx, 3 |
1037 | jmp .relative |
1049 | jmp .relative |
1038 | .doset_relative: |
1050 | .doset_relative: |
1039 | add edx, 0x1000 |
1051 | add edx, 0x1000 |
1040 | mov byte [esi], '/' |
1052 | mov byte [esi], '/' |
1041 | inc esi |
1053 | inc esi |
1042 | cmp esi, edx |
1054 | cmp esi, edx |
1043 | jae .overflow_esi |
1055 | jae .overflow_esi |
1044 | @@: |
1056 | @@: |
1045 | mov al, [ebx] |
1057 | mov al, [ebx] |
1046 | inc ebx |
1058 | inc ebx |
1047 | mov [esi], al |
1059 | mov [esi], al |
1048 | inc esi |
1060 | inc esi |
1049 | test al, al |
1061 | test al, al |
1050 | jz .set_ok |
1062 | jz .set_ok |
1051 | cmp esi, edx |
1063 | cmp esi, edx |
1052 | jb @b |
1064 | jb @b |
1053 | .overflow_esi: |
1065 | .overflow_esi: |
1054 | mov byte [esi-1], 0 ; force null-terminated string |
1066 | mov byte [esi-1], 0 ; force null-terminated string |
1055 | .set_ok: |
1067 | .set_ok: |
1056 | ret |
1068 | ret |
1057 | .set_absolute: |
1069 | .set_absolute: |
1058 | lea esi, [ebx+1] |
1070 | lea esi, [ebx+1] |
1059 | call process_replace_file_name |
1071 | call process_replace_file_name |
1060 | mov edi, edx |
1072 | mov edi, edx |
1061 | add edx, 0x1000 |
1073 | add edx, 0x1000 |
1062 | .set_copy: |
1074 | .set_copy: |
1063 | lodsb |
1075 | lodsb |
1064 | stosb |
1076 | stosb |
1065 | test al, al |
1077 | test al, al |
1066 | jz .set_part2 |
1078 | jz .set_part2 |
1067 | .set_copy_cont: |
1079 | .set_copy_cont: |
1068 | cmp edi, edx |
1080 | cmp edi, edx |
1069 | jb .set_copy |
1081 | jb .set_copy |
1070 | .overflow_edi: |
1082 | .overflow_edi: |
1071 | mov byte [edi-1], 0 |
1083 | mov byte [edi-1], 0 |
1072 | ret |
1084 | ret |
1073 | .set_part2: |
1085 | .set_part2: |
1074 | mov esi, ebp |
1086 | mov esi, ebp |
1075 | xor ebp, ebp |
1087 | xor ebp, ebp |
1076 | test esi, esi |
1088 | test esi, esi |
1077 | jz .set_ok |
1089 | jz .set_ok |
1078 | mov byte [edi-1], '/' |
1090 | mov byte [edi-1], '/' |
1079 | jmp .set_copy_cont |
1091 | jmp .set_copy_cont |