168,21 → 168,22 |
pop ecx ebx eax |
ret |
;=================================================================== |
; in: ecx = номер блока |
; in: ecx = номер блока в inode (0..) |
; ebp = адрес inode |
; out: ecx = адрес очередного блока |
ext2_get_inode_block: |
cmp ecx, 12 |
jbe .get_direct_block |
cmp ecx, 12 ; 0..11 - direct block address |
jb .get_direct_block |
|
sub ecx, 12 |
cmp ecx, [ext2_data.count_pointer_in_block] |
jbe .get_indirect_block |
cmp ecx, [ext2_data.count_pointer_in_block] ; 12.. - indirect block |
jb .get_indirect_block |
|
sub ecx, [ext2_data.count_pointer_in_block] |
cmp ecx, [ext2_data.count_pointer_in_block_square] |
jbe .get_double_indirect_block |
jb .get_double_indirect_block |
|
sub ecx, [ext2_data.count_pointer_in_block_square] |
;.get_triple_indirect_block: |
push eax edx ebx |
|
367,54 → 368,36 |
endg |
|
ext2_HdReadFolder: |
mov ebp, [ext2_data.root_inode] |
mov [EXT2_read_in_folder], ebx |
mov [EXT2_files_in_folder], ecx ;сохраним регистры |
|
.next_folder: |
cmp byte [esi], 0 |
jz .get_folder |
jz .doit |
|
or [EXT2_counter_blocks], -1 ;счетчик блоков папки cur block of inode |
mov eax, [ebp + EXT2_INODE_STRUC.i_blocks] ;убывающий счетчик блоков |
add eax, [ext2_data.count_block_in_block] |
mov [EXT2_end_block], eax |
.next_block_folder: |
mov eax, [ext2_data.count_block_in_block] |
sub [EXT2_end_block], eax |
jz .not_found |
inc [EXT2_counter_blocks] |
mov ecx, [EXT2_counter_blocks] |
call ext2_get_inode_block |
|
mov eax, ecx |
mov ebx, [ext2_data.ext2_save_block] ;ebx = cur dir record |
call ext2_get_block |
|
mov eax, esi |
call ext2_test_block_by_name |
cmp eax, esi ;нашли имя? |
je .next_block_folder |
|
cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR |
jne .not_found ;нашли, но это не папка |
mov eax, [ebx + EXT2_DIR_STRUC.inode] |
mov ebx, [ext2_data.ext2_save_inode] ;все же папка. |
call ext2_get_inode |
mov ebp, ebx |
jmp .next_folder |
|
push ecx ebx |
call ext2_find_lfn |
jnc .doit2 |
pop ebx |
.not_found: |
pop ecx |
or ebx, -1 |
mov eax, ERROR_FILE_NOT_FOUND |
ret |
|
.doit: |
mov ebp, [ext2_data.root_inode] |
push ecx |
jmp @F |
.doit2: |
pop ebx |
test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR |
jz .not_found |
@@: |
xor eax, eax |
mov edi, edx |
mov ecx, 32/4 |
rep stosd ; fill header zero |
pop edi ; edi = число блоков для чтения |
push edx ebx |
|
;--------------------------------------------- final step |
; in ebp - pointer to final inode (folder). |
.get_folder: |
push edx ;заголовок будем заполнять в конце (адрес - в стеке) edx |
push [EXT2_read_in_folder] ;сохраненный регистр тоже в стек |
|
mov edi, [EXT2_files_in_folder] ;edi = число блоков для чтения |
and [EXT2_read_in_folder], 0 |
and [EXT2_files_in_folder], 0 |
|