Subversion Repositories Kolibri OS

Rev

Rev 1398 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1398 Rev 1400
Line 6... Line 6...
6
;;   23.01.2010  turbanoff  - support 70.0 70.1                 ;;
6
;;   23.01.2010  turbanoff  - support 70.0 70.1                 ;;
7
;;                                                              ;;
7
;;                                                              ;;
8
;;                                                              ;;
8
;;                                                              ;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 10... Line 10...
10
 
10
 
Line 11... Line 11...
11
$Revision: 1398 $
11
$Revision: 1400 $
12
 
12
 
13
EXT2_BAD_INO        = 1
13
EXT2_BAD_INO        = 1
14
EXT2_ROOT_INO        = 2
14
EXT2_ROOT_INO        = 2
Line 34... Line 34...
34
EXT2_S_IROTH        = 0x0001
34
EXT2_S_IROTH        = 0x0001
Line 35... Line 35...
35
 
35
 
36
EXT2_FT_REG_FILE        = 1     ;это файл, запись в родительском каталоге
36
EXT2_FT_REG_FILE        = 1     ;это файл, запись в родительском каталоге
Line -... Line 37...
-
 
37
EXT2_FT_DIR             = 2     ;это папка
37
EXT2_FT_DIR             = 2     ;это папка
38
 
38
 
39
FS_FT_HIDDEN            = 2
39
FS_FT_DIR               = 0x10  ;это папка
40
FS_FT_DIR               = 0x10  ;это папка
Line 40... Line 41...
40
FS_FT_ASCII             = 0     ;имя в ascii
41
FS_FT_ASCII             = 0     ;имя в ascii
Line 429... Line 430...
429
            movzx   ebx, [eax+EXT2_DIR_STRUC.rec_len]
430
            movzx   ebx, [eax+EXT2_DIR_STRUC.rec_len]
430
            add     eax, ebx                            ; к следующей записи
431
            add     eax, ebx                            ; к следующей записи
431
            cmp     eax, [EXT2_end_block]              ; проверяем "конец"
432
            cmp     eax, [EXT2_end_block]              ; проверяем "конец"
432
            jb      .find_wanted_start
433
            jb      .find_wanted_start
Line -... Line 434...
-
 
434
 
433
 
435
		push	.find_wanted_start
434
   .end_block_find_wanted:                                   ;вылетили из цикла find_wanted
436
   .end_block:                                   		;вылетили из цикла
435
        mov     ebx, [ext2_data.count_block_in_block]
437
        mov     ebx, [ext2_data.count_block_in_block]
436
        sub     [EXT2_counter_blocks], ebx
438
        sub     [EXT2_counter_blocks], ebx
Line 437... Line 439...
437
        jz      .end_dir
439
        jbe      .end_dir
438
 
-
 
439
        ;получаем новый блок
440
 
440
        inc     esi
441
        inc     esi										;получаем новый блок
441
        push    ecx
442
        push    ecx
442
        mov     ecx, esi
443
        mov     ecx, esi
443
        call    ext2_get_inode_block
444
        call    ext2_get_inode_block
444
        mov     eax, ecx
445
        mov     eax, ecx
445
        mov     ebx, [ext2_data.ext2_save_block]
446
        mov     ebx, [ext2_data.ext2_save_block]
446
        call    ext2_get_block
-
 
447
        pop     ecx
447
        call    ext2_get_block
448
        dec     ecx
448
        pop     ecx
449
        mov     eax, ebx
449
        mov     eax, ebx
-
 
450
        add     ebx, [ext2_data.block_size]
-
 
451
        mov     [EXT2_end_block], ebx
450
        add     ebx, [ext2_data.block_size]
452
        ret												; опять в цикл
-
 
453
 
Line 451... Line 454...
451
        mov     [EXT2_end_block], ebx
454
    .wanted_end:
452
        jmp     .find_wanted_start
455
    	loop	.find_wanted_cycle                      ; ecx = -1
453
 
-
 
454
    .find_wanted_end:
456
 
455
        mov     ecx, edi
457
    .find_wanted_end:
456
 
458
        mov     ecx, edi
457
    .wanted_start:                                      ; ищем first_wanted+count
459
    .wanted_start:                                      ; ищем first_wanted+count
458
            jecxz   .find_wanted_cycle                  ; ecx=0 => огромный цикл до конца папки
460
            jecxz   .wanted_end
459
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
461
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
Line 466... Line 468...
466
            xor     eax, eax
