diff --git a/DiscImageChef.DiscImages/VDI.cs b/DiscImageChef.DiscImages/VDI.cs
index a39c5c85..de63a166 100644
--- a/DiscImageChef.DiscImages/VDI.cs
+++ b/DiscImageChef.DiscImages/VDI.cs
@@ -40,6 +40,9 @@ using DiscImageChef.Filters;
namespace DiscImageChef.DiscImages
{
+ // TODO: Support version 0
+ // TODO: Support fixed images
+ // TODO: Support version 1.2 geometry
public class Vdi : IMediaImage
{
const uint VDI_MAGIC = 0xBEDA107F;
@@ -51,6 +54,7 @@ namespace DiscImageChef.DiscImages
const string SUN_VDI = "<<< Sun VirtualBox Disk Image >>>\n";
const string INNOTEK_VDI = "<<< innotek VirtualBox Disk Image >>>\n";
const string INNOTEK_OLD_VDI = "<<< InnoTek VirtualBox Disk Image >>>\n";
+ const string DIC_VDI = "<<< DiscImageChef VirtualBox Disk Image >>>\n";
const uint MAX_CACHE_SIZE = 16777216;
const uint MAX_CACHED_SECTORS = MAX_CACHE_SIZE / 512;
@@ -145,7 +149,7 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.headerSize = {0}", vHdr.headerSize);
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.imageType = {0}", vHdr.imageType);
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.imageFlags = {0}", vHdr.imageFlags);
- DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.description = {0}", vHdr.description);
+ DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.description = {0}", vHdr.comments);
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.offsetBlocks = {0}", vHdr.offsetBlocks);
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.offsetData = {0}", vHdr.offsetData);
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.cylinders = {0}", vHdr.cylinders);
@@ -162,6 +166,9 @@ namespace DiscImageChef.DiscImages
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.linkUuid = {0}", vHdr.linkUuid);
DicConsole.DebugWriteLine("VirtualBox plugin", "vHdr.parentUuid = {0}", vHdr.parentUuid);
+ if(vHdr.imageType != VdiImageType.Normal)
+ throw new FeatureSupportedButNotImplementedImageException($"Support for image type {vHdr.imageType} not yet implemented");
+
DicConsole.DebugWriteLine("VirtualBox plugin", "Reading Image Block Map");
stream.Seek(vHdr.offsetBlocks, SeekOrigin.Begin);
ibm = new uint[vHdr.blocks];
@@ -179,7 +186,7 @@ namespace DiscImageChef.DiscImages
imageInfo.SectorSize = vHdr.sectorSize;
imageInfo.XmlMediaType = XmlMediaType.BlockMedia;
imageInfo.MediaType = MediaType.GENERIC_HDD;
- imageInfo.Comments = vHdr.description;
+ imageInfo.Comments = vHdr.comments;
imageInfo.Version = $"{vHdr.majorVersion}.{vHdr.minorVersion}";
switch(vHdr.creator)
@@ -200,6 +207,9 @@ namespace DiscImageChef.DiscImages
case INNOTEK_OLD_VDI:
imageInfo.Application = "innotek VirtualBox";
break;
+ case DIC_VDI:
+ imageInfo.Application = "DiscImageChef";
+ break;
}
imageStream = stream;
@@ -375,10 +385,10 @@ namespace DiscImageChef.DiscImages
///
public ushort majorVersion;
public ushort minorVersion;
- public uint headerSize;
- public uint imageType;
- public uint imageFlags;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string description;
+ public int headerSize;
+ public VdiImageType imageType;
+ public VdiImageFlags imageFlags;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string comments;
public uint offsetBlocks;
public uint offsetData;
public uint cylinders;
@@ -395,7 +405,32 @@ namespace DiscImageChef.DiscImages
public Guid snapshotUuid;
public Guid linkUuid;
public Guid parentUuid;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)] public byte[] garbage;
+ }
+
+
+ enum VdiImageType : uint
+ {
+ /// Normal dynamically growing base image file.
+ Normal = 1,
+ /// Preallocated base image file of a fixed size.
+ Fixed,
+ /// Dynamically growing image file for undo/commit changes support.
+ Undo,
+ /// Dynamically growing image file for differencing support.
+ Differential,
+
+ /// First valid image type value.
+ First = Normal,
+ /// Last valid image type value.
+ Last = Differential
+ }
+
+ enum VdiImageFlags : uint
+ {
+ ///
+ /// Fill new blocks with zeroes while expanding image file. Only valid for newly created images, never set
+ /// for opened existing images.
+ ZeroExpand = 0x100
}
}
}
\ No newline at end of file