Rev 6792 | Rev 6875 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2288 | clevermous | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
6462 | pathoswith | 3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License. ;; |
||
2288 | clevermous | 5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
8 | $Revision: 6798 $ |
||
9 | |||
2889 | turbanoff | 10 | ERROR_SUCCESS = 0 |
11 | ERROR_DISK_BASE = 1 |
||
12 | ERROR_UNSUPPORTED_FS = 2 |
||
13 | ERROR_UNKNOWN_FS = 3 |
||
14 | ERROR_PARTITION = 4 |
||
15 | ERROR_FILE_NOT_FOUND = 5 |
||
16 | ERROR_END_OF_FILE = 6 |
||
17 | ERROR_MEMORY_POINTER = 7 |
||
18 | ERROR_DISK_FULL = 8 |
||
19 | ERROR_FS_FAIL = 9 |
||
20 | ERROR_ACCESS_DENIED = 10 |
||
21 | ERROR_DEVICE = 11 |
||
5994 | pathoswith | 22 | ERROR_OUT_OF_MEMORY = 12 |
2288 | clevermous | 23 | |
6468 | pathoswith | 24 | maxPathLength = 1000h |
25 | |||
2288 | clevermous | 26 | image_of_eax EQU esp+32 |
27 | image_of_ebx EQU esp+20 |
||
28 | |||
6464 | pathoswith | 29 | ; System function 70 |
2288 | clevermous | 30 | |
3296 | clevermous | 31 | file_system_lfn_protected: |
32 | pushad |
||
33 | call protect_from_terminate |
||
34 | call file_system_lfn |
||
35 | call unprotect_from_terminate |
||
36 | popad |
||
37 | mov [image_of_eax], eax |
||
38 | mov [image_of_ebx], ebx |
||
39 | ret |
||
40 | |||
6798 | pathoswith | 41 | fileSystemUnicode: |
42 | ; in: ebx -> f.80 parameter structure |
||
43 | mov edi, [ebx+20] |
||
44 | mov esi, [ebx+24] |
||
45 | jmp @f |
||
46 | |||
2288 | clevermous | 47 | file_system_lfn: |
6798 | pathoswith | 48 | ; in: ebx -> f.70 parameter structure |
49 | xor edi, edi |
||
50 | lea esi, [ebx+20] |
||
51 | cmp byte [esi], 0 |
||
2288 | clevermous | 52 | jnz @f |
6798 | pathoswith | 53 | mov esi, [ebx+21] |
2288 | clevermous | 54 | @@: |
6798 | pathoswith | 55 | cmp word [esi], '/' |
6502 | pathoswith | 56 | jnz @f |
6798 | pathoswith | 57 | cmp edi, 2 |
6502 | pathoswith | 58 | jnz .rootdir |
6798 | pathoswith | 59 | cmp dword[esi], '/' |
6502 | pathoswith | 60 | jz .rootdir |
61 | @@: |
||
6792 | pathoswith | 62 | stdcall kernel_alloc, maxPathLength |
63 | push eax ebx |
||
64 | xchg eax, edi |
||
65 | call getFullPath |
||
66 | pop ebx ebp |
||
67 | test eax, eax |
||
68 | jz .notfound |
||
6464 | pathoswith | 69 | cmp dword[ebx], 7 ; start application |
6502 | pathoswith | 70 | jnz @f |
6333 | serge | 71 | mov edx, [ebx+4] |
6792 | pathoswith | 72 | mov ecx, [ebx+8] |
73 | mov ebx, ebp |
||
74 | call fs_execute |
||
6333 | serge | 75 | mov [image_of_eax], eax |
76 | ret |
||
6464 | pathoswith | 77 | |
6333 | serge | 78 | @@: |
6502 | pathoswith | 79 | lea esi, [ebp+2] |
80 | mov ax, [esi] |
||
6464 | pathoswith | 81 | or ax, 2020h |
82 | cmp ax, 'cd' |
||
83 | jz .CD |
||
84 | call dyndisk_handler ; not returns if success |
||
85 | .notfound: |
||
6468 | pathoswith | 86 | stdcall kernel_free, ebp |
6464 | pathoswith | 87 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
88 | ret |
||
89 | |||
90 | .CD: |
||
91 | add esi, 2 |
||
92 | xor eax, eax |
||
93 | lodsb ; disk number |
||
94 | sub eax, '0' |
||
95 | cmp eax, 10 |
||
96 | jnc .notfound |
||
97 | mov edi, eax |
||
2288 | clevermous | 98 | lodsb |
6464 | pathoswith | 99 | test eax, eax |
100 | jz .maindir |
||
2288 | clevermous | 101 | cmp al, '/' |
6464 | pathoswith | 102 | jnz .notfound |
103 | lodsb ; partition number |
||
104 | test eax, eax |
||
105 | jz .maindir |
||
106 | cmp al, '1' |
||
107 | jnz .notfound |
||
108 | cmp byte [esi], '/' |
||
109 | jnz @f |
||
110 | inc esi |
||
111 | @@: |
||
112 | call reserve_cd |
||
113 | mov eax, edi |
||
114 | bt eax, 0 |
||
115 | setc [DiskNumber] |
||
116 | bt eax, 1 |
||
117 | setc [ChannelNumber] |
||
118 | inc [ChannelNumber] |
||
119 | inc eax |
||
120 | mov [cdpos], eax |
||
121 | call reserve_cd_channel |
||
122 | mov eax, edi |
||
123 | not eax |
||
124 | and eax, 3 |
||
125 | shl eax, 1 |
||
126 | inc eax |
||
127 | shr edi, 2 |
||
128 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
||
129 | bt [edi*5+DRIVE_DATA+1], ax |
||
130 | jnc @f |
||
131 | mov ecx, [ebx+12] |
||
132 | mov edx, [ebx+16] |
||
133 | mov eax, [ebx] |
||
134 | mov dword[image_of_eax], ERROR_UNSUPPORTED_FS |
||
135 | cmp eax, fs_NumCdServices |
||
136 | jae @f |
||
137 | add ebx, 4 |
||
6611 | clevermous | 138 | push ebp |
6464 | pathoswith | 139 | call dword[fs_CdServices + eax*4] |
6611 | clevermous | 140 | pop ebp |
6464 | pathoswith | 141 | mov [image_of_eax], eax |
142 | mov [image_of_ebx], ebx |
||
143 | @@: |
||
144 | call free_cd_channel |
||
145 | and [cd_status], 0 |
||
6468 | pathoswith | 146 | stdcall kernel_free, ebp |
6464 | pathoswith | 147 | ret |
148 | |||
149 | .nextCD: |
||
150 | test eax, eax ; partition number |
||
151 | stc |
||
152 | jnz @f ; no more partitions |
||
153 | mov al, 1 ; /cdX/1 |
||
154 | clc |
||
155 | @@: |
||
156 | ret |
||
157 | |||
158 | .maindir: ; list partitions |
||
159 | mov esi, .nextCD |
||
160 | .maindir_noesi: ; backjump from dyndisk_handler |
||
6468 | pathoswith | 161 | push ebp |
162 | mov ebp, ecx |
||
163 | call kernel_free |
||
6464 | pathoswith | 164 | cmp dword[ebx], 1 |
165 | jnz .access_denied ; read folder? |
||
6468 | pathoswith | 166 | push ebp |
167 | pushd [ebx+4] ; first block |
||
6464 | pathoswith | 168 | mov ebp, [ebx+12] ; the number of blocks to read |
6468 | pathoswith | 169 | mov edx, [ebx+16] ; buffer |
2288 | clevermous | 170 | mov ebx, [ebx+8] ; flags |
6464 | pathoswith | 171 | mov ecx, 32/4 |
2288 | clevermous | 172 | mov edi, edx |
6464 | pathoswith | 173 | xor eax, eax |
2288 | clevermous | 174 | rep stosd |
175 | mov byte [edx], 1 ; version |
||
176 | .maindir_loop: |
||
177 | call esi |
||
178 | jc .maindir_done |
||
6464 | pathoswith | 179 | inc dword[edx+8] |
180 | dec dword[esp] |
||
2288 | clevermous | 181 | jns .maindir_loop |
182 | dec ebp |
||
183 | js .maindir_loop |
||
6464 | pathoswith | 184 | inc dword[edx+4] |
185 | mov dword[edi], 16 ; attributes: folder |
||
186 | mov dword[edi+4], ebx ; name encoding |
||
2288 | clevermous | 187 | push eax |
6464 | pathoswith | 188 | mov ecx, 32/4 |
189 | add edi, 8 |
||
2288 | clevermous | 190 | xor eax, eax |
191 | rep stosd |
||
192 | pop eax |
||
6464 | pathoswith | 193 | push eax edx edi |
194 | ; convert number in eax to decimal string |
||
2288 | clevermous | 195 | push -'0' |
196 | mov ecx, 10 |
||
197 | @@: |
||
198 | xor edx, edx |
||
199 | div ecx |
||
200 | push edx |
||
201 | test eax, eax |
||
202 | jnz @b |
||
6464 | pathoswith | 203 | cmp ebx, 1 |
204 | jz .uni |
||
2288 | clevermous | 205 | @@: |
206 | pop eax |
||
6464 | pathoswith | 207 | add eax, '0' |
2288 | clevermous | 208 | stosb |
6464 | pathoswith | 209 | test eax, eax |
2288 | clevermous | 210 | jnz @b |
6464 | pathoswith | 211 | pop edi edx eax |
212 | add edi, 264 |
||
213 | jmp .maindir_loop |
||
214 | |||
215 | .uni: |
||
216 | pop eax |
||
217 | add eax, '0' |
||
218 | stosw |
||
219 | test eax, eax |
||
220 | jnz .uni |
||
221 | pop edi edx eax |
||
2288 | clevermous | 222 | add edi, 520 |
223 | jmp .maindir_loop |
||
6464 | pathoswith | 224 | |
2288 | clevermous | 225 | .maindir_done: |
6464 | pathoswith | 226 | pop eax eax |
2288 | clevermous | 227 | mov ebx, [edx+4] |
228 | xor eax, eax |
||
229 | dec ebp |
||
230 | js @f |
||
231 | mov al, ERROR_END_OF_FILE |
||
232 | @@: |
||
233 | mov [image_of_eax], eax |
||
234 | mov [image_of_ebx], ebx |
||
235 | ret |
||
6464 | pathoswith | 236 | |
2288 | clevermous | 237 | .access_denied: |
6464 | pathoswith | 238 | mov dword[image_of_eax], ERROR_ACCESS_DENIED |
2288 | clevermous | 239 | ret |
240 | |||
6464 | pathoswith | 241 | .rootdir: ; / - virtual root folder |
242 | cmp dword[ebx], 1 ; read folder? |
||
243 | jnz .access_denied |
||
244 | mov ebp, [ebx+12] ; number of blocks |
||
245 | mov edx, [ebx+16] ; return area |
||
246 | push dword[ebx+4] ; first block |
||
2288 | clevermous | 247 | mov ebx, [ebx+8] ; flags |
6464 | pathoswith | 248 | mov ecx, 32/4 |
249 | mov edi, edx |
||
2288 | clevermous | 250 | xor eax, eax |
251 | rep stosd |
||
252 | mov byte [edx], 1 ; version |
||
4277 | clevermous | 253 | sub esp, 16 |
6464 | pathoswith | 254 | .rootdir_loop: |
4277 | clevermous | 255 | push edi |
256 | lea edi, [esp+4] |
||
257 | call dyndisk_enum_root |
||
258 | pop edi |
||
259 | test eax, eax |
||
6464 | pathoswith | 260 | jz .rootdirCD |
261 | inc dword[edx+8] |
||
262 | dec dword[esp+16] |
||
263 | jns .rootdir_loop |
||
4277 | clevermous | 264 | dec ebp |
6464 | pathoswith | 265 | js .rootdir_loop |
266 | inc dword[edx+4] |
||
267 | mov dword[edi], 16 ; attributes: folder |
||
268 | mov dword[edi+4], ebx ; name encoding |
||
4277 | clevermous | 269 | push eax |
6464 | pathoswith | 270 | mov ecx, 32/4 |
271 | add edi, 8 |
||
4277 | clevermous | 272 | xor eax, eax |
273 | rep stosd |
||
6468 | pathoswith | 274 | push edi |
275 | lea esi, [esp+8] |
||
6464 | pathoswith | 276 | cmp ebx, 1 |
277 | jz .uni2 |
||
4277 | clevermous | 278 | @@: |
279 | lodsb |
||
280 | stosb |
||
6464 | pathoswith | 281 | test eax, eax |
4277 | clevermous | 282 | jnz @b |
6468 | pathoswith | 283 | pop edi eax |
6464 | pathoswith | 284 | add edi, 264 |
285 | jmp .rootdir_loop |
||
286 | |||
287 | .uni2: |
||
288 | lodsb |
||
289 | stosw |
||
290 | test eax, eax |
||
291 | jnz .uni2 |
||
6468 | pathoswith | 292 | pop edi eax |
4277 | clevermous | 293 | add edi, 520 |
6464 | pathoswith | 294 | jmp .rootdir_loop |
295 | |||
296 | .rootdirCD: |
||
4277 | clevermous | 297 | add esp, 16 |
6464 | pathoswith | 298 | or esi, -1 |
299 | .rootdirCD_loop: |
||
300 | inc esi |
||
301 | cmp esi, 10 |
||
302 | jnc .rootdir_done |
||
303 | mov eax, esi |
||
304 | not eax |
||
305 | and eax, 3 |
||
306 | shl eax, 1 |
||
307 | inc eax |
||
308 | mov ecx, esi |
||
309 | shr ecx, 2 |
||
310 | bt [ecx*5+DRIVE_DATA+1], ax |
||
311 | jnc .rootdirCD_loop |
||
312 | inc dword[edx+8] |
||
313 | dec dword[esp] |
||
314 | jns .rootdirCD_loop |
||
2288 | clevermous | 315 | dec ebp |
6464 | pathoswith | 316 | js .rootdirCD_loop |
317 | inc dword[edx+4] |
||
318 | mov dword[edi], 16 ; attributes: folder |
||
319 | mov dword[edi+4], ebx ; name encoding |
||
320 | mov ecx, 32/4 |
||
2288 | clevermous | 321 | add edi, 8 |
6464 | pathoswith | 322 | xor eax, eax |
2288 | clevermous | 323 | rep stosd |
6464 | pathoswith | 324 | mov eax, esi |
325 | add eax, '0' |
||
326 | cmp ebx, 1 |
||
327 | jz @f |
||
328 | mov word [edi], 'cd' |
||
329 | mov [edi+2], ax |
||
330 | add edi, 264 |
||
331 | jmp .rootdirCD_loop |
||
332 | |||
2288 | clevermous | 333 | @@: |
6464 | pathoswith | 334 | mov dword[edi], 640063h |
335 | mov [edi+4], eax |
||
2288 | clevermous | 336 | add edi, 520 |
6464 | pathoswith | 337 | jmp .rootdirCD_loop |
338 | |||
339 | .rootdir_done: |
||
2288 | clevermous | 340 | pop eax |
341 | mov ebx, [edx+4] |
||
342 | xor eax, eax |
||
343 | dec ebp |
||
344 | js @f |
||
345 | mov al, ERROR_END_OF_FILE |
||
346 | @@: |
||
347 | mov [image_of_eax], eax |
||
348 | mov [image_of_ebx], ebx |
||
349 | ret |
||
350 | |||
4700 | mario79 | 351 | ;----------------------------------------------------------------------------- |
2288 | clevermous | 352 | process_replace_file_name: |
6464 | pathoswith | 353 | ; in: [esi] = virtual path |
354 | ; out: [esi]+[ebp] = physical path |
||
3689 | mario79 | 355 | xor edi, edi |
6471 | pathoswith | 356 | xor ebp, ebp |
2288 | clevermous | 357 | .loop: |
3711 | clevermous | 358 | cmp edi, [full_file_name_table.size] |
3689 | mario79 | 359 | jae .notfound |
2288 | clevermous | 360 | push esi edi |
6464 | pathoswith | 361 | shl edi, 7 |
6471 | pathoswith | 362 | add edi, [full_file_name_table] |
2288 | clevermous | 363 | @@: |
6464 | pathoswith | 364 | cmp byte [edi], 0 |
2288 | clevermous | 365 | jz .dest_done |
366 | lodsb |
||
367 | test al, al |
||
368 | jz .cont |
||
369 | scasb |
||
370 | jz @b |
||
6798 | pathoswith | 371 | or al, 20h |
372 | cmp [edi-1], al |
||
373 | jz @b |
||
6464 | pathoswith | 374 | .cont: |
375 | pop edi esi |
||
376 | inc edi |
||
377 | jmp .loop |
||
378 | |||
2288 | clevermous | 379 | .dest_done: |
380 | cmp byte [esi], 0 |
||
381 | jz .found |
||
382 | cmp byte [esi], '/' |
||
383 | jnz .cont |
||
384 | .found: |
||
385 | pop edi eax |
||
6464 | pathoswith | 386 | shl edi, 7 |
6471 | pathoswith | 387 | add edi, [full_file_name_table] |
2288 | clevermous | 388 | mov ebp, esi |
389 | lea esi, [edi+64] |
||
390 | .notfound: |
||
391 | ret |
||
6464 | pathoswith | 392 | |
3689 | mario79 | 393 | ;----------------------------------------------------------------------------- |
3663 | mario79 | 394 | uglobal |
6471 | pathoswith | 395 | addDirSeal db ? |
3663 | mario79 | 396 | endg |
6338 | serge | 397 | |
6464 | pathoswith | 398 | sys_current_directory: ; sysfunction 30 |
2288 | clevermous | 399 | mov eax, [current_slot] |
400 | mov edi, [eax+APPDATA.cur_dir] |
||
6798 | pathoswith | 401 | xor eax, eax |
2288 | clevermous | 402 | dec ebx |
403 | jz .set |
||
404 | dec ebx |
||
405 | jz .get |
||
3663 | mario79 | 406 | dec ebx |
407 | jz .mount_additional_directory |
||
6798 | pathoswith | 408 | mov eax, edx |
6471 | pathoswith | 409 | dec ebx |
6798 | pathoswith | 410 | jz .set |
411 | mov eax, esi |
||
412 | dec ebx |
||
413 | jz .get |
||
6471 | pathoswith | 414 | @@: |
2288 | clevermous | 415 | ret |
3663 | mario79 | 416 | |
417 | .mount_additional_directory: |
||
6464 | pathoswith | 418 | ; in: ecx -> dir name+dir path (128) |
6471 | pathoswith | 419 | mov al, 1 |
420 | xchg [addDirSeal], al |
||
421 | test al, al |
||
422 | jnz @b |
||
3663 | mario79 | 423 | mov esi, ecx |
424 | mov edi, sysdir_name1 |
||
6798 | pathoswith | 425 | mov ecx, 64 |
6464 | pathoswith | 426 | rep movsb ; copying fake directory name |
6798 | pathoswith | 427 | mov byte [edi-1], 0 |
6471 | pathoswith | 428 | mov cl, 63 |
429 | call cp866toUTF8_string |
||
430 | mov byte [edi], 0 |
||
3663 | mario79 | 431 | mov [full_file_name_table.size], 2 |
432 | ret |
||
6338 | serge | 433 | |
6798 | pathoswith | 434 | .get: |
435 | ; in: ecx -> buffer, edx = length, eax = encoding |
||
6471 | pathoswith | 436 | mov esi, edi |
6534 | pathoswith | 437 | inc esi |
6471 | pathoswith | 438 | mov edi, ecx |
439 | cmp edx, maxPathLength |
||
440 | jc @f |
||
441 | mov edx, maxPathLength |
||
2288 | clevermous | 442 | @@: |
443 | mov ecx, edx |
||
6798 | pathoswith | 444 | jecxz .ret |
445 | cmp eax, 2 |
||
446 | jz .get16 |
||
447 | cmp eax, 3 |
||
448 | jz .get8 |
||
6471 | pathoswith | 449 | @@: |
450 | dec ecx |
||
451 | js @f |
||
452 | call utf8to16 |
||
453 | call uni2ansi_char |
||
454 | stosb |
||
455 | test al, al |
||
456 | jnz @b |
||
457 | sub edx, ecx |
||
458 | @@: |
||
6798 | pathoswith | 459 | mov byte [edi-1], 0 |
460 | .ret: |
||
461 | mov [esp+32], edx |
||
2288 | clevermous | 462 | ret |
463 | |||
6798 | pathoswith | 464 | .get8: |
465 | push edi |
||
466 | mov edi, esi |
||
467 | xor eax, eax |
||
468 | repnz scasb |
||
469 | sub edx, ecx |
||
470 | mov ecx, edx |
||
471 | pop edi |
||
472 | rep movsb |
||
473 | jmp @b |
||
474 | |||
6471 | pathoswith | 475 | .get16: |
6798 | pathoswith | 476 | shr ecx, 1 |
6471 | pathoswith | 477 | shr edx, 1 |
478 | @@: |
||
479 | dec ecx |
||
480 | js @f |
||
481 | call utf8to16 |
||
482 | stosw |
||
483 | test ax, ax |
||
484 | jnz @b |
||
485 | sub edx, ecx |
||
486 | @@: |
||
6798 | pathoswith | 487 | shl edx, 1 |
488 | mov word [edi-2], 0 |
||
489 | jmp .ret |
||
6464 | pathoswith | 490 | |
2288 | clevermous | 491 | .set: |
6792 | pathoswith | 492 | mov esi, ecx |
493 | getFullPath: |
||
494 | ; in: esi -> file path, eax = string encoding, edi -> destination |
||
495 | ; out: UTF-8 string (with marker), eax = length, 0 -> error |
||
496 | test eax, eax |
||
497 | jnz @f |
||
498 | cmp byte [esi], 4 |
||
6502 | pathoswith | 499 | jnc @f |
6792 | pathoswith | 500 | cmp byte [esi], 0 |
501 | jz @f |
||
502 | lodsb |
||
6471 | pathoswith | 503 | @@: |
504 | cmp byte [esi], '/' |
||
6792 | pathoswith | 505 | jnz .relative |
506 | cmp eax, 2 |
||
507 | jnz @f |
||
508 | cmp word [esi], '/' |
||
509 | jnz .relative |
||
6471 | pathoswith | 510 | inc esi |
6792 | pathoswith | 511 | inc esi |
512 | jmp .start |
||
513 | |||
514 | @@: |
||
515 | inc esi |
||
6758 | pathoswith | 516 | cmp byte [esi], 4 |
6792 | pathoswith | 517 | jnc .start |
518 | lodsb |
||
6758 | pathoswith | 519 | cmp byte [esi], '/' |
520 | jnz .start |
||
521 | inc esi |
||
522 | .start: |
||
6792 | pathoswith | 523 | push eax edi |
6468 | pathoswith | 524 | call process_replace_file_name |
6792 | pathoswith | 525 | mov edi, [esp] |
526 | mov ecx, maxPathLength |
||
6502 | pathoswith | 527 | mov al, 3 |
528 | mov ah, '/' |
||
529 | stosw |
||
530 | sub ecx, 2 |
||
6471 | pathoswith | 531 | test ebp, ebp |
532 | jz .absolute |
||
533 | @@: |
||
6468 | pathoswith | 534 | lodsb |
535 | stosb |
||
6471 | pathoswith | 536 | dec ecx |
6468 | pathoswith | 537 | test al, al |
6471 | pathoswith | 538 | jnz @b |
539 | mov esi, ebp |
||
6468 | pathoswith | 540 | dec edi |
6471 | pathoswith | 541 | .absolute: |
6792 | pathoswith | 542 | cmp byte [esp+4], 2 |
6502 | pathoswith | 543 | jz .utf16 |
6792 | pathoswith | 544 | cmp byte [esp+4], 3 |
6502 | pathoswith | 545 | jz .utf8 |
6471 | pathoswith | 546 | call cp866toUTF8_string |
6787 | pathoswith | 547 | jns .end |
6471 | pathoswith | 548 | jmp .fail |
549 | |||
6502 | pathoswith | 550 | .utf8: |
551 | dec ecx |
||
552 | js .fail |
||
553 | lodsb |
||
554 | stosb |
||
555 | test al, al |
||
6787 | pathoswith | 556 | jz .end |
6502 | pathoswith | 557 | jmp .utf8 |
558 | |||
559 | .utf16: |
||
6471 | pathoswith | 560 | call UTF16to8_string |
6787 | pathoswith | 561 | jns .end |
6468 | pathoswith | 562 | .fail: |
563 | mov byte [edi], 0 |
||
6792 | pathoswith | 564 | pop eax eax |
6468 | pathoswith | 565 | xor eax, eax |
6792 | pathoswith | 566 | ret |
6468 | pathoswith | 567 | |
6792 | pathoswith | 568 | .relative: |
569 | push eax edi |
||
570 | mov ebx, esi |
||
6468 | pathoswith | 571 | mov edi, [current_slot] |
572 | mov edi, [edi+APPDATA.cur_dir] |
||
573 | mov edx, edi |
||
6792 | pathoswith | 574 | mov ecx, maxPathLength |
6468 | pathoswith | 575 | xor eax, eax |
576 | repnz scasb |
||
577 | mov esi, edi |
||
6792 | pathoswith | 578 | mov edi, [esp] |
6468 | pathoswith | 579 | jecxz .fail |
6502 | pathoswith | 580 | cmp byte [ebx], 0 |
581 | jz .set_ok |
||
6792 | pathoswith | 582 | dec esi |
6471 | pathoswith | 583 | cmp edx, edi ; is destination equal to cur_dir? |
584 | mov edi, esi |
||
585 | jz @f |
||
6792 | pathoswith | 586 | mov edi, [esp] |
2288 | clevermous | 587 | mov ecx, esi |
6468 | pathoswith | 588 | sub ecx, edx |
2288 | clevermous | 589 | mov esi, edx |
590 | mov edx, edi |
||
591 | rep movsb |
||
6471 | pathoswith | 592 | @@: |
2288 | clevermous | 593 | mov byte [edi], '/' |
594 | inc edi |
||
6471 | pathoswith | 595 | mov esi, ebx |
596 | mov ecx, edx |
||
6792 | pathoswith | 597 | add ecx, maxPathLength |
6471 | pathoswith | 598 | sub ecx, edi |
599 | jmp .absolute |
||
600 | |||
6787 | pathoswith | 601 | .set_ok: |
602 | cmp edx, edi ; is destination equal to cur_dir? |
||
6471 | pathoswith | 603 | jz @f |
6787 | pathoswith | 604 | mov ecx, esi |
605 | sub ecx, edx |
||
606 | mov esi, edx |
||
607 | rep movsb |
||
2288 | clevermous | 608 | @@: |
6792 | pathoswith | 609 | pop eax |
610 | sub edi, eax |
||
611 | pop eax |
||
612 | mov eax, edi |
||
613 | ret |
||
6787 | pathoswith | 614 | |
615 | .end: |
||
616 | or ecx, -1 |
||
6792 | pathoswith | 617 | mov edi, [esp] |
6787 | pathoswith | 618 | xor eax, eax |
619 | push edi |
||
620 | repnz scasb |
||
621 | not ecx |
||
622 | pop edi |
||
623 | .parse: |
||
624 | mov al, '/' |
||
625 | repnz scasb |
||
626 | jecxz @b |
||
627 | cmp byte [edi], '.' |
||
628 | jnz .parse |
||
629 | mov esi, edi |
||
630 | @@: |
||
631 | lodsw |
||
632 | sub ecx, 2 |
||
633 | cmp ax, './' |
||
634 | jz @b |
||
635 | cmp ax, '..' |
||
636 | jnz @f |
||
6471 | pathoswith | 637 | cmp byte [esi], '/' |
6787 | pathoswith | 638 | jnz @f |
639 | mov edx, ecx |
||
640 | mov ecx, edi |
||
6792 | pathoswith | 641 | sub ecx, [esp] |
6787 | pathoswith | 642 | sub ecx, 2 |
643 | jc .fail |
||
644 | sub edi, 2 |
||
645 | lodsb |
||
646 | dec edx |
||
647 | std |
||
648 | repnz scasb |
||
649 | cld |
||
650 | add edi, 2 |
||
651 | mov ecx, edx |
||
652 | jmp @b |
||
6464 | pathoswith | 653 | |
6787 | pathoswith | 654 | @@: |
655 | sub esi, 2 |
||
656 | add ecx, 2 |
||
657 | cmp esi, edi |
||
658 | jz .parse |
||
659 | push edi ecx |
||
660 | rep movsb |
||
661 | pop ecx edi |
||
662 | jmp .parse |
||
663 | |||
6462 | pathoswith | 664 | include "parse_fn.inc" |
665 | include "fs_common.inc" |
||
666 | include "iso9660.inc" ; read for CD filesystem |
||
667 | include "fat.inc" |
||
668 | include "ntfs.inc" |
||
669 | include "ext.inc" |
||
6503 | pathoswith | 670 | ; include "xfs.asm" |
671 | |||
672 | xfs_create_partition: |
||
673 | xor eax, eax |
||
674 | ret |