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