Rev 1378 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1378 | Rev 1384 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; 02.02.2010 turbanoff - support 70.5 ;; |
6 | ;; 23.01.2010 turbanoff - read from ext2fs ;; |
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: 1378 $ |
11 | $Revision: 1384 $ |
12 | 12 | ||
13 | EXT2_BAD_INO = 1 |
13 | EXT2_BAD_INO = 1 |
14 | EXT2_ROOT_INO = 2 |
14 | EXT2_ROOT_INO = 2 |
Line 120... | Line 120... | ||
120 | call kernel_alloc |
120 | call kernel_alloc |
121 | mov [ext2_data.ext2_save_block], eax ; and for temp block |
121 | mov [ext2_data.ext2_save_block], eax ; and for temp block |
122 | call kernel_alloc |
122 | call kernel_alloc |
123 | mov [ext2_data.ext2_temp_block], eax ; and for get_inode proc |
123 | mov [ext2_data.ext2_temp_block], eax ; and for get_inode proc |
Line 124... | Line 124... | ||
124 | 124 | ||
125 | mov ebp, [ebx+88] |
125 | movzx ebp, word [ebx+88] |
126 | mov ecx, [ebx+32] |
126 | mov ecx, [ebx+32] |
127 | mov edx, [ebx+40] |
127 | mov edx, [ebx+40] |
Line 128... | Line 128... | ||
128 | mov eax, [ebx+20] ; first_data_block |
128 | mov eax, [ebx+20] ; first_data_block |
Line 326... | Line 326... | ||
326 | pop esi |
326 | pop esi |
327 | .next_rec: |
327 | .next_rec: |
328 | movzx eax, [ebx + EXT2_DIR_STRUC.rec_len] |
328 | movzx eax, [ebx + EXT2_DIR_STRUC.rec_len] |
329 | add ebx, eax ;к след. записи |
329 | add ebx, eax ;к след. записи |
330 | cmp ebx, edx ;проверим конец ли |
330 | cmp ebx, edx ;проверим конец ли |
331 | jne .start_rec |
331 | jb .start_rec |
332 | jmp .ret |
332 | jmp .ret |
Line 333... | Line 333... | ||
333 | 333 | ||
334 | .test_find: |
334 | .test_find: |
335 | cmp byte [esi], 0 |
335 | cmp byte [esi], 0 |
Line 416... | Line 416... | ||
416 | 416 | ||
417 | mov edi, [EXT2_files_in_folder] ;edi = число блоков для чтения |
417 | mov edi, [EXT2_files_in_folder] ;edi = число блоков для чтения |
418 | and [EXT2_read_in_folder], 0 |
418 | and [EXT2_read_in_folder], 0 |
Line 419... | Line 419... | ||
419 | and [EXT2_files_in_folder], 0 |
419 | and [EXT2_files_in_folder], 0 |
420 | 420 | ||
Line 421... | Line 421... | ||
421 | mov esi, [ebp + EXT2_INODE_STRUC.i_blocks] |
421 | mov eax, [ebp + EXT2_INODE_STRUC.i_blocks] |
422 | mov [EXT2_counter_blocks], esi |
422 | mov [EXT2_counter_blocks], eax |
Line 423... | Line 423... | ||
423 | 423 | ||
Line 447... | Line 447... | ||
447 | inc [EXT2_files_in_folder] |
447 | inc [EXT2_files_in_folder] |
448 | @@: |
448 | @@: |
449 | movzx ebx, [eax+EXT2_DIR_STRUC.rec_len] |
449 | movzx ebx, [eax+EXT2_DIR_STRUC.rec_len] |
450 | add eax, ebx ; к следующей записи |
450 | add eax, ebx ; к следующей записи |
451 | cmp eax, [EXT2_end_block] ; проверяем "конец" |
451 | cmp eax, [EXT2_end_block] ; проверяем "конец" |
452 | je .end_block_find_wanted |
452 | jae .end_block_find_wanted |
453 | loop .find_wanted_cycle |
453 | loop .find_wanted_cycle |
454 | .find_wanted_end: |
454 | .find_wanted_end: |
Line 455... | Line 455... | ||
455 | 455 | ||
456 | mov ecx, edi |
456 | mov ecx, edi |
Line 460... | Line 460... | ||
460 | cmp [eax + EXT2_DIR_STRUC.inode], 0 ; if (inode = 0) => not used |
460 | cmp [eax + EXT2_DIR_STRUC.inode], 0 ; if (inode = 0) => not used |
461 | jz .empty_rec |
461 | jz .empty_rec |
462 | inc [EXT2_files_in_folder] |
462 | inc [EXT2_files_in_folder] |
463 | inc [EXT2_read_in_folder] |
463 | inc [EXT2_read_in_folder] |
Line -... | Line 464... | ||
- | 464 | ||
- | 465 | mov edi, edx |
|
- | 466 | push eax ecx |
|
- | 467 | xor eax, eax |
|
- | 468 | mov ecx, 40 / 4 |
|
- | 469 | rep stosd |
|
- | 470 | pop ecx eax |
|
464 | 471 | ||
465 | test [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR ;папка или нет |
472 | cmp [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR ;папка или нет |
Line 466... | Line 473... | ||
466 | jnz @F |
473 | jz @F |
467 | 474 | ||
468 | push eax ;получим размер, если это файл |
475 | push eax ;получим размер, если это файл |
469 | mov eax, [eax + EXT2_DIR_STRUC.inode] |
476 | mov eax, [eax + EXT2_DIR_STRUC.inode] |
Line 475... | Line 482... | ||
475 | mov dword [edx+36], ebx |
482 | mov dword [edx+36], ebx |
476 | xor dword [edx], FS_FT_DIR ; для файлов xor - 2 раза |
483 | xor dword [edx], FS_FT_DIR ; для файлов xor - 2 раза |
477 | pop eax |
484 | pop eax |
478 | @@: |
485 | @@: |
479 | xor dword [edx], FS_FT_DIR |
486 | xor dword [edx], FS_FT_DIR |
480 | mov dword [edx+4], FS_FT_ASCII ; symbol type in name |
487 | or dword [edx+4], FS_FT_ASCII ; symbol type in name |
Line 481... | Line 488... | ||
481 | 488 | ||
482 | push ecx esi ;copy name |
489 | push ecx esi ;copy name |
483 | movzx ecx, [eax + EXT2_DIR_STRUC.name_len] |
490 | movzx ecx, [eax + EXT2_DIR_STRUC.name_len] |
484 | mov edi, edx |
491 | mov edi, edx |
Line 491... | Line 498... | ||
491 | add edx, 40 + 264 ; go to next record |
498 | add edx, 40 + 264 ; go to next record |
492 | .empty_rec: |
499 | .empty_rec: |
493 | movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] |
500 | movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] |
494 | add eax, ebx |
501 | add eax, ebx |
495 | cmp eax, [EXT2_end_block] |
502 | cmp eax, [EXT2_end_block] |
496 | je .end_block_wanted |
503 | jae .end_block_wanted ;по хорошему должно быть =, но ччнш |
497 | loop .wanted_cycle |
504 | loop .wanted_cycle |
Line 498... | Line 505... | ||
498 | 505 | ||
499 | .wanted_end: ;теперь дойдем до конца чтобы узнать сколько файлов в папке |
506 | .wanted_end: ;теперь дойдем до конца чтобы узнать сколько файлов в папке |
500 | or ecx, -1 ;цикл уже есть, просто поставим ему огромный счетчик |
507 | or ecx, -1 ;цикл уже есть, просто поставим ему огромный счетчик |
Line 615... | Line 622... | ||
615 | je .next_block_folder |
622 | je .next_block_folder |
Line 616... | Line 623... | ||
616 | 623 | ||
617 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_REG_FILE |
624 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_REG_FILE |
618 | je .test_file |
625 | je .test_file |
619 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR |
626 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR |
- | 627 | jne .this_is_nofile |
|
620 | jne .not_found |
628 | |
621 | .test_dir: |
629 | ;.test_dir: |
622 | cmp edi, 0 |
630 | cmp edi, 0 |
Line 623... | Line 631... | ||
623 | jne .this_is_folder |
631 | jne .this_is_nofile |
624 | 632 | ||
625 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
633 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
626 | mov ebx, [ext2_data.ext2_save_inode] ;все же папка. |
634 | mov ebx, [ext2_data.ext2_save_inode] ;все же папка. |
Line 640... | Line 648... | ||
640 | .not_found: |
648 | .not_found: |
641 | pop edx ecx ebx |
649 | pop edx ecx ebx |
642 | or ebx, -1 |
650 | or ebx, -1 |
643 | mov eax, ERROR_FILE_NOT_FOUND |
651 | mov eax, ERROR_FILE_NOT_FOUND |
644 | ret |
652 | ret |
645 | .this_is_folder: |
653 | .this_is_nofile: |
646 | pop edx ecx ebx |
654 | pop edx ecx ebx |
647 | or ebx, -1 |
655 | or ebx, -1 |
648 | mov eax, ERROR_ACCESS_DENIED |
656 | mov eax, ERROR_ACCESS_DENIED |
649 | .end_read: |
657 | .end_read: |
650 | ret |
658 | ret |
Line 651... | Line 659... | ||
651 | 659 | ||
652 | ;-----------------------------------------------------------------------------final step |
660 | ;-----------------------------------------------------------------------------final step |
653 | .get_file: |
- | |
654 | xchg bx, bx |
661 | .get_file: |
Line 655... | Line 662... | ||
655 | mov ebp ,ebx |
662 | mov ebp ,ebx |
656 | 663 | ||
657 | ;pop eax edi ecx ; первый_блок память кол-во_байт |
664 | ;pop eax edi ecx ; первый_блок память кол-во_байт |
Line 779... | Line 786... | ||
779 | ret |
786 | ret |
780 | @@: |
787 | @@: |
781 | xor eax, eax |
788 | xor eax, eax |
782 | ret |
789 | ret |
783 | ;======================== |
790 | ;======================== |
- | 791 | ;in : esi -> name not save register |
|
- | 792 | ;out: ebp -> inode cf=0 |
|
- | 793 | ; ebp -> trash cf=1 |
|
- | 794 | ext2_find_lfn: |
|
- | 795 | mov ebp, [ext2_data.root_inode] |
|
- | 796 | .next_folder: |
|
- | 797 | or [EXT2_counter_blocks], -1 ;счетчик блоков папки cur block of inode |
|
- | 798 | mov eax, [ebp + EXT2_INODE_STRUC.i_blocks] ;убывающий счетчик блоков |
|
- | 799 | add eax, [ext2_data.count_block_in_block] |
|
- | 800 | mov [EXT2_end_block], eax |
|
- | 801 | .next_block_folder: |
|
- | 802 | mov eax, [ext2_data.count_block_in_block] |
|
- | 803 | sub [EXT2_end_block], eax |
|
- | 804 | jz .not_found |
|
- | 805 | inc [EXT2_counter_blocks] |
|
- | 806 | mov ecx, [EXT2_counter_blocks] |
|
- | 807 | call ext2_get_inode_block |
|
- | 808 | ||
- | 809 | mov eax, ecx |
|
- | 810 | mov ebx, [ext2_data.ext2_save_block] ;ebx = cur dir record |
|
- | 811 | call ext2_get_block |
|
- | 812 | ||
- | 813 | mov eax, esi |
|
- | 814 | call ext2_test_block_by_name |
|
- | 815 | cmp eax, esi ;нашли имя? |
|
- | 816 | jz .next_block_folder |
|
- | 817 | ||
- | 818 | cmp byte [esi],0 |
|
- | 819 | jz .get_inode_ret |
|
Line -... | Line 820... | ||
- | 820 | ||
- | 821 | cmp [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR |
|
- | 822 | jne .not_found ;нашли, но это не папка |
|
- | 823 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
|
- | 824 | mov ebx, [ext2_data.ext2_save_inode] ;все же папка. |
|
- | 825 | call ext2_get_inode |
|
- | 826 | mov ebp, ebx |
|
- | 827 | jmp .next_folder |
|
- | 828 | ||
- | 829 | .not_found: |
|
- | 830 | stc |
|
- | 831 | ret |
|
- | 832 | .get_inode_ret: |
|
- | 833 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
|
- | 834 | mov ebx, [ext2_data.ext2_save_inode] |
|
- | 835 | call ext2_get_inode |
|
- | 836 | mov ebp, ebx |
|
- | 837 | .ret: |
|
- | 838 | clc |
|
- | 839 | ret |
|
- | 840 | ||
- | 841 | ||
784 | 842 | ;======================== |
|
785 | ext2_HdRewrite: |
843 | ext2_HdRewrite: |
786 | ; xchg bx, bx |
844 | ; xchg bx, bx |
787 | xor ebx, ebx |
845 | xor ebx, ebx |
788 | mov eax, ERROR_UNSUPPORTED_FS |
846 | mov eax, ERROR_UNSUPPORTED_FS |
Line 796... | Line 854... | ||
796 | ext2_HdSetFileEnd: |
854 | ext2_HdSetFileEnd: |
797 | ; xchg bx, bx |
855 | ; xchg bx, bx |
798 | xor ebx, ebx |
856 | xor ebx, ebx |
799 | mov eax, ERROR_UNSUPPORTED_FS |
857 | mov eax, ERROR_UNSUPPORTED_FS |
800 | ret |
858 | ret |
- | 859 | ||
801 | ext2_HdGetFileInfo: |
860 | ext2_HdGetFileInfo: |
- | 861 | cmp byte [esi], 0 |
|
802 | ; xchg bx, bx |
862 | jz .doit |
- | 863 | ||
- | 864 | call ext2_find_lfn |
|
803 | xor ebx, ebx |
865 | jnc .doit2 |
- | 866 | ;.not_found: |
|
804 | mov eax, ERROR_UNSUPPORTED_FS |
867 | mov eax, ERROR_FILE_NOT_FOUND |
805 | ret |
868 | ret |
- | 869 | ||
- | 870 | .doit: |
|
- | 871 | mov ebp, [ext2_data.root_inode] |
|
- | 872 | .doit2: |
|
- | 873 | xor eax, eax |
|
- | 874 | mov edi, edx |
|
- | 875 | mov ecx, 40/4 |
|
- | 876 | rep stosd ; fill zero |
|
- | 877 | ||
- | 878 | test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR |
|
- | 879 | jz @F |
|
- | 880 | or dword [edx], FS_FT_DIR |
|
- | 881 | @@: |
|
- | 882 | mov byte [edx+1], FS_FT_ASCII |
|
- | 883 | mov eax, [ebp + EXT2_INODE_STRUC.i_size] ;low size |
|
- | 884 | mov ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl] ;high size |
|
- | 885 | mov dword [edx+32], eax |
|
- | 886 | mov dword [edx+36], ebx |
|
- | 887 | ||
- | 888 | xor eax, eax |
|
- | 889 | ret |
|
- | 890 | ||
806 | ext2_HdSetFileInfo: |
891 | ext2_HdSetFileInfo: |
807 | ; xchg bx, bx |
892 | ; xchg bx, bx |
808 | xor ebx, ebx |
893 | xor ebx, ebx |
809 | mov eax, ERROR_UNSUPPORTED_FS |
894 | mov eax, ERROR_UNSUPPORTED_FS |
810 | ret |
895 | ret |