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 |