Subversion Repositories Kolibri OS

Rev

Rev 1389 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1389 Rev 1397
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: 1389 $
11
$Revision: 1397 $
12
 
12
 
13
EXT2_BAD_INO        = 1
13
EXT2_BAD_INO        = 1
14
EXT2_ROOT_INO        = 2
14
EXT2_ROOT_INO        = 2
Line 38... Line 38...
38
 
38
 
39
FS_FT_DIR               = 0x10  ;это папка
39
FS_FT_DIR               = 0x10  ;это папка
40
FS_FT_ASCII             = 0     ;имя в ascii
40
FS_FT_ASCII             = 0     ;имя в ascii
Line -... Line 41...
-
 
41
FS_FT_UNICODE           = 1     ;имя в unicode
-
 
42
 
-
 
43
uglobal
-
 
44
    EXT2_files_in_folder    dd ?   ;всего файлов в папке
-
 
45
    EXT2_read_in_folder     dd ?   ;сколько файлов "считали"
-
 
46
    EXT2_end_block          dd ?   ;конец очередного блока папки
-
 
47
    EXT2_counter_blocks     dd ?
-
 
48
    EXT2_filename           db 256 dup ?
41
FS_FT_UNICODE           = 1     ;имя в unicode
49
endg
42
 
50
 
43
struct EXT2_INODE_STRUC
51
struct EXT2_INODE_STRUC
44
    .i_mode         dw ?
52
    .i_mode         dw ?
45
    .i_uid          dw ?
53
    .i_uid          dw ?
Line 279... Line 287...
279
        rep     movsb                           ;копируем inode
287
        rep     movsb                           ;копируем inode
280
        popad
288
        popad
281
        ret
289
        ret
Line 282... Line 290...
282
 
290
 
283
;----------------------------------------------------------------
-
 
284
ext2_upcase:
-
 
285
        cmp     al, 'a'
-
 
286
        jb      .ret
-
 
287
        cmp     al, 'z'
-
 
288
        ja      .ret
-
 
289
        and     al, 0xDF        ; upcase = clear 0010 0000
-
 
290
    .ret:
-
 
291
        ret
-
 
292
;----------------------------------------------------------------
291
;----------------------------------------------------------------
293
; in:  esi -> children
292
; in:  esi -> children
294
;      ebx -> pointer to dir block
293
;      ebx -> pointer to dir block
295
; out: esi -> name without parent or not_changed
294
; out: esi -> name without parent or not_changed
296
;      ebx -> dir_rec of inode children      or trash
295
;      ebx -> dir_rec of inode children      or trash
Line 301... Line 300...
301
        add        edx, [ext2_data.block_size]    ;запомним конец блока
300
        add        edx, [ext2_data.block_size]    ;запомним конец блока
Line 302... Line 301...
302
 
301
 
303
        .start_rec:
302
        .start_rec:
304
            cmp     [ebx + EXT2_DIR_STRUC.inode], 0
303
            cmp     [ebx + EXT2_DIR_STRUC.inode], 0
305
            jz      .next_rec
-
 
