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 |