mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
Added CRC calculation method and check of header using CRC to
return a positive identification.
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
|
2014-04-21 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
|
* ImagePlugins/TeleDisk.cs:
|
||||||
|
Added CRC calculation method and check of header using CRC
|
||||||
|
to return a positive identification.
|
||||||
|
|
||||||
2014-04-19 Natalia Portillo <claunia@claunia.com>
|
2014-04-19 Natalia Portillo <claunia@claunia.com>
|
||||||
|
|
||||||
* ImagePlugins/TeleDisk.cs:
|
* ImagePlugins/TeleDisk.cs:
|
||||||
|
|||||||
@@ -187,7 +187,10 @@ namespace FileSystemIDandChk.ImagePlugins
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Internal variables
|
#region Internal variables
|
||||||
|
TD0Header header;
|
||||||
|
TDCommentBlockHeader commentHeader;
|
||||||
|
byte[] commentBlock;
|
||||||
|
string comment;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -196,10 +199,10 @@ namespace FileSystemIDandChk.ImagePlugins
|
|||||||
Name = "Sydex TeleDisk";
|
Name = "Sydex TeleDisk";
|
||||||
PluginUUID = new Guid("0240B7B1-E959-4CDC-B0BD-386D6E467B88");
|
PluginUUID = new Guid("0240B7B1-E959-4CDC-B0BD-386D6E467B88");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IdentifyImage(string imagePath)
|
public override bool IdentifyImage(string imagePath)
|
||||||
{
|
{
|
||||||
TD0Header header = new TD0Header();
|
header = new TD0Header();
|
||||||
byte[] headerBytes = new byte[12];
|
byte[] headerBytes = new byte[12];
|
||||||
FileStream stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read);
|
FileStream stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
@@ -220,6 +223,10 @@ namespace FileSystemIDandChk.ImagePlugins
|
|||||||
header.sides = headerBytes[9];
|
header.sides = headerBytes[9];
|
||||||
header.crc = BitConverter.ToUInt16(headerBytes, 10);
|
header.crc = BitConverter.ToUInt16(headerBytes, 10);
|
||||||
|
|
||||||
|
byte[] headerBytesForCRC = new byte[10];
|
||||||
|
Array.Copy(headerBytes, headerBytesForCRC, 10);
|
||||||
|
UInt16 calculatedHeaderCRC = TeleDiskCRC(0x0000, headerBytesForCRC);
|
||||||
|
|
||||||
if (MainClass.isDebug)
|
if (MainClass.isDebug)
|
||||||
{
|
{
|
||||||
Console.WriteLine("DEBUG (TeleDisk plugin): header.signature = 0x{0:X4}", header.signature);
|
Console.WriteLine("DEBUG (TeleDisk plugin): header.signature = 0x{0:X4}", header.signature);
|
||||||
@@ -232,8 +239,26 @@ namespace FileSystemIDandChk.ImagePlugins
|
|||||||
Console.WriteLine("DEBUG (TeleDisk plugin): header.dosAllocation = 0x{0:X2}", header.dosAllocation);
|
Console.WriteLine("DEBUG (TeleDisk plugin): header.dosAllocation = 0x{0:X2}", header.dosAllocation);
|
||||||
Console.WriteLine("DEBUG (TeleDisk plugin): header.sides = 0x{0:X2}", header.sides);
|
Console.WriteLine("DEBUG (TeleDisk plugin): header.sides = 0x{0:X2}", header.sides);
|
||||||
Console.WriteLine("DEBUG (TeleDisk plugin): header.crc = 0x{0:X4}", header.crc);
|
Console.WriteLine("DEBUG (TeleDisk plugin): header.crc = 0x{0:X4}", header.crc);
|
||||||
|
Console.WriteLine("DEBUG (TeleDisk plugin): calculated header crc = 0x{0:X4}", calculatedHeaderCRC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We need more checks as the magic is too simply.
|
||||||
|
// This may deny legal images
|
||||||
|
|
||||||
|
// That would be much of a coincidence
|
||||||
|
if (header.crc == calculatedHeaderCRC)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (header.sequence != 0x00)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (header.dataRate != DataRate250kbps && header.dataRate != DataRate300kbps && header.dataRate != DataRate500kbps)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (header.driveType != DriveType35DD && header.driveType != DriveType35ED && header.driveType != DriveType35HD && header.driveType != DriveType525DD &&
|
||||||
|
header.driveType != DriveType525HD && header.driveType != DriveType525HD_DDDisk && header.driveType != DriveType8inch)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +346,31 @@ namespace FileSystemIDandChk.ImagePlugins
|
|||||||
{
|
{
|
||||||
throw new NotImplementedException("Not yet implemented.");
|
throw new NotImplementedException("Not yet implemented.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Private methods
|
||||||
|
static UInt16 TeleDiskCRC(UInt16 crc, byte[] buffer)
|
||||||
|
{
|
||||||
|
int counter = 0;
|
||||||
|
|
||||||
|
while (counter < buffer.Length)
|
||||||
|
{
|
||||||
|
crc ^= (UInt16)((buffer[counter] & 0xFF) << 8);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if ((crc & 0x8000) > 0)
|
||||||
|
crc = (UInt16)((crc << 1) ^ TeleDiskCRCPoly);
|
||||||
|
else
|
||||||
|
crc = (UInt16)(crc << 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Unsupported features
|
#region Unsupported features
|
||||||
|
|
||||||
public override byte[] ReadSectorTag(UInt64 sectorAddress, SectorTagType tag)
|
public override byte[] ReadSectorTag(UInt64 sectorAddress, SectorTagType tag)
|
||||||
|
|||||||
Reference in New Issue
Block a user