306
;            test    [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR
-
 
Line 307... Line 304...
307
;            jz      .next_rec
304
            jz      .next_rec
308
 
305
 
309
            push    esi
306
            push    esi
310
            movzx   ecx, [ebx + EXT2_DIR_STRUC.name_len]
307
            movzx   ecx, [ebx + EXT2_DIR_STRUC.name_len]
Line -... Line 308...
-
 
308
            mov     edi, EXT2_filename
-
 
309
            lea     esi, [ebx + EXT2_DIR_STRUC.name]
-
 
310
 
-
 
311
            call    utf8toansi_str
-
 
312
            mov     ecx, edi
-
 
313
            sub     ecx, EXT2_filename      ;кол-во байт в получившейся строке
311
            lea     edi, [ebx + EXT2_DIR_STRUC.name]
314
 
312
            inc     ecx
-
 
313
 
315
            mov     edi, EXT2_filename
-
 
316
            mov     esi, [esp]
-
 
317
          @@:
314
          @@:
318
                jecxz   .test_find
-
 
319
                dec     ecx
-
 
320
 
315
                dec     ecx
321
                lodsb
316
                jecxz   .test_find
322
                call    char_toupper
317
                lodsb
-
 
318
                mov     ah, [edi]
-
 
319
                inc     edi
323
 
320
 
324
                mov     ah, [edi]
321
                call    ext2_upcase
325
                inc     edi
322
                xchg    al, ah
326
                xchg    al, ah
323
                call    ext2_upcase
327
                call    char_toupper
324
                cmp     al, ah
328
                cmp     al, ah
325
                je      @B
329
                je      @B
Line 338... Line 342...
338
        cmp     byte [esi], '/'
342
        cmp     byte [esi], '/'
339
        jne      @B
343
        jne      @B
340
        inc     esi
344
        inc     esi
341
    .find:
345
    .find:
342
        pop eax         ;удаляем из стека сохраненое значение
346
        pop eax         ;удаляем из стека сохраненое значение
343
       ; mov ebx, [ebx + EXT2_DIR_STRUC.inode]
-
 
344
    .ret:
347
    .ret:
345
        pop edi edx ecx eax
348
        pop edi edx ecx eax
346
        ret
349
        ret
Line 347... Line 350...
347
 
350
 
Line 358... Line 361...
358
;
361
;
359
;  ret ebx = blocks read or 0xffffffff folder not found
362
;  ret ebx = blocks read or 0xffffffff folder not found
360
;      eax = 0 ok read or other = errormsg
363
;      eax = 0 ok read or other = errormsg
361
;
364
;
362
;--------------------------------------------------------------
365
;--------------------------------------------------------------
363
uglobal
-
 
364
    EXT2_files_in_folder    dd ?   ;всего файлов в папке
-
 
365
    EXT2_read_in_folder     dd ?   ;сколько файлов "считали"
-
 
366
    EXT2_end_block          dd ?   ;конец очередного блока папки
-
 
367
    EXT2_counter_blocks     dd ?
-
 
368
endg
-
 
369
 
-
 
370
ext2_HdReadFolder:
366
ext2_HdReadFolder:
371
        cmp     byte [esi], 0
367
        cmp     byte [esi], 0
372
        jz      .doit
368
        jz      .doit
Line 373... Line 369...
373
 
369
 
Line 402... Line 398...
402
        and     [EXT2_files_in_folder], 0
398
        and     [EXT2_files_in_folder], 0
Line 403... Line 399...
403
 
399
 
404
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]
400
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]
Line 405... Line 401...
405
        mov     [EXT2_counter_blocks], eax
401
        mov     [EXT2_counter_blocks], eax
406
 
402
 
Line 407... Line 403...
407
        add     edx, 32                         ; заголовок будем заполнять в конце (адрес - в стеке) edx = current mem for return
403
        add     edx, 32                         ; (header pointer in stack) edx = current mem for return
408
        xor     esi, esi                        ; esi = номер блока по порядку
404
        xor     esi, esi                        ; esi = номер блока по порядку
409
 
405
 
Line 424... Line 420...
424
 
420
 
425
    .find_wanted_start:
421
    .find_wanted_start:
426
        jecxz   .find_wanted_end
422
        jecxz   .find_wanted_end
427
    .find_wanted_cycle:
423
    .find_wanted_cycle:
428
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
424
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
429
            je      @F
425
            jz      @F
430
            inc     [EXT2_files_in_folder]
426
            inc     [EXT2_files_in_folder]
431
          @@:
427
          @@:
432
            movzx   ebx, [eax+EXT2_DIR_STRUC.rec_len]
428
            movzx   ebx, [eax+EXT2_DIR_STRUC.rec_len]
433
            add     eax, ebx                            ; к следующей записи
429
            add     eax, ebx                            ; к следующей записи
Line 436... Line 432...
436
            loop    .find_wanted_cycle
432
            loop    .find_wanted_cycle
437
    .find_wanted_end:
433
    .find_wanted_end:
Line 438... Line 434...
438
 
434
 
439
        mov     ecx, edi
435
        mov     ecx, edi
440
    .wanted_start:                                      ; ищем first_wanted+count
