Subversion Repositories Kolibri OS

Rev

Rev 1384 | Go to most recent revision | Show entire file | Ignore 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 107... Line 107...
107
        mov     edx, eax                                ; потом еще квадрат найдем
107
        mov     edx, eax                                ; потом еще квадрат найдем
Line 108... Line 108...
108
 
108
 
109
        shl     eax, 2
109
        shl     eax, 2
Line 110... Line 110...
110
        mov     [ext2_data.block_size], eax
110
        mov     [ext2_data.block_size], eax
Line 111... Line 111...
111
 
111
 
112
        push    eax eax eax                             ;3 kernel_alloc
112
        push    eax eax eax                             ; 3 kernel_alloc
113
 
113
 
Line 114... Line 114...
114
        mov     eax, edx
114
        mov     eax, edx
115
        mul     edx
115
        mul     edx
116
        mov     [ext2_data.count_pointer_in_block_square], eax
116
        mov     [ext2_data.count_pointer_in_block_square], eax
117
 
117
 
118
        call    kernel_alloc
118
        call    kernel_alloc
119
        mov     [ext2_data.global_desc_table],eax       ;reserve mem for gdt
119
        mov     [ext2_data.global_desc_table],eax       ; reserve mem for gdt
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 194... Line 195...
194
        mov     eax, ecx
195
        mov     eax, ecx
195
        div     [ext2_data.count_pointer_in_block_square]
196
        div     [ext2_data.count_pointer_in_block_square]
Line 196... Line 197...
196
 
197
 
197
    ;eax - номер в полученном блоке   edx - номер дальше
198
    ;eax - номер в полученном блоке   edx - номер дальше
198
        mov    eax, [ebx + eax*4]
199
        mov    eax, [ebx + eax*4]
Line 199... Line 200...
199
        call    ext2_get_block
200
        call   ext2_get_block
200
 
201
 
Line 201... Line 202...
201
        mov    eax, edx
202
        mov    eax, edx
Line 221... Line 222...
221
        ret
222
        ret
Line 222... Line 223...
222
 
223
 
223
    .get_indirect_block:
224
    .get_indirect_block:
224
        push    eax ebx
225
        push    eax ebx
225
        mov     eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4]
226
        mov     eax, [ebp + EXT2_INODE_STRUC.i_block + 12*4]
226
        mov    ebx, [ext2_data.ext2_temp_block]
227
        mov     ebx, [ext2_data.ext2_temp_block]
Line 227... Line 228...
227
        call    ext2_get_block
228
        call    ext2_get_block
228
 
229
 
229
        mov     ecx, [ebx + ecx*4]
230
        mov     ecx, [ebx + ecx*4]
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
Line 419... Line 402...
419
        and     [EXT2_files_in_folder], 0
402
        and     [EXT2_files_in_folder], 0
420
 
403
 
Line 421... Line 404...
421
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]
404
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]
422
        mov     [EXT2_counter_blocks], eax
405
        mov     [EXT2_counter_blocks], eax
423
 
406