Rev 1410 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1410 | Rev 1419 | ||
---|---|---|---|
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: 1410 $ |
11 | $Revision: 1419 $ |
12 | 12 | ||
13 | EXT2_BAD_INO = 1 |
13 | EXT2_BAD_INO = 1 |
14 | EXT2_ROOT_INO = 2 |
14 | EXT2_ROOT_INO = 2 |
Line 28... | Line 28... | ||
28 | EXT2_S_IRGRP = 0x0020 |
28 | EXT2_S_IRGRP = 0x0020 |
29 | EXT2_S_IWGRP = 0x0010 |
29 | EXT2_S_IWGRP = 0x0010 |
30 | EXT2_S_IXGRP = 0x0008 |
30 | EXT2_S_IXGRP = 0x0008 |
31 | ;other inode right's |
31 | ;other inode right's |
32 | EXT2_S_IROTH = 0x0004 |
32 | EXT2_S_IROTH = 0x0004 |
33 | EXT2_S_IROTH = 0x0002 |
33 | EXT2_S_IWOTH = 0x0002 |
34 | EXT2_S_IROTH = 0x0001 |
34 | EXT2_S_IXOTH = 0x0001 |
- | 35 | EXT2_777_MODE = EXT2_S_IROTH or EXT2_S_IWOTH or EXT2_S_IXOTH or \ |
|
- | 36 | EXT2_S_IRGRP or EXT2_S_IWGRP or EXT2_S_IXGRP or \ |
|
- | 37 | EXT2_S_IRUSR or EXT2_S_IWUSR or EXT2_S_IXUSR |
|
Line 35... | Line 38... | ||
35 | 38 | ||
36 | EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге |
39 | EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге |
Line 37... | Line 40... | ||
37 | EXT2_FT_DIR = 2 ;это папка |
40 | EXT2_FT_DIR = 2 ;это папка |
Line 47... | Line 50... | ||
47 | EXT2_files_in_folder dd ? ;всего файлов в папке |
50 | EXT2_files_in_folder dd ? ;всего файлов в папке |
48 | EXT2_read_in_folder dd ? ;сколько файлов "считали" |
51 | EXT2_read_in_folder dd ? ;сколько файлов "считали" |
49 | EXT2_end_block dd ? ;конец очередного блока папки |
52 | EXT2_end_block dd ? ;конец очередного блока папки |
50 | EXT2_counter_blocks dd ? |
53 | EXT2_counter_blocks dd ? |
51 | EXT2_filename db 256 dup ? |
54 | EXT2_filename db 256 dup ? |
- | 55 | EXT2_parent_name db 256 dup ? |
|
- | 56 | EXT2_name_len dd ? |
|
52 | endg |
57 | endg |
Line 53... | Line 58... | ||
53 | 58 | ||
54 | struct EXT2_INODE_STRUC |
59 | struct EXT2_INODE_STRUC |
55 | .i_mode dw ? |
60 | .i_mode dw ? |
Line 78... | Line 83... | ||
78 | .name_len db ? |
83 | .name_len db ? |
79 | .file_type db ? |
84 | .file_type db ? |
80 | .name db ? ; 0..255 |
85 | .name db ? ; 0..255 |
81 | ends |
86 | ends |
Line -... | Line 87... | ||
- | 87 | ||
- | 88 | struct EXT2_BLOCK_GROUP_DESC |
|
- | 89 | .block_bitmap dd ? |
|
- | 90 | .inode_bitmap dd ? |
|
- | 91 | .inode_table dd ? |
|
- | 92 | .free_blocks_count dw ? |
|
- | 93 | .free_inodes_count dw ? |
|
- | 94 | .used_dirs_count dw ? |
|
- | 95 | ends |
|
- | 96 | ||
- | 97 | struct EXT2_SB_STRUC |
|
- | 98 | .inodes_count dd ? ;+0 |
|
- | 99 | .blocks_count dd ? ;+4 |
|
- | 100 | .r_block_count dd ? ;+8 |
|
- | 101 | .free_block_count dd ? ;+12 |
|
- | 102 | .free_inodes_count dd ? ;+16 |
|
- | 103 | .first_data_block dd ? ;+20 |
|
- | 104 | .log_block_size dd ? ;+24 |
|
- | 105 | .log_frag_size dd ? ;+28 |
|
- | 106 | .blocks_per_group dd ? ;+32 |
|
- | 107 | .frags_per_group dd ? ;+36 |
|
- | 108 | .inodes_per_group dd ? ;+40 |
|
- | 109 | .mtime dd ? ;+44 |
|
- | 110 | .wtime dd ? ;+48 |
|
- | 111 | .mnt_count dw ? ;+52 |
|
- | 112 | .max_mnt_count dw ? ;+54 |
|
- | 113 | .magic dw ? ;+56 |
|
- | 114 | .state dw ? ;+58 |
|
- | 115 | .errors dw ? ;+60 |
|
- | 116 | .minor_rev_level dw ? ;+62 |
|
- | 117 | .lastcheck dd ? ;+64 |
|
- | 118 | .check_intervals dd ? ;+68 |
|
- | 119 | .creator_os dd ? ;+72 |
|
- | 120 | .rev_level dd ? ;+76 |
|
- | 121 | .def_resuid dw ? ;+80 |
|
- | 122 | .def_resgid dw ? ;+82 |
|
- | 123 | .first_ino dd ? ;+84 |
|
- | 124 | .inode_size dw ? ;+88 |
|
- | 125 | .block_group_nr dw ? ;+90 |
|
- | 126 | .feature_compat dd ? ;+92 |
|
- | 127 | .feature_incompat dd ? ;+96 |
|
- | 128 | .feature_ro_compat dd ? ;+100 |
|
- | 129 | .uuid db 16 dup ? ;+104 |
|
- | 130 | .volume_name db 16 dup ? ;+120 |
|
- | 131 | .last_mounted db 64 dup ? ;+136 |
|
- | 132 | .algo_bitmap dd ? ;+200 |
|
- | 133 | .prealloc_blocks db ? ;+204 |
|
- | 134 | .preallock_dir_blocks db ? ;+205 |
|
- | 135 | dw ? ;+206 alignment |
|
- | 136 | .journal_uuid db 16 dup ? ;+208 |
|
- | 137 | .journal_inum dd ? ;+224 |
|
- | 138 | .journal_dev dd ? ;+228 |
|
- | 139 | .last_orphan dd ? ;+232 |
|
- | 140 | .hash_seed dd 4 dup ? ;+236 |
|
- | 141 | .def_hash_version db ? ;+252 |
|
- | 142 | db 3 dup ? ;+253 reserved |
|
- | 143 | .default_mount_options dd ? ;+256 |
|
- | 144 | .first_meta_bg dd ? ;+260 |
|
Line 82... | Line 145... | ||
82 | 145 | ends |
|
83 | 146 | ||
84 | ext2_test_superblock: |
147 | ext2_test_superblock: |
Line 109... | Line 172... | ||
109 | stc |
172 | stc |
110 | ret |
173 | ret |
Line 111... | Line 174... | ||
111 | 174 | ||
112 | ext2_setup: |
175 | ext2_setup: |
- | 176 | mov [fs_type], 2 |
|
- | 177 | ||
- | 178 | push 512 |
|
- | 179 | call kernel_alloc ; mem for superblock |
|
- | 180 | mov esi, ebx |
|
- | 181 | mov edi, eax |
|
- | 182 | mov ecx, 512/4 |
|
- | 183 | rep movsd ; copy sb to reserved mem |
|
- | 184 | mov ebx, eax |
|
- | 185 | mov [ext2_data.sb],eax |
|
- | 186 | ||
- | 187 | mov eax, [ebx + EXT2_SB_STRUC.blocks_count] |
|
- | 188 | sub eax, [ebx + EXT2_SB_STRUC.first_data_block] |
|
- | 189 | dec eax |
|
- | 190 | xor edx, edx |
|
- | 191 | div [ebx + EXT2_SB_STRUC.blocks_per_group] |
|
- | 192 | inc eax |
|
- | 193 | mov [ext2_data.groups_count], eax |
|
113 | mov [fs_type], 2 |
194 | |
114 | mov ecx, [ebx+24] |
195 | mov ecx, [ebx+24] |
115 | inc ecx |
196 | inc ecx |
Line 116... | Line 197... | ||
116 | mov [ext2_data.log_block_size], ecx ; 1, 2, 3, 4 equ 1kb, 2kb, 4kb, 8kb |
197 | mov [ext2_data.log_block_size], ecx ; 1, 2, 3, 4 equ 1kb, 2kb, 4kb, 8kb |
Line 124... | Line 205... | ||
124 | mov edx, eax ; потом еще квадрат найдем |
205 | mov edx, eax ; потом еще квадрат найдем |
Line 125... | Line 206... | ||
125 | 206 | ||
126 | shl eax, 2 |
207 | shl eax, 2 |
Line 127... | Line 208... | ||
127 | mov [ext2_data.block_size], eax |
208 | mov [ext2_data.block_size], eax |
Line 128... | Line 209... | ||
128 | 209 | ||
129 | push eax eax eax ; 3 kernel_alloc |
210 | push eax eax ; 2 kernel_alloc |
130 | 211 | ||
Line 131... | Line 212... | ||
131 | mov eax, edx |
212 | mov eax, edx |
132 | mul edx |
- | |
133 | mov [ext2_data.count_pointer_in_block_square], eax |
- | |
134 | 213 | mul edx |
|
135 | call kernel_alloc |
214 | mov [ext2_data.count_pointer_in_block_square], eax |
136 | mov [ext2_data.global_desc_table],eax ; reserve mem for gdt |
215 | |
Line 137... | Line 216... | ||
137 | call kernel_alloc |
216 | call kernel_alloc |
138 | mov [ext2_data.ext2_save_block], eax ; and for temp block |
217 | mov [ext2_data.ext2_save_block], eax ; and for temp block |
139 | call kernel_alloc |
218 | call kernel_alloc |
140 | mov [ext2_data.ext2_temp_block], eax ; and for get_inode proc |
- | |
Line 141... | Line 219... | ||
141 | 219 | mov [ext2_data.ext2_temp_block], eax ; and for get_inode proc |
|
142 | movzx ebp, word [ebx+88] |
220 | |
143 | mov ecx, [ebx+32] |
221 | movzx ebp, word [ebx+88] |
Line 144... | Line -... | ||
144 | mov edx, [ebx+40] |
- | |
145 | mov eax, [ebx+20] ; first_data_block |
- | |
146 | - | ||
147 | mov [ext2_data.inode_size], ebp |
- | |
148 | mov [ext2_data.blocks_per_group], ecx |
222 | mov ecx, [ebx+32] |
149 | mov [ext2_data.inodes_per_group], edx |
223 | mov edx, [ebx+40] |
150 | 224 | ||
151 | mov ebx, [ext2_data.global_desc_table] |
225 | mov [ext2_data.inode_size], ebp |
152 | inc eax ; first_data_block + 1 = gdt |
226 | mov [ext2_data.blocks_per_group], ecx |
Line 161... | Line 235... | ||
161 | mov [ext2_data.root_inode], eax |
235 | mov [ext2_data.root_inode], eax |
Line 162... | Line 236... | ||
162 | 236 | ||
163 | mov ebx, eax |
237 | mov ebx, eax |
164 | mov eax, EXT2_ROOT_INO |
238 | mov eax, EXT2_ROOT_INO |
- | 239 | call ext2_get_inode ; read root inode |
|
165 | call ext2_get_inode ; read root inode |
240 | |
Line 166... | Line 241... | ||
166 | jmp return_from_part_set |
241 | jmp return_from_part_set |
167 | 242 | ||
168 | ;================================================================== |
243 | ;================================================================== |
Line 247... | Line 322... | ||
247 | 322 | ||
248 | .get_direct_block: |
323 | .get_direct_block: |
249 | mov ecx, dword [ebp + EXT2_INODE_STRUC.i_block + ecx*4] |
324 | mov ecx, dword [ebp + EXT2_INODE_STRUC.i_block + ecx*4] |
Line 250... | Line -... | ||
250 | ret |
- | |
251 | 325 | ret |
|
252 | 326 | ||
253 | ;=================================================================== |
327 | ;=================================================================== |
254 | ;get content inode by num |
328 | ;get content inode by num |
255 | ;in: eax = inode_num |
329 | ;in: eax = inode_num |
Line 260... | Line 334... | ||
260 | mov edi, ebx ;сохраним адрес inode |
334 | mov edi, ebx ;сохраним адрес inode |
261 | dec eax |
335 | dec eax |
262 | xor edx, edx |
336 | xor edx, edx |
263 | div [ext2_data.inodes_per_group] |
337 | div [ext2_data.inodes_per_group] |
Line 264... | Line 338... | ||
264 | 338 | ||
Line 265... | Line 339... | ||
265 | push edx ;locale num |
339 | push edx ;locale num in group |
266 | 340 | ||
Line -... | Line 341... | ||
- | 341 | mov edx, 32 |
|
- | 342 | mul edx ; address block_group in global_desc_table |
|
- | 343 | ||
- | 344 | ; в eax - смещение группы с inode-ом относительно начала глобальной дескрипторной таблицы |
|
- | 345 | ; найдем блок в котором он находится |
|
- | 346 | ||
- | 347 | div [ext2_data.block_size] |
|
267 | mov edx, 32 |
348 | mov ecx, [ext2_data.sb] |
- | 349 | add eax, [ecx + EXT2_SB_STRUC.first_data_block] |
|
- | 350 | inc eax |
|
- | 351 | mov ebx, [ext2_data.ext2_temp_block] |
|
268 | mul edx ; address block_group in global_desc_table |
352 | call ext2_get_block |
Line 269... | Line 353... | ||
269 | 353 | ||
270 | add eax, [ext2_data.global_desc_table] |
354 | add ebx, edx ; локальный номер в блоке |
271 | mov eax, [eax+8] ; номер блока - в терминах ext2 |
355 | mov eax, [ebx+8] ; номер блока - в терминах ext2 |
Line 432... | Line 516... | ||
432 | jz @F |
516 | jz @F |
433 | inc [EXT2_files_in_folder] |
517 | inc [EXT2_files_in_folder] |
434 | dec ecx |
518 | dec ecx |
435 | @@: |
519 | @@: |
436 | movzx ebx, [eax+EXT2_DIR_STRUC.rec_len] |
520 | movzx ebx, [eax+EXT2_DIR_STRUC.rec_len] |
- | 521 | ||
- | 522 | cmp ebx, 12 ; минимальная длина записи |
|
- | 523 | jb .end_error |
|
- | 524 | test ebx, 0x3 ; длина записи должна делиться на 4 |
|
- | 525 | jnz .end_error |
|
- | 526 | ||
437 | add eax, ebx ; к следующей записи |
527 | add eax, ebx ; к следующей записи |
438 | cmp eax, [EXT2_end_block] ; проверяем "конец" |
528 | cmp eax, [EXT2_end_block] ; проверяем "конец" |
439 | jb .find_wanted_start |
529 | jb .find_wanted_start |
Line 440... | Line 530... | ||
440 | 530 | ||
Line 532... | Line 622... | ||
532 | 622 | ||
533 | add edx, 40 + 264 ; go to next record |
623 | add edx, 40 + 264 ; go to next record |
534 | dec ecx ; если запись пустая ecx не надо уменьшать |
624 | dec ecx ; если запись пустая ecx не надо уменьшать |
535 | .empty_rec: |
625 | .empty_rec: |
- | 626 | movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] |
|
- | 627 | cmp ebx, 12 ; минимальная длина записи |
|
- | 628 | jb .end_error |
|
- | 629 | test ebx, 0x3 ; длина записи должна делиться на 4 |
|
- | 630 | jnz .end_error |
|
536 | movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] |
631 | |
537 | add eax, ebx |
632 | add eax, ebx |
538 | cmp eax, [EXT2_end_block] |
633 | cmp eax, [EXT2_end_block] |
Line 539... | Line 634... | ||
539 | jb .wanted_start |
634 | jb .wanted_start |
540 | 635 | ||
Line 541... | Line 636... | ||
541 | push .wanted_start ; дошли до конца очередного блока |
636 | push .wanted_start ; дошли до конца очередного блока |
542 | jmp .end_block |
637 | jmp .end_block |
- | 638 | ||
543 | 639 | .end_dir: |
|
544 | .end_dir: |
640 | pop eax ; мусор (адрес возврата в цикл) |
545 | pop eax ; мусор (адрес возврата в цикл) |
641 | .end_error: |
546 | pop edx |
642 | pop edx |
547 | mov ebx, [EXT2_read_in_folder] |
643 | mov ebx, [EXT2_read_in_folder] |
Line 656... | Line 752... | ||
656 | cmp [ebp + EXT2_INODE_STRUC.i_size], eax |
752 | cmp [ebp + EXT2_INODE_STRUC.i_size], eax |
657 | ja .size_great |
753 | ja .size_great |
Line 658... | Line 754... | ||
658 | 754 | ||
659 | .size_less: |
755 | .size_less: |
660 | xor ebx, ebx |
756 | xor ebx, ebx |
661 | mov eax, 6 ;EOF |
757 | mov eax, ERROR_END_OF_FILE |
662 | ret |
758 | ret |
663 | .size_great: |
759 | .size_great: |
664 | add eax, ecx ;add to first_wanted кол-во байт для чтения |
760 | add eax, ecx ;add to first_wanted кол-во байт для чтения |
Line 756... | Line 852... | ||
756 | .end_read: |
852 | .end_read: |
757 | pop ebx |
853 | pop ebx |
758 | cmp [EXT2_files_in_folder], 0 |
854 | cmp [EXT2_files_in_folder], 0 |
759 | jz @F |
855 | jz @F |
Line 760... | Line 856... | ||
760 | 856 | ||
761 | mov eax, 6 ;EOF |
857 | mov eax, ERROR_END_OF_FILE |
762 | ret |
858 | ret |
763 | @@: |
859 | @@: |
764 | xor eax, eax |
860 | xor eax, eax |
765 | ret |
861 | ret |
Line 814... | Line 910... | ||
814 | clc |
910 | clc |
815 | ret |
911 | ret |
Line 816... | Line 912... | ||
816 | 912 | ||
817 | - | ||
818 | ;======================== |
- | |
819 | ext2_HdRewrite: |
- | |
820 | ; xchg bx, bx |
- | |
821 | xor ebx, ebx |
- | |
822 | mov eax, ERROR_UNSUPPORTED_FS |
- | |
823 | ret |
- | |
824 | - | ||
825 | ext2_HdWrite: |
- | |
826 | ; xchg bx, bx |
- | |
827 | xor ebx, ebx |
- | |
828 | mov eax, ERROR_UNSUPPORTED_FS |
- | |
829 | ret |
- | |
830 | ext2_HdSetFileEnd: |
- | |
831 | ; xchg bx, bx |
- | |
832 | xor ebx, ebx |
- | |
Line 833... | Line 913... | ||
833 | mov eax, ERROR_UNSUPPORTED_FS |
913 | |
834 | ret |
914 | ;======================== |
835 | 915 | ||
Line 891... | Line 971... | ||
891 | call ntfs_datetime_to_bdfe.sec |
971 | call ntfs_datetime_to_bdfe.sec |
Line 892... | Line 972... | ||
892 | 972 | ||
893 | xor eax, eax |
973 | xor eax, eax |
Line -... | Line 974... | ||
- | 974 | ret |
|
- | 975 | ||
- | 976 | ext2_HdRewrite: |
|
894 | ret |
977 | ext2_HdWrite: |
- | 978 | ext2_HdSetFileEnd: |
|
895 | 979 | ext2_HdSetFileInfo: |
|
896 | ext2_HdSetFileInfo: |
980 | ext2_HdDelete: |
897 | ; xchg bx, bx |
981 | ext2_HdCreateFolder: |
898 | xor ebx, ebx |
982 | xor ebx, ebx |
- | 983 | mov eax, ERROR_UNSUPPORTED_FS |
|
- | 984 | ret |
|
- | 985 | ;---------------------------------------------------------------- |
|
- | 986 | ; |
|
- | 987 | ; ext2_HdCreateFolder - create new folder |
|
- | 988 | ; |
|
- | 989 | ; esi points to filename |
|
- | 990 | ; |
|
- | 991 | ; ret eax = 0 ok read or other = errormsg |
|
- | 992 | ; |
|
- | 993 | ;-------------------------------------------------------------- |
|
- | 994 | cmp byte [esi], 0 |
|
- | 995 | jz .not_found |
|
- | 996 | cmp byte [esi], '/' |
|
- | 997 | jz .not_found |
|
- | 998 | ||
- | 999 | mov ebx, esi ; save source pointer |
|
- | 1000 | xor edi, edi ; slah pointer |
|
- | 1001 | @@: |
|
- | 1002 | lodsb |
|
- | 1003 | cmp al, 0 |
|
- | 1004 | jz .zero |
|
- | 1005 | cmp al, '/' |
|
- | 1006 | jz .slash |
|
- | 1007 | jmp @B |
|
- | 1008 | ||
- | 1009 | .slash: |
|
- | 1010 | lodsb |
|
- | 1011 | cmp al, 0 |
|
- | 1012 | jz .zero ; уберем слеш из имени |
|
- | 1013 | cmp al, '/' |
|
- | 1014 | jz .not_found |
|
- | 1015 | mov edi, esi ; edi -> next symbol after '/' |
|
- | 1016 | dec edi |
|
- | 1017 | jmp @B |
|
- | 1018 | ||
- | 1019 | .zero: |
|
- | 1020 | dec esi |
|
- | 1021 | test edi, edi |
|
- | 1022 | jz .doit |
|
- | 1023 | ||
- | 1024 | ;слеш был |
|
- | 1025 | mov eax, esi |
|
- | 1026 | sub eax, edi |
|
- | 1027 | mov [EXT2_name_len], eax |
|
- | 1028 | ||
- | 1029 | mov ecx, edi |
|
- | 1030 | sub ecx, ebx |
|
- | 1031 | dec ecx ;выкинули '/' из имени ролителя |
|
- | 1032 | mov esi, ebx |
|
- | 1033 | mov edi, EXT2_parent_name |
|
- | 1034 | rep movsb |
|
- | 1035 | ; esi - pointer to last slash |
|
- | 1036 | ||
- | 1037 | mov edx, esi |
|
- | 1038 | mov esi, EXT2_parent_name |
|
- | 1039 | call ext2_find_lfn |
|
- | 1040 | jnc .doit2 |
|
- | 1041 | .not_found: |
|
- | 1042 | or ebx, -1 |
|
- | 1043 | mov eax, ERROR_FILE_NOT_FOUND |
|
- | 1044 | ret |
|
- | 1045 | ||
- | 1046 | .doit: |
|
- | 1047 | mov ebp, [ext2_data.root_inode] |
|
- | 1048 | mov edx, ebx ; имя создаваемой папки |
|
- | 1049 | sub esi, ebx |
|
- | 1050 | mov [EXT2_name_len], esi |
|
- | 1051 | .doit2: |
|
- | 1052 | ;ebp -> parent_inode ebx->name_new_folder [EXT2_name_len]=length of name |
|
- | 1053 | ; стратегия выбора группы для нового inode: (так делает линукс) |
|
- | 1054 | ; 1) Ищем группу в которой меньше всего папок и в есть свободное место |
|
- | 1055 | ; 2) Если такая группа не нашлась, то берем группу в которой больше свободного места |
|
- | 1056 | ||
- | 1057 | ||
- | 1058 | ||
899 | mov eax, ERROR_UNSUPPORTED_FS |
1059 | |
- | 1060 | call ext2_balloc |
|
- | 1061 | jmp ext2_HdDelete |
|
- | 1062 | ||
- | 1063 | push ebx |
|
- | 1064 | push ebp |
|
- | 1065 | ||
- | 1066 | mov ecx, [ext2_data.sb] |
|
- | 1067 | cmp [ecx + EXT2_SB_STRUC.free_inodes_count],0 ; есть ли место для inode |
|
- | 1068 | jz .no_space |
|
- | 1069 | mov eax, [ecx + EXT2_SB_STRUC.free_block_count] |
|
- | 1070 | sub eax, [ecx + EXT2_SB_STRUC.r_block_count] |
|
- | 1071 | cmp eax, 2 ; и как минимум на 2 блока |
|
- | 1072 | jb .no_space |
|
- | 1073 | ||
- | 1074 | mov ecx, [ext2_data.groups_count] |
|
- | 1075 | mov esi, [ext2_data.global_desc_table] |
|
- | 1076 | mov edi, -1 ;указатель на лучшую группу |
|
- | 1077 | mov edx, 0 |
|
- | 1078 | .find_group_dir: |
|
900 | ret |
1079 | jecxz .end_find_group_dir |
- | 1080 | movzx eax, [esi + EXT2_BLOCK_GROUP_DESC.free_inodes_count] |
|
- | 1081 | cmp eax, edx |
|
- | 1082 | jbe @F |
|
- | 1083 | cmp [esi + EXT2_BLOCK_GROUP_DESC.free_blocks_count], 0 |
|
- | 1084 | jz @F |
|
- | 1085 | mov edi, esi |
|
- | 1086 | movzx edx, [esi + EXT2_BLOCK_GROUP_DESC.free_inodes_count] |
|
- | 1087 | @@: |
|
- | 1088 | dec ecx |
|
- | 1089 | add esi, 32 ;размер структуры |
|
- | 1090 | jmp .find_group_dir |
|
- | 1091 | .end_find_group_dir: |
|
- | 1092 | cmp edx, 0 |
|
- | 1093 | jz .no_space |
|
- | 1094 | ||
- | 1095 | ;нашли группу, получим битовую карту inode-ов (найдем locale number) |
|
- | 1096 | mov eax, [edi + EXT2_BLOCK_GROUP_DESC.inode_bitmap] |
|
- | 1097 | mov ebx, [ext2_data.ext2_save_block] |
|
- | 1098 | call ext2_get_block |
|
- | 1099 | ||
- | 1100 | ;теперь цикл по всем битам |
|
- | 1101 | mov esi, ebx |
|
- | 1102 | mov ecx, [ext2_data.inodes_per_group] |
|
- | 1103 | shr ecx, 5 ;делим на 32 |
|
- | 1104 | mov ebp, ecx ; всего сохраним в ebp |
|
- | 1105 | or eax, -1 ; ищем первый свободный inode (!= -1) |
|
- | 1106 | repne scasd |
|
- | 1107 | jnz .test_last_dword ;нашли или нет |
|
- | 1108 | mov eax, [esi-4] |
|
- | 1109 | ||
- | 1110 | sub ebp, ecx |
|
- | 1111 | dec ebp |
|
- | 1112 | shl ebp, 5 ; глобальный номер локального номера |
|
- | 1113 | ||
- | 1114 | mov ecx, 32 |
|
- | 1115 | @@: |
|
- | 1116 | test eax, 1 |
|
- | 1117 | jz @F |
|
- | 1118 | shr eax, 1 |
|
- | 1119 | loop @B |
|
- | 1120 | @@: |
|
- | 1121 | mov eax, 32 |
|
- | 1122 | sub eax, ecx |
|
- | 1123 | ||
- | 1124 | add ebp, eax ; locale num of inode |
|
- | 1125 | ||
- | 1126 | mov eax, [esi-4] |
|
- | 1127 | ;устанавливаем в eax крайний справа нулевой бит в 1 |
|
- | 1128 | mov ecx, eax |
|
- | 1129 | inc ecx |
|
- | 1130 | or eax, ecx ; x | (x+1) |
|
- | 1131 | mov [esi-4], eax |
|
- | 1132 | mov ebx, [ext2_data.ext2_save_block] |
|
- | 1133 | mov eax, [edi + EXT2_BLOCK_GROUP_DESC.inode_bitmap] |
|
- | 1134 | call ext2_set_block |
|
- | 1135 | ;считаем таблицу inode |
|
- | 1136 | sub edi, [ext2_data.global_desc_table] |
|
- | 1137 | shr edi, 5 |
|
- | 1138 | ||
- | 1139 | mov eax, edi |
|
- | 1140 | mul [ext2_data.inodes_per_group] |
|
- | 1141 | add eax, ebp |
|
- | 1142 | inc eax ; теперь в eax (ebp) номер inode-а |
|
- | 1143 | mov ebp, eax |
|
- | 1144 | ;call ext2_get_inode_address |
|
- | 1145 | ||
- | 1146 | mov ebx, [ext2_data.ext2_save_block] |
|
- | 1147 | call hd_read |
|
- | 1148 | add edx, ebx ; в edx адрес нужного inode |
|
- | 1149 | ||
- | 1150 | ;забьем 0 для начала |
|
- | 1151 | mov edi, edx |
|
- | 1152 | mov ecx, [ext2_data.inode_size] |
|
- | 1153 | shr ecx, 2 |
|
- | 1154 | xor eax, eax |
|
- | 1155 | rep stosd |
|
- | 1156 | ||
- | 1157 | mov edi, edx |
|
- | 1158 | mov eax, EXT2_S_IFDIR or EXT2_777_MODE |
|
- | 1159 | stosd ; i_mode |
|
- | 1160 | xor eax, eax |
|
- | 1161 | stosd ; i_uid |
|
- | 1162 | mov eax, [ext2_data.block_size] |
|
- | 1163 | stosd ; i_size |
|
- | 1164 | xor eax, eax |
|
- | 1165 | stosd ; i_atime |
|
- | 1166 | stosd ; i_ctime |
|
- | 1167 | stosd ; i_mtime |
|
- | 1168 | stosd ; i_dtime |
|
- | 1169 | stosd ; i_gid |
|
- | 1170 | inc eax |
|
- | 1171 | stosd ; i_links_count |
|
- | 1172 | mov eax, [ext2_data.count_block_in_block] |
|
- | 1173 | stosd ; i_blocks |
|
- | 1174 | ||
- | 1175 | ||
- | 1176 | ||
- | 1177 | ||
901 | ext2_HdDelete: |
1178 | .test_last_dword: |
902 | ; xchg bx, bx |
1179 | |
903 | xor ebx, ebx |
1180 | xor ebx, ebx |
Line -... | Line 1181... | ||
- | 1181 | mov eax, ERROR_UNSUPPORTED_FS |
|
- | 1182 | ret |
|
- | 1183 | ||
- | 1184 | ||
- | 1185 | ||
- | 1186 | .no_space: |
|
- | 1187 | or ebx, -1 |
|
- | 1188 | mov eax, ERROR_DISK_FULL |
|
- | 1189 | ret |
|
- | 1190 | ||
- | 1191 | ;выделяет новый блок, если это можно |
|
- | 1192 | ;иначе возвращает eax=0 |
|
- | 1193 | ext2_balloc: |
|
- | 1194 | mov ecx, [ext2_data.sb] |
|
- | 1195 | mov eax, [ecx + EXT2_SB_STRUC.free_block_count] |
|
- | 1196 | sub eax, [ecx + EXT2_SB_STRUC.r_block_count] |
|
- | 1197 | jbe .no_space |
|
- | 1198 | ||
- | 1199 | mov ecx, [ext2_data.groups_count] |
|
- | 1200 | mov edi, [ext2_data.global_desc_table] |
|
- | 1201 | ;mov esi, -1 ;указатель на лучшую группу |
|
- | 1202 | mov edx, 0 |
|
- | 1203 | .find_group: |
|
- | 1204 | jecxz .end_find_group |
|
- | 1205 | movzx eax, [edi + EXT2_BLOCK_GROUP_DESC.free_blocks_count] |
|
- | 1206 | cmp eax, edx |
|
- | 1207 | jbe @F |
|
- | 1208 | mov esi, edi |
|
- | 1209 | mov edx, eax |
|
- | 1210 | @@: |
|
- | 1211 | dec ecx |
|
- | 1212 | add edi, 32 ;размер структуры |
|
- | 1213 | jmp .find_group |
|
- | 1214 | .end_find_group: |
|
- | 1215 | cmp edx, 0 |
|
- | 1216 | jz .no_space |
|
- | 1217 | ||
- | 1218 | ;нашли группу, получим битовую карту block-ов |
|
- | 1219 | mov eax, [esi + EXT2_BLOCK_GROUP_DESC.block_bitmap] |
|
- | 1220 | mov ebx, [ext2_data.ext2_save_block] |
|
- | 1221 | call ext2_get_block |
|
- | 1222 | ||
- | 1223 | ;теперь цикл по всем битам |
|
- | 1224 | mov edi, ebx |
|
- | 1225 | mov ecx, [ext2_data.blocks_per_group] |
|
- | 1226 | shr ecx, 5 ;делим на 32 |
|
- | 1227 | mov ebp, ecx ;всего сохраним в ebp |
|
- | 1228 | or eax, -1 ;ищем первый свободный inode (!= -1) |
|
- | 1229 | repe scasd |
|
- | 1230 | jz .test_last_dword ;нашли или нет |
|
- | 1231 | ||
- | 1232 | mov eax, [edi-4] |
|
- | 1233 | sub ebp, ecx |
|
- | 1234 | dec ebp |
|
- | 1235 | shl ebp, 5 ; ebp = 32*(номер div 32). Теперь найдем (номер mod 32) |
|
- | 1236 | ||
- | 1237 | mov ecx, 32 |
|
- | 1238 | @@: |
|
- | 1239 | test eax, 1 |
|
- | 1240 | jz @F |
|
- | 1241 | shr eax, 1 |
|
- | 1242 | loop @B |
|
- | 1243 | @@: |
|
- | 1244 | mov eax, 32 |
|
- | 1245 | sub eax, ecx |
|
- | 1246 | ||
- | 1247 | add ebp, eax ; ebp = номер блока в группе |
|
- | 1248 | ||
- | 1249 | mov eax, [edi-4] |
|
- | 1250 | mov ecx, eax |
|
- | 1251 | inc ecx |
|
- | 1252 | or eax, ecx ; x | (x+1) - устанавливает в 1 крайний справа нулевой бит (block used) |
|
- | 1253 | mov [edi-4], eax |
|
- | 1254 | ||
- | 1255 | mov ebx, [ext2_data.ext2_save_block] |
|
- | 1256 | mov eax, [esi + EXT2_BLOCK_GROUP_DESC.inode_bitmap] |
|
- | 1257 | ; call ext2_set_block ; и пишем на hdd новую битовую маску |
|
- | 1258 | ||
- | 1259 | ;============== тут получаем номер блока |
|
- | 1260 | mov eax, [ext2_data.blocks_per_group] |
|
- | 1261 | sub esi, [ext2_data.global_desc_table] |
|
- | 1262 | shr esi, 5 ;esi - номер группы |
|
- | 1263 | mul esi |
|
- | 1264 | add ebp, eax ;(номер_группы) * (blocks_per_group) + локальный номер в группе |
|
- | 1265 | mov eax, [ext2_data.sb] |
|
- | 1266 | add ebp, [eax + EXT2_SB_STRUC.first_data_block] |
|
- | 1267 | ||
- | 1268 | ;теперь поправим глобальную дескрипторную таблицу и суперблок |
|
- | 1269 | mov ebx, [ext2_data.sb] |
|
- | 1270 | dec [ebx + EXT2_SB_STRUC.free_block_count] |
|
- | 1271 | mov eax, 2 |
|
- | 1272 | add eax, [PARTITION_START] |
|
- | 1273 | call hd_write |
|
- | 1274 | mov eax, [ebx + EXT2_SB_STRUC.first_data_block] |
|
- | 1275 | inc eax |
|
- | 1276 | dec [esi + EXT2_BLOCK_GROUP_DESC.free_blocks_count];edi все еще указывает на группу в которой мы выделил блок |
|
- | 1277 | call ext2_set_block |
|
- | 1278 | ||
- | 1279 | mov eax, ebx |
|
- | 1280 | ret |
|
- | 1281 | ||
- | 1282 | .test_last_dword: |
|
- | 1283 | lodsd |
|
- | 1284 | mov ecx, [ext2_data.blocks_per_group] |
|
- | 1285 | and ecx, not (32-1) ;обнуляем все кроме последних 5 бит |
|
- | 1286 | mov edx, ecx |
|
- | 1287 | mov ebx, 1 |
|
- | 1288 | @@: |
|
- | 1289 | jecxz .no_space |
|
- | 1290 | mov edx, ebx |
|
- | 1291 | or edx, eax ; тестируем очередной бит |
|
- | 1292 | shl ebx, 1 |
|
- | 1293 | jmp @B |
|
- | 1294 | @@: |
|
- | 1295 | sub edx, ecx |
|
- | 1296 | dec edx ;номер в последнем блоке |
|
- | 1297 | ||
- | 1298 | ||
- | 1299 | .no_space: |
|
- | 1300 | xor eax, eax |
|
- | 1301 | ret |
|
- | 1302 | ||
- | 1303 | ;in: eax = i_block |
|
- | 1304 | ; ebx = pointer to memory |
|
- | 1305 | ext2_set_block: |
|
- | 1306 | push eax ebx ecx |
|
- | 1307 | mov ecx, [ext2_data.log_block_size] |
|
- | 1308 | shl eax, cl |
|
- | 1309 | add eax, [PARTITION_START] |
|
- | 1310 | mov ecx, [ext2_data.count_block_in_block] |
|
- | 1311 | @@: |
|
- | 1312 | call hd_write |
|
- | 1313 | inc eax |
|
- | 1314 | add ebx, 512 |
|
- | 1315 | loop @B |