public static MBR getMBR(byte[] bytes) { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); MBR mbr = (MBR)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(MBR)); handle.Free(); return(mbr); }
/// <summary> /// Create MBR sector (512 bytes) with partitions specified in a parameter list /// </summary> /// <param name="partitions">List of partition descriptors</param> /// <returns>512 bytes array with MBR disk sector content</returns> public static byte[] createMBRSector(List <PartitionInfo> partitions) { byte[] result = new byte[512]; if (partitions != null && partitions.Count > 0) { MBR mbr = new MBR(getDiskSignature()); int idx = 0; foreach (PartitionInfo partition in partitions) { // There can be only 4 primary partitions in MBR if (idx >= 4) { break; } MBRPartitionEntry mbrPartition = new MBRPartitionEntry(); mbrPartition.partitionType = Convert.ToByte(partition.type); mbrPartition.lbaFirstSector = partition.offsetStart; mbrPartition.partitionLengthSectors = partition.length; // Since CLR does not allow arrays not aligned to x4 - workaround to address particular instances switch (idx) { case 0: mbr.partition1 = mbrPartition; break; case 1: mbr.partition2 = mbrPartition; break; case 2: mbr.partition3 = mbrPartition; break; case 3: mbr.partition4 = mbrPartition; break; } idx++; } result = getBytes(mbr); } return(result); }