| 647 | } |
| 648 | |
| 649 | NT::NTSTATUS |
| 650 | Ext2SetDriveLayout( |
| 651 | HANDLE Handle, |
| 652 | PDRIVE_LAYOUT_INFORMATION_EXT Layout |
| 653 | ) |
| 654 | { |
| 655 | NT::IO_STATUS_BLOCK ioSb; |
| 656 | NT::NTSTATUS status = STATUS_SUCCESS; |
| 657 | ULONG dataSize; |
| 658 | |
| 659 | dataSize = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EXT, PartitionEntry); |
| 660 | dataSize += sizeof(PARTITION_INFORMATION_EXT) * Layout->PartitionCount; |
| 661 | |
| 662 | if (IsWindows2000()) { |
| 663 | |
| 664 | if (Layout->PartitionStyle != PARTITION_STYLE_MBR) { |
| 665 | return STATUS_UNSUCCESSFUL; |
| 666 | } |
| 667 | |
| 668 | ULONG newLayoutSize = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, PartitionEntry); |
| 669 | newLayoutSize += sizeof(PARTITION_INFORMATION) * Layout->PartitionCount; |
| 670 | |
| 671 | PDRIVE_LAYOUT_INFORMATION oldLayout = |
| 672 | (PDRIVE_LAYOUT_INFORMATION ) malloc(newLayoutSize); |
| 673 | if (!oldLayout) { |
| 674 | goto errorout; |
| 675 | } |
| 676 | |
| 677 | oldLayout->PartitionCount = Layout->PartitionCount; |
| 678 | oldLayout->Signature = Layout->Mbr.Signature; |
| 679 | |
| 680 | for (DWORD i=0; i < oldLayout->PartitionCount; i++) { |
| 681 | |
| 682 | oldLayout->PartitionEntry[i].StartingOffset = |
| 683 | Layout->PartitionEntry[i].StartingOffset; |
| 684 | oldLayout->PartitionEntry[i].PartitionLength = |
| 685 | Layout->PartitionEntry[i].PartitionLength; |
| 686 | oldLayout->PartitionEntry[i].PartitionNumber = |
| 687 | Layout->PartitionEntry[i].PartitionNumber; |
| 688 | oldLayout->PartitionEntry[i].RewritePartition = |
| 689 | Layout->PartitionEntry[i].RewritePartition; |
| 690 | oldLayout->PartitionEntry[i].PartitionType = |
| 691 | Layout->PartitionEntry[i].Mbr.PartitionType; |
| 692 | oldLayout->PartitionEntry[i].BootIndicator = |
| 693 | Layout->PartitionEntry[i].Mbr.BootIndicator; |
| 694 | oldLayout->PartitionEntry[i].RecognizedPartition = |
| 695 | Layout->PartitionEntry[i].Mbr.RecognizedPartition; |
| 696 | oldLayout->PartitionEntry[i].HiddenSectors = |
| 697 | Layout->PartitionEntry[i].Mbr.HiddenSectors; |
| 698 | } |
| 699 | |
| 700 | status = NT::ZwDeviceIoControlFile( |
| 701 | Handle, NULL, NULL, NULL, &ioSb, |
| 702 | IOCTL_DISK_SET_DRIVE_LAYOUT, |
| 703 | (PVOID)oldLayout, newLayoutSize, |
| 704 | NULL, 0 |
| 705 | ); |
| 706 |
no test coverage detected