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