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 |