436
    .wanted_start:                                      ; ищем first_wanted+count
441
        jecxz   .wanted_end
-
 
442
    .wanted_cycle:
437
            jecxz   .find_wanted_cycle                  ; ecx=0 => огромный цикл до конца папки
443
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
438
            cmp     [eax + EXT2_DIR_STRUC.inode], 0     ; if (inode = 0) => not used
444
            jz      .empty_rec
439
            jz      .empty_rec
445
            inc     [EXT2_files_in_folder]
440
            inc     [EXT2_files_in_folder]
Line 467... Line 462...
467
            pop     eax
462
            pop     eax
468
          @@:
463
          @@:
469
            xor     dword [edx], FS_FT_DIR
464
            xor     dword [edx], FS_FT_DIR
470
            or      dword [edx+4], FS_FT_ASCII      ; symbol type in name
465
            or      dword [edx+4], FS_FT_ASCII      ; symbol type in name
Line -... Line 466...
-
 
466
 
471
 
467
            ;теперь скопируем название, сконвертировав из UTF-8 в CP866
472
            push    ecx esi                         ;copy name
468
            push    eax ecx esi
473
            movzx   ecx, [eax + EXT2_DIR_STRUC.name_len]
469
            movzx   ecx, [eax + EXT2_DIR_STRUC.name_len]
474
            mov     edi, edx
-
 
475
            add     edi, 40
470
            lea     edi, [edx + 40]
-
 
471
            lea     esi, [eax + EXT2_DIR_STRUC.name]
476
            lea     esi, [eax + EXT2_DIR_STRUC.name]
472
            call    utf8toansi_str
477
            rep     movsb
473
            ;rep     movsb
478
            pop     esi ecx
474
            pop     esi ecx eax
Line 479... Line 475...
479
            and     byte [edi], 0
475
            and     byte [edi], 0
-
 
476
 
-
 
477
            add     edx, 40 + 264                       ; go to next record
480
 
478
 
481
            add     edx, 40 + 264                       ; go to next record
479
            dec     ecx                                 ; если запись пустая ecx не надо уменьшать
482
        .empty_rec:
480
        .empty_rec:
483
            movzx   ebx, [eax + EXT2_DIR_STRUC.rec_len]
481
            movzx   ebx, [eax + EXT2_DIR_STRUC.rec_len]
484
            add     eax, ebx
-
 
485
            cmp     eax, [EXT2_end_block]
482
            add     eax, ebx
Line 486... Line -...
486
            jae     .end_block_wanted                   ;по хорошему должно быть =, но ччнш
-
 
487
            loop    .wanted_cycle
-
 
488
 
-
 
489
    .wanted_end:                        ;теперь дойдем до конца чтобы узнать сколько файлов в папке
-
 
490
        or      ecx, -1                 ;цикл уже есть, просто поставим ему огромный счетчик
483
            cmp     eax, [EXT2_end_block]
491
        jmp     .find_wanted_cycle
484
            jb      .wanted_start
492
 
485
 
493
    .end_block_find_wanted:                                   ;вылетили из цикла find_wanted
486
    .end_block_wanted:                                      ;вылетели из цикла wanted
Line 494... Line -...
494
        mov     ebx, [ext2_data.count_block_in_block]
-
 
495
        sub     [EXT2_counter_blocks], ebx
487
        mov     ebx, [ext2_data.count_block_in_block]
496
        jz      .end_dir
488
        sub     [EXT2_counter_blocks], ebx
497
 
489
        jz      .end_dir
498
        ;получаем новый блок
490
 
499
        inc     esi
491
        inc     esi
Line 506... Line 498...
506
        pop     ecx
498
        pop     ecx
507
        dec     ecx
499
        dec     ecx
508
        mov     eax, ebx
500
        mov     eax, ebx
509
        add     ebx, [ext2_data.block_size]
501
        add     ebx, [ext2_data.block_size]
510
        mov     [EXT2_end_block], ebx
502
        mov     [EXT2_end_block], ebx
511
        jmp     .find_wanted_start
503
        jmp     .wanted_start
Line 512... Line 504...
512
 
504
 
