Subversion Repositories Kolibri OS

Rev

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

Rev 1384 Rev 1387
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: 1384 $
11
$Revision: 1387 $
12
 
12
 
13
EXT2_BAD_INO        = 1
13
EXT2_BAD_INO        = 1
14
EXT2_ROOT_INO        = 2
14
EXT2_ROOT_INO        = 2
Line 166... Line 166...
166
        add     ebx, 512
166
        add     ebx, 512
167
        loop    @B
167
        loop    @B
168
        pop     ecx ebx eax
168
        pop     ecx ebx eax
169
        ret
169
        ret
170
;===================================================================
170
;===================================================================
171
; in:  ecx = номер блока
171
; in:  ecx = номер блока в inode (0..)
172
;      ebp = адрес inode
172
;      ebp = адрес inode
173
; out: ecx = адрес очередного блока
173
; out: ecx = адрес очередного блока
174
ext2_get_inode_block:
174
ext2_get_inode_block:
175
        cmp     ecx, 12
175
        cmp     ecx, 12                                         ; 0..11 - direct block address
176
        jbe     .get_direct_block
176
        jb      .get_direct_block
Line 177... Line 177...
177
 
177
 
178
        sub     ecx, 12
178
        sub     ecx, 12
179
        cmp     ecx, [ext2_data.count_pointer_in_block]
179
        cmp     ecx, [ext2_data.count_pointer_in_block]         ; 12.. - indirect block
Line 180... Line 180...
180
        jbe     .get_indirect_block
180
        jb      .get_indirect_block
181
 
181
 
182
        sub     ecx, [ext2_data.count_pointer_in_block]
182
        sub     ecx, [ext2_data.count_pointer_in_block]
Line -... Line 183...
-
 
183
        cmp     ecx, [ext2_data.count_pointer_in_block_square]
183
        cmp     ecx, [ext2_data.count_pointer_in_block_square]
184
        jb      .get_double_indirect_block
184
        jbe     .get_double_indirect_block
185
 
Line 185... Line 186...
185
 
186
        sub     ecx, [ext2_data.count_pointer_in_block_square]
186
    ;.get_triple_indirect_block:
187
    ;.get_triple_indirect_block:
Line 365... Line 366...
365
    EXT2_end_block          dd ?   ;конец очередного блока папки
366
    EXT2_end_block          dd ?   ;конец очередного блока папки
366
    EXT2_counter_blocks     dd ?
367
    EXT2_counter_blocks     dd ?
367
endg
368
endg
Line 368... Line 369...
368
 
369
 
369
ext2_HdReadFolder:
-
 
370
        mov     ebp, [ext2_data.root_inode]
-
 
371
        mov     [EXT2_read_in_folder], ebx
-
 
372
        mov     [EXT2_files_in_folder], ecx     ;сохраним регистры
-
 
373
 
-
 
374
    .next_folder:
370
ext2_HdReadFolder:
375
        cmp     byte [esi], 0
-
 
376
        jz      .get_folder
-
 
377
 
-
 
378
        or      [EXT2_counter_blocks], -1               ;счетчик блоков папки    cur block of inode
-
 
379
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]  ;убывающий счетчик блоков
-
 
380
        add     eax, [ext2_data.count_block_in_block]
-
 
381
        mov     [EXT2_end_block], eax
-
 
382
    .next_block_folder:
-
 
383
        mov     eax, [ext2_data.count_block_in_block]
-
 
384
        sub     [EXT2_end_block], eax
371
        cmp     byte [esi], 0
385
        jz      .not_found
-
 
386
        inc     [EXT2_counter_blocks]
-
 
387
        mov     ecx, [EXT2_counter_blocks]
-
 
388
        call    ext2_get_inode_block
-
 
389
 
-
 
390
        mov     eax, ecx
-
 
391
        mov     ebx, [ext2_data.ext2_save_block]        ;ebx = cur dir record
-
 
392
        call    ext2_get_block
-
 
393
 
-
 
394
        mov     eax, esi
-
 
395
        call    ext2_test_block_by_name
-
 
396
        cmp     eax, esi                                ;нашли имя?
-
 
397
        je      .next_block_folder
-
 
398
 
-
 
399
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR
-
 
400
        jne     .not_found                                      ;нашли, но это не папка
-
 
401
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
-
 
402
        mov     ebx, [ext2_data.ext2_save_inode]                ;все же папка.
-
 
403
        call    ext2_get_inode
-
 
404
        mov     ebp, ebx
-
 
Line -... Line 372...
-
 
372
        jz      .doit
-
 
373
 
-
 
374
        push    ecx ebx
-
 
375
        call    ext2_find_lfn
405
        jmp     .next_folder
376
        jnc     .doit2
-
 
377
        pop     ebx
406
 
378
    .not_found:
407
    .not_found:
379
        pop     ecx
408
        or      ebx, -1
380
        or      ebx, -1
409
        mov     eax, ERROR_FILE_NOT_FOUND
-
 
410
        ret
-
 
411
     ;--------------------------------------------- final step
-
 
412
        ; in ebp - pointer to final inode (folder).
-
 
413
    .get_folder:
-
 
Line -... Line 381...
-
 
381
        mov     eax, ERROR_FILE_NOT_FOUND
-
 
382
        ret
-
 
383
 
-
 
384
    .doit:
-
 
385
        mov     ebp, [ext2_data.root_inode]
-
 
386
        push    ecx
-
 
387
        jmp     @F
-
 
388
    .doit2:
-
 
389
        pop     ebx
-
 
390
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR
-
 
391
        jz      .not_found
-
 
392
    @@:
-
 
393
        xor     eax, eax
414
        push    edx                             ;заголовок будем заполнять в конце (адрес - в стеке) edx
394
        mov     edi, edx
-
 
395
        mov     ecx, 32/4
-
 
396
        rep     stosd                           ; fill header zero
-
 
397
        pop     edi                             ; edi = число блоков для чтения
415
        push    [EXT2_read_in_folder]           ;сохраненный регистр тоже в стек
398
        push    edx ebx
416
 
399
 
Line 417... Line 400...
417
        mov     edi, [EXT2_files_in_folder]     ;edi = число блоков для чтения
400
     ;--------------------------------------------- final step
418
        and     [EXT2_read_in_folder], 0
401
        and     [EXT2_read_in_folder], 0