Subversion Repositories Kolibri OS

Rev

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

Rev 2987 Rev 3500
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: 2987 $
11
$Revision: 3500 $
12
 
12
 
13
EXT2_BAD_INO        = 1
13
EXT2_BAD_INO         = 1
14
EXT2_ROOT_INO        = 2
14
EXT2_ROOT_INO        = 2
Line 448... Line 448...
448
        push    ebx
448
        push    ebx
449
        mov     eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4]
449
        mov     eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4]
450
        mov     ebx, [ext2_data.ext2_temp_block]
450
        mov     ebx, [ext2_data.ext2_temp_block]
451
        call    ext2_get_block
451
        call    ext2_get_block
452
        test    eax, eax
452
        test    eax, eax
453
        jz      @F                      ;если не было ошибки
453
        jnz     @F                      ;если не было ошибки
Line 454... Line 454...
454
 
454
 
455
        mov     ecx, [ebx + ecx*4]    ;заносим результат
455
        mov     ecx, [ebx + ecx*4]    ;заносим результат
456
    @@:
456
    @@:
457
        pop     ebx
457
        pop     ebx
Line 563... Line 563...
563
        shr     ecx, 2
563
        shr     ecx, 2
564
        mov     ebp, edi
564
        mov     ebp, edi
565
        rep movsd
565
        rep movsd
566
        pop     ecx
566
        pop     ecx
567
    @@:
567
    @@:
568
        cmp     [ebp + EXT2_INODE_STRUC.i_blocks], 0 ;папка пуста
568
        cmp     [ebp + EXT2_INODE_STRUC.i_size], 0 ;папка пуста
569
        je      .error_empty_dir
569
        je      .error_empty_dir
Line 570... Line 570...
570
        
570
        
571
        push    edx      ;адрес результата              [edi + 28]
571
        push    edx      ;адрес результата              [edi + 28]
572
        push    0        ;конец очередного блока папки   [edi + 24]
572
        push    0        ;конец очередного блока папки   [edi + 24]
Line 614... Line 614...
614
        cmp     ebx, 12                                 ; минимальная длина записи
614
        cmp     ebx, 12                                 ; минимальная длина записи
615
        jb      .error_bad_len
615
        jb      .error_bad_len
616
        test    ebx, 0x3                                ; длина записи должна делиться на 4
616
        test    ebx, 0x3                                ; длина записи должна делиться на 4
617
        jnz     .error_bad_len
617
        jnz     .error_bad_len
Line -... Line 618...
-
 
618
 
618
 
619
        sub     [ebp + EXT2_INODE_STRUC.i_size], ebx    ;вычитаем напрямую из структуры inode
619
        add     esi, ebx                                ; к следующей записи
620
        add     esi, ebx                                ; к следующей записи
620
        cmp     esi, [edi + 24]                        ; сравниваем с концом блока
621
        cmp     esi, [edi + 24]                        ; сравниваем с концом блока
Line 621... Line 622...
621
        jb      .find_wanted_start
622
        jb      .find_wanted_start
622
 
623
 
623
        push    .find_wanted_start
624
        push    .find_wanted_start
624
   .end_block:                                              ;вылетели из цикла
-
 
625
        mov     ebx, [ext2_data.count_block_in_block]
625
   .end_block:                                              ;вылетели из цикла
Line 626... Line 626...
626
        sub     [ebp + EXT2_INODE_STRUC.i_blocks], ebx  ;вычитаем напрямую из структуры inode
626
        cmp     [ebp + EXT2_INODE_STRUC.i_size], 0
627
        jle     .end_dir
627
        jle     .end_dir
628
 
628
 
Line 725... Line 725...
725
        cmp     ebx, 12                                 ; минимальная длина записи
725
        cmp     ebx, 12                                 ; минимальная длина записи
726
        jb      .error_bad_len
726
        jb      .error_bad_len
727
        test    ebx, 0x3                                ; длина записи должна делиться на 4
727
        test    ebx, 0x3                                ; длина записи должна делиться на 4
728
        jnz     .error_bad_len
728
        jnz     .error_bad_len
Line -... Line 729...
-
 
729
 
729
 