513
    .end_block_wanted:                                      ;вылетели из цикла wanted
505
    .end_block_find_wanted:                                   ;вылетили из цикла find_wanted
514
        mov     ebx, [ext2_data.count_block_in_block]
506
        mov     ebx, [ext2_data.count_block_in_block]
515
        sub     [EXT2_counter_blocks], ebx
507
        sub     [EXT2_counter_blocks], ebx
Line -... Line 508...
-
 
508
        jz      .end_dir
516
        jz      .end_dir
509
 
517
 
510
        ;получаем новый блок
518
        inc     esi
511
        inc     esi
519
        push    ecx
512
        push    ecx
520
        mov     ecx, esi
513
        mov     ecx, esi
Line 525... Line 518...
525
        pop     ecx
518
        pop     ecx
526
        dec     ecx
519
        dec     ecx
527
        mov     eax, ebx
520
        mov     eax, ebx
528
        add     ebx, [ext2_data.block_size]
521
        add     ebx, [ext2_data.block_size]
529
        mov     [EXT2_end_block], ebx
522
        mov     [EXT2_end_block], ebx
530
        jmp     .wanted_start
523
        jmp     .find_wanted_start
Line 531... Line 524...
531
 
524
 
532
    .end_dir:
525
    .end_dir:
533
        pop     edx
526
        pop     edx
534
        mov     ebx, [EXT2_read_in_folder]
527
        mov     ebx, [EXT2_read_in_folder]
Line 540... Line 533...
540
        lea     edi, [edx + 12]
533
        lea     edi, [edx + 12]
541
        mov     ecx, 20 / 4
534
        mov     ecx, 20 / 4
542
        rep     stosd
535
        rep     stosd
543
        ret
536
        ret
544
;====================== end ext2_HdReadFolder
537
;====================== end ext2_HdReadFolder
-
 
538
utf8toansi_str:
-
 
539
; convert UTF-8 string to ASCII-string (codepage 866)
-
 
540
; in: ecx=length source, esi->source, edi->buffer
-
 
541
; destroys: eax,esi,edi
-
 
542
        jecxz   .ret
-
 
543
    .start:
-
 
544
        lodsw
-
 
545
        cmp     al, 0x80
-
 
546
        jb      .ascii
-
 
547
 
-
 
548
        xchg    al, ah
-
 
549
        cmp     ax, 0xd080
-
 
550
        jz      .yo1
-
 
551
        cmp     ax, 0xd191
-
 
552
        jz      .yo2
-
 
553
        cmp     ax, 0xd090
-
 
554
        jb      .unk
-
 
555
        cmp     ax, 0xd180
-
 
556
        jb      .rus1
-
 
557
        cmp     ax, 0xd190
-
 
558
        jb      .rus2
-
 
559
    .unk:
-
 
560
        mov     al, '_'
-
 
561
        jmp     .doit
-
 
562
    .yo1:
-
 
563
        mov     al, 0xf0    ; Ё capital
-
 
564
        jmp     .doit
-
 
565
    .yo2:
-
 
566
        mov     al, 0xf1    ; ё small
-
 
567
        jmp     .doit
-
 
568
    .rus1:
-
 
569
        sub     ax, 0xd090 - 0x80
-
 
570
        jmp     .doit
-
 
571
    .rus2:
-
 
572
        sub     ax, 0xd18f - 0xEF
-
 
573
    .doit:
-
 
574
        stosb
-
 
575
        sub     ecx, 2
-
 
576
        ja      .start
-
 
577
        ret
-
 
578
 
-
 
579
    .ascii:
-
 
580
        stosb
-
 
581
        dec     esi
-
 
582
        dec     ecx
-
 
583
        jnz     .start
-
 
584
    .ret:
-
 
585
        ret
Line 545... Line 586...
545
 
586
 
546
;----------------------------------------------------------------
587
;----------------------------------------------------------------
547
;
588
;
548
;  ext2_HdRead - read hard disk
589
;  ext2_HdRead - read hard disk
Line 556... Line 597...
556
;  ret ebx = bytes read or 0xffffffff file not found
597
;  ret ebx = bytes read or 0xffffffff file not found
557
;      eax = 0 ok read or other = errormsg
598
;      eax = 0 ok read or other = errormsg
558
;
599
;
559
;--------------------------------------------------------------
600
;--------------------------------------------------------------
560
ext2_HdRead:
601
ext2_HdRead:
561
        xchg    bx, bx
