Rev 6468 | Rev 6502 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6468 | Rev 6471 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2016. 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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 6468 $ |
8 | $Revision: 6471 $ |
9 | 9 | ||
10 | ERROR_SUCCESS = 0 |
10 | ERROR_SUCCESS = 0 |
11 | ERROR_DISK_BASE = 1 |
11 | ERROR_DISK_BASE = 1 |
Line 65... | Line 65... | ||
65 | ret |
65 | ret |
Line 66... | Line 66... | ||
66 | 66 | ||
67 | @@: |
67 | @@: |
68 | cmp word [ebp], '/' |
68 | cmp word [ebp], '/' |
- | 69 | jz .rootdir |
|
- | 70 | cmp byte [ebp], 2 |
|
- | 71 | jnz @f |
|
- | 72 | cmp dword[ebp+1], '/' |
|
- | 73 | jz .rootdir |
|
69 | jz .rootdir |
74 | @@: |
70 | stdcall kernel_alloc, maxPathLength |
75 | stdcall kernel_alloc, maxPathLength |
71 | push ebx |
76 | push ebx |
72 | mov ebx, ebp |
77 | mov ebx, ebp |
73 | mov ebp, eax |
78 | mov ebp, eax |
74 | push maxPathLength |
79 | push maxPathLength |
75 | push eax |
80 | push eax |
76 | call get_full_file_name |
81 | call get_full_file_name |
- | 82 | pop ebx |
|
- | 83 | test eax, eax |
|
77 | pop ebx |
84 | jz .notfound |
78 | mov esi, ebp |
85 | mov esi, ebp |
79 | mov ax, [ebp] |
86 | mov ax, [ebp] |
80 | or ax, 2020h |
87 | or ax, 2020h |
81 | cmp ax, 'cd' |
88 | cmp ax, 'cd' |
Line 347... | Line 354... | ||
347 | 354 | ||
348 | ;----------------------------------------------------------------------------- |
355 | ;----------------------------------------------------------------------------- |
349 | process_replace_file_name: |
356 | process_replace_file_name: |
350 | ; in: [esi] = virtual path |
357 | ; in: [esi] = virtual path |
351 | ; out: [esi]+[ebp] = physical path |
- | |
352 | pushfd |
- | |
353 | cli |
- | |
354 | mov ebp, [full_file_name_table] |
358 | ; out: [esi]+[ebp] = physical path |
- | 359 | xor edi, edi |
|
355 | xor edi, edi |
360 | xor ebp, ebp |
356 | .loop: |
361 | .loop: |
357 | cmp edi, [full_file_name_table.size] |
362 | cmp edi, [full_file_name_table.size] |
358 | jae .notfound |
363 | jae .notfound |
359 | push esi edi |
364 | push esi edi |
360 | shl edi, 7 |
365 | shl edi, 7 |
361 | add edi, ebp |
366 | add edi, [full_file_name_table] |
362 | @@: |
367 | @@: |
363 | cmp byte [edi], 0 |
368 | cmp byte [edi], 0 |
364 | jz .dest_done |
369 | jz .dest_done |
365 | lodsb |
370 | lodsb |
Line 376... | Line 381... | ||
376 | .dest_done: |
381 | .dest_done: |
377 | cmp byte [esi], 0 |
382 | cmp byte [esi], 0 |
378 | jz .found |
383 | jz .found |
379 | cmp byte [esi], '/' |
384 | cmp byte [esi], '/' |
380 | jnz .cont |
385 | jnz .cont |
381 | inc esi |
- | |
382 | .found: |
386 | .found: |
383 | pop edi eax |
387 | pop edi eax |
384 | shl edi, 7 |
388 | shl edi, 7 |
385 | add edi, ebp |
389 | add edi, [full_file_name_table] |
386 | mov ebp, esi |
390 | mov ebp, esi |
387 | cmp byte [esi], 0 |
- | |
388 | lea esi, [edi+64] |
391 | lea esi, [edi+64] |
389 | jnz .ret |
- | |
390 | .notfound: |
392 | .notfound: |
391 | xor ebp, ebp |
- | |
392 | .ret: |
- | |
393 | popfd |
- | |
394 | ret |
393 | ret |
Line 395... | Line 394... | ||
395 | 394 | ||
396 | ;----------------------------------------------------------------------------- |
395 | ;----------------------------------------------------------------------------- |
397 | uglobal |
396 | uglobal |
398 | lock_flag_for_f30_3 rb 1 |
397 | addDirSeal db ? |
Line 399... | Line 398... | ||
399 | endg |
398 | endg |
400 | 399 | ||
401 | sys_current_directory: ; sysfunction 30 |
400 | sys_current_directory: ; sysfunction 30 |
Line 405... | Line 404... | ||
405 | jz .set |
404 | jz .set |
406 | dec ebx |
405 | dec ebx |
407 | jz .get |
406 | jz .get |
408 | dec ebx |
407 | dec ebx |
409 | jz .mount_additional_directory |
408 | jz .mount_additional_directory |
- | 409 | dec ebx |
|
- | 410 | jz .get16 |
|
- | 411 | @@: |
|
410 | ret |
412 | ret |
Line 411... | Line 413... | ||
411 | 413 | ||
412 | .mount_additional_directory: |
414 | .mount_additional_directory: |
- | 415 | ; in: ecx -> dir name+dir path (128) |
|
413 | ; in: ecx -> dir name+dir path (128) |
416 | mov al, 1 |
- | 417 | xchg [addDirSeal], al |
|
414 | cmp [lock_flag_for_f30_3], 1 ; check lock |
418 | test al, al |
415 | je @f |
419 | jnz @b |
416 | mov esi, ecx |
420 | mov esi, ecx |
417 | mov edi, sysdir_name1 |
421 | mov edi, sysdir_name1 |
418 | mov ecx, 63 |
- | |
419 | pushfd |
- | |
420 | cli |
- | |
421 | cld |
422 | mov ecx, 63 |
422 | rep movsb ; copying fake directory name |
423 | rep movsb ; copying fake directory name |
423 | inc esi |
424 | inc esi |
424 | xor eax, eax |
425 | xor eax, eax |
425 | stosb ; terminator of name, in case if we get the inlet trash |
426 | stosb ; terminator of name, in case if we get the inlet trash |
426 | mov ecx, 63 |
- | |
427 | rep movsb ; copying real directory path for mounting |
427 | mov cl, 63 |
428 | xor eax, eax |
428 | cmp word [esi], 2 |
429 | stosb |
- | |
430 | ; increase the pointer of inputs for procedure "process_replace_file_name" |
429 | jz .utf16 |
431 | mov [full_file_name_table.size], 2 |
- | |
432 | mov [lock_flag_for_f30_3], 1 ; lock |
- | |
433 | popfd |
430 | call cp866toUTF8_string |
- | 431 | @@: |
|
- | 432 | mov byte [edi], 0 |
|
434 | @@: |
433 | mov [full_file_name_table.size], 2 |
Line -... | Line 434... | ||
- | 434 | ret |
|
- | 435 | ||
- | 436 | .utf16: |
|
- | 437 | add esi, 2 |
|
- | 438 | call UTF16to8_string |
|
435 | ret |
439 | jmp @b |
436 | - | ||
437 | .get: ; in: ecx -> buffer, edx = length |
- | |
438 | mov ebx, edi ; buffer |
440 | |
439 | push ecx |
441 | .get: ; in: ecx -> buffer, edx = length |
440 | push edi |
442 | mov esi, edi |
441 | xor eax, eax |
- | |
442 | mov ecx, maxPathLength |
- | |
443 | repne scasb |
- | |
444 | jnz .error |
- | |
445 | sub edi, ebx |
- | |
446 | inc edi |
- | |
447 | mov [esp+32+8], edi ; return in eax |
443 | mov edi, ecx |
448 | cmp edx, edi |
444 | cmp edx, maxPathLength |
449 | jbe @f |
445 | jc @f |
450 | mov edx, edi |
- | |
451 | @@: |
- | |
452 | pop esi |
- | |
453 | pop edi |
- | |
454 | cmp edx, 1 |
446 | mov edx, maxPathLength |
455 | jbe .ret |
447 | @@: |
456 | mov al, '/' |
448 | mov al, '/' |
- | 449 | stosb |
|
- | 450 | mov ecx, edx |
|
- | 451 | dec ecx |
|
- | 452 | @@: |
|
- | 453 | dec ecx |
|
- | 454 | js @f |
|
457 | stosb |
455 | call utf8to16 |
- | 456 | call uni2ansi_char |
|
- | 457 | stosb |
|
- | 458 | test al, al |
|
- | 459 | jnz @b |
|
458 | mov ecx, edx |
460 | sub edx, ecx |
- | 461 | mov ecx, edx |
|
459 | rep movsb |
462 | @@: |
Line 460... | Line 463... | ||
460 | .ret: |
463 | mov [esp+32], ecx |
- | 464 | ret |
|
- | 465 | ||
- | 466 | .get16: |
|
- | 467 | mov esi, edi |
|
- | 468 | mov edi, ecx |
|
- | 469 | cmp edx, maxPathLength |
|
461 | ret |
470 | jc @f |
- | 471 | mov edx, maxPathLength |
|
- | 472 | @@: |
|
- | 473 | shr edx, 1 |
|
- | 474 | mov ax, '/' |
|
- | 475 | stosw |
|
- | 476 | mov ecx, edx |
|
- | 477 | dec ecx |
|
- | 478 | @@: |
|
- | 479 | dec ecx |
|
- | 480 | js @f |
|
- | 481 | call utf8to16 |
|
- | 482 | stosw |
|
- | 483 | test ax, ax |
|
- | 484 | jnz @b |
|
462 | 485 | sub edx, ecx |
|
463 | .error: |
486 | mov ecx, edx |
Line 464... | Line 487... | ||
464 | add esp, 8 |
487 | @@: |
465 | or dword[esp+32], -1 |
488 | mov [esp+32], ecx |
466 | ret |
489 | ret |
467 | 490 | ||
468 | .set: |
491 | .set: |
469 | pop eax |
492 | pop eax |
470 | push maxPathLength |
493 | push maxPathLength |
471 | push edi |
494 | push edi |
472 | push eax |
495 | push eax |
473 | mov ebx, ecx |
496 | mov ebx, ecx |
- | 497 | get_full_file_name: |
|
- | 498 | ; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length |
|
- | 499 | ; out: eax=0 -> out of length |
|
- | 500 | push ebp ebx |
|
- | 501 | mov esi, ebx |
|
474 | get_full_file_name: |
502 | cmp byte [ebx], 2 |
475 | ; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length |
503 | jnz @f |
- | 504 | inc esi |
|
476 | ; destroys all registers |
505 | @@: |
- | 506 | cmp byte [esi], '/' |
|
- | 507 | jnz .set_relative |
|
- | 508 | inc esi |
|
477 | push ebp |
509 | cmp byte [ebx], 2 |
478 | cmp byte [ebx], '/' |
510 | jnz @f |
479 | jnz .set_relative |
511 | inc esi |
480 | lea esi, [ebx+1] |
512 | @@: |
- | 513 | call process_replace_file_name |
|
481 | call process_replace_file_name |
514 | mov edi, [esp+12] |
482 | mov edi, [esp+8] |
515 | mov ecx, [esp+16] |
483 | mov edx, [esp+12] |
516 | test ebp, ebp |
- | 517 | jz .absolute |
|
484 | add edx, edi |
518 | @@: |
485 | .set_copy: |
519 | lodsb |
486 | lodsb |
- | |
487 | stosb |
520 | stosb |
488 | test al, al |
- | |
489 | jz .set_part2 |
- | |
490 | .set_copy_cont: |
521 | dec ecx |
- | 522 | test al, al |
|
- | 523 | jnz @b |
|
- | 524 | mov esi, ebp |
|
- | 525 | dec edi |
|
- | 526 | .absolute: |
|
- | 527 | cmp byte [ebx], 2 |
|
- | 528 | jz @f |
|
- | 529 | call cp866toUTF8_string |
|
- | 530 | jns .ret |
|
- | 531 | jmp .fail |
|
491 | cmp edi, edx |
532 | |
492 | jb .set_copy |
533 | @@: |
493 | .overflow: |
534 | call UTF16to8_string |
494 | dec edi |
535 | jns .ret |
495 | .fail: |
536 | .fail: |
Line 496... | Line -... | ||
496 | mov byte [edi], 0 |
- | |
497 | xor eax, eax |
- | |
498 | pop ebp |
- | |
499 | ret 8 |
- | |
500 | - | ||
501 | .set_part2: |
- | |
502 | mov esi, ebp |
- | |
503 | xor ebp, ebp |
- | |
504 | test esi, esi |
537 | mov byte [edi], 0 |
505 | jz .ret.ok |
538 | xor eax, eax |
506 | mov byte [edi-1], '/' |
539 | pop ebx ebp |
507 | jmp .set_copy_cont |
540 | ret 8 |
508 | 541 | ||
509 | .set_relative: |
542 | .set_relative: |
510 | mov edi, [current_slot] |
543 | mov edi, [current_slot] |
511 | mov edi, [edi+APPDATA.cur_dir] |
544 | mov edi, [edi+APPDATA.cur_dir] |
512 | mov edx, edi |
545 | mov edx, edi |
513 | mov ecx, [esp+12] |
546 | mov ecx, [esp+16] |
514 | xor eax, eax |
547 | xor eax, eax |
- | 548 | repnz scasb |
|
- | 549 | mov esi, edi |
|
515 | repnz scasb |
550 | dec esi |
516 | mov esi, edi |
551 | mov edi, [esp+12] |
517 | dec esi |
552 | jecxz .fail |
518 | mov edi, [esp+8] |
553 | cmp byte [ebx], 2 |
519 | jecxz .fail |
554 | jz .relative16 |
520 | .relative: |
555 | .relative: |
521 | cmp byte [ebx], 0 |
- | |
522 | jz .set_ok |
- | |
523 | cmp word [ebx], '.' |
556 | cmp byte [ebx], 0 |
524 | jz .set_ok |
- | |
525 | cmp word [ebx], './' |
- | |
526 | jnz @f |
557 | jz .set_ok |
527 | add ebx, 2 |
558 | cmp word [ebx], '.' |
528 | jmp .relative |
559 | jz .set_ok |
529 | 560 | cmp word [ebx], './' |
|
530 | @@: |
561 | jz .next |
531 | cmp word [ebx], '..' |
562 | cmp word [ebx], '..' |
- | 563 | jnz .doset_relative |
|
532 | jnz .doset_relative |
564 | cmp byte [ebx+2], 0 |
533 | cmp byte [ebx+2], 0 |
565 | jz @f |
534 | jz @f |
566 | cmp byte [ebx+2], '/' |
535 | cmp byte [ebx+2], '/' |
567 | jnz .doset_relative |
- | 568 | inc ebx |
|
536 | jnz .doset_relative |
569 | @@: |
537 | @@: |
570 | dec esi |
Line 538... | Line 571... | ||
538 | dec esi |
571 | cmp byte [esi], '/' |
539 | cmp byte [esi], '/' |
572 | jnz @b |
540 | jnz @b |
573 | .next: |
541 | add ebx, 3 |
574 | add ebx, 2 |
542 | jmp .relative |
575 | jmp .relative |
543 | 576 | ||
544 | .set_ok: |
577 | .set_ok: |
545 | cmp edx, edi ; is destination equal to APPDATA.cur_dir? |
578 | cmp edx, edi ; is destination equal to cur_dir? |
546 | jz @f |
579 | jz @f |
547 | mov ecx, esi |
580 | mov ecx, esi |
548 | sub ecx, edx |
581 | sub ecx, edx |
549 | mov esi, edx |
582 | mov esi, edx |
Line 550... | Line 583... | ||
550 | rep movsb |
583 | rep movsb |
551 | mov byte [edi], 0 |
584 | mov byte [edi], 0 |
552 | .ret.ok: |
585 | .ret: |
Line 553... | Line 586... | ||
553 | mov al, 1 |
586 | mov al, 1 |
- | 587 | pop ebx ebp |
|
554 | pop ebp |
588 | ret 8 |
- | 589 | ||
555 | ret 8 |
590 | @@: |
556 | 591 | mov byte [esi], 0 |
|
557 | @@: |
592 | jmp .ret |
558 | mov byte [esi], 0 |
593 | |
559 | jmp .ret.ok |
594 | .doset_relative: |
560 | 595 | cmp edx, edi ; is destination equal to cur_dir? |
|
561 | .doset_relative: |
- | |
562 | cmp edx, edi |
596 | mov edi, esi |
563 | jz .doset_relative.cur_dir |
- | |
564 | mov ecx, esi |
- | |
565 | sub ecx, edx |
- | |
566 | mov esi, edx |
- | |
567 | mov edx, edi |
597 | jz @f |
568 | rep movsb |
598 | mov edi, [esp+12] |
- | 599 | mov ecx, esi |
|
569 | jmp .doset_relative.copy |
600 | sub ecx, edx |
- | 601 | mov esi, edx |
|
- | 602 | mov edx, edi |
|
- | 603 | rep movsb |
|
- | 604 | @@: |
|
- | 605 | mov byte [edi], '/' |
|
- | 606 | inc edi |
|
- | 607 | mov esi, ebx |
|
- | 608 | mov ecx, edx |
|
- | 609 | add ecx, [esp+16] |
|
- | 610 | sub ecx, edi |
|
- | 611 | mov ebx, [esp] |
|
570 | 612 | jmp .absolute |
|
- | 613 | ||
- | 614 | .relative16: |
|
- | 615 | cmp word [ebx], 0 |
|
- | 616 | jz .set_ok |
|
- | 617 | cmp word [ebx], '.' |
|
- | 618 | jnz .doset_relative |
|
- | 619 | cmp word [ebx+2], 0 |
|
- | 620 | jz .set_ok |
|
- | 621 | cmp word [ebx+2], '/' |
|
571 | .doset_relative.cur_dir: |
622 | jz .next16 |
572 | mov edi, esi |
- | |
573 | .doset_relative.copy: |
623 | cmp word [ebx+2], '.' |
574 | add edx, [esp+12] |
- | |
575 | mov byte [edi], '/' |
624 | jnz .doset_relative |
576 | inc edi |
625 | cmp word [ebx+4], 0 |
577 | cmp edi, edx |
626 | jz @f |
578 | jae .overflow |
627 | cmp word [ebx+4], '/' |
579 | @@: |
628 | jnz .doset_relative |
Line 580... | Line 629... | ||
580 | mov al, [ebx] |
629 | add ebx, 2 |
581 | inc ebx |
630 | @@: |
582 | stosb |
631 | dec esi |
583 | test al, al |
632 | cmp byte [esi], '/' |