468
            xor     eax, eax
467
            mov     ecx, 40 / 4
469
            mov     ecx, 40 / 4
468
            rep     stosd
470
            rep     stosd
469
            pop     ecx eax
471
            pop     ecx eax
Line 470... Line -...
470
 
-
 
471
            cmp     [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR   ;папка или нет
-
 
472
            jz      @F
-
 
473
 
472
 
474
            push    eax                                             ;получим размер, если это файл
473
            push    eax esi edx                                        ;получим inode
475
            mov     eax, [eax + EXT2_DIR_STRUC.inode]
474
            mov     eax, [eax + EXT2_DIR_STRUC.inode]
476
            mov     ebx, [ext2_data.ext2_temp_inode]
475
            mov     ebx, [ext2_data.ext2_temp_inode]
-
 
476
            call    ext2_get_inode
-
 
477
 
-
 
478
            lea     edi, [edx + 8]
-
 
479
 
-
 
480
            mov     eax, [ebx + EXT2_INODE_STRUC.i_ctime]           ; переведем время в ntfs формат
-
 
481
            xor     edx, edx
-
 
482
            add     eax, 3054539008                                 ;(369 * 365 + 89) * 24 * 3600
-
 
483
            adc     edx, 2
-
 
484
            call    ntfs_datetime_to_bdfe.sec
-
 
485
 
-
 
486
            mov     eax, [ebx + EXT2_INODE_STRUC.i_atime]
-
 
487
            xor     edx, edx
-
 
488
            add     eax, 3054539008
-
 
489
            adc     edx, 2
-
 
490
            call    ntfs_datetime_to_bdfe.sec
-
 
491
 
-
 
492
            mov     eax, [ebx + EXT2_INODE_STRUC.i_mtime]
-
 
493
            xor     edx, edx
-
 
494
            add     eax, 3054539008
-
 
495
            adc     edx, 2
-
 
496
            call    ntfs_datetime_to_bdfe.sec
-
 
497
 
-
 
498
            pop     edx                                             ; пока достаем только буфер
-
 
499
            test    [ebx + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR   ; для папки размер
-
 
500
            jnz     @F                                              ; не возвращаем
477
            call    ext2_get_inode
501
 
-
 
502
            mov     eax, [ebx + EXT2_INODE_STRUC.i_size]            ;low size
478
            mov     eax, [ebx + EXT2_INODE_STRUC.i_size]            ;low size
503
            stosd
479
            mov     ebx, [ebx + EXT2_INODE_STRUC.i_dir_acl]         ;high size
504
            mov     eax, [ebx + EXT2_INODE_STRUC.i_dir_acl]         ;high size
480
            mov     dword [edx+32], eax
505
            stosd
481
            mov     dword [edx+36], ebx
-
 
482
            xor     dword [edx], FS_FT_DIR          ; для файлов xor - 2 раза
-
 
483
            pop     eax
506
            xor     dword [edx], FS_FT_DIR
484
          @@:
507
        @@:
-
 
508
            xor     dword [edx], FS_FT_DIR
-
 
509
            pop     esi eax
485
            xor     dword [edx], FS_FT_DIR
510
 
Line 486... Line 511...
486
            or      dword [edx+4], FS_FT_ASCII      ; symbol type in name
511
            or      dword [edx+4], FS_FT_ASCII      ; symbol type in name
487
 
512
 
488
            ;теперь скопируем название, сконвертировав из UTF-8 в CP866
513
            ;теперь скопируем имя, сконвертировав из UTF-8 в CP866
489
            push    eax ecx esi
514
            push    eax ecx esi
490
            movzx   ecx, [eax + EXT2_DIR_STRUC.name_len]
515
            movzx   ecx, [eax + EXT2_DIR_STRUC.name_len]
491
            lea     edi, [edx + 40]
516
            lea     edi, [edx + 40]
492
            lea     esi, [eax + EXT2_DIR_STRUC.name]
517
            lea     esi, [eax + EXT2_DIR_STRUC.name]
493
            call    utf8toansi_str
518
            call    utf8toansi_str
Line -... Line 519...
-
 
519
            pop     esi ecx eax
-
 
520
            and     byte [edi], 0
494
            pop     esi ecx eax
521
 
-
 
522
            cmp     byte [edx + 40], '.'
Line -... Line 523...
-
 
523
            jne     @F
495
            and     byte [edi], 0
524
            or      dword [edx], FS_FT_HIDDEN
496
 
525
        @@:
497
            add     edx, 40 + 264                       ; go to next record
526
 
498
 
527
            add     edx, 40 + 264                       ; go to next record
499
            dec     ecx                                 ; если запись пустая ecx не надо уменьшать
528
            dec     ecx                                 ; если запись пустая ecx не надо уменьшать
500
        .empty_rec:
529
        .empty_rec:
Line 501... Line 530...
501
            movzx   ebx, [eax + EXT2_DIR_STRUC.rec_len]
530
            movzx   ebx, [eax + EXT2_DIR_STRUC.rec_len]
502
            add     eax, ebx
-
 
503
            cmp     eax, [EXT2_end_block]
-
 
504
            jb      .wanted_start
531
            add     eax, ebx
505
 
-
 
506
    .end_block_wanted:                                      ;вылетели из цикла wanted
-
 
507
        mov     ebx, [ext2_data.count_block_in_block]
-
 
508
        sub     [EXT2_counter_blocks], ebx
-
 
509
        jz      .end_dir
-
 
510
 
-
 
511
        inc     esi
-
 
512
        push    ecx
-
 
513
        mov     ecx, esi
-
 
514
        call    ext2_get_inode_block
-
 
515
        mov     eax, ecx
-
 
516
        mov     ebx, [ext2_data.ext2_save_block]
-
 
517
        call    ext2_get_block
-
 
518
        pop     ecx
-
 
519
        dec     ecx
-
 
520
        mov     eax, ebx
-
 
521
        add     ebx, [ext2_data.block_size]
-
 
522
        mov     [EXT2_end_block], ebx
-
 
Line 523... Line 532...
523
        jmp     .wanted_start
532
            cmp     eax, [EXT2_end_block]
-
 
533
            jb      .wanted_start
524
 
534
 
525
    .wanted_end:
535
        push    .wanted_start                           ; дошли до конца очередного блока
526
    	dec     ecx
536
        jmp     .end_block
527
    	jmp     .find_wanted_cycle
537
 
528
 
538
    .end_dir:
Line 547... Line 557...
547
    .start:
557
    .start:
548
        lodsw
558
        lodsw
549
        cmp     al, 0x80
559
        cmp     al, 0x80
550
        jb      .ascii
560
        jb      .ascii
Line 551... Line 561...
551
 
561
 
552
        xchg    al, ah
562
        xchg    al, ah              ; big-endian
553
        cmp     ax, 0xd080
563
        cmp     ax, 0xd080
554
        jz      .yo1
564
        jz      .yo1
555
        cmp     ax, 0xd191
565
        cmp     ax, 0xd191
556
        jz      .yo2
566
        jz      .yo2
Line 624... Line 634...
624
    .doit:
634
    .doit:
625
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFREG
635
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFREG
626
        jz      .this_is_nofile
636
        jz      .this_is_nofile
Line 627... Line 637...
627
 
637
 
628
    ;-----------------------------------------------------------------------------final step
-
 
629
 
638
    ;-----------------------------------------------------------------------------final step
630
        mov     edi, edx            ; edi = pointer to return mem
639
        mov     edi, edx            ; edi = pointer to return mem
Line 631... Line 640...
631
        mov     esi, ebx            ; esi = pointer to first_wanted
640
        mov     esi, ebx            ; esi = pointer to first_wanted
632
 
641
 
633
        ;///// сравним хватит ли нам файла или нет
642
        ;///// сравним хватит ли нам файла или нет
Line 634... Line -...
634
        mov     ebx, [esi+4]
-
 
635
        mov     eax, [esi]          ; ebx : eax - стартовый номер байта
-
 
636
 
-
 
637
   ;    mov     edx, [ebp + EXT2_INODE_STRUC.i_dir_acl]
643
        mov     ebx, [esi+4]
638
   ;    mov     ecx, [ebp + EXT2_INODE_STRUC.i_size]        ;edx : ecx - размер файла
644
        mov     eax, [esi]          ; ebx : eax - стартовый номер байта
639
 
645
 
Line 640... Line 646...
640
        cmp     [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx
646
        cmp     [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx
641
        ja      .size_great
647
        ja      .size_great
Line 642... Line 648...
642
        jb      .size_less
648
        jb      .size_less
643
 
-
 
644
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
649
 
645
        ja      .size_great
650
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
646
 
651
        ja      .size_great
647
    .size_less:
652
 
648
        pop     ecx
653
    .size_less:
Line 751... Line 756...
751
        ret
756
        ret
752
    @@:
757
    @@:
753
        xor     eax, eax
758
        xor     eax, eax
754
        ret
759
        ret
755
;========================
760
;========================
756
;in : esi -> name           not save register
761
;in : esi -> name           not save: eax ebx ecx
757
;out: ebp -> inode cf=0
762
;out: ebp -> inode cf=0
758
;     ebp -> trash cf=1
763
;     ebp -> trash cf=1
759
ext2_find_lfn:
764
ext2_find_lfn:
760
        mov     ebp, [ext2_data.root_inode]
765
        mov     ebp, [ext2_data.root_inode]
761
    .next_folder:
766
    .next_folder:
Line 793... Line 798...
793
 
798
 
794
    .not_found:
799
    .not_found:
795
        stc
800
        stc
796
        ret
801
        ret
-
 
802
    .get_inode_ret:
797
    .get_inode_ret:
803
        mov     [EXT2_end_block], ebx                           ; сохраняем указатеть на dir_rec
798
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
804
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
799
        mov     ebx, [ext2_data.ext2_save_inode]
805
        mov     ebx, [ext2_data.ext2_save_inode]
800
        call    ext2_get_inode
806
        call    ext2_get_inode
801
        mov     ebp, ebx
807
        mov     ebp, ebx
Line 831... Line 837...
831
        mov     eax, ERROR_FILE_NOT_FOUND
837
        mov     eax, ERROR_FILE_NOT_FOUND
832
        ret
838
        ret
Line 833... Line 839...
833
 
839
 
834
    .doit:
840
    .doit:
-
 
841
        mov     ebp, [ext2_data.root_inode]
-
 
842
        mov     ebx, .doit                        ;неважно что лишь бы этому адресу не '.'
835
        mov     ebp, [ext2_data.root_inode]
843
        jmp     @F
-
 
844
    .doit2:
-
 
845
        mov     ebx, [EXT2_end_block]
-
 
846
        add     ebx, EXT2_DIR_STRUC.name
836
    .doit2:
847
    @@:
837
        xor     eax, eax
848
        xor     eax, eax
838
        mov     edi, edx
849
        mov     edi, edx
839
        mov     ecx, 40/4
850
        mov     ecx, 40/4
Line 840... Line 851...
840
        rep stosd               ; fill zero
851
        rep     stosd               ; fill zero
841
 
852
 
842
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
853
        cmp     byte [ebx], '.'
843
        jz      @F
854
        jnz     @F
-
 
855
        or      dword [edx], FS_FT_HIDDEN
844
        or      dword [edx], FS_FT_DIR
856
    @@:
-
 
857
 
845
    @@:
858
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
846
        mov     byte [edx+1], FS_FT_ASCII
859
        jnz      @F
847
        mov     eax, [ebp + EXT2_INODE_STRUC.i_size]            ;low size
860
        mov     eax, [ebp + EXT2_INODE_STRUC.i_size]            ;low size
848
        mov     ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl]         ;high size
861
        mov     ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl]         ;high size
-
 
862
        mov     dword [edx+32], eax
-
 
863
        mov     dword [edx+36], ebx
-
 
864
        xor     dword [edx], FS_FT_DIR
-
 
865
    @@:
-
 
866
        xor     dword [edx], FS_FT_DIR
-
 
867
 
-
 
868
        lea     edi, [edx + 8]
-
 
869
        mov     eax, [ebx + EXT2_INODE_STRUC.i_ctime]
-
 
870
        xor     edx, edx
-
 
871
        add     eax, 3054539008
-
 
872
        adc     edx, 2
-
 
873
        call    ntfs_datetime_to_bdfe.sec
-
 
874
 
-
 
875
        mov     eax, [ebx + EXT2_INODE_STRUC.i_atime]
-
 
876
        xor     edx, edx
-
 
877
        add     eax, 3054539008
-
 
878
        adc     edx, 2
-
 
879
        call    ntfs_datetime_to_bdfe.sec
-
 
880
 
-
 
881
        mov     eax, [ebx + EXT2_INODE_STRUC.i_mtime]
-
 
882
        xor     edx, edx
-
 
883
        add     eax, 3054539008
Line 849... Line 884...
849
        mov     dword [edx+32], eax
884
        adc     edx, 2
850
        mov     dword [edx+36], ebx
885
        call    ntfs_datetime_to_bdfe.sec
Line 851... Line 886...
851
 
886