Rev 3500 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3500 | Rev 3725 | ||
---|---|---|---|
Line 2... | Line 2... | ||
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; 02.02.2010 turbanoff - support 70.5 ;; |
5 | ;; 02.02.2010 turbanoff - support 70.5 ;; |
6 | ;; 23.01.2010 turbanoff - support 70.0 70.1 ;; |
6 | ;; 23.01.2010 turbanoff - support 70.0 70.1 ;; |
7 | ;; ;; |
7 | ;; 21.06.2013 yogev_ezra - Translate Russian comments ;; |
8 | ;; ;; |
8 | ;; ;; |
9 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
9 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 10... | Line 10... | ||
10 | 10 | ||
Line 11... | Line 11... | ||
11 | $Revision: 3500 $ |
11 | $Revision: 3725 $ |
12 | 12 | ||
13 | EXT2_BAD_INO = 1 |
13 | EXT2_BAD_INO = 1 |
14 | EXT2_ROOT_INO = 2 |
14 | EXT2_ROOT_INO = 2 |
15 | EXT2_ACL_IDX_INO = 3 |
15 | EXT2_ACL_IDX_INO = 3 |
16 | EXT2_ACL_DATA_INO = 4 |
16 | EXT2_ACL_DATA_INO = 4 |
Line 17... | Line 17... | ||
17 | EXT2_BOOT_LOADER_INO = 5 |
17 | EXT2_BOOT_LOADER_INO = 5 |
18 | EXT2_UNDEL_DIR_INO = 6 |
18 | EXT2_UNDEL_DIR_INO = 6 |
19 | 19 | ||
20 | ;флаги, указываемый в inode файла |
20 | ;RUS: флаги, указываемые в inode файла ;ENG: flags specified in file inode |
Line 21... | Line 21... | ||
21 | EXT2_S_IFREG = 0x8000 |
21 | EXT2_S_IFREG = 0x8000 |
- | 22 | EXT2_S_IFDIR = 0x4000 |
|
22 | EXT2_S_IFDIR = 0x4000 |
23 | EXT2_S_IFMT = 0xF000 ;RUS: маска для типа файла ;ENG: mask for file type |
- | 24 | ||
23 | EXT2_S_IFMT = 0xF000 ;маска для типа файла |
25 | ;RUS: флаги, указываемые в linked list родительской папки |
Line 24... | Line 26... | ||
24 | 26 | ;ENG: flags specified in linked list of parent folder |
|
25 | ;флаги, указываемые в linked list родительской папки |
27 | EXT2_FT_REG_FILE = 1 ;RUS: это файл, запись в родительском каталоге |
26 | EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге |
28 | ;ENG: this is a file, record in parent catalog |
27 | EXT2_FT_DIR = 2 ;это папка |
29 | EXT2_FT_DIR = 2 ;RUS: это папка ;ENG: this is a folder |
28 | 30 | ||
29 | ;флаги используемые KolibriOS |
31 | ;RUS: флаги используемые KolibriOS ;ENG: flags used by KolibriOS |
30 | FS_FT_HIDDEN = 2 |
32 | FS_FT_HIDDEN = 2 |
- | 33 | FS_FT_DIR = 0x10 ;RUS: это папка ;ENG: this is a folder |
|
31 | FS_FT_DIR = 0x10 ;это папка |
34 | FS_FT_ASCII = 0 ;RUS: имя в ascii ;ENG: name in ASCII |
32 | FS_FT_ASCII = 0 ;имя в ascii |
35 | FS_FT_UNICODE = 1 ;RUS: имя в unicode ;ENG: name in UNICODE |
- | 36 | ||
33 | FS_FT_UNICODE = 1 ;имя в unicode |
37 | EXT2_FEATURE_INCOMPAT_FILETYPE = 0x0002 ;RUS: тип файла должен указываться в директории |
34 | 38 | ;ENG: file type must be specified in the folder |
|
35 | EXT2_FEATURE_INCOMPAT_FILETYPE = 0x0002 ;тип файла должен указываться в директории |
39 | EXT4_FEATURE_INCOMPAT_EXTENTS = 0x0040 ;RUS: экстенты ;ENG: extents |
36 | EXT4_FEATURE_INCOMPAT_EXTENTS = 0x0040 ;экстенты |
40 | EXT4_FEATURE_INCOMPAT_FLEX_BG = 0x0200 ;RUS: гибкие группы блоков ;ENG: flexible block groups |
Line 37... | Line -... | ||
37 | EXT4_FEATURE_INCOMPAT_FLEX_BG = 0x0200 ;гибкие группы блоков |
- | |
38 | ;реализованные ext[234] features |
41 | |
39 | EXT4_FEATURE_INCOMPAT_SUPP = EXT2_FEATURE_INCOMPAT_FILETYPE \ |
42 | ;RUS: реализованные ext[234] features ;ENG: implemented ext[234] features |
Line 40... | Line 43... | ||
40 | or EXT4_FEATURE_INCOMPAT_EXTENTS \ |
43 | EXT4_FEATURE_INCOMPAT_SUPP = EXT2_FEATURE_INCOMPAT_FILETYPE \ |
41 | or EXT4_FEATURE_INCOMPAT_FLEX_BG |
44 | or EXT4_FEATURE_INCOMPAT_EXTENTS \ |
42 | 45 | or EXT4_FEATURE_INCOMPAT_FLEX_BG |
|
Line 145... | Line 148... | ||
145 | mmp_block dq ? ;+360 |
148 | mmp_block dq ? ;+360 |
146 | raid_stripe_width dd ? ;+368 |
149 | raid_stripe_width dd ? ;+368 |
147 | log_groups_per_flex db ? ;+372 |
150 | log_groups_per_flex db ? ;+372 |
148 | ends |
151 | ends |
Line 149... | Line 152... | ||
149 | 152 | ||
150 | struct EXT4_EXTENT_HEADER ;заголовок блока экстентов/индексов |
153 | struct EXT4_EXTENT_HEADER ;RUS: заголовок блока экстентов/индексов |
151 | eh_magic dw ? ;в текущей реализации ext4 должно быть 0xF30A |
154 | eh_magic dw ? ;RUS: в текущей реализации ext4 должно быть 0xF30A |
152 | eh_entries dw ? ;количество экстентов/индексов в блоке |
155 | eh_entries dw ? ;RUS: количество экстентов/индексов в блоке |
153 | eh_max dw ? ;max количество (используется при записи) |
156 | eh_max dw ? ;RUS: max количество (используется при записи) |
154 | eh_depth dw ? ;глубина дерева (0, если это блок экстентов) |
157 | eh_depth dw ? ;RUS: глубина дерева (0, если это блок экстентов) |
155 | eh_generation dd ? ;??? |
158 | eh_generation dd ? ;??? |
Line 156... | Line 159... | ||
156 | ends |
159 | ends |
157 | 160 | ||
158 | struct EXT4_EXTENT ;экстент |
161 | struct EXT4_EXTENT ;RUS: экстент ;ENG: extent |
159 | ee_block dd ? ;номер ext4 блока |
162 | ee_block dd ? ;RUS: номер ext4 блока ;ENG: number of ext4 block |
- | 163 | ee_len dw ? ;RUS: длина экстента ;ENG: extent length |
|
160 | ee_len dw ? ;длина экстента |
164 | ee_start_hi dw ? ;RUS: старшие 16 бит 48-битного адреса (пока не используются в KOS) |
- | 165 | ;ENG: upper 16 bits of the 48-bit address (not used in KolibriOS yet) |
|
161 | ee_start_hi dw ? ;старшие 16 бит 48-битного адреса (пока не используются в KOS) |
166 | ee_start_lo dd ? ;RUS: младшие 32 бита 48-битного адреса |
Line 162... | Line 167... | ||
162 | ee_start_lo dd ? ;младшие 32 бита 48-битного адреса |
167 | ;ENG: lower 32 bits of the 48-bit address |
- | 168 | ends |
|
163 | ends |
169 | |
164 | 170 | struct EXT4_EXTENT_IDX ;RUS: индекс - указатель на блок с экстентами/индексами |
|
- | 171 | ;ENG: index - pointer to block of extents/indexes |
|
165 | struct EXT4_EXTENT_IDX ;индес - указатель на блок с экстентами/индексами |
172 | ei_block dd ? ;RUS: номер ext4 блока ;ENG: number of ext4 block |
- | 173 | ei_leaf_lo dd ? ;RUS: младшие 32 бит 48-битного адреса |
|
166 | ei_block dd ? ;номер ext4 блока |
174 | ;ENG: lower 32 bits of the 48-bit address |
167 | ei_leaf_lo dd ? ;младшие 32 бит 48-битного адреса |
175 | ei_leaf_hi dw ? ;RUS: старшие 16 бит 48-битного адреса (пока не используются в KOS) |
Line 168... | Line 176... | ||
168 | ei_leaf_hi dw ? ;старшие 16 бит 48-битного адреса (пока не используются в KOS) |
176 | ;ENG: upper 16 bits of the 48-bit address (not used in KolibriOS yet) |
169 | ei_unused dw ? ;зарезервировано |
177 | ei_unused dw ? ;RUS: зарезервировано ;ENG: reserved |
170 | ends |
178 | ends |
Line 228... | Line 236... | ||
228 | shl eax, cl |
236 | shl eax, cl |
229 | mov [ext2_data.count_block_in_block], eax |
237 | mov [ext2_data.count_block_in_block], eax |
Line 230... | Line 238... | ||
230 | 238 | ||
231 | shl eax, 7 |
239 | shl eax, 7 |
232 | mov [ext2_data.count_pointer_in_block], eax |
240 | mov [ext2_data.count_pointer_in_block], eax |
Line 233... | Line 241... | ||
233 | mov edx, eax ; потом еще квадрат найдем |
241 | mov edx, eax ;RUS: потом еще квадрат найдем ;ENG: we'll find a square later |
234 | 242 | ||
Line 235... | Line 243... | ||
235 | shl eax, 2 |
243 | shl eax, 2 |
Line 292... | Line 300... | ||
292 | mov eax, ERROR_DEVICE |
300 | mov eax, ERROR_DEVICE |
293 | jmp @B |
301 | jmp @B |
Line 294... | Line 302... | ||
294 | 302 | ||
295 | 303 | ||
296 | ;=================================================================== |
304 | ;=================================================================== |
297 | ;получает номер блока из extent inode |
305 | ;RUS: получает номер блока из extent inode ;ENG: receives block number from extent inode |
298 | ;in: ecx = номер блока по порядку |
306 | ;RUS: in: ecx = номер блока по порядку ;ENG: in: ecx = consecutive block number |
299 | ; ebp = адрес extent header`а |
307 | ;RUS: ebp = адрес extent header`а ;ENG: ebp = address of extent header |
300 | ;out: ecx - адрес очередного блока в случае успеха |
308 | ;RUS: out: ecx - адрес очередного блока в случае успеха ;ENG: out: ecx - address of next block, if successful |
301 | ; eax - номер ошибки (если равно 0, то ошибки нет) |
309 | ;RUS: eax - номер ошибки (если равно 0, то ошибки нет) ;ENG: eax - error number (0 - no error) |
302 | ext4_block_recursive_search: |
310 | ext4_block_recursive_search: |
Line 303... | Line 311... | ||
303 | cmp word [ebp + EXT4_EXTENT_HEADER.eh_magic], 0xF30A ;EXT4_EXT_MAGIC |
311 | cmp word [ebp + EXT4_EXTENT_HEADER.eh_magic], 0xF30A ;EXT4_EXT_MAGIC |
Line 367... | Line 375... | ||
367 | mov eax, ERROR_FS_FAIL |
375 | mov eax, ERROR_FS_FAIL |
368 | ret |
376 | ret |
Line 369... | Line 377... | ||
369 | 377 | ||
370 | ;=================================================================== |
378 | ;=================================================================== |
371 | ;получает адрес ext2 блока из inode с определнным номером |
379 | ;получает адрес ext2 блока из inode с определнным номером |
372 | ;in: ecx = номер блока в inode (0..) |
380 | ;RUS: in: ecx = номер блока в inode (0..) ;ENG: in: ecx = number of block in inode (0..) |
373 | ; ebp = адрес inode |
381 | ;RUS: ebp = адрес inode ;ENG: ebp = inode address |
374 | ;out: ecx = адрес очередного блока |
382 | ;RUS: out: ecx = адрес очередного блока ;ENG: out: ecx = next block address |
375 | ; eax - error code |
383 | ;RUS: eax - error code ;ENG: eax - error code |
376 | ext2_get_inode_block: |
384 | ext2_get_inode_block: |
377 | test [ebp + EXT2_INODE_STRUC.i_flags], EXT2_EXTENTS_FL |
385 | test [ebp + EXT2_INODE_STRUC.i_flags], EXT2_EXTENTS_FL |
Line 378... | Line 386... | ||
378 | jz @F |
386 | jz @F |
Line 409... | Line 417... | ||
409 | 417 | ||
410 | xor edx, edx |
418 | xor edx, edx |
411 | mov eax, ecx |
419 | mov eax, ecx |
Line 412... | Line 420... | ||
412 | div [ext2_data.count_pointer_in_block_square] |
420 | div [ext2_data.count_pointer_in_block_square] |
- | 421 | ||
413 | 422 | ;RUS: eax - номер в полученном блоке edx - номер дальше |
|
414 | ;eax - номер в полученном блоке edx - номер дальше |
423 | ;ENG: eax - current block number, edx - next block number |
415 | mov eax, [ebx + eax*4] |
424 | mov eax, [ebx + eax*4] |
416 | call ext2_get_block |
425 | call ext2_get_block |
Line 448... | Line 457... | ||
448 | push ebx |
457 | push ebx |
449 | mov eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4] |
458 | mov eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4] |
450 | mov ebx, [ext2_data.ext2_temp_block] |
459 | mov ebx, [ext2_data.ext2_temp_block] |
451 | call ext2_get_block |
460 | call ext2_get_block |
452 | test eax, eax |
461 | test eax, eax |
453 | jnz @F ;если не было ошибки |
462 | jnz @F ;RUS: если не было ошибки ;ENG: if there was no error |
Line 454... | Line 463... | ||
454 | 463 | ||
455 | mov ecx, [ebx + ecx*4] ;заносим результат |
464 | mov ecx, [ebx + ecx*4] ;RUS: заносим результат ;ENG: ??? |
456 | @@: |
465 | @@: |
457 | pop ebx |
466 | pop ebx |
Line 458... | Line 467... | ||
458 | ret |
467 | ret |
Line 479... | Line 488... | ||
479 | push edx ;locale num in group |
488 | push edx ;locale num in group |
Line 480... | Line 489... | ||
480 | 489 | ||
481 | mov edx, 32 |
490 | mov edx, 32 |
Line 482... | Line 491... | ||
482 | mul edx ; address block_group in global_desc_table |
491 | mul edx ; address block_group in global_desc_table |
483 | 492 | ||
- | 493 | ;RUS: в eax - смещение группы с inode-ом относительно начала глобальной дескрипторной таблицы |
|
- | 494 | ;RUS: найдем блок в котором он находится |
|
484 | ; в eax - смещение группы с inode-ом относительно начала глобальной дескрипторной таблицы |
495 | ;ENG: in eax - inode group offset relative to global descriptor table start |
485 | ; найдем блок в котором он находится |
496 | ;ENG: let's find the block this inode is in |
486 | div [ext2_data.block_size] |
497 | div [ext2_data.block_size] |
487 | add eax, [ecx + EXT2_SB_STRUC.first_data_block] |
498 | add eax, [ecx + EXT2_SB_STRUC.first_data_block] |
488 | inc eax |
499 | inc eax |
489 | mov ebx, [ext2_data.ext2_temp_block] |
500 | mov ebx, [ext2_data.ext2_temp_block] |
490 | call ext2_get_block |
501 | call ext2_get_block |
Line 491... | Line 502... | ||
491 | test eax, eax |
502 | test eax, eax |
492 | jnz .fail |
503 | jnz .fail |
493 | - | ||
- | 504 | ||
494 | add ebx, edx ; локальный номер в блоке |
505 | add ebx, edx ;RUS: локальный номер в блоке ;ENG: local number inside block |
495 | mov eax, [ebx + EXT2_BLOCK_GROUP_DESC.inode_table]; номер блока - в терминах ext2 |
506 | mov eax, [ebx + EXT2_BLOCK_GROUP_DESC.inode_table] ;RUS: номер блока - в терминах ext2 |
496 | 507 | ;ENG: block number - in ext2 terms |
|
497 | mov ecx, [ext2_data.log_block_size] |
- | |
- | 508 | mov ecx, [ext2_data.log_block_size] |
|
498 | shl eax, cl |
509 | shl eax, cl |
499 | add eax, [PARTITION_START] ; а старт раздела - в терминах hdd (512) |
510 | add eax, [PARTITION_START] ;RUS: а старт раздела - в терминах hdd (512) |
Line 500... | Line 511... | ||
500 | 511 | ;ENG: partition start - in HDD terms (512) |
|
501 | ;eax - указывает на таблицу inode-ов на hdd |
512 | ;RUS: eax - указывает на таблицу inode-ов на hdd ;ENG: eax - points to inode table on HDD |
502 | mov esi, eax ;сохраним его пока в esi |
513 | mov esi, eax ;RUS: сохраним его пока в esi ;ENG: let's save it in esi for now |
503 | 514 | ||
504 | ; прибавим локальный адрес inode-а |
515 | ;RUS: прибавим локальный адрес inode-а ;ENG: add local address of inode |
505 | pop eax ; index |
516 | pop eax ; index |
Line 506... | Line 517... | ||
506 | mov ecx, [ext2_data.inode_size] |
517 | mov ecx, [ext2_data.inode_size] |
507 | mul ecx ; (index * inode_size) |
518 | mul ecx ; (index * inode_size) |
508 | mov ebp, 512 |
519 | mov ebp, 512 |
509 | div ebp ;поделим на размер блока |
520 | div ebp ;RUS: поделим на размер блока ;ENG: divide by block size |
510 | 521 | ||
Line 511... | Line 522... | ||
511 | add eax, esi ;нашли адрес блока для чтения |
522 | add eax, esi ;RUS: нашли адрес блока для чтения ;ENG: found block address to read |
512 | mov ebx, [ext2_data.ext2_temp_block] |
523 | mov ebx, [ext2_data.ext2_temp_block] |
513 | call hd_read |
524 | call hd_read |
514 | cmp [hd_error], 0 |
525 | cmp [hd_error], 0 |
515 | jnz .fail |
526 | jnz .fail |
516 | 527 | ||
517 | mov esi, edx ;добавим "остаток" |
528 | mov esi, edx ;RUS: добавим "остаток" ;ENG: add the "remainder" |
518 | add esi, ebx ;к адресу |
529 | add esi, ebx ;RUS: к адресу ;ENG: to the address |
Line 743... | Line 754... | ||
743 | mov [edx + 4], ebx |
754 | mov [edx + 4], ebx |
744 | mov [edx + 8], ecx |
755 | mov [edx + 8], ecx |
Line 745... | Line 756... | ||
745 | 756 | ||
Line 746... | Line 757... | ||
746 | lea esp, [edi + 32] |
757 | lea esp, [edi + 32] |
- | 758 | ||
747 | 759 | xor eax, eax ;RUS: зарезервировано: нули в текущей реализации |
|
748 | xor eax, eax ;зарезервировано: нули в текущей реализации |
760 | ;ENG: reserved: zeros in current implementation |
749 | lea edi, [edx + 12] |
761 | lea edi, [edx + 12] |
750 | mov ecx, 20 / 4 |
762 | mov ecx, 20 / 4 |
Line 758... | Line 770... | ||
758 | lea esp, [edi + 32] |
770 | lea esp, [edi + 32] |
759 | .error_ret: |
771 | .error_ret: |
760 | or ebx, -1 |
772 | or ebx, -1 |
761 | ret |
773 | ret |
Line 762... | Line 774... | ||
762 | 774 | ||
763 | .error_empty_dir: ;inode папки без блоков |
775 | .error_empty_dir: ;RUS: inode папки без блоков ;ENG: inode of folder without blocks |
764 | .error_root: ;root - не папка |
776 | .error_root: ;RUS: root - не папка ;ENG: root is not a folder |
765 | mov eax, ERROR_FS_FAIL |
777 | mov eax, ERROR_FS_FAIL |
Line 766... | Line 778... | ||
766 | jmp .error_ret |
778 | jmp .error_ret |
767 | 779 | ||
768 | .error_not_found: ;файл не найден |
780 | .error_not_found: ;RUS: файл не найден ;ENG: file not found |
Line 769... | Line 781... | ||
769 | mov eax, ERROR_FILE_NOT_FOUND |
781 | mov eax, ERROR_FILE_NOT_FOUND |
770 | jmp .error_ret |
782 | jmp .error_ret |
Line 865... | Line 877... | ||
865 | 877 | ||
866 | test ebx, ebx |
878 | test ebx, ebx |
867 | jz @F |
879 | jz @F |
868 | mov esi, ebx ; esi = pointer to first_wanted |
880 | mov esi, ebx ; esi = pointer to first_wanted |
869 | mov ebx, [esi+4] |
881 | mov ebx, [esi+4] |
Line 870... | Line 882... | ||
870 | mov eax, [esi] ; ebx : eax - стартовый номер байта |
882 | mov eax, [esi] ;RUS: ebx : eax - стартовый номер байта ;ENG: ebx : eax - start byte number |
871 | 883 | ||
872 | ;///// сравним хватит ли нам файла или нет |
884 | ;RUS: ///// сравним хватит ли нам файла или нет ;ENG: ///// check if file is big enough for us |
873 | cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx |
885 | cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx |
Line 874... | Line 886... | ||
874 | ja .size_great |
886 | ja .size_great |
Line 884... | Line 896... | ||
884 | 896 | ||
885 | @@: |
897 | @@: |
886 | xor ebx, ebx |
898 | xor ebx, ebx |
887 | xor eax, eax |
899 | xor eax, eax |
888 | .size_great: |
900 | .size_great: |
- | 901 | add eax, ecx ;RUS: add to first_wanted кол-во байт для чтения |
|
889 | add eax, ecx ;add to first_wanted кол-во байт для чтения |
902 | ;ENG: add to first_wanted number of bytes to read |
Line 890... | Line 903... | ||
890 | adc ebx, 0 |
903 | adc ebx, 0 |
891 | 904 | ||
892 | cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx |
905 | cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx |
893 | ja .size_great_great |
906 | ja .size_great_great |
894 | jb .size_great_less |
907 | jb .size_great_less |
Line 895... | Line 908... | ||
895 | cmp [ebp + EXT2_INODE_STRUC.i_size], eax |
908 | cmp [ebp + EXT2_INODE_STRUC.i_size], eax |
896 | jae .size_great_great |
909 | jae .size_great_great ; and if it's equal, no matter where we jump |
897 | 910 | ||
898 | .size_great_less: |
911 | .size_great_less: |
899 | push 1 ;читаем по границе размера |
912 | push 1 ;RUS: читаем по границе размера ;ENG: reading till the end of file |
Line 900... | Line 913... | ||
900 | mov ecx, [ebp + EXT2_INODE_STRUC.i_size] |
913 | mov ecx, [ebp + EXT2_INODE_STRUC.i_size] |
901 | sub ecx, [esi] ;(размер - старт) = сколько читать |
914 | sub ecx, [esi] ;RUS: (размер - старт) = сколько читать ;ENG: to read = (size - start) |
Line 902... | Line 915... | ||
902 | jmp @F |
915 | jmp @F |
903 | 916 | ||
904 | .size_great_great: |
917 | .size_great_great: |
905 | push 0 ;читаем столько сколько запросили |
918 | push 0 ;RUS: читаем столько, сколько запросили ;ENG: reading as much as requested |
Line 932... | Line 945... | ||
932 | jnz .error_at_first_block |
945 | jnz .error_at_first_block |
933 | pop ecx |
946 | pop ecx |
934 | add ebx, edx |
947 | add ebx, edx |
Line 935... | Line 948... | ||
935 | 948 | ||
936 | neg edx |
949 | neg edx |
- | 950 | add edx, [ext2_data.block_size] ;RUS: block_size - стартовый байт = сколько байт 1-го блока |
|
937 | add edx, [ext2_data.block_size] ;block_size - стартовый байт = сколько байт 1-го блока |
951 | ;ENG: block_size - start byte = number of bytes in 1st block |
938 | cmp ecx, edx |
952 | cmp ecx, edx |
Line 939... | Line 953... | ||
939 | jbe .only_one_block |
953 | jbe .only_one_block |
940 | 954 | ||
941 | mov eax, ecx |
955 | mov eax, ecx |
Line 942... | Line 956... | ||
942 | sub eax, edx |
956 | sub eax, edx |
943 | mov ecx, edx |
957 | mov ecx, edx |
944 | 958 | ||
Line 945... | Line 959... | ||
945 | mov esi, ebx |
959 | mov esi, ebx |
946 | rep movsb ;кусок 1-го блока |
960 | rep movsb ;RUS: кусок 1-го блока ;ENG: part of 1st block |
947 | jmp .calc_blocks_count |
961 | jmp .calc_blocks_count |
Line 1029... | Line 1043... | ||
1029 | ; out: esi - name without parent or not_changed |
1043 | ; out: esi - name without parent or not_changed |
1030 | ; ebx - dir_rec of inode children |
1044 | ; ebx - dir_rec of inode children |
1031 | ext2_test_block_by_name: |
1045 | ext2_test_block_by_name: |
1032 | sub esp, 256 ;EXT2_filename |
1046 | sub esp, 256 ;EXT2_filename |
1033 | mov edx, ebx |
1047 | mov edx, ebx |
1034 | add edx, [ext2_data.block_size] ;запомним конец блока |
1048 | add edx, [ext2_data.block_size] ;RUS: запомним конец блока ;ENG: save block end |
Line 1035... | Line 1049... | ||
1035 | 1049 | ||
1036 | .start_rec: |
1050 | .start_rec: |
1037 | cmp [ebx + EXT2_DIR_STRUC.inode], 0 |
1051 | cmp [ebx + EXT2_DIR_STRUC.inode], 0 |
Line 1043... | Line 1057... | ||
1043 | lea esi, [ebx + EXT2_DIR_STRUC.name] |
1057 | lea esi, [ebx + EXT2_DIR_STRUC.name] |
1044 | call utf8_to_cp866 |
1058 | call utf8_to_cp866 |
Line 1045... | Line 1059... | ||
1045 | 1059 | ||
1046 | mov ecx, edi |
1060 | mov ecx, edi |
1047 | lea edi, [esp + 4] |
1061 | lea edi, [esp + 4] |
Line 1048... | Line 1062... | ||
1048 | sub ecx, edi ;кол-во байт в получившейся строке |
1062 | sub ecx, edi ;RUS: кол-во байт в получившейся строке ;ENG: number of bytes in resulting string |
1049 | 1063 | ||
1050 | mov esi, [esp] |
1064 | mov esi, [esp] |
1051 | @@: |
1065 | @@: |
Line 1059... | Line 1073... | ||
1059 | inc edi |
1073 | inc edi |
1060 | xchg al, ah |
1074 | xchg al, ah |
1061 | call char_toupper |
1075 | call char_toupper |
1062 | cmp al, ah |
1076 | cmp al, ah |
1063 | je @B |
1077 | je @B |
1064 | @@: ;не подошло |
1078 | @@: ;RUS: не подошло ;ENG: didn't fit |
1065 | pop esi |
1079 | pop esi |
1066 | .next_rec: |
1080 | .next_rec: |
1067 | movzx eax, [ebx + EXT2_DIR_STRUC.rec_len] |
1081 | movzx eax, [ebx + EXT2_DIR_STRUC.rec_len] |
1068 | add ebx, eax ;к след. записи |
1082 | add ebx, eax ;RUS: к след. записи ;ENG: go to next record |
1069 | cmp ebx, edx ;проверим конец ли |
1083 | cmp ebx, edx ;RUS: проверим конец ли ;ENG: check if this is the end |
1070 | jb .start_rec |
1084 | jb .start_rec |
1071 | add esp, 256 |
1085 | add esp, 256 |
1072 | ret |
1086 | ret |
Line 1073... | Line 1087... | ||
1073 | 1087 | ||
1074 | .test_find: |
1088 | .test_find: |
1075 | cmp byte [esi], 0 |
1089 | cmp byte [esi], 0 |
1076 | je .ret ;нашли конец |
1090 | je .ret ;RUS: нашли конец ;ENG: the end reached |
1077 | cmp byte [esi], '/' |
1091 | cmp byte [esi], '/' |
1078 | jne @B |
1092 | jne @B |
1079 | inc esi |
1093 | inc esi |
1080 | .ret: |
1094 | .ret: |
Line 1109... | Line 1123... | ||
1109 | 1123 | ||
1110 | push esi |
1124 | push esi |
1111 | call ext2_test_block_by_name |
1125 | call ext2_test_block_by_name |
Line 1112... | Line 1126... | ||
1112 | pop edi ecx |
1126 | pop edi ecx |
1113 | 1127 | ||
Line 1114... | Line 1128... | ||
1114 | cmp edi, esi ;нашли имя? |
1128 | cmp edi, esi ;RUS: нашли имя? ;ENG: did we find a name? |
- | 1129 | je .next_folder_block ;RUS: не нашли -> к след. блоку ;ENG: we didn't -> moving to next block |
|
1115 | je .next_folder_block ;не нашли -> к след. блоку |
1130 | |
Line 1116... | Line 1131... | ||
1116 | 1131 | cmp byte [esi], 0 ;RUS: дошли до "конца" пути -> возваращаемся |
|
1117 | cmp byte [esi], 0 ;дошли до "конца" пути -> возваращаемся |
1132 | ;ENG: reached the "end" of path -> returning |
Line 1118... | Line 1133... | ||
1118 | jz .get_inode_ret |
1133 | jz .get_inode_ret |
1119 | 1134 | ||
1120 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR ;нашли, но это не папка |
1135 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR ;RUS: нашли, но это не папка |
1121 | jne .not_found |
1136 | jne .not_found ;ENG: found, but it's not a folder |
1122 | 1137 | ||
1123 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
1138 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
1124 | mov ebx, [ext2_data.ext2_save_inode] ;все же папка. |
1139 | mov ebx, [ext2_data.ext2_save_inode] ;RUS: все же папка. ;ENG: it's a folder afterall |
1125 | call ext2_get_inode |
1140 | call ext2_get_inode |
Line 1126... | Line 1141... | ||
1126 | test eax, eax |
1141 | test eax, eax |
1127 | jnz .error_get_inode |
1142 | jnz .error_get_inode |
1128 | pop ecx ;в стеке лежит кол-во блоков |
1143 | pop ecx ;RUS: в стеке лежит кол-во блоков ;ENG: stack top contains number of blocks |
1129 | mov ebp, ebx |
1144 | mov ebp, ebx |
1130 | jmp .next_path_part |
1145 | jmp .next_path_part |
Line 1131... | Line 1146... | ||
1131 | 1146 | ||
1132 | .next_folder_block: |
1147 | .next_folder_block: |
Line 1142... | Line 1157... | ||
1142 | .not_found: |
1157 | .not_found: |
1143 | mov eax, ERROR_FILE_NOT_FOUND |
1158 | mov eax, ERROR_FILE_NOT_FOUND |
1144 | ret |
1159 | ret |
Line 1145... | Line 1160... | ||
1145 | 1160 | ||
1146 | .get_inode_ret: |
1161 | .get_inode_ret: |
1147 | pop ecx ;в стеке лежит кол-во блоков |
1162 | pop ecx ;RUS: в стеке лежит кол-во блоков ;ENG: stack top contains number of blocks |
1148 | mov dl, [ebx + EXT2_DIR_STRUC.name] ;в dl - первый символ () |
1163 | mov dl, [ebx + EXT2_DIR_STRUC.name] ;RUS: в dl - первый символ () ;ENG: ??? |
1149 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
1164 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
1150 | mov ebx, [ext2_data.ext2_save_inode] |
1165 | mov ebx, [ext2_data.ext2_save_inode] |
1151 | call ext2_get_inode |
1166 | call ext2_get_inode |
1152 | mov ebp, ebx |
1167 | mov ebp, ebx |
Line 1180... | Line 1195... | ||
1180 | test eax, eax |
1195 | test eax, eax |
1181 | jz @F |
1196 | jz @F |
1182 | ret |
1197 | ret |
Line 1183... | Line 1198... | ||
1183 | 1198 | ||
1184 | .is_root: |
1199 | .is_root: |
1185 | xor ebx, ebx ;root не может быть скрытым |
1200 | xor ebx, ebx ;RUS: root не может быть скрытым ;ENG: root cannot be hidden |
1186 | mov ebp, [ext2_data.root_inode] |
1201 | mov ebp, [ext2_data.root_inode] |
1187 | @@: |
1202 | @@: |
1188 | xor eax, eax |
1203 | xor eax, eax |
1189 | mov edi, edx |
1204 | mov edi, edx |