Subversion Repositories Kolibri OS

Rev

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

Rev 1378 Rev 1384
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2010. 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
;;   02.02.2010  turbanoff  - support 70.5                      ;;
6
;;   23.01.2010  turbanoff  - read from ext2fs                  ;;
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: 1378 $
11
$Revision: 1384 $
12
 
12
 
13
EXT2_BAD_INO        = 1
13
EXT2_BAD_INO        = 1
14
EXT2_ROOT_INO        = 2
14
EXT2_ROOT_INO        = 2
Line 120... Line 120...
120
        call    kernel_alloc
120
        call    kernel_alloc
121
        mov     [ext2_data.ext2_save_block], eax        ; and for temp block
121
        mov     [ext2_data.ext2_save_block], eax        ; and for temp block
122
        call    kernel_alloc
122
        call    kernel_alloc
123
        mov     [ext2_data.ext2_temp_block], eax        ; and for get_inode proc
123
        mov     [ext2_data.ext2_temp_block], eax        ; and for get_inode proc
Line 124... Line 124...
124
 
124
 
125
        mov     ebp, [ebx+88]
125
        movzx   ebp, word [ebx+88]
126
        mov     ecx, [ebx+32]
126
        mov     ecx, [ebx+32]
127
        mov     edx, [ebx+40]
127
        mov     edx, [ebx+40]
Line 128... Line 128...
128
        mov     eax, [ebx+20]                           ; first_data_block
128
        mov     eax, [ebx+20]                           ; first_data_block
Line 326... Line 326...
326
            pop     esi
326
            pop     esi
327
        .next_rec:
327
        .next_rec:
328
            movzx   eax, [ebx + EXT2_DIR_STRUC.rec_len]
328
            movzx   eax, [ebx + EXT2_DIR_STRUC.rec_len]
329
            add     ebx, eax                                ;к след. записи
329
            add     ebx, eax                                ;к след. записи
330
            cmp     ebx, edx                                ;проверим конец ли
330
            cmp     ebx, edx                                ;проверим конец ли
331
            jne     .start_rec
331
            jb      .start_rec
332
            jmp     .ret
332
            jmp     .ret
Line 333... Line 333...
333
 
333
 
334
    .test_find:
334
    .test_find:
335
        cmp     byte [esi], 0
335
        cmp     byte [esi], 0
Line 416... Line 416...
416
 
416
 
417
        mov     edi, [EXT2_files_in_folder]     ;edi = число блоков для чтения
417
        mov     edi, [EXT2_files_in_folder]     ;edi = число блоков для чтения
418
        and     [EXT2_read_in_folder], 0
418
        and     [EXT2_read_in_folder], 0
Line 419... Line 419...
419
        and     [EXT2_files_in_folder], 0
419
        and     [EXT2_files_in_folder], 0
420
 
420
 
Line 421... Line 421...
421
        mov     esi, [ebp + EXT2_INODE_STRUC.i_blocks]
421
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]
422
        mov     [EXT2_counter_blocks], esi
422
        mov     [EXT2_counter_blocks], eax
Line 423... Line 423...
423
 
423
 
Line 447... Line 447...
447
            inc     [EXT2_files_in_folder]
447
            inc     [EXT2_files_in_folder]
448
          @@:
448
          @@:
449
            movzx   ebx, [eax+EXT2_DIR_STRUC.rec_len]
449
            movzx   ebx, [eax+EXT2_DIR_STRUC.rec_len]
450
            add     eax, ebx                            ; к следующей записи
450
            add     eax, ebx                            ; к следующей записи
451
            cmp     eax, [EXT2_end_block]              ; проверяем "конец"
451
            cmp     eax, [EXT2_end_block]              ; проверяем "конец"
452
            je      .end_block_find_wanted
452
            jae      .end_block_find_wanted
453
            loop    .find_wanted_cycle
453
            loop    .find_wanted_cycle
454
    .find_wanted_end:
454
    .find_wanted_end:
Line 455... Line 455...
455
 
455
 
456
        mov     ecx, edi
456
        mov     ecx, edi
Line 460... Line 460...
460
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
460
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
461
            jz      .empty_rec
461
            jz      .empty_rec
462
            inc     [EXT2_files_in_folder]
462
            inc     [EXT2_files_in_folder]
463
            inc     [EXT2_read_in_folder]
463
            inc     [EXT2_read_in_folder]
Line -... Line 464...
-
 
464
 
-
 
465
            mov     edi, edx
-
 
466
            push    eax ecx
-
 
467
            xor     eax, eax
-
 
468
            mov     ecx, 40 / 4
-
 
469
            rep     stosd
-
 
470
            pop     ecx eax
464
 
471
 
