| 621 | |
| 622 | |
| 623 | NTSTATUS |
| 624 | Ext2TruncateBlock( |
| 625 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 626 | IN PEXT2_VCB Vcb, |
| 627 | IN PEXT2_MCB Mcb, |
| 628 | IN ULONG Base, |
| 629 | IN ULONG Start, |
| 630 | IN ULONG Layer, |
| 631 | IN ULONG SizeArray, |
| 632 | IN PULONG BlockArray, |
| 633 | IN PULONG Extra |
| 634 | ) |
| 635 | { |
| 636 | NTSTATUS Status = STATUS_SUCCESS; |
| 637 | ULONG i = 0; |
| 638 | ULONG Slot = 0; |
| 639 | ULONG Skip = 0; |
| 640 | |
| 641 | LONGLONG Offset; |
| 642 | PBCB Bcb = NULL; |
| 643 | PULONG pData = NULL; |
| 644 | |
| 645 | ASSERT(Mcb != NULL); |
| 646 | |
| 647 | for (i = 0; i < SizeArray; i++) { |
| 648 | |
| 649 | if (Layer == 0) { |
| 650 | |
| 651 | ULONG Number = 1; |
| 652 | |
| 653 | while (Extra && SizeArray > i + 1 && Number < *Extra) { |
| 654 | |
| 655 | if (BlockArray[SizeArray - i - 1] == |
| 656 | BlockArray[SizeArray - i - 2] + 1) { |
| 657 | |
| 658 | BlockArray[SizeArray - i - 1] = 0; |
| 659 | Number++; |
| 660 | SizeArray--; |
| 661 | |
| 662 | } else { |
| 663 | break; |
| 664 | } |
| 665 | } |
| 666 | |
| 667 | if (BlockArray[SizeArray - i - 1]) { |
| 668 | |
| 669 | Status = Ext2FreeBlock(IrpContext, Vcb, BlockArray[SizeArray - i - 1], Number); |
| 670 | if (NT_SUCCESS(Status)) { |
| 671 | ASSERT(Mcb->Inode.i_blocks >= (Number << (BLOCK_BITS - 9))); |
| 672 | if (Mcb->Inode.i_blocks < (Number << (BLOCK_BITS - 9))) { |
| 673 | Mcb->Inode.i_blocks = 0; |
| 674 | DbgBreak(); |
| 675 | } else { |
| 676 | Mcb->Inode.i_blocks -= (Number << (BLOCK_BITS - 9)); |
| 677 | } |
| 678 | BlockArray[SizeArray - i - 1] = 0; |
| 679 | } |
| 680 | } |
no test coverage detected