Rev 1398 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1398 | Rev 1400 | ||
---|---|---|---|
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: 1398 $ |
11 | $Revision: 1400 $ |
12 | 12 | ||
13 | EXT2_BAD_INO = 1 |
13 | EXT2_BAD_INO = 1 |
14 | EXT2_ROOT_INO = 2 |
14 | EXT2_ROOT_INO = 2 |
Line 34... | Line 34... | ||
34 | EXT2_S_IROTH = 0x0001 |
34 | EXT2_S_IROTH = 0x0001 |
Line 35... | Line 35... | ||
35 | 35 | ||
36 | EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге |
36 | EXT2_FT_REG_FILE = 1 ;это файл, запись в родительском каталоге |
Line -... | Line 37... | ||
- | 37 | EXT2_FT_DIR = 2 ;это папка |
|
37 | EXT2_FT_DIR = 2 ;это папка |
38 | |
38 | 39 | FS_FT_HIDDEN = 2 |
|
39 | FS_FT_DIR = 0x10 ;это папка |
40 | FS_FT_DIR = 0x10 ;это папка |
Line 40... | Line 41... | ||
40 | FS_FT_ASCII = 0 ;имя в ascii |
41 | FS_FT_ASCII = 0 ;имя в ascii |
Line 429... | Line 430... | ||
429 | movzx ebx, [eax+EXT2_DIR_STRUC.rec_len] |
430 | movzx ebx, [eax+EXT2_DIR_STRUC.rec_len] |
430 | add eax, ebx ; к следующей записи |
431 | add eax, ebx ; к следующей записи |
431 | cmp eax, [EXT2_end_block] ; проверяем "конец" |
432 | cmp eax, [EXT2_end_block] ; проверяем "конец" |
432 | jb .find_wanted_start |
433 | jb .find_wanted_start |
Line -... | Line 434... | ||
- | 434 | ||
433 | 435 | push .find_wanted_start |
|
434 | .end_block_find_wanted: ;вылетили из цикла find_wanted |
436 | .end_block: ;вылетили из цикла |
435 | mov ebx, [ext2_data.count_block_in_block] |
437 | mov ebx, [ext2_data.count_block_in_block] |
436 | sub [EXT2_counter_blocks], ebx |
438 | sub [EXT2_counter_blocks], ebx |
Line 437... | Line 439... | ||
437 | jz .end_dir |
439 | jbe .end_dir |
438 | - | ||
439 | ;получаем новый блок |
440 | |
440 | inc esi |
441 | inc esi ;получаем новый блок |
441 | push ecx |
442 | push ecx |
442 | mov ecx, esi |
443 | mov ecx, esi |
443 | call ext2_get_inode_block |
444 | call ext2_get_inode_block |
444 | mov eax, ecx |
445 | mov eax, ecx |
445 | mov ebx, [ext2_data.ext2_save_block] |
446 | mov ebx, [ext2_data.ext2_save_block] |
446 | call ext2_get_block |
- | |
447 | pop ecx |
447 | call ext2_get_block |
448 | dec ecx |
448 | pop ecx |
449 | mov eax, ebx |
449 | mov eax, ebx |
- | 450 | add ebx, [ext2_data.block_size] |
|
- | 451 | mov [EXT2_end_block], ebx |
|
450 | add ebx, [ext2_data.block_size] |
452 | ret ; опять в цикл |
- | 453 | ||
Line 451... | Line 454... | ||
451 | mov [EXT2_end_block], ebx |
454 | .wanted_end: |
452 | jmp .find_wanted_start |
455 | loop .find_wanted_cycle ; ecx = -1 |
453 | - | ||
454 | .find_wanted_end: |
456 | |
455 | mov ecx, edi |
457 | .find_wanted_end: |
456 | 458 | mov ecx, edi |
|
457 | .wanted_start: ; ищем first_wanted+count |
459 | .wanted_start: ; ищем first_wanted+count |
458 | jecxz .find_wanted_cycle ; ecx=0 => огромный цикл до конца папки |
460 | jecxz .wanted_end |
459 | cmp [eax + EXT2_DIR_STRUC.inode], 0 ; if (inode = 0) => not used |
461 | cmp [eax + EXT2_DIR_STRUC.inode], 0 ; if (inode = 0) => not used |
Line 466... | Line 468... | ||
466 | xor eax, eax |
468 | xor eax, eax |
467 | mov ecx, 40 / 4 |
469 | mov ecx, 40 / 4 |
468 | rep stosd |
470 | rep stosd |
469 | pop ecx eax |
471 | pop ecx eax |
Line 470... | Line -... | ||
470 | - | ||
471 | cmp [eax + EXT2_DIR_STRUC.file_type], EXT2_FT_DIR ;папка или нет |
- | |
472 | jz @F |
- | |
473 | 472 | ||
474 | push eax ;получим размер, если это файл |
473 | push eax esi edx ;получим inode |
475 | mov eax, [eax + EXT2_DIR_STRUC.inode] |
474 | mov eax, [eax + EXT2_DIR_STRUC.inode] |
476 | mov ebx, [ext2_data.ext2_temp_inode] |
475 | mov ebx, [ext2_data.ext2_temp_inode] |
- | 476 | call ext2_get_inode |
|
- | 477 | ||
- | 478 | lea edi, [edx + 8] |
|
- | 479 | ||
- | 480 | mov eax, [ebx + EXT2_INODE_STRUC.i_ctime] ; переведем время в ntfs формат |
|
- | 481 | xor edx, edx |
|
- | 482 | add eax, 3054539008 ;(369 * 365 + 89) * 24 * 3600 |
|
- | 483 | adc edx, 2 |
|
- | 484 | call ntfs_datetime_to_bdfe.sec |
|
- | 485 | ||
- | 486 | mov eax, [ebx + EXT2_INODE_STRUC.i_atime] |
|
- | 487 | xor edx, edx |
|
- | 488 | add eax, 3054539008 |
|
- | 489 | adc edx, 2 |
|
- | 490 | call ntfs_datetime_to_bdfe.sec |
|
- | 491 | ||
- | 492 | mov eax, [ebx + EXT2_INODE_STRUC.i_mtime] |
|
- | 493 | xor edx, edx |
|
- | 494 | add eax, 3054539008 |
|
- | 495 | adc edx, 2 |
|
- | 496 | call ntfs_datetime_to_bdfe.sec |
|
- | 497 | ||
- | 498 | pop edx ; пока достаем только буфер |
|
- | 499 | test [ebx + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR ; для папки размер |
|
- | 500 | jnz @F ; не возвращаем |
|
477 | call ext2_get_inode |
501 | |
- | 502 | mov eax, [ebx + EXT2_INODE_STRUC.i_size] ;low size |
|
478 | mov eax, [ebx + EXT2_INODE_STRUC.i_size] ;low size |
503 | stosd |
479 | mov ebx, [ebx + EXT2_INODE_STRUC.i_dir_acl] ;high size |
504 | mov eax, [ebx + EXT2_INODE_STRUC.i_dir_acl] ;high size |
480 | mov dword [edx+32], eax |
505 | stosd |
481 | mov dword [edx+36], ebx |
- | |
482 | xor dword [edx], FS_FT_DIR ; для файлов xor - 2 раза |
- | |
483 | pop eax |
506 | xor dword [edx], FS_FT_DIR |
484 | @@: |
507 | @@: |
- | 508 | xor dword [edx], FS_FT_DIR |
|
- | 509 | pop esi eax |
|
485 | xor dword [edx], FS_FT_DIR |
510 | |
Line 486... | Line 511... | ||
486 | or dword [edx+4], FS_FT_ASCII ; symbol type in name |
511 | or dword [edx+4], FS_FT_ASCII ; symbol type in name |
487 | 512 | ||
488 | ;теперь скопируем название, сконвертировав из UTF-8 в CP866 |
513 | ;теперь скопируем имя, сконвертировав из UTF-8 в CP866 |
489 | push eax ecx esi |
514 | push eax ecx esi |
490 | movzx ecx, [eax + EXT2_DIR_STRUC.name_len] |
515 | movzx ecx, [eax + EXT2_DIR_STRUC.name_len] |
491 | lea edi, [edx + 40] |
516 | lea edi, [edx + 40] |
492 | lea esi, [eax + EXT2_DIR_STRUC.name] |
517 | lea esi, [eax + EXT2_DIR_STRUC.name] |
493 | call utf8toansi_str |
518 | call utf8toansi_str |
Line -... | Line 519... | ||
- | 519 | pop esi ecx eax |
|
- | 520 | and byte [edi], 0 |
|
494 | pop esi ecx eax |
521 | |
- | 522 | cmp byte [edx + 40], '.' |
|
Line -... | Line 523... | ||
- | 523 | jne @F |
|
495 | and byte [edi], 0 |
524 | or dword [edx], FS_FT_HIDDEN |
496 | 525 | @@: |
|
497 | add edx, 40 + 264 ; go to next record |
526 | |
498 | 527 | add edx, 40 + 264 ; go to next record |
|
499 | dec ecx ; если запись пустая ecx не надо уменьшать |
528 | dec ecx ; если запись пустая ecx не надо уменьшать |
500 | .empty_rec: |
529 | .empty_rec: |
Line 501... | Line 530... | ||
501 | movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] |
530 | movzx ebx, [eax + EXT2_DIR_STRUC.rec_len] |
502 | add eax, ebx |
- | |
503 | cmp eax, [EXT2_end_block] |
- | |
504 | jb .wanted_start |
531 | add eax, ebx |
505 | - | ||
506 | .end_block_wanted: ;вылетели из цикла wanted |
- | |
507 | mov ebx, [ext2_data.count_block_in_block] |
- | |
508 | sub [EXT2_counter_blocks], ebx |
- | |
509 | jz .end_dir |
- | |
510 | - | ||
511 | inc esi |
- | |
512 | push ecx |
- | |
513 | mov ecx, esi |
- | |
514 | call ext2_get_inode_block |
- | |
515 | mov eax, ecx |
- | |
516 | mov ebx, [ext2_data.ext2_save_block] |
- | |
517 | call ext2_get_block |
- | |
518 | pop ecx |
- | |
519 | dec ecx |
- | |
520 | mov eax, ebx |
- | |
521 | add ebx, [ext2_data.block_size] |
- | |
522 | mov [EXT2_end_block], ebx |
- | |
Line 523... | Line 532... | ||
523 | jmp .wanted_start |
532 | cmp eax, [EXT2_end_block] |
- | 533 | jb .wanted_start |
|
524 | 534 | ||
525 | .wanted_end: |
535 | push .wanted_start ; дошли до конца очередного блока |
526 | dec ecx |
536 | jmp .end_block |
527 | jmp .find_wanted_cycle |
537 | |
528 | 538 | .end_dir: |
|
Line 547... | Line 557... | ||
547 | .start: |
557 | .start: |
548 | lodsw |
558 | lodsw |
549 | cmp al, 0x80 |
559 | cmp al, 0x80 |
550 | jb .ascii |
560 | jb .ascii |
Line 551... | Line 561... | ||
551 | 561 | ||
552 | xchg al, ah |
562 | xchg al, ah ; big-endian |
553 | cmp ax, 0xd080 |
563 | cmp ax, 0xd080 |
554 | jz .yo1 |
564 | jz .yo1 |
555 | cmp ax, 0xd191 |
565 | cmp ax, 0xd191 |
556 | jz .yo2 |
566 | jz .yo2 |
Line 624... | Line 634... | ||
624 | .doit: |
634 | .doit: |
625 | test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFREG |
635 | test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFREG |
626 | jz .this_is_nofile |
636 | jz .this_is_nofile |
Line 627... | Line 637... | ||
627 | 637 | ||
628 | ;-----------------------------------------------------------------------------final step |
- | |
629 | 638 | ;-----------------------------------------------------------------------------final step |
|
630 | mov edi, edx ; edi = pointer to return mem |
639 | mov edi, edx ; edi = pointer to return mem |
Line 631... | Line 640... | ||
631 | mov esi, ebx ; esi = pointer to first_wanted |
640 | mov esi, ebx ; esi = pointer to first_wanted |
632 | 641 | ||
633 | ;///// сравним хватит ли нам файла или нет |
642 | ;///// сравним хватит ли нам файла или нет |
Line 634... | Line -... | ||
634 | mov ebx, [esi+4] |
- | |
635 | mov eax, [esi] ; ebx : eax - стартовый номер байта |
- | |
636 | - | ||
637 | ; mov edx, [ebp + EXT2_INODE_STRUC.i_dir_acl] |
643 | mov ebx, [esi+4] |
638 | ; mov ecx, [ebp + EXT2_INODE_STRUC.i_size] ;edx : ecx - размер файла |
644 | mov eax, [esi] ; ebx : eax - стартовый номер байта |
639 | 645 | ||
Line 640... | Line 646... | ||
640 | cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx |
646 | cmp [ebp + EXT2_INODE_STRUC.i_dir_acl], ebx |
641 | ja .size_great |
647 | ja .size_great |
Line 642... | Line 648... | ||
642 | jb .size_less |
648 | jb .size_less |
643 | - | ||
644 | cmp [ebp + EXT2_INODE_STRUC.i_size], eax |
649 | |
645 | ja .size_great |
650 | cmp [ebp + EXT2_INODE_STRUC.i_size], eax |
646 | 651 | ja .size_great |
|
647 | .size_less: |
652 | |
648 | pop ecx |
653 | .size_less: |
Line 751... | Line 756... | ||
751 | ret |
756 | ret |
752 | @@: |
757 | @@: |
753 | xor eax, eax |
758 | xor eax, eax |
754 | ret |
759 | ret |
755 | ;======================== |
760 | ;======================== |
756 | ;in : esi -> name not save register |
761 | ;in : esi -> name not save: eax ebx ecx |
757 | ;out: ebp -> inode cf=0 |
762 | ;out: ebp -> inode cf=0 |
758 | ; ebp -> trash cf=1 |
763 | ; ebp -> trash cf=1 |
759 | ext2_find_lfn: |
764 | ext2_find_lfn: |
760 | mov ebp, [ext2_data.root_inode] |
765 | mov ebp, [ext2_data.root_inode] |
761 | .next_folder: |
766 | .next_folder: |
Line 793... | Line 798... | ||
793 | 798 | ||
794 | .not_found: |
799 | .not_found: |
795 | stc |
800 | stc |
796 | ret |
801 | ret |
- | 802 | .get_inode_ret: |
|
797 | .get_inode_ret: |
803 | mov [EXT2_end_block], ebx ; сохраняем указатеть на dir_rec |
798 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
804 | mov eax, [ebx + EXT2_DIR_STRUC.inode] |
799 | mov ebx, [ext2_data.ext2_save_inode] |
805 | mov ebx, [ext2_data.ext2_save_inode] |
800 | call ext2_get_inode |
806 | call ext2_get_inode |
801 | mov ebp, ebx |
807 | mov ebp, ebx |
Line 831... | Line 837... | ||
831 | mov eax, ERROR_FILE_NOT_FOUND |
837 | mov eax, ERROR_FILE_NOT_FOUND |
832 | ret |
838 | ret |
Line 833... | Line 839... | ||
833 | 839 | ||
834 | .doit: |
840 | .doit: |
- | 841 | mov ebp, [ext2_data.root_inode] |
|
- | 842 | mov ebx, .doit ;неважно что лишь бы этому адресу не '.' |
|
835 | mov ebp, [ext2_data.root_inode] |
843 | jmp @F |
- | 844 | .doit2: |
|
- | 845 | mov ebx, [EXT2_end_block] |
|
- | 846 | add ebx, EXT2_DIR_STRUC.name |
|
836 | .doit2: |
847 | @@: |
837 | xor eax, eax |
848 | xor eax, eax |
838 | mov edi, edx |
849 | mov edi, edx |
839 | mov ecx, 40/4 |
850 | mov ecx, 40/4 |
Line 840... | Line 851... | ||
840 | rep stosd ; fill zero |
851 | rep stosd ; fill zero |
841 | 852 | ||
842 | test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR |
853 | cmp byte [ebx], '.' |
843 | jz @F |
854 | jnz @F |
- | 855 | or dword [edx], FS_FT_HIDDEN |
|
844 | or dword [edx], FS_FT_DIR |
856 | @@: |
- | 857 | ||
845 | @@: |
858 | test [ebp + EXT2_INODE_STRUC.i_mode], EXT2_S_IFDIR |
846 | mov byte [edx+1], FS_FT_ASCII |
859 | jnz @F |
847 | mov eax, [ebp + EXT2_INODE_STRUC.i_size] ;low size |
860 | mov eax, [ebp + EXT2_INODE_STRUC.i_size] ;low size |
848 | mov ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl] ;high size |
861 | mov ebx, [ebp + EXT2_INODE_STRUC.i_dir_acl] ;high size |
- | 862 | mov dword [edx+32], eax |
|
- | 863 | mov dword [edx+36], ebx |
|
- | 864 | xor dword [edx], FS_FT_DIR |
|
- | 865 | @@: |
|
- | 866 | xor dword [edx], FS_FT_DIR |
|
- | 867 | ||
- | 868 | lea edi, [edx + 8] |
|
- | 869 | mov eax, [ebx + EXT2_INODE_STRUC.i_ctime] |
|
- | 870 | xor edx, edx |
|
- | 871 | add eax, 3054539008 |
|
- | 872 | adc edx, 2 |
|
- | 873 | call ntfs_datetime_to_bdfe.sec |
|
- | 874 | ||
- | 875 | mov eax, [ebx + EXT2_INODE_STRUC.i_atime] |
|
- | 876 | xor edx, edx |
|
- | 877 | add eax, 3054539008 |
|
- | 878 | adc edx, 2 |
|
- | 879 | call ntfs_datetime_to_bdfe.sec |
|
- | 880 | ||
- | 881 | mov eax, [ebx + EXT2_INODE_STRUC.i_mtime] |
|
- | 882 | xor edx, edx |
|
- | 883 | add eax, 3054539008 |
|
Line 849... | Line 884... | ||
849 | mov dword [edx+32], eax |
884 | adc edx, 2 |
850 | mov dword [edx+36], ebx |
885 | call ntfs_datetime_to_bdfe.sec |
Line 851... | Line 886... | ||
851 | 886 |