Subversion Repositories Kolibri OS

Rev

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], '/'