Subversion Repositories Kolibri OS

Rev

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