730
        sub     [ebp + EXT2_INODE_STRUC.i_size], ebx    ;вычитаем напрямую из структуры inode
730
        add     esi, ebx
731
        add     esi, ebx
731
        cmp     esi, [edi + 24]                         ;дошли ли до конца блока?
732
        cmp     esi, [edi + 24]                         ;дошли ли до конца блока?
Line 732... Line 733...
732
        jb      .wanted_start
733
        jb      .wanted_start
Line 893... Line 894...
893
        jb      .size_great_less
894
        jb      .size_great_less
894
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
895
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
895
        jae     .size_great_great
896
        jae     .size_great_great
Line 896... Line 897...
896
 
897
 
897
    .size_great_less:
-
 
898
        push    1
898
    .size_great_less:
899
;        or      [EXT2_files_in_folder], 1       ;читаем по границе размера
899
        push    1                                ;читаем по границе размера
900
        mov     ecx, [ebp + EXT2_INODE_STRUC.i_size]
900
        mov     ecx, [ebp + EXT2_INODE_STRUC.i_size]
901
        sub     ecx, [esi]                      ;(размер - старт) = сколько читать
901
        sub     ecx, [esi]                      ;(размер - старт) = сколько читать
Line 902... Line 902...
902
        jmp     @F
902
        jmp     @F
903
 
-
 
904
    .size_great_great:
903
 
Line 905... Line 904...
905
        push    0
904
    .size_great_great:
906
;        and     [EXT2_files_in_folder], 0       ;читаем столько сколько запросили
905
        push    0                                ;читаем столько сколько запросили
907
 
906
 
908
    @@:
907
    @@:
Line 917... Line 916...
917
        ;получим кусок из первого блока
916
        ;получим кусок из первого блока
918
        mov     edx, [esi+4]
917
        mov     edx, [esi+4]
919
        mov     eax, [esi]
918
        mov     eax, [esi]
920
        div     [ext2_data.block_size]
919
        div     [ext2_data.block_size]
Line 921... Line 920...
921
 
920
 
Line 922... Line 921...
922
        push    eax       ;номер блока запоминаем
921
        push    eax       ;счетчик блоков ложим в стек
923
 
922
        
924
        push    ecx
923
        push    ecx
925
        mov     ecx, eax
924
        mov     ecx, eax
Line 947... Line 946...
947
        rep movsb                               ;кусок 1-го блока
946
        rep movsb                               ;кусок 1-го блока
948
        jmp     .calc_blocks_count
947
        jmp     .calc_blocks_count
Line 949... Line 948...
949
 
948
 
950
    .zero_start:
949
    .zero_start:
951
        mov     eax, ecx
950
        mov     eax, ecx
952
        push    0                               ;счетчик блоков
951
        push    0                               ;счетчик блоков ложим в стек
953
        ;теперь в eax кол-во оставшихся байт для чтения
952
        ;теперь в eax кол-во оставшихся байт для чтения
954
    .calc_blocks_count:
953
    .calc_blocks_count:
955
        mov     ebx, edi                        ;чтение блока прям в ->ebx
954
        mov     ebx, edi                        ;чтение блока прям в ->ebx
956
        xor     edx, edx
955
        xor     edx, edx
Line 980... Line 979...
980
 
979
 
981
        pop     ecx         ;счетчик блоков -> ecx
980
        pop     ecx         ;счетчик блоков -> ecx
982
        inc     ecx
981
        inc     ecx
983
        call    ext2_get_inode_block
982
        call    ext2_get_inode_block
984
        test    eax, eax
983
        test    eax, eax
Line 985... Line 984...
985
        jz      .error_at_finish_block
984
        jnz     .error_at_finish_block
986
 
985
 
987
        mov     edi, ebx
986
        mov     edi, ebx
988
        mov     eax, ecx
987
        mov     eax, ecx
Line 992... Line 991...
992
        jnz     .error_at_finish_block
991
        jnz     .error_at_finish_block
Line 993... Line 992...
993
 
992
 
994
        mov     ecx, edx
993
        mov     ecx, edx 
995
        mov     esi, ebx
994
        mov     esi, ebx
-
 
995
        rep movsb                               ;кусок last блока
-
 
996
        jmp     @F
