Subversion Repositories Kolibri OS

Rev

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