diff --git a/Aaru.Decoders b/Aaru.Decoders index 317b5af53..3fafaa892 160000 --- a/Aaru.Decoders +++ b/Aaru.Decoders @@ -1 +1 @@ -Subproject commit 317b5af538e5f6d389bc098fac536facee7fd093 +Subproject commit 3fafaa8921864c1baa613c4849a49aa6354e209d diff --git a/Aaru.Devices/Device/AtaCommands/Ata48.cs b/Aaru.Devices/Device/AtaCommands/Ata48.cs index cfa0bc423..533cf73eb 100644 --- a/Aaru.Devices/Device/AtaCommands/Ata48.cs +++ b/Aaru.Devices/Device/AtaCommands/Ata48.cs @@ -57,10 +57,13 @@ namespace Aaru.Devices if((statusRegisters.Status & 0x23) == 0) { - lba = statusRegisters.LbaHigh; - lba *= 0x100000000; - lba += (ulong)(statusRegisters.LbaMid << 16); - lba += statusRegisters.LbaLow; + lba = (ulong)((statusRegisters.LbaHighCurrent << 16) + (statusRegisters.LbaMidCurrent << 8) + + statusRegisters.LbaLowCurrent); + + lba <<= 24; + + lba += (ulong)((statusRegisters.LbaHighPrevious << 16) + (statusRegisters.LbaMidPrevious << 8) + + statusRegisters.LbaLowPrevious); } AaruConsole.DebugWriteLine("ATA Device", "GET NATIVE MAX ADDRESS EXT took {0} ms.", duration); @@ -75,11 +78,14 @@ namespace Aaru.Devices var registers = new AtaRegistersLba48 { - Command = (byte)AtaCommands.ReadDmaExt, - SectorCount = count, - LbaHigh = (ushort)((lba & 0xFFFF00000000) / 0x100000000), - LbaMid = (ushort)((lba & 0xFFFF0000) / 0x10000), - LbaLow = (ushort)((lba & 0xFFFF) / 0x1) + Command = (byte)AtaCommands.ReadDmaExt, + SectorCount = count, + LbaHighPrevious = (byte)((lba & 0xFF0000000000) / 0x10000000000), + LbaMidPrevious = (byte)((lba & 0xFF00000000) / 0x100000000), + LbaLowPrevious = (byte)((lba & 0xFF000000) / 0x1000000), + LbaHighCurrent = (byte)((lba & 0xFF0000) / 0x10000), + LbaMidCurrent = (byte)((lba & 0xFF00) / 0x100), + LbaLowCurrent = (byte)(lba & 0xFF) }; registers.DeviceHead += 0x40; @@ -101,13 +107,13 @@ namespace Aaru.Devices var registers = new AtaRegistersLba48 { - Command = (byte)AtaCommands.ReadLogExt, - SectorCount = count, - LbaLow = (ushort)((pageNumber & 0xFF) * 0x100), - LbaHigh = (ushort)((pageNumber & 0xFF00) / 0x100) + Command = (byte)AtaCommands.ReadLogExt, + SectorCount = count, + LbaMidCurrent = (byte)(pageNumber & 0xFF), + LbaMidPrevious = (byte)((pageNumber & 0xFF00) / 0x100) }; - registers.LbaLow += logAddress; + registers.LbaLowCurrent = logAddress; LastError = SendAtaCommand(registers, out statusRegisters, AtaProtocol.PioIn, AtaTransferRegister.SectorCount, ref buffer, timeout, true, out duration, @@ -127,13 +133,13 @@ namespace Aaru.Devices var registers = new AtaRegistersLba48 { - Command = (byte)AtaCommands.ReadLogDmaExt, - SectorCount = count, - LbaLow = (ushort)((pageNumber & 0xFF) * 0x100), - LbaHigh = (ushort)((pageNumber & 0xFF00) / 0x100) + Command = (byte)AtaCommands.ReadLogDmaExt, + SectorCount = count, + LbaMidCurrent = (byte)(pageNumber & 0xFF), + LbaMidPrevious = (byte)((pageNumber & 0xFF00) / 0x100) }; - registers.LbaLow += logAddress; + registers.LbaLowCurrent = logAddress; LastError = SendAtaCommand(registers, out statusRegisters, AtaProtocol.Dma, AtaTransferRegister.SectorCount, ref buffer, timeout, true, out duration, out bool sense); @@ -152,11 +158,14 @@ namespace Aaru.Devices var registers = new AtaRegistersLba48 { - Command = (byte)AtaCommands.ReadMultipleExt, - SectorCount = count, - LbaHigh = (ushort)((lba & 0xFFFF00000000) / 0x100000000), - LbaMid = (ushort)((lba & 0xFFFF0000) / 0x10000), - LbaLow = (ushort)((lba & 0xFFFF) / 0x1) + Command = (byte)AtaCommands.ReadMultipleExt, + SectorCount = count, + LbaHighPrevious = (byte)((lba & 0xFF0000000000) / 0x10000000000), + LbaMidPrevious = (byte)((lba & 0xFF00000000) / 0x100000000), + LbaLowPrevious = (byte)((lba & 0xFF000000) / 0x1000000), + LbaHighCurrent = (byte)((lba & 0xFF0000) / 0x10000), + LbaMidCurrent = (byte)((lba & 0xFF00) / 0x100), + LbaLowCurrent = (byte)(lba & 0xFF) }; registers.DeviceHead += 0x40; @@ -193,10 +202,13 @@ namespace Aaru.Devices if((statusRegisters.Status & 0x23) == 0) { - lba = statusRegisters.LbaHigh; - lba *= 0x100000000; - lba += (ulong)(statusRegisters.LbaMid << 16); - lba += statusRegisters.LbaLow; + lba = (ulong)((statusRegisters.LbaHighCurrent << 16) + (statusRegisters.LbaMidCurrent << 8) + + statusRegisters.LbaLowCurrent); + + lba <<= 24; + + lba += (ulong)((statusRegisters.LbaHighPrevious << 16) + (statusRegisters.LbaMidPrevious << 8) + + statusRegisters.LbaLowPrevious); } AaruConsole.DebugWriteLine("ATA Device", "READ NATIVE MAX ADDRESS EXT took {0} ms.", duration); @@ -211,11 +223,14 @@ namespace Aaru.Devices var registers = new AtaRegistersLba48 { - Command = (byte)AtaCommands.ReadExt, - SectorCount = count, - LbaHigh = (ushort)((lba & 0xFFFF00000000) / 0x100000000), - LbaMid = (ushort)((lba & 0xFFFF0000) / 0x10000), - LbaLow = (ushort)((lba & 0xFFFF) / 0x1) + Command = (byte)AtaCommands.ReadExt, + SectorCount = count, + LbaHighPrevious = (byte)((lba & 0xFF0000000000) / 0x10000000000), + LbaMidPrevious = (byte)((lba & 0xFF00000000) / 0x100000000), + LbaLowPrevious = (byte)((lba & 0xFF000000) / 0x1000000), + LbaHighCurrent = (byte)((lba & 0xFF0000) / 0x10000), + LbaMidCurrent = (byte)((lba & 0xFF00) / 0x100), + LbaLowCurrent = (byte)(lba & 0xFF) }; registers.DeviceHead += 0x40; diff --git a/Aaru.Devices/FreeBSD/Command.cs b/Aaru.Devices/FreeBSD/Command.cs index 8c3202ec8..adc9c2b3d 100644 --- a/Aaru.Devices/FreeBSD/Command.cs +++ b/Aaru.Devices/FreeBSD/Command.cs @@ -567,16 +567,16 @@ namespace Aaru.Devices.FreeBSD break; } - ataio.cmd.lba_high_exp = (byte)((registers.LbaHigh & 0xFF00) >> 8); - ataio.cmd.lba_mid_exp = (byte)((registers.LbaMid & 0xFF00) >> 8); + ataio.cmd.lba_high_exp = registers.LbaHighCurrent; + ataio.cmd.lba_mid_exp = registers.LbaMidCurrent; ataio.cmd.features_exp = (byte)((registers.Feature & 0xFF00) >> 8); ataio.cmd.sector_count_exp = (byte)((registers.SectorCount & 0xFF00) >> 8); - ataio.cmd.lba_low_exp = (byte)((registers.LbaLow & 0xFF00) >> 8); - ataio.cmd.lba_high = (byte)(registers.LbaHigh & 0xFF); - ataio.cmd.lba_mid = (byte)(registers.LbaMid & 0xFF); + ataio.cmd.lba_low_exp = registers.LbaLowCurrent; + ataio.cmd.lba_high = registers.LbaHighPrevious; + ataio.cmd.lba_mid = registers.LbaMidPrevious; ataio.cmd.features = (byte)(registers.Feature & 0xFF); ataio.cmd.sector_count = (byte)(registers.SectorCount & 0xFF); - ataio.cmd.lba_low = (byte)(registers.LbaLow & 0xFF); + ataio.cmd.lba_low = registers.LbaLowPrevious; ataio.cmd.command = registers.Command; ataio.cmd.device = (byte)(0x40 | registers.DeviceHead); @@ -603,13 +603,16 @@ namespace Aaru.Devices.FreeBSD if((ataio.ccb_h.status & CamStatus.CamStatusMask) == CamStatus.CamAtaStatusError) sense = true; - errorRegisters.SectorCount = (ushort)((ataio.res.sector_count_exp << 8) + ataio.res.sector_count); - errorRegisters.LbaLow = (ushort)((ataio.res.lba_low_exp << 8) + ataio.res.lba_low); - errorRegisters.LbaMid = (ushort)((ataio.res.lba_mid_exp << 8) + ataio.res.lba_mid); - errorRegisters.LbaHigh = (ushort)((ataio.res.lba_high_exp << 8) + ataio.res.lba_high); - errorRegisters.DeviceHead = ataio.res.device; - errorRegisters.Error = ataio.res.error; - errorRegisters.Status = ataio.res.status; + errorRegisters.SectorCount = (ushort)((ataio.res.sector_count_exp << 8) + ataio.res.sector_count); + errorRegisters.LbaLowCurrent = ataio.res.lba_low_exp; + errorRegisters.LbaMidCurrent = ataio.res.lba_mid_exp; + errorRegisters.LbaHighCurrent = ataio.res.lba_high_exp; + errorRegisters.LbaLowPrevious = ataio.res.lba_low; + errorRegisters.LbaMidPrevious = ataio.res.lba_mid; + errorRegisters.LbaHighPrevious = ataio.res.lba_high; + errorRegisters.DeviceHead = ataio.res.device; + errorRegisters.Error = ataio.res.error; + errorRegisters.Status = ataio.res.status; buffer = new byte[ataio.dxfer_len]; diff --git a/Aaru.Devices/Linux/Command.cs b/Aaru.Devices/Linux/Command.cs index 037e6800d..1732fbabd 100644 --- a/Aaru.Devices/Linux/Command.cs +++ b/Aaru.Devices/Linux/Command.cs @@ -345,12 +345,12 @@ namespace Aaru.Devices.Linux cdb[4] = (byte)(registers.Feature & 0xFF); cdb[5] = (byte)((registers.SectorCount & 0xFF00) >> 8); cdb[6] = (byte)(registers.SectorCount & 0xFF); - cdb[7] = (byte)((registers.LbaLow & 0xFF00) >> 8); - cdb[8] = (byte)(registers.LbaLow & 0xFF); - cdb[9] = (byte)((registers.LbaMid & 0xFF00) >> 8); - cdb[10] = (byte)(registers.LbaMid & 0xFF); - cdb[11] = (byte)((registers.LbaHigh & 0xFF00) >> 8); - cdb[12] = (byte)(registers.LbaHigh & 0xFF); + cdb[7] = registers.LbaLowPrevious; + cdb[8] = registers.LbaLowCurrent; + cdb[9] = registers.LbaMidPrevious; + cdb[10] = registers.LbaMidCurrent; + cdb[11] = registers.LbaHighPrevious; + cdb[12] = registers.LbaHighCurrent; cdb[13] = registers.DeviceHead; cdb[14] = registers.Command; @@ -363,12 +363,15 @@ namespace Aaru.Devices.Linux errorRegisters.Error = senseBuffer[11]; - errorRegisters.SectorCount = (ushort)((senseBuffer[12] << 8) + senseBuffer[13]); - errorRegisters.LbaLow = (ushort)((senseBuffer[14] << 8) + senseBuffer[15]); - errorRegisters.LbaMid = (ushort)((senseBuffer[16] << 8) + senseBuffer[17]); - errorRegisters.LbaHigh = (ushort)((senseBuffer[18] << 8) + senseBuffer[19]); - errorRegisters.DeviceHead = senseBuffer[20]; - errorRegisters.Status = senseBuffer[21]; + errorRegisters.SectorCount = (ushort)((senseBuffer[12] << 8) + senseBuffer[13]); + errorRegisters.LbaLowPrevious = senseBuffer[14]; + errorRegisters.LbaLowCurrent = senseBuffer[15]; + errorRegisters.LbaMidPrevious = senseBuffer[16]; + errorRegisters.LbaMidCurrent = senseBuffer[17]; + errorRegisters.LbaHighPrevious = senseBuffer[18]; + errorRegisters.LbaHighCurrent = senseBuffer[19]; + errorRegisters.DeviceHead = senseBuffer[20]; + errorRegisters.Status = senseBuffer[21]; sense = errorRegisters.Error != 0 || (errorRegisters.Status & 0xA5) != 0; diff --git a/Aaru.Devices/Windows/Command.cs b/Aaru.Devices/Windows/Command.cs index 79995b4ab..59abc9cbd 100644 --- a/Aaru.Devices/Windows/Command.cs +++ b/Aaru.Devices/Windows/Command.cs @@ -366,21 +366,21 @@ namespace Aaru.Devices.Windows DataTransferLength = (uint)buffer.Length, PreviousTaskFile = new AtaTaskFile { - CylinderHigh = (byte)((registers.LbaHigh & 0xFF00) >> 8), - CylinderLow = (byte)((registers.LbaMid & 0xFF00) >> 8), + CylinderHigh = registers.LbaHighPrevious, + CylinderLow = registers.LbaMidPrevious, Features = (byte)((registers.Feature & 0xFF00) >> 8), SectorCount = (byte)((registers.SectorCount & 0xFF00) >> 8), - SectorNumber = (byte)((registers.LbaLow & 0xFF00) >> 8) + SectorNumber = registers.LbaLowPrevious }, CurrentTaskFile = new AtaTaskFile { Command = registers.Command, - CylinderHigh = (byte)(registers.LbaHigh & 0xFF), - CylinderLow = (byte)(registers.LbaMid & 0xFF), + CylinderHigh = registers.LbaHighCurrent, + CylinderLow = registers.LbaMidCurrent, DeviceHead = registers.DeviceHead, Features = (byte)(registers.Feature & 0xFF), SectorCount = (byte)(registers.SectorCount & 0xFF), - SectorNumber = (byte)(registers.LbaLow & 0xFF) + SectorNumber = registers.LbaLowCurrent } }, dataBuffer = new byte[64 * 512] @@ -441,18 +441,15 @@ namespace Aaru.Devices.Windows errorRegisters.SectorCount = (ushort)((aptdBuf.aptd.PreviousTaskFile.SectorCount << 8) + aptdBuf.aptd.CurrentTaskFile.SectorCount); - errorRegisters.LbaLow = (ushort)((aptdBuf.aptd.PreviousTaskFile.SectorNumber << 8) + - aptdBuf.aptd.CurrentTaskFile.SectorNumber); - - errorRegisters.LbaMid = (ushort)((aptdBuf.aptd.PreviousTaskFile.CylinderLow << 8) + - aptdBuf.aptd.CurrentTaskFile.CylinderLow); - - errorRegisters.LbaHigh = (ushort)((aptdBuf.aptd.PreviousTaskFile.CylinderHigh << 8) + - aptdBuf.aptd.CurrentTaskFile.CylinderHigh); - - errorRegisters.DeviceHead = aptdBuf.aptd.CurrentTaskFile.DeviceHead; - errorRegisters.Error = aptdBuf.aptd.CurrentTaskFile.Error; - errorRegisters.Status = aptdBuf.aptd.CurrentTaskFile.Status; + errorRegisters.LbaLowPrevious = aptdBuf.aptd.PreviousTaskFile.SectorNumber; + errorRegisters.LbaMidPrevious = aptdBuf.aptd.PreviousTaskFile.CylinderLow; + errorRegisters.LbaHighPrevious = aptdBuf.aptd.PreviousTaskFile.CylinderHigh; + errorRegisters.LbaLowCurrent = aptdBuf.aptd.CurrentTaskFile.SectorNumber; + errorRegisters.LbaMidCurrent = aptdBuf.aptd.CurrentTaskFile.CylinderLow; + errorRegisters.LbaHighCurrent = aptdBuf.aptd.CurrentTaskFile.CylinderHigh; + errorRegisters.DeviceHead = aptdBuf.aptd.CurrentTaskFile.DeviceHead; + errorRegisters.Error = aptdBuf.aptd.CurrentTaskFile.Error; + errorRegisters.Status = aptdBuf.aptd.CurrentTaskFile.Status; sense = errorRegisters.Error != 0 || (errorRegisters.Status & 0xA5) != 0; diff --git a/Aaru.Tests.Devices/DecodeATARegisters.cs b/Aaru.Tests.Devices/DecodeATARegisters.cs index ecdba307a..8035744de 100644 --- a/Aaru.Tests.Devices/DecodeATARegisters.cs +++ b/Aaru.Tests.Devices/DecodeATARegisters.cs @@ -139,10 +139,14 @@ namespace Aaru.Tests.Devices sb.AppendFormat("Error: {0}", DecodeAtaStatus(registers.Error)).AppendLine(); sb.AppendFormat("Device: {0}", (registers.DeviceHead >> 4) & 0x01).AppendLine(); - sb.AppendFormat("LBA: {0}", - ((ulong)(registers.DeviceHead & 0xF) * 0x100000000000) + - (registers.LbaHigh * (ulong)0x100000000L) + (ulong)(registers.LbaMid << 16) + - registers.LbaLow); + ulong lba = registers.LbaHighPrevious * 0x10000000000UL; + lba += registers.LbaMidPrevious * 0x100000000UL; + lba += registers.LbaLowPrevious * 0x1000000UL; + lba += registers.LbaHighCurrent * 0x10000UL; + lba += registers.LbaMidCurrent * 0x100UL; + lba += registers.LbaLowCurrent; + + sb.AppendFormat("LBA: {0}", lba); sb.AppendFormat("Count: {0}", registers.SectorCount).AppendLine(); sb.AppendFormat("LBA?: {0}", Convert.ToBoolean(registers.DeviceHead & 0x40)).AppendLine();