996
        rep movsb                               ;кусок last блока
997
 
-
 
998
    .end_read:
997
    .end_read:
999
        pop     ecx                             ;счетчик блоков, который хранился в стеке
998
        pop     ebx
1000
    @@:
-
 
1001
        pop     ebx                             ;количество считанных байт
999
        pop     eax
1002
        pop     eax                             ; 1 или 0 - достигли ли конца файла
1000
        test    eax, eax
1003
        test    eax, eax
Line 1001... Line 1004...
1001
        jz      @F
1004
        jz      @F
1002
 
1005
 
Line 1007... Line 1010...
1007
        ret
1010
        ret
Line 1008... Line 1011...
1008
        
1011
        
1009
    .only_one_block:
1012
    .only_one_block:
1010
        mov     esi, ebx
1013
        mov     esi, ebx
1011
        rep movsb                               ;кусок last блока
-
 
1012
        pop     eax
1014
        rep movsb                               ;кусок last блока
Line 1013... Line 1015...
1013
        jmp     .end_read
1015
        jmp     .end_read
1014
        
1016
        
1015
   .error_at_first_block:
1017
   .error_at_first_block:
Line 1092... Line 1094...
1092
        
1094
        
1093
    .next_path_part:
1095
    .next_path_part:
1094
        push    [ebp + EXT2_INODE_STRUC.i_blocks]
1096
        push    [ebp + EXT2_INODE_STRUC.i_blocks]
1095
        xor     ecx, ecx
1097
        xor     ecx, ecx
-
 
1098
    .folder_block_cycle:
1096
    .folder_block_cycle:
1099
        push    ecx
1097
        call    ext2_get_inode_block
1100
        call    ext2_get_inode_block
1098
        test    eax, eax
1101
        test    eax, eax
Line 1099... Line 1102...
1099
        jnz     .error_get_inode_block
1102
        jnz     .error_get_inode_block
Line 1104... Line 1107...
1104
        test    eax, eax
1107
        test    eax, eax
1105
        jnz     .error_get_block
1108
        jnz     .error_get_block
Line 1106... Line 1109...
1106
 
1109
        
1107
        push    esi
1110
        push    esi
1108
        call    ext2_test_block_by_name
1111
        call    ext2_test_block_by_name
Line 1109... Line 1112...
1109
        pop     edi
1112
        pop     edi ecx
1110
 
1113
 
Line 1111... Line 1114...
1111
        cmp     edi, esi                                ;нашли имя?
1114
        cmp     edi, esi                                ;нашли имя?
Line 1130... Line 1133...
1130
        ;к следующему блоку в текущей папке
1133
        ;к следующему блоку в текущей папке
1131
        pop     eax                                     ;счетчик блоков
1134
        pop     eax                                     ;счетчик блоков
1132
        sub     eax, [ext2_data.count_block_in_block]
1135
        sub     eax, [ext2_data.count_block_in_block]
1133
        jle     .not_found
1136
        jle     .not_found
Line -... Line 1137...
-
 
1137
        
1134
        
1138
        push    eax
1135
        inc     ecx
1139
        inc     ecx
Line 1136... Line 1140...
1136
        jmp     .folder_block_cycle
1140
        jmp     .folder_block_cycle
1137
 
-
 
1138
    .not_found:
1141
 
1139
        pop     ebx
1142
    .not_found:
Line 1140... Line 1143...
1140
        mov     eax, ERROR_FILE_NOT_FOUND
1143
        mov     eax, ERROR_FILE_NOT_FOUND
1141
        ret
1144
        ret
Line 1150... Line 1153...
1150
        xor     eax, eax
1153
        xor     eax, eax
1151
        ret
1154
        ret
Line 1152... Line 1155...
1152
 
1155
 
1153
    .error_get_inode_block:
1156
    .error_get_inode_block:
-
 
1157
    .error_get_block:
1154
    .error_get_block:
1158
        pop     ecx
1155
    .error_get_inode:
1159
    .error_get_inode:
1156
        pop     ebx
1160
        pop     ebx
1157
    .error_empty_root:
1161
    .error_empty_root:
1158
        mov     eax, ERROR_FS_FAIL
1162
        mov     eax, ERROR_FS_FAIL