Add interface for setting media geometry.

This commit is contained in:
2018-01-01 20:56:33 +00:00
parent df563dd2dd
commit 4756fd8e7c
17 changed files with 376 additions and 112 deletions

View File

@@ -1066,24 +1066,26 @@ namespace DiscImageChef.DiscImages
writingStream.Flush();
writingStream.Close();
// TODO: Interface to set geometry
imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63);
imageInfo.Heads = 16;
imageInfo.SectorsPerTrack = 63;
while(imageInfo.Cylinders == 0)
if(imageInfo.Cylinders == 0)
{
imageInfo.Heads--;
imageInfo.Cylinders = (uint)(imageInfo.Sectors / 16 / 63);
imageInfo.Heads = 16;
imageInfo.SectorsPerTrack = 63;
if(imageInfo.Heads == 0)
while(imageInfo.Cylinders == 0)
{
imageInfo.SectorsPerTrack--;
imageInfo.Heads = 16;
imageInfo.Heads--;
if(imageInfo.Heads == 0)
{
imageInfo.SectorsPerTrack--;
imageInfo.Heads = 16;
}
imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack);
if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break;
}
imageInfo.Cylinders = (uint)(imageInfo.Sectors / imageInfo.Heads / imageInfo.SectorsPerTrack);
if(imageInfo.Cylinders == 0 && imageInfo.Heads == 0 && imageInfo.SectorsPerTrack == 0) break;
}
descriptorStream.WriteLine("# Disk DescriptorFile");
@@ -1116,6 +1118,33 @@ namespace DiscImageChef.DiscImages
return true;
}
public bool SetGeometry(uint cylinders, uint heads, uint sectorsPerTrack)
{
if(cylinders > ushort.MaxValue)
{
ErrorMessage = "Too many cylinders.";
return false;
}
if(heads > byte.MaxValue)
{
ErrorMessage = "Too many heads.";
return false;
}
if(sectorsPerTrack > byte.MaxValue)
{
ErrorMessage = "Too many sectors per track.";
return false;
}
imageInfo.SectorsPerTrack = sectorsPerTrack;
imageInfo.Heads = heads;
imageInfo.Cylinders = cylinders;
return true;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct VMwareExtentHeader
{