-
 
562
        mov     ebp, [ext2_data.root_inode]
-
 
563
 
-
 
564
        push    ecx edx ebx
-
 
565
    .next_folder:
-
 
566
        push    esi
-
 
567
    @@:
-
 
568
            lodsb
-
 
569
            test    al, al
-
 
570
            jz      .find_end
-
 
571
            cmp     al, '/'
-
 
572
            jz      .find_folder
-
 
573
            jmp     @B
-
 
574
 
-
 
575
    .find_end:
-
 
576
        ;установим флаг что ищем файл или очередную папку
-
 
577
        mov     edi, 1
-
 
578
        jmp     .find_any
-
 
579
    .find_folder:
-
 
580
        xor     edi, edi
-
 
581
    .find_any:
-
 
582
        pop     esi
-
 
583
 
-
 
584
        cmp     byte [esi], 0
602
        cmp     byte [esi], 0
585
        jz      .not_found
-
 
586
 
-
 
587
        or      [EXT2_counter_blocks], -1               ;счетчик блоков папки    cur block of inode
-
 
588
        mov     eax, [ebp + EXT2_INODE_STRUC.i_blocks]  ;убывающий счетчик блоков
-
 
589
        add     eax, [ext2_data.count_block_in_block]
-
 
590
        mov     [EXT2_end_block], eax
-
 
591
    .next_block_folder:
-
 
592
        mov     eax, [ext2_data.count_block_in_block]
-
 
593
        sub     [EXT2_end_block], eax
-
 
594
        jz      .not_found
-
 
595
        inc     [EXT2_counter_blocks]
-
 
596
        mov     ecx, [EXT2_counter_blocks]
-
 
597
        call    ext2_get_inode_block
-
 
598
 
-
 
599
        mov     eax, ecx
-
 
600
        mov     ebx, [ext2_data.ext2_save_block]        ;ebx = cur dir record
-
 
601
        call    ext2_get_block
-
 
602
 
-
 
603
        mov     eax, esi
-
 
604
        call    ext2_test_block_by_name
-
 
605
        cmp     eax, esi                                ;нашли имя?
-
 
606
        je      .next_block_folder
-
 
607
 
-
 
608
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_REG_FILE
-
 
609
        je      .test_file
-
 