465
            test    [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR   ;папка или нет
472
            cmp     [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR   ;папка или нет
Line 466... Line 473...
466
            jnz      @F
473
            jz      @F
467
 
474
 
468
            push    eax                                             ;получим размер, если это файл
475
            push    eax                                             ;получим размер, если это файл
469
            mov     eax, [eax + EXT2_DIR_STRUC.inode]
476
            mov     eax, [eax + EXT2_DIR_STRUC.inode]
Line 475... Line 482...
475
            mov     dword [edx+36], ebx
482
            mov     dword [edx+36], ebx
476
            xor     dword [edx], FS_FT_DIR          ; для файлов xor - 2 раза
483
            xor     dword [edx], FS_FT_DIR          ; для файлов xor - 2 раза
477
            pop     eax
484
            pop     eax
478
          @@:
485
          @@:
479
            xor     dword [edx], FS_FT_DIR
486
            xor     dword [edx], FS_FT_DIR
480
            mov     dword [edx+4], FS_FT_ASCII      ; symbol type in name
487
            or      dword [edx+4], FS_FT_ASCII      ; symbol type in name
Line 481... Line 488...
481
 
488
 
482
            push    ecx esi                         ;copy name
489
            push    ecx esi                         ;copy name
483
            movzx   ecx, [eax + EXT2_DIR_STRUC.name_len]
490
            movzx   ecx, [eax + EXT2_DIR_STRUC.name_len]
484
            mov     edi, edx
491
            mov     edi, edx
Line 491... Line 498...
491
            add     edx, 40 + 264                       ; go to next record
498
            add     edx, 40 + 264                       ; go to next record
492
        .empty_rec:
499
        .empty_rec:
493
            movzx   ebx, [eax + EXT2_DIR_STRUC.rec_len]
500
            movzx   ebx, [eax + EXT2_DIR_STRUC.rec_len]
494
            add     eax, ebx
501
            add     eax, ebx
495
            cmp     eax, [EXT2_end_block]
502
            cmp     eax, [EXT2_end_block]
496
            je      .end_block_wanted
503
            jae     .end_block_wanted                   ;по хорошему должно быть =, но ччнш
497
            loop    .wanted_cycle
504
            loop    .wanted_cycle
Line 498... Line 505...
498
 
505
 
499
    .wanted_end:                        ;теперь дойдем до конца чтобы узнать сколько файлов в папке
506
    .wanted_end:                        ;теперь дойдем до конца чтобы узнать сколько файлов в папке
500
        or      ecx, -1                 ;цикл уже есть, просто поставим ему огромный счетчик
507
        or      ecx, -1                 ;цикл уже есть, просто поставим ему огромный счетчик
Line 615... Line 622...
615
        je      .next_block_folder
622
        je      .next_block_folder
Line 616... Line 623...
616
 
623
 
617
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_REG_FILE
624
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_REG_FILE
618
        je      .test_file
625
        je      .test_file
619
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR
626
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR
-
 
627
        jne     .this_is_nofile
620
        jne     .not_found
628
 
621
    .test_dir:
629
    ;.test_dir:
622
        cmp     edi, 0
630
        cmp     edi, 0
Line 623... Line 631...
623
        jne     .this_is_folder
631
        jne     .this_is_nofile
624
 
632
 
625
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
633
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
626
        mov     ebx, [ext2_data.ext2_save_inode]                ;все же папка.
634
        mov     ebx, [ext2_data.ext2_save_inode]                ;все же папка.
Line 640... Line 648...
640
    .not_found:
648
    .not_found:
641
    	pop     edx ecx ebx
649
    	pop     edx ecx ebx
642
        or      ebx, -1
650
        or      ebx, -1
643
        mov     eax, ERROR_FILE_NOT_FOUND
651
        mov     eax, ERROR_FILE_NOT_FOUND
644
        ret
652
        ret
645
    .this_is_folder:
653
    .this_is_nofile:
646
        pop     edx ecx ebx
654
        pop     edx ecx ebx
647
        or      ebx, -1
655
        or      ebx, -1
648
        mov     eax, ERROR_ACCESS_DENIED
656
        mov     eax, ERROR_ACCESS_DENIED
649
    .end_read:
657
    .end_read:
650
        ret
658
        ret
Line 651... Line 659...
651
 
659
 
652
    ;-----------------------------------------------------------------------------final step
660
    ;-----------------------------------------------------------------------------final step
653
    .get_file:
-
 
654
        xchg    bx, bx
661
    .get_file:
Line 655... Line 662...
655
        mov     ebp ,ebx
662
        mov     ebp ,ebx
656
 
663
 
657
        ;pop     eax edi ecx         ; первый_блок память кол-во_байт
664
        ;pop     eax edi ecx         ; первый_блок память кол-во_байт
Line 779... Line 786...
779
        ret
786
        ret
780
    @@:
787
    @@:
781
        xor     eax, eax
788
        xor     eax, eax
782
        ret
789
        ret
783
;========================
790
;========================
-
 
791
;in : esi -> name           not save register
-
 
792
;out: ebp -> inode cf=0
-
 
793
;     ebp -> trash cf=1
-
 
794
ext2_find_lfn:
-
 
795
        mov     ebp, [ext2_data.root_inode]
-
 
796
    .next_folder:
-
 
797
        or      [EXT2_counter_blocks], -1               ;счетчик блоков папки    cur block of inode
-
 
798
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]  ;убывающий счетчик блоков
-
 
799
        add     eax, [ext2_data.count_block_in_block]
-
 
800
        mov     [EXT2_end_block], eax
-
 
801
    .next_block_folder:
-
 
802
        mov     eax, [ext2_data.count_block_in_block]
-
 
803
        sub     [EXT2_end_block], eax
-
 
804
        jz      .not_found
-
 
805
        inc     [EXT2_counter_blocks]
-
 
806
        mov     ecx, [EXT2_counter_blocks]
-
 
807
        call    ext2_get_inode_block
-
 
808
 
-
 
809
        mov     eax, ecx
-
 
810
        mov     ebx, [ext2_data.ext2_save_block]        ;ebx = cur dir record
-
 
811
        call    ext2_get_block
-
 
812
 
-
 
813
        mov     eax, esi
-
 
814
        call    ext2_test_block_by_name
-
 
815
        cmp     eax, esi                                ;нашли имя?
-
 
816
        jz      .next_block_folder
-
 
817
 
-
 
818
        cmp     byte [esi],0
-
 
819
        jz      .get_inode_ret
Line -... Line 820...
-
 
820
 
-
 
821
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR
-
 
822
        jne     .not_found                                      ;нашли, но это не папка
-
 
823
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
-
 
824
        mov     ebx, [ext2_data.ext2_save_inode]                ;все же папка.
-
 
825
        call    ext2_get_inode
-
 
826
        mov     ebp, ebx
-
 
827
        jmp     .next_folder
-
 
828
 
-
 
829
    .not_found:
-
 
830
        stc
-
 
831
        ret
-
 
832
    .get_inode_ret:
-
 
833
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
-
 
834
        mov     ebx, [ext2_data.ext2_save_inode]
-
 
835
        call    ext2_get_inode
-
 
836
        mov     ebp, ebx
-
 
837
    .ret:
-
 
838
        clc
-
 
839
        ret
-
 
840
 
-
 
841
 
784
 
842
;========================
785
ext2_HdRewrite:
843
ext2_HdRewrite:
786
;    xchg    bx, bx
844
;    xchg    bx, bx
787
        xor     ebx, ebx
845
        xor     ebx, ebx
788
        mov     eax, ERROR_UNSUPPORTED_FS
846
        mov     eax, ERROR_UNSUPPORTED_FS
Line 796... Line 854...
796
ext2_HdSetFileEnd:
854
ext2_HdSetFileEnd:
797
;    xchg    bx, bx
855
;    xchg    bx, bx
798
        xor     ebx, ebx
856
        xor     ebx, ebx
799
        mov     eax, ERROR_UNSUPPORTED_FS
857
        mov     eax, ERROR_UNSUPPORTED_FS
800
        ret
858
        ret
-
 
859
 
801
ext2_HdGetFileInfo:
860
ext2_HdGetFileInfo:
-
 
861
        cmp     byte [esi], 0
802
;    xchg    bx, bx
862
        jz      .doit
-
 
863
 
-
 
864
        call    ext2_find_lfn
803
        xor     ebx, ebx
865
        jnc     .doit2
-
 
866
    ;.not_found:
804
        mov     eax, ERROR_UNSUPPORTED_FS
867
        mov     eax, ERROR_FILE_NOT_FOUND
805
        ret
868
        ret
-
 
869
 
-
 
870
    .doit:
-
 
871
        mov     ebp, [ext2_data.root_inode]
-
 
872
    .doit2:
-
 
873
        xor     eax, eax
-
 
874
        mov     edi, edx
-
 
875
        mov     ecx, 40/4
-
 
876
        rep stosd               ; fill zero
-
 
877
 
-
 
878
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
-
 
879
        jz      @F
-
 
880
        or      dword [edx], FS_FT_DIR
-
 
881
    @@:
-
 
882
        mov     byte [edx+1], FS_FT_ASCII
-
 
883
        mov     eax, [ebp + EXT2_INODE_STRUC.i_size]            ;low size
-
 
884
        mov     ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl]         ;high size
-
 
885
        mov     dword [edx+32], eax
-
 
886
        mov     dword [edx+36], ebx
-
 
887
 
-
 
888
        xor     eax, eax
-
 
889
        ret
-
 
890
 
806
ext2_HdSetFileInfo:
891
ext2_HdSetFileInfo:
807
;    xchg    bx, bx
892
;    xchg    bx, bx
808
        xor     ebx, ebx
893
        xor     ebx, ebx
809
        mov     eax, ERROR_UNSUPPORTED_FS
894
        mov     eax, ERROR_UNSUPPORTED_FS
810
        ret
895
        ret