610
        cmp     [ebx + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR
-
 
611
        jne     .this_is_nofile
-
 
612
 
-
 
613
    ;.test_dir:
-
 
614
        cmp     edi, 0
-
 
615
        jne     .this_is_nofile
-
 
616
 
-
 
617
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
-
 
618
        mov     ebx, [ext2_data.ext2_save_inode]                ;все же папка.
-
 
619
        call    ext2_get_inode
-
 
620
        mov     ebp, ebx
-
 
621
        jmp     .next_folder
-
 
622
 
-
 
623
    .test_file:
-
 
624
        cmp     edi, 0
603
        jnz     @F
625
        je      .not_found
-
 
626
 
-
 
627
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
-
 
628
        mov     ebx, [ext2_data.ext2_save_inode]
-
 
629
        call    ext2_get_inode
-
 
630
        jmp     .get_file
-
 
Line 631... Line -...
631
 
-
 
632
    .not_found:
-
 
633
    	pop     edx ecx ebx
-
 
634
        or      ebx, -1
-
 
635
        mov     eax, ERROR_FILE_NOT_FOUND
-
 
636
        ret
604
 
637
    .this_is_nofile:
-
 
638
        pop     edx ecx ebx
605
    .this_is_nofile:
639
        or      ebx, -1
606
        or      ebx, -1
640
        mov     eax, ERROR_ACCESS_DENIED
607
        mov     eax, ERROR_ACCESS_DENIED
Line -... Line 608...
-
 
608
        ret
-
 
609
 
-
 
610
    @@:
-
 
611
        push    ecx ebx
-
 
612
        call    ext2_find_lfn
-
 
613
        pop     ebx ecx
-
 
614
        jnc     .doit
-
 
615
    ;.not_found:
-
 
616
        or      ebx, -1
-
 
617
        mov     eax, ERROR_FILE_NOT_FOUND
-
 
618
        ret
-
 
619
 
-
 
620
    .doit:
-
 
621
        test    [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFREG
641
        ret
622
        jz      .this_is_nofile
642
 
-
 
643
    ;-----------------------------------------------------------------------------final step
-
 
Line 644... Line 623...
644
    .get_file:
623
 
645
        mov     ebp ,ebx
-
 
646
 
624
    ;-----------------------------------------------------------------------------final step
Line 647... Line 625...
647
        ;pop     eax edi ecx         ; первый_блок память кол-во_байт
625
 
648
        mov     esi, [esp]
626
        mov     edi, edx            ; edi = pointer to return mem
649
        mov     edi, [esp + 8]      ;edi = нужно считать байт
627
        mov     esi, ebx            ; esi = pointer to first_wanted
Line 650... Line 628...
650
 
628
 
651
        ;///// сравним хватит ли нам файла или нет
629
        ;///// сравним хватит ли нам файла или нет
Line 652... Line 630...
652
        mov     ebx, [esi+4]
630
        mov     ebx, [esi+4]
653
        mov     eax, [esi]          ; ebx : eax - стартовый номер байта
631
        mov     eax, [esi]          ; ebx : eax - стартовый номер байта
654
 
632
 
Line 655... Line 633...
655
        mov     edx, [ebp + EXT2_INODE_STRUC.i_dir_acl]
633
   ;    mov     edx, [ebp + EXT2_INODE_STRUC.i_dir_acl]
656
        mov     ecx, [ebp + EXT2_INODE_STRUC.i_size]        ;edx : ecx - размер файла
634
   ;    mov     ecx, [ebp + EXT2_INODE_STRUC.i_size]        ;edx : ecx - размер файла
Line 657... Line 635...
657
 
635
 
658
        cmp     edx, ebx
636
        cmp     [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx
659
        ja      .size_great
637
        ja      .size_great
660
        jb      .size_less
638
        jb      .size_less
661
 
639
 
662
        cmp     ecx, eax
640
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
663
        ja      .size_great
641
        ja      .size_great
664
 
642
 
665
    .size_less:
-
 
666
        add     esp, 12
-
 
667
        mov     ebx, 0
643
    .size_less:
668
        mov     eax, 6      ;EOF
644
        pop     ecx
669
        ret
645
        xor     ebx, ebx
670
    .size_great:
646
        mov     eax, 6      ;EOF
671
        ;прибавим к старту кол-во байт для чтения
647
        ret
672
        add     eax, edi
-
 
673
        jnc     @F
-
 
674
        inc     ebx
648
    .size_great:
-
 
649
        add     eax, ecx                  ;add to first_wanted кол-во байт для чтения
675
    @@:
650
        adc     ebx, 0
676
        cmp     edx, ebx
651
 
677
        ja      .size_great_great
652
        cmp     [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx
678
        jb      .size_great_less
653
        ja      .size_great_great
679
        cmp     ecx, eax
654
        jb      .size_great_less
Line 680... Line 655...
680
        jae     .size_great_great
655
        cmp     [ebp + EXT2_INODE_STRUC.i_size], eax
681
        ;jmp      .size_great_less
656
        jae     .size_great_great               ; а если равно, то не важно куда
682
                                                ; а если равно, то не важно куда
-
 
Line 683... Line 657...
683
    .size_great_less:
657
 
684
        or      [EXT2_files_in_folder], 1       ;читаем по границе размера
658
    .size_great_less:
685
        sub     ecx, [esi]
659
        or      [EXT2_files_in_folder], 1       ;читаем по границе размера
686
        pop     eax edi edx                     ;ecx - не меняем
660
        mov     ecx, [ebp + EXT2_INODE_STRUC.i_size]
Line 687... Line 661...
687
        jmp     @F
661
        sub     ecx, [esi]                      ;(размер - старт)
688
 
662
        jmp     @F
689
    .size_great_great:
663
 
690
        and     [EXT2_files_in_folder], 0       ;читаем нормально
664
    .size_great_great:
Line 691... Line 665...
691
        pop     eax edi ecx
665
        and     [EXT2_files_in_folder], 0       ;читаем столько сколько запросили
Line 692... Line 666...
692
 
666
 
Line 710... Line 684...
710
        call    ext2_get_block
684
        call    ext2_get_block
711
        pop     ecx
685
        pop     ecx
712
        add     ebx, edx
686
        add     ebx, edx
Line 713... Line 687...
713
 
687
 
714
        neg     edx
688
        neg     edx
715
        add     edx,[ext2_data.block_size]      ;block_size - стартоый блок = сколько байт 1-го блока
689
        add     edx,[ext2_data.block_size]      ;block_size - стартовый байт = сколько байт 1-го блока
716
        cmp     ecx, edx
690
        cmp     ecx, edx
Line 717... Line 691...
717
        jbe     .only_one_block
691
        jbe     .only_one_block
718
 
692
 
Line 724... Line 698...
724
        rep     movsb                           ;кусок 1-го блока
698
        rep     movsb                           ;кусок 1-го блока
725
        jmp     @F
699
        jmp     @F
Line 726... Line 700...
726
 
700
 
727
    .zero_start:
701
    .zero_start:
728
        mov     eax, ecx
-
 
729
        mov     ebx, edi                        ;чтение блока прям в ebx
702
        mov     eax, ecx
730
        ;теперь в eax кол-во оставшихся байт для чтения
703
        ;теперь в eax кол-во оставшихся байт для чтения
-
 
704
    @@:
731
    @@:
705
        mov     ebx, edi                        ;чтение блока прям в ->ebx
732
        xor     edx, edx
706
        xor     edx, edx
733
        div     [ext2_data.block_size]          ;кол-во байт в последнем блоке (остаток) в edx
707
        div     [ext2_data.block_size]          ;кол-во байт в последнем блоке (остаток) в edx
734
        mov     [EXT2_end_block], eax           ;кол-во целых блоков в EXT2_end_block
708
        mov     edi, eax                        ;кол-во целых блоков в edi
735
    @@:
709
    @@:
736
        cmp     [EXT2_end_block], 0
710
        test     edi, edi
737
        jz      .finish_block
711
        jz      .finish_block
738
        inc     [EXT2_counter_blocks]
712
        inc     [EXT2_counter_blocks]
739
        mov     ecx, [EXT2_counter_blocks]
713
        mov     ecx, [EXT2_counter_blocks]
Line 740... Line 714...
740
        call    ext2_get_inode_block
714
        call    ext2_get_inode_block
741
 
715
 
742
        mov     eax, ecx            ;а ebx уже забит нужным значением
716
        mov     eax, ecx                        ;а ebx уже забит нужным значением
Line 743... Line 717...
743
        call    ext2_get_block
717
        call    ext2_get_block
744
        add     ebx, [ext2_data.block_size]
718
        add     ebx, [ext2_data.block_size]
Line 745... Line 719...
745
 
719
 
746
        dec     [EXT2_end_block]
720
        dec     edi
747
        jmp     @B
721
        jmp     @B
Line 748... Line 722...
748
 
722
 
749
    .finish_block:          ;в edx - кол-во байт в последнем блоке
723
    .finish_block:          ;в edx - кол-во байт в последнем блоке
750
        cmp     edx, 0
724
        test    edx, edx
Line 819... Line 793...
819
    .get_inode_ret:
793
    .get_inode_ret:
820
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
794
        mov     eax, [ebx + EXT2_DIR_STRUC.inode]
821
        mov     ebx, [ext2_data.ext2_save_inode]
795
        mov     ebx, [ext2_data.ext2_save_inode]
822
        call    ext2_get_inode
796
        call    ext2_get_inode
823
        mov     ebp, ebx
797
        mov     ebp, ebx
824
    .ret:
-
 
825
        clc
798
        clc
826
        ret
799
        ret
Line 827... Line 800...
827
 
800