Files
Aaru/Aaru.Images/Nero/Read.cs

2315 lines
96 KiB
C#
Raw Normal View History

// /***************************************************************************
2020-02-27 12:31:25 +00:00
// Aaru Data Preservation Suite
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// ----------------------------------------------------------------------------
//
// Filename : Read.cs
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Disk image plugins.
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
//
// --[ Description ] ----------------------------------------------------------
//
// Reads Nero Burning ROM disc images.
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
2024-12-19 10:45:18 +00:00
// Copyright © 2011-2025 Natalia Portillo
* LICENSE.MIT: * LICENSE.LGPL: Added LICENSE files for LGPL and MIT licenses. * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Partitions/MBR.cs: * DiscImageChef.Partitions/RDB.cs: * DiscImageChef.DiscImages/GDI.cs: * DiscImageChef.Partitions/Sun.cs: * DiscImageChef.DiscImages/VHD.cs: * DiscImageChef.Partitions/GPT.cs: * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Partitions/NeXT.cs: * DiscImageChef.Devices/Command.cs: * DiscImageChef.DiscImages/Nero.cs: * DiscImageChef.Decoders/CD/PMA.cs: * DiscImageChef.Decoders/CD/TOC.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Helpers/PrintHex.cs: * DiscImageChef.Helpers/Swapping.cs: * DiscImageChef.Decoders/DVD/PRI.cs: * DiscImageChef.Decoders/DVD/DMI.cs: * DiscImageChef.Decoders/DVD/DDS.cs: * DiscImageChef.Decoders/DVD/RMD.cs: * DiscImageChef.Decoders/DVD/UDI.cs: * DiscImageChef.Partitions/Atari.cs: * DiscImageChef.Decoders/DVD/BCA.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Decoders/DVD/PFI.cs: * DiscImageChef.Decoders/CD/ATIP.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.DiscImages/CDRWin.cs: * DiscImageChef.DiscImages/CDRDAO.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Decoders/Xbox/DMI.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Settings/Settings.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Decoders/DVD/CPRM.cs: * DiscImageChef.Decoders/DVD/ADIP.cs: * DiscImageChef.Decoders/CD/Enums.cs: * DiscImageChef.Decoders/DVD/AACS.cs: * DiscImageChef.Decoders/SCSI/EVPD.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Metadata/MediaType.cs: * DiscImageChef.Console/DicConsole.cs: * DiscImageChef.Decoders/DVD/Spare.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Decoders/DVD/Enums.cs: * DiscImageChef.Filesystems/Symbian.cs: * DiscImageChef.Decoders/SCSI/Types.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.DiscImages/TeleDisk.cs: * DiscImageChef.Decoders/SCSI/Sense.cs: * DiscImageChef.Decoders/CD/FullTOC.cs: * DiscImageChef.Decoders/Blu-ray/DI.cs: * DiscImageChef.Decoders/ATA/Errors.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Devices/Linux/Enums.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/Structs.cs: * DiscImageChef.DiscImages/Apple2MG.cs: * DiscImageChef.Decoders/SCSI/Modes.cs: * DiscImageChef.Metadata/Dimensions.cs: * DiscImageChef.Partitions/AppleMap.cs: * DiscImageChef.Decoders/Floppy/ISO.cs: * DiscImageChef.Decoders/DVD/Layers.cs: * DiscImageChef.Decoders/CD/Session.cs: * DiscImageChef.Decoders/SCSI/Enums.cs: * DiscImageChef.Filesystems/Nintendo.cs: * DiscImageChef.Helpers/DateHandlers.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.DiscImages/ImageInfo.cs: * DiscImageChef.Checksums/MD5Context.cs: * DiscImageChef.Devices/Linux/Extern.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleMFS.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Decoders/Blu-ray/BCA.cs: * DiscImageChef.Decoders/Blu-ray/DDS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Decoders/ATA/Identify.cs: * DiscImageChef.Devices/Linux/Command.cs: * DiscImageChef.Devices/FreeBSD/Enums.cs: * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Metadata/DeviceReport.cs: * DiscImageChef.Decoders/Floppy/Amiga.cs: * DiscImageChef.Devices/Linux/Structs.cs: * DiscImageChef.Devices/Windows/Enums.cs: * DiscImageChef.Decoders/DVD/CSS&CPRM.cs: * DiscImageChef.Checksums/SHA1Context.cs: * DiscImageChef.DiscImages/DiskCopy42.cs: * DiscImageChef.Partitions/PartPlugin.cs: * DiscImageChef.CommonTypes/Partition.cs: * DiscImageChef.Decoders/Floppy/Enums.cs: * DiscImageChef.CommonTypes/MediaType.cs: * DiscImageChef.Decoders/Floppy/Apple2.cs: * DiscImageChef.Devices/Windows/Extern.cs: * DiscImageChef.Decoders/SCSI/MMC/CPRM.cs: * DiscImageChef.Helpers/StringHandlers.cs: * DiscImageChef.DiscImages/ImagePlugin.cs: * DiscImageChef.Checksums/CRC64Context.cs: * DiscImageChef.Checksums/CRC32Context.cs: * DiscImageChef.DiscImages/ZZZRawImage.cs: * DiscImageChef.Checksums/CRC16Context.cs: * DiscImageChef.Filesystems/LisaFS/Dir.cs: * DiscImageChef.Decoders/DVD/Cartridge.cs: * DiscImageChef.Decoders/Blu-ray/Spare.cs: * DiscImageChef.Filesystems/Filesystem.cs: * DiscImageChef.Decoders/SCSI/MMC/AACS.cs: * DiscImageChef.Devices/FreeBSD/Extern.cs: * DiscImageChef.Devices/Device/Commands.cs: * DiscImageChef.Checksums/SHA384Context.cs: * DiscImageChef.Devices/FreeBSD/Command.cs: * DiscImageChef.Checksums/SHA512Context.cs: * DiscImageChef.Decoders/SCSI/MMC/Enums.cs: * DiscImageChef.Devices/Windows/Command.cs: * DiscImageChef.Devices/FreeBSD/Structs.cs: * DiscImageChef.Devices/Windows/Structs.cs: * DiscImageChef.Filesystems/LisaFS/Info.cs: * DiscImageChef.Checksums/SHA256Context.cs: * DiscImageChef.Filesystems/LisaFS/File.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/LisaFS/Super.cs: * DiscImageChef.Filesystems/LisaFS/Xattr.cs: * DiscImageChef.Checksums/Adler32Context.cs: * DiscImageChef.Decoders/Floppy/System34.cs: * DiscImageChef.Checksums/SpamSumContext.cs: * DiscImageChef.Decoders/SCSI/MMC/Hybrid.cs: * DiscImageChef.Devices/Device/Variables.cs: * DiscImageChef.Filesystems/LisaFS/Consts.cs: * DiscImageChef.Filesystems/LisaFS/LisaFS.cs: * DiscImageChef.Decoders/Floppy/Commodore.cs: * DiscImageChef.Checksums/FletcherContext.cs: * DiscImageChef.Filesystems/LisaFS/Extent.cs: * DiscImageChef.Devices/Device/Destructor.cs: * DiscImageChef.Decoders/Floppy/AppleSony.cs: * DiscImageChef.Filesystems/LisaFS/Structs.cs: * DiscImageChef.Decoders/SCSI/VendorString.cs: * DiscImageChef.Decoders/SCSI/MMC/Features.cs: * DiscImageChef.Devices/Device/Constructor.cs: * DiscImageChef.Checksums/RIPEMD160Context.cs: * DiscImageChef.Decoders/CD/CDTextOnLeadIn.cs: * DiscImageChef.Decoders/Blu-ray/Cartridge.cs: * DiscImageChef.Decoders/Floppy/System3740.cs: * DiscImageChef.Filesystems/LisaFS/Encoding.cs: * DiscImageChef.Decoders/SCSI/ModesEncoders.cs: * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.Helpers/BigEndianBitConverter.cs: * DiscImageChef.Decoders/Floppy/Perpendicular.cs: * DiscImageChef.Decoders/SCSI/SSC/BlockLimits.cs: * DiscImageChef.Decoders/SCSI/MMC/WriteProtect.cs: * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: * DiscImageChef.Devices/Device/AtaCommands/Cfa.cs: * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: * DiscImageChef.Helpers/EndianAwareBinaryReader.cs: * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: * DiscImageChef.Devices/Device/AtaCommands/MCPT.cs: * DiscImageChef.Devices/Device/ScsiCommands/SSC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SMC.cs: * DiscImageChef.Devices/Device/ScsiCommands/SBC.cs: * DiscImageChef.Metadata/Properties/AssemblyInfo.cs: * DiscImageChef.Devices/Device/AtaCommands/Atapi.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata28.cs: * DiscImageChef.Devices/Device/AtaCommands/Smart.cs: * DiscImageChef.Decoders/SCSI/SSC/DensitySupport.cs: * DiscImageChef.Devices/Device/AtaCommands/Ata48.cs: * DiscImageChef.Decoders/SCSI/MMC/DiscInformation.cs: * DiscImageChef.Devices/Device/AtaCommands/AtaCHS.cs: * DiscImageChef.Devices/Device/ScsiCommands/SyQuest.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: * DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs: * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: * DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs: * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: * DiscImageChef.Devices/Device/ScsiCommands/HL-DT-ST.cs: * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: * DiscImageChef.Decoders/SCSI/DiscStructureCapabilities.cs: * DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs: Relicensed as LGPL. Updated standard header. * DiscImageChef/Main.cs: * DiscImageChef/Plugins.cs: * DiscImageChef/Options.cs: * DiscImageChef/Commands/Ls.cs: * DiscImageChef/Core/IBGLog.cs: * DiscImageChef/Core/MHDDLog.cs: * DiscImageChef/AssemblyInfo.cs: * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/Decode.cs: * DiscImageChef/Core/Statistics.cs: * DiscImageChef/Commands/Verify.cs: * DiscImageChef/Commands/Formats.cs: * DiscImageChef/Commands/Entropy.cs: * DiscImageChef/Commands/Compare.cs: * DiscImageChef.Interop/DetectOS.cs: * DiscImageChef/Commands/Analyze.cs: * DiscImageChef/Commands/Commands.cs: * DiscImageChef/Commands/PrintHex.cs: * DiscImageChef/Commands/Checksum.cs: * DiscImageChef/DetectImageFormat.cs: * DiscImageChef/Commands/DumpMedia.cs: * DiscImageChef/Commands/Benchmark.cs: * DiscImageChef/Commands/Configure.cs: * DiscImageChef/Commands/MediaInfo.cs: * DiscImageChef.Interop/PlatformID.cs: * DiscImageChef/Commands/MediaScan.cs: * DiscImageChef/Commands/Statistics.cs: * DiscImageChef/Commands/DeviceInfo.cs: * DiscImageChef.Checksums/ReedSolomon.cs: * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef/Commands/ExtractFiles.cs: * DiscImageChef.Checksums/CDChecksums.cs: * DiscImageChef/Commands/CreateSidecar.cs: Updated standard header. * DiscImageChef.Checksums/DiscImageChef.Checksums.csproj: Relicensed project as LGPL. Updated standard header. Embed license as resource. * DiscImageChef.Console/DiscImageChef.Console.csproj: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: * DiscImageChef.Settings/DiscImageChef.Settings.csproj: * DiscImageChef.Decoders/DiscImageChef.Decoders.csproj: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: * DiscImageChef.Partitions/DiscImageChef.Partitions.csproj: * DiscImageChef.DiscImages/DiscImageChef.DiscImages.csproj: * DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Relicensed as LGPL. Updated standard header. Embed license as resource. * DiscImageChef/DiscImageChef.csproj: * DiscImageChef.Interop/DiscImageChef.Interop.csproj: Updated standard header. Embed license as resource.
2016-07-28 18:13:49 +01:00
// ****************************************************************************/
using System;
using System.Collections.Generic;
2017-12-19 19:33:46 +00:00
using System.IO;
using System.Linq;
2017-12-21 14:30:38 +00:00
using System.Text;
2020-02-27 00:33:26 +00:00
using Aaru.CommonTypes;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.CommonTypes.Structs;
using Aaru.Decoders.CD;
2020-07-20 15:43:52 +01:00
using Aaru.Helpers;
using Aaru.Logging;
2025-08-20 18:51:05 +01:00
using Sentry;
namespace Aaru.Images;
2022-03-06 13:29:38 +00:00
public sealed partial class Nero
{
2023-10-03 23:34:59 +01:00
#region IOpticalMediaImage Members
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber Open(IFilter imageFilter)
{
2022-03-06 13:29:38 +00:00
try
{
2022-03-06 13:29:38 +00:00
// Look for the footer
_imageStream = imageFilter.GetDataForkStream();
var footerV1 = new FooterV1();
var footerV2 = new FooterV2();
_imageStream.Seek(-8, SeekOrigin.End);
var buffer = new byte[8];
_imageStream.EnsureRead(buffer, 0, 8);
2022-03-06 13:29:38 +00:00
footerV1.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0);
footerV1.FirstChunkOffset = BigEndianBitConverter.ToUInt32(buffer, 4);
_imageStream.Seek(-12, SeekOrigin.End);
buffer = new byte[12];
_imageStream.EnsureRead(buffer, 0, 12);
2022-03-06 13:29:38 +00:00
footerV2.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0);
footerV2.FirstChunkOffset = BigEndianBitConverter.ToUInt64(buffer, 4);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "imageStream.Length = {0}", _imageStream.Length);
2022-03-06 13:29:38 +00:00
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"footerV1.ChunkID = 0x{0:X8} (\"{1}\")",
footerV1.ChunkId,
Encoding.ASCII.GetString(BigEndianBitConverter.GetBytes(footerV1.ChunkId)));
2022-03-06 13:29:38 +00:00
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "footerV1.FirstChunkOffset = {0}", footerV1.FirstChunkOffset);
2022-03-06 13:29:38 +00:00
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"footerV2.ChunkID = 0x{0:X8} (\"{1}\")",
footerV2.ChunkId,
Encoding.ASCII.GetString(BigEndianBitConverter.GetBytes(footerV2.ChunkId)));
2022-03-06 13:29:38 +00:00
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "footerV2.FirstChunkOffset = {0}", footerV2.FirstChunkOffset);
2022-03-06 13:29:38 +00:00
// Check footer version
if(footerV1.ChunkId == NERO_FOOTER_V1 && footerV1.FirstChunkOffset < (ulong)_imageStream.Length)
2022-03-06 13:29:38 +00:00
_imageNewFormat = false;
else if(footerV2.ChunkId == NERO_FOOTER_V2 && footerV2.FirstChunkOffset < (ulong)_imageStream.Length)
2022-03-06 13:29:38 +00:00
_imageNewFormat = true;
else
{
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Nero_version_not_recognized);
2022-03-06 13:29:38 +00:00
return ErrorNumber.NotSupported;
}
2022-03-06 13:29:38 +00:00
// Seek to first chunk
if(_imageNewFormat)
_imageStream.Seek((long)footerV2.FirstChunkOffset, SeekOrigin.Begin);
else
_imageStream.Seek(footerV1.FirstChunkOffset, SeekOrigin.Begin);
var parsing = true;
2022-03-06 13:29:38 +00:00
ushort currentSession = 1;
uint currentTrack = 1;
2024-05-01 04:39:38 +01:00
Tracks = [];
2022-03-06 13:29:38 +00:00
_trackIsrCs = new Dictionary<uint, byte[]>();
2022-03-06 13:29:38 +00:00
_imageInfo.MediaType = CommonTypes.MediaType.CD;
_imageInfo.Sectors = 0;
_imageInfo.SectorSize = 0;
var oldFormat = false;
int currentLba = -150;
var corruptedTrackMode = false;
2022-03-06 13:29:38 +00:00
// Parse chunks
while(parsing)
{
var chunkHeaderBuffer = new byte[8];
_imageStream.EnsureRead(chunkHeaderBuffer, 0, 8);
var chunkId = BigEndianBitConverter.ToUInt32(chunkHeaderBuffer, 0);
var chunkLength = BigEndianBitConverter.ToUInt32(chunkHeaderBuffer, 4);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"ChunkID = 0x{0:X8} (\"{1}\")",
chunkId,
Encoding.ASCII.GetString(BigEndianBitConverter.GetBytes(chunkId)));
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "ChunkLength = {0}", chunkLength);
2022-03-06 13:29:38 +00:00
switch(chunkId)
{
case NERO_CUE_V1:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_CUES_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
var newCuesheetV1 = new CuesheetV1
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength,
2024-05-01 04:39:38 +01:00
Entries = []
2022-03-06 13:29:38 +00:00
};
var tmpBuffer = new byte[8];
for(var i = 0; i < newCuesheetV1.ChunkSize; i += 8)
2022-03-06 13:29:38 +00:00
{
var entry = new CueEntryV1();
_imageStream.EnsureRead(tmpBuffer, 0, 8);
2022-03-06 13:29:38 +00:00
entry.Mode = tmpBuffer[0];
2023-10-03 23:34:59 +01:00
entry.TrackNumber = (byte)(((tmpBuffer[1] & 0xF0) >> 4) * 10 + (tmpBuffer[1] & 0xF));
entry.IndexNumber = (byte)(((tmpBuffer[2] & 0xF0) >> 4) * 10 + (tmpBuffer[2] & 0xF));
2022-03-06 13:29:38 +00:00
entry.Dummy = BigEndianBitConverter.ToUInt16(tmpBuffer, 3);
2023-10-03 23:34:59 +01:00
entry.Minute = (byte)(((tmpBuffer[5] & 0xF0) >> 4) * 10 + (tmpBuffer[5] & 0xF));
entry.Second = (byte)(((tmpBuffer[6] & 0xF0) >> 4) * 10 + (tmpBuffer[6] & 0xF));
entry.Frame = (byte)(((tmpBuffer[7] & 0xF0) >> 4) * 10 + (tmpBuffer[7] & 0xF));
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Cuesheet_entry_0, i / 8 + 1);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Mode = {1:X2}", i / 8 + 1, entry.Mode);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].TrackNumber = {1:X2}",
i / 8 + 1,
entry.TrackNumber);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].IndexNumber = {1:X2}",
i / 8 + 1,
entry.IndexNumber);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Dummy = {1:X4}", i / 8 + 1, entry.Dummy);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Minute = {1:X2}", i / 8 + 1, entry.Minute);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Second = {1:X2}", i / 8 + 1, entry.Second);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Frame = {1:X2}", i / 8 + 1, entry.Frame);
2022-03-06 13:29:38 +00:00
newCuesheetV1.Entries.Add(entry);
}
2022-03-06 13:29:38 +00:00
if(_cuesheetV1 is null)
_cuesheetV1 = newCuesheetV1;
else
_cuesheetV1.Entries.AddRange(newCuesheetV1.Entries);
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_CUE_V2:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_CUEX_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
var newCuesheetV2 = new CuesheetV2
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength,
2024-05-01 04:39:38 +01:00
Entries = []
2022-03-06 13:29:38 +00:00
};
var tmpBuffer = new byte[8];
for(var i = 0; i < newCuesheetV2.ChunkSize; i += 8)
2022-03-06 13:29:38 +00:00
{
var entry = new CueEntryV2();
_imageStream.EnsureRead(tmpBuffer, 0, 8);
2022-03-06 13:29:38 +00:00
entry.Mode = tmpBuffer[0];
2023-10-03 23:34:59 +01:00
entry.TrackNumber = (byte)(((tmpBuffer[1] & 0xF0) >> 4) * 10 + (tmpBuffer[1] & 0xF));
entry.IndexNumber = (byte)(((tmpBuffer[2] & 0xF0) >> 4) * 10 + (tmpBuffer[2] & 0xF));
2022-03-06 13:29:38 +00:00
entry.Dummy = tmpBuffer[3];
entry.LbaStart = BigEndianBitConverter.ToInt32(tmpBuffer, 4);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Cuesheet_entry_0, i / 8 + 1);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Mode = 0x{1:X2}", i / 8 + 1, entry.Mode);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].TrackNumber = {1:X2}",
i / 8 + 1,
entry.TrackNumber);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].IndexNumber = {1:X2}",
i / 8 + 1,
entry.IndexNumber);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Dummy = {1:X2}", i / 8 + 1, entry.Dummy);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].LBAStart = {1}", i / 8 + 1, entry.LbaStart);
2022-03-06 13:29:38 +00:00
newCuesheetV2.Entries.Add(entry);
}
2022-03-06 13:29:38 +00:00
if(_cuesheetV2 is null)
_cuesheetV2 = newCuesheetV2;
else
_cuesheetV2.Entries.AddRange(newCuesheetV2.Entries);
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_DAO_V1:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_DAOI_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_neroDaov1 = new DaoV1
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSizeBe = chunkLength
};
var tmpBuffer = new byte[22];
_imageStream.EnsureRead(tmpBuffer, 0, 22);
2022-03-06 13:29:38 +00:00
_neroDaov1.ChunkSizeLe = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
_neroDaov1.Upc = new byte[14];
Array.Copy(tmpBuffer, 4, _neroDaov1.Upc, 0, 14);
_neroDaov1.TocType = BigEndianBitConverter.ToUInt16(tmpBuffer, 18);
_neroDaov1.FirstTrack = tmpBuffer[20];
_neroDaov1.LastTrack = tmpBuffer[21];
2024-05-01 04:39:38 +01:00
_neroDaov1.Tracks = [];
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV1.ChunkSizeLe = {0} bytes", _neroDaov1.ChunkSizeLe);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"neroDAOV1.UPC = \"{0}\"",
StringHandlers.CToString(_neroDaov1.Upc));
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV1.TocType = 0x{0:X4}", _neroDaov1.TocType);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV1.FirstTrack = {0}", _neroDaov1.FirstTrack);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV1.LastTrack = {0}", _neroDaov1.LastTrack);
2022-03-06 13:29:38 +00:00
_upc = _neroDaov1.Upc;
2022-03-06 13:29:38 +00:00
tmpBuffer = new byte[30];
for(var i = 0; i < _neroDaov1.ChunkSizeBe - 22; i += 30)
2022-03-06 13:29:38 +00:00
{
var entry = new DaoEntryV1();
_imageStream.EnsureRead(tmpBuffer, 0, 30);
2022-03-06 13:29:38 +00:00
entry.Isrc = new byte[12];
Array.Copy(tmpBuffer, 4, entry.Isrc, 0, 12);
entry.SectorSize = BigEndianBitConverter.ToUInt16(tmpBuffer, 12);
entry.Mode = BitConverter.ToUInt16(tmpBuffer, 14);
entry.Unknown = BigEndianBitConverter.ToUInt16(tmpBuffer, 16);
entry.Index0 = BigEndianBitConverter.ToUInt32(tmpBuffer, 18);
entry.Index1 = BigEndianBitConverter.ToUInt32(tmpBuffer, 22);
entry.EndOfTrack = BigEndianBitConverter.ToUInt32(tmpBuffer, 26);
// MagicISO
if(entry.SectorSize == 2352)
2023-10-03 23:34:59 +01:00
{
2022-11-13 19:38:03 +00:00
switch(entry.Mode)
2022-03-06 13:29:38 +00:00
{
2022-11-13 19:38:03 +00:00
case 0x0000:
corruptedTrackMode = true;
entry.Mode = 0x0005;
break;
case 0x0002 or 0x0003:
corruptedTrackMode = true;
entry.Mode = 0x0006;
break;
2022-03-06 13:29:38 +00:00
}
2023-10-03 23:34:59 +01:00
}
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Disc_At_Once_entry_0, i / 32 + 1);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].ISRC = \"{1}\"",
i / 32 + 1,
StringHandlers.CToString(entry.Isrc));
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].SectorSize = {1}",
i / 32 + 1,
entry.SectorSize);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Mode = {1} (0x{2:X4})",
i / 32 + 1,
(DaoMode)entry.Mode,
entry.Mode);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Unknown = 0x{1:X4}",
i / 32 + 1,
entry.Unknown);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Index0 = {1}", i / 32 + 1, entry.Index0);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Index1 = {1}", i / 32 + 1, entry.Index1);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].EndOfTrack = {1}",
i / 32 + 1,
entry.EndOfTrack);
2022-03-06 13:29:38 +00:00
_neroDaov1.Tracks.Add(entry);
2024-05-01 04:05:22 +01:00
if(entry.SectorSize > _imageInfo.SectorSize) _imageInfo.SectorSize = entry.SectorSize;
2022-03-06 13:29:38 +00:00
_trackIsrCs.Add(currentTrack, entry.Isrc);
2022-03-06 13:29:38 +00:00
var neroTrack = new NeroTrack
{
EndOfTrack = entry.EndOfTrack,
Isrc = entry.Isrc,
Length = entry.EndOfTrack - entry.Index0,
Mode = entry.Mode,
Offset = entry.Index0,
SectorSize = entry.SectorSize,
Index0 = entry.Index0,
Index1 = entry.Index1,
Sequence = currentTrack
};
2022-03-06 13:29:38 +00:00
_neroTracks.Add(currentTrack, neroTrack);
currentTrack++;
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_DAO_V2:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_DAOX_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_neroDaov2 = new DaoV2
{
ChunkId = chunkId,
ChunkSizeBe = chunkLength
};
var tmpBuffer = new byte[22];
_imageStream.EnsureRead(tmpBuffer, 0, 22);
2022-03-06 13:29:38 +00:00
_neroDaov2.ChunkSizeLe = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
_neroDaov2.Upc = new byte[14];
Array.Copy(tmpBuffer, 4, _neroDaov2.Upc, 0, 14);
_neroDaov2.TocType = BigEndianBitConverter.ToUInt16(tmpBuffer, 18);
_neroDaov2.FirstTrack = tmpBuffer[20];
_neroDaov2.LastTrack = tmpBuffer[21];
2024-05-01 04:39:38 +01:00
_neroDaov2.Tracks = [];
2022-03-06 13:29:38 +00:00
_upc = _neroDaov2.Upc;
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV2.ChunkSizeLe = {0} bytes", _neroDaov2.ChunkSizeLe);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"neroDAOV2.UPC = \"{0}\"",
StringHandlers.CToString(_neroDaov2.Upc));
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV2.TocType = 0x{0:X4}", _neroDaov2.TocType);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV2.FirstTrack = {0}", _neroDaov2.FirstTrack);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "neroDAOV2.LastTrack = {0}", _neroDaov2.LastTrack);
2022-03-06 13:29:38 +00:00
tmpBuffer = new byte[42];
for(var i = 0; i < _neroDaov2.ChunkSizeBe - 22; i += 42)
2022-03-06 13:29:38 +00:00
{
var entry = new DaoEntryV2();
_imageStream.EnsureRead(tmpBuffer, 0, 42);
2022-03-06 13:29:38 +00:00
entry.Isrc = new byte[12];
Array.Copy(tmpBuffer, 4, entry.Isrc, 0, 12);
entry.SectorSize = BigEndianBitConverter.ToUInt16(tmpBuffer, 12);
entry.Mode = BitConverter.ToUInt16(tmpBuffer, 14);
entry.Unknown = BigEndianBitConverter.ToUInt16(tmpBuffer, 16);
entry.Index0 = BigEndianBitConverter.ToUInt64(tmpBuffer, 18);
entry.Index1 = BigEndianBitConverter.ToUInt64(tmpBuffer, 26);
entry.EndOfTrack = BigEndianBitConverter.ToUInt64(tmpBuffer, 34);
// MagicISO
if(entry.SectorSize == 2352)
2023-10-03 23:34:59 +01:00
{
2022-11-13 19:38:03 +00:00
switch(entry.Mode)
{
2022-11-13 19:38:03 +00:00
case 0x0000:
corruptedTrackMode = true;
entry.Mode = 0x0005;
break;
case 0x0002 or 0x0003:
corruptedTrackMode = true;
entry.Mode = 0x0006;
break;
}
2023-10-03 23:34:59 +01:00
}
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Disc_At_Once_entry_0, i / 32 + 1);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].ISRC = \"{1}\"",
i / 32 + 1,
StringHandlers.CToString(entry.Isrc));
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].SectorSize = {1}",
i / 32 + 1,
entry.SectorSize);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Mode = {1} (0x{2:X4})",
i / 32 + 1,
(DaoMode)entry.Mode,
entry.Mode);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Unknown = {1:X2}",
i / 32 + 1,
entry.Unknown);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Index0 = {1}", i / 32 + 1, entry.Index0);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Index1 = {1}", i / 32 + 1, entry.Index1);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].EndOfTrack = {1}",
i / 32 + 1,
entry.EndOfTrack);
2022-03-06 13:29:38 +00:00
_neroDaov2.Tracks.Add(entry);
2024-05-01 04:05:22 +01:00
if(entry.SectorSize > _imageInfo.SectorSize) _imageInfo.SectorSize = entry.SectorSize;
2022-03-06 13:29:38 +00:00
_trackIsrCs.Add(currentTrack, entry.Isrc);
2022-03-06 13:29:38 +00:00
var neroTrack = new NeroTrack
{
EndOfTrack = entry.EndOfTrack,
Isrc = entry.Isrc,
Length = entry.EndOfTrack - entry.Index0,
Mode = entry.Mode,
Offset = entry.Index0,
SectorSize = entry.SectorSize,
Index0 = entry.Index0,
Index1 = entry.Index1,
Sequence = currentTrack
};
2022-03-06 13:29:38 +00:00
_neroTracks.Add(currentTrack, neroTrack);
currentTrack++;
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_CDTEXT:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_CDTX_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_cdtxt = new CdText
{
ChunkId = chunkId,
ChunkSize = chunkLength,
2024-05-01 04:39:38 +01:00
Packs = []
2022-03-06 13:29:38 +00:00
};
var tmpBuffer = new byte[18];
for(var i = 0; i < _cdtxt.ChunkSize; i += 18)
2022-03-06 13:29:38 +00:00
{
var entry = new CdTextPack();
_imageStream.EnsureRead(tmpBuffer, 0, 18);
2022-03-06 13:29:38 +00:00
entry.PackType = tmpBuffer[0];
entry.TrackNumber = tmpBuffer[1];
entry.PackNumber = tmpBuffer[2];
entry.BlockNumber = tmpBuffer[3];
entry.Text = new byte[12];
Array.Copy(tmpBuffer, 4, entry.Text, 0, 12);
entry.Crc = BigEndianBitConverter.ToUInt16(tmpBuffer, 16);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.CD_TEXT_entry_0, i / 18 + 1);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].PackType = 0x{1:X2}",
i / 18 + 1,
entry.PackType);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].TrackNumber = 0x{1:X2}",
i / 18 + 1,
entry.TrackNumber);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].PackNumber = 0x{1:X2}",
i / 18 + 1,
entry.PackNumber);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].BlockNumber = 0x{1:X2}",
i / 18 + 1,
entry.BlockNumber);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Text = \"{1}\"",
i / 18 + 1,
StringHandlers.CToString(entry.Text));
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].CRC = 0x{1:X4}", i / 18 + 1, entry.Crc);
2022-03-06 13:29:38 +00:00
_cdtxt.Packs.Add(entry);
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_TAO_V0:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_TINF_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
oldFormat = true;
2022-03-06 13:29:38 +00:00
_taoV0 = new TaoV0
{
ChunkId = chunkId,
ChunkSize = chunkLength,
2024-05-01 04:39:38 +01:00
Tracks = []
2022-03-06 13:29:38 +00:00
};
var tmpBuffer = new byte[12];
for(var i = 0; i < _taoV0.ChunkSize; i += 12)
2022-03-06 13:29:38 +00:00
{
var entry = new TaoEntryV0();
_imageStream.EnsureRead(tmpBuffer, 0, 12);
2022-03-06 13:29:38 +00:00
entry.Offset = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
entry.Length = BigEndianBitConverter.ToUInt32(tmpBuffer, 4);
entry.Mode = BigEndianBitConverter.ToUInt32(tmpBuffer, 8);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Track_at_Once_entry_0, i / 20 + 1);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Offset = {1}", i / 20 + 1, entry.Offset);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Length = {1} bytes",
i / 20 + 1,
entry.Length);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Mode = {1} (0x{2:X4})",
i / 20 + 1,
(DaoMode)entry.Mode,
entry.Mode);
2022-03-06 13:29:38 +00:00
_taoV0.Tracks.Add(entry);
2022-03-06 13:29:38 +00:00
if(NeroTrackModeToBytesPerSector((DaoMode)entry.Mode) > _imageInfo.SectorSize)
_imageInfo.SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode);
2022-03-06 13:29:38 +00:00
// StartLba points to INDEX 0 and Nero always introduces a pregap of 150 sectors,
2022-03-06 13:29:38 +00:00
var neroTrack = new NeroTrack
{
EndOfTrack = entry.Offset + entry.Length,
Isrc = new byte[12],
Length = entry.Length,
Mode = entry.Mode,
Offset = entry.Offset,
SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode),
UseLbaForIndex = true,
Sequence = currentTrack,
StartLba = currentLba > 0 ? (ulong)currentLba : 0
};
_neroTracks.Add(currentTrack, neroTrack);
currentTrack++;
currentLba += (int)(neroTrack.Length / neroTrack.SectorSize);
}
2022-03-06 13:29:38 +00:00
break;
}
case NERO_TAO_V1:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_ETNF_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_taoV1 = new TaoV1
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength,
2024-05-01 04:39:38 +01:00
Tracks = []
2022-03-06 13:29:38 +00:00
};
var tmpBuffer = new byte[20];
for(var i = 0; i < _taoV1.ChunkSize; i += 20)
2022-03-06 13:29:38 +00:00
{
var entry = new TaoEntryV1();
_imageStream.EnsureRead(tmpBuffer, 0, 20);
2022-03-06 13:29:38 +00:00
entry.Offset = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
entry.Length = BigEndianBitConverter.ToUInt32(tmpBuffer, 4);
entry.Mode = BigEndianBitConverter.ToUInt32(tmpBuffer, 8);
entry.StartLba = BigEndianBitConverter.ToUInt32(tmpBuffer, 12);
entry.Unknown = BigEndianBitConverter.ToUInt32(tmpBuffer, 16);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Track_at_Once_entry_0, i / 20 + 1);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Offset = {1}", i / 20 + 1, entry.Offset);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Length = {1} bytes",
i / 20 + 1,
entry.Length);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Mode = {1} (0x{2:X4})",
i / 20 + 1,
(DaoMode)entry.Mode,
entry.Mode);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].StartLBA = {1}", i / 20 + 1, entry.StartLba);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Unknown = 0x{1:X4}",
i / 20 + 1,
entry.Unknown);
2022-03-06 13:29:38 +00:00
_taoV1.Tracks.Add(entry);
2022-03-06 13:29:38 +00:00
if(NeroTrackModeToBytesPerSector((DaoMode)entry.Mode) > _imageInfo.SectorSize)
_imageInfo.SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode);
2022-03-06 13:29:38 +00:00
// StartLba points to INDEX 0 and Nero always introduces a pregap of 150 sectors,
2022-03-06 13:29:38 +00:00
var neroTrack = new NeroTrack
{
EndOfTrack = entry.Offset + entry.Length,
Isrc = new byte[12],
Length = entry.Length,
Mode = entry.Mode,
Offset = entry.Offset,
SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode),
UseLbaForIndex = true,
Sequence = currentTrack,
StartLba = entry.StartLba
};
2022-03-06 13:29:38 +00:00
_neroTracks.Add(currentTrack, neroTrack);
2022-03-06 13:29:38 +00:00
currentTrack++;
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_TAO_V2:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_ETN2_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_taoV2 = new TaoV2
{
ChunkId = chunkId,
ChunkSize = chunkLength,
2024-05-01 04:39:38 +01:00
Tracks = []
2022-03-06 13:29:38 +00:00
};
var tmpBuffer = new byte[32];
for(var i = 0; i < _taoV2.ChunkSize; i += 32)
2022-03-06 13:29:38 +00:00
{
var entry = new TaoEntryV2();
_imageStream.EnsureRead(tmpBuffer, 0, 32);
2022-03-06 13:29:38 +00:00
entry.Offset = BigEndianBitConverter.ToUInt64(tmpBuffer, 0);
entry.Length = BigEndianBitConverter.ToUInt64(tmpBuffer, 8);
entry.Mode = BigEndianBitConverter.ToUInt32(tmpBuffer, 16);
entry.StartLba = BigEndianBitConverter.ToUInt32(tmpBuffer, 20);
entry.Unknown = BigEndianBitConverter.ToUInt32(tmpBuffer, 24);
entry.Sectors = BigEndianBitConverter.ToUInt32(tmpBuffer, 28);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Track_at_Once_entry_0, i / 32 + 1);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Offset = {1}", i / 32 + 1, entry.Offset);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Length = {1} bytes",
i / 32 + 1,
entry.Length);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Mode = {1} (0x{2:X4})",
i / 32 + 1,
(DaoMode)entry.Mode,
entry.Mode);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].StartLBA = {1}", i / 32 + 1, entry.StartLba);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t _entry[{0}].Unknown = 0x{1:X4}",
i / 32 + 1,
entry.Unknown);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\t _entry[{0}].Sectors = {1}", i / 32 + 1, entry.Sectors);
2022-03-06 13:29:38 +00:00
_taoV2.Tracks.Add(entry);
2022-03-06 13:29:38 +00:00
ushort v2Bps = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode);
2022-03-06 13:29:38 +00:00
if(NeroTrackModeToBytesPerSector((DaoMode)entry.Mode) > _imageInfo.SectorSize)
_imageInfo.SectorSize = v2Bps;
2022-03-06 13:29:38 +00:00
// StartLba points to INDEX 1 and Nero always introduces a pregap of 150 sectors,
// so let's move it to INDEX 0 and fix the pointers
if(entry.StartLba >= 150)
{
entry.StartLba -= 150;
entry.Offset -= (ulong)(150 * v2Bps);
entry.Length += (ulong)(150 * v2Bps);
}
2022-03-06 13:29:38 +00:00
var neroTrack = new NeroTrack
{
EndOfTrack = entry.Offset + entry.Length,
Isrc = new byte[12],
Length = entry.Length,
Mode = entry.Mode,
Offset = entry.Offset,
StartLba = entry.StartLba,
UseLbaForIndex = true,
SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode),
Sequence = currentTrack
};
_neroTracks.Add(currentTrack, neroTrack);
currentTrack++;
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_SESSION:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_SINF_chunk_parsing_0_bytes, chunkLength);
var tmpBuffer = new byte[4];
_imageStream.EnsureRead(tmpBuffer, 0, 4);
var sessionTracks = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
2022-03-06 13:29:38 +00:00
_neroSessions.Add(currentSession, sessionTracks);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t" + Localization.Session_0_has_1_tracks,
currentSession,
sessionTracks);
2022-03-06 13:29:38 +00:00
currentSession++;
break;
}
2022-03-06 13:29:38 +00:00
case NERO_DISC_TYPE:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_MTYP_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_mediaType = new MediaType
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength
};
var tmpBuffer = new byte[4];
_imageStream.EnsureRead(tmpBuffer, 0, 4);
2022-03-06 13:29:38 +00:00
_mediaType.Type = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
"\t" + Localization.Media_type_is_0_1,
(NeroMediaTypes)_mediaType.Type,
_mediaType.Type);
2022-03-06 13:29:38 +00:00
_imageInfo.MediaType = NeroMediaTypeToMediaType((NeroMediaTypes)_mediaType.Type);
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_DISC_INFO:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_DINF_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_discInfo = new DiscInformation
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength
};
var tmpBuffer = new byte[4];
_imageStream.EnsureRead(tmpBuffer, 0, 4);
2022-03-06 13:29:38 +00:00
_discInfo.Unknown = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\tneroDiscInfo.Unknown = 0x{0:X4} ({0})", _discInfo.Unknown);
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_RELOCATION:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_RELO_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_relo = new ReloChunk
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength
};
var tmpBuffer = new byte[4];
_imageStream.EnsureRead(tmpBuffer, 0, 4);
2022-03-06 13:29:38 +00:00
_relo.Unknown = BigEndianBitConverter.ToUInt32(tmpBuffer, 0);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\tneroRELO.Unknown = 0x{0:X4} ({0})", _relo.Unknown);
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_TOC:
{
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_TOCT_chunk_parsing_0_bytes, chunkLength);
2022-03-06 13:29:38 +00:00
_toc = new TocChunk
{
2022-03-06 13:29:38 +00:00
ChunkId = chunkId,
ChunkSize = chunkLength
};
var tmpBuffer = new byte[2];
_imageStream.EnsureRead(tmpBuffer, 0, 2);
2022-03-06 13:29:38 +00:00
_toc.Unknown = BigEndianBitConverter.ToUInt16(tmpBuffer, 0);
2022-11-13 19:59:24 +00:00
_imageInfo.MediaType = tmpBuffer[0] switch
2023-10-03 23:34:59 +01:00
{
0 => CommonTypes.MediaType.CDROM,
0x10 => CommonTypes.MediaType.CDI,
0x20 => CommonTypes.MediaType.CDROMXA,
_ => _imageInfo.MediaType
};
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\tneroTOC.Unknown = 0x{0:X4} ({0})", _toc.Unknown);
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case NERO_END:
{
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Found_END_chunk_finishing_parse);
2022-03-06 13:29:38 +00:00
parsing = false;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
default:
{
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME,
2025-08-20 18:51:05 +01:00
Localization.Unknown_chunk_ID_0_skipping,
Encoding.ASCII.GetString(BigEndianBitConverter.GetBytes(chunkId)));
2022-03-06 13:29:38 +00:00
_imageStream.Seek(chunkLength, SeekOrigin.Current);
2022-03-06 13:29:38 +00:00
break;
}
}
2022-03-06 13:29:38 +00:00
}
2025-08-20 18:51:05 +01:00
if(corruptedTrackMode) AaruLogging.Error(Localization.Inconsistent_track_mode_and_track_sector_size_found);
2022-03-06 13:29:38 +00:00
_imageInfo.HasPartitions = true;
_imageInfo.HasSessions = true;
_imageInfo.Creator = null;
_imageInfo.CreationTime = imageFilter.CreationTime;
_imageInfo.LastModificationTime = imageFilter.LastWriteTime;
_imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.Filename);
_imageInfo.Comments = null;
_imageInfo.MediaManufacturer = null;
_imageInfo.MediaModel = null;
_imageInfo.MediaSerialNumber = null;
_imageInfo.MediaBarcode = null;
_imageInfo.MediaPartNumber = null;
_imageInfo.DriveManufacturer = null;
_imageInfo.DriveModel = null;
_imageInfo.DriveSerialNumber = null;
_imageInfo.DriveFirmwareRevision = null;
_imageInfo.MediaSequence = 0;
_imageInfo.LastMediaSequence = 0;
_imageInfo.Application = "Nero Burning ROM";
if(_imageNewFormat)
{
_imageInfo.ImageSize = footerV2.FirstChunkOffset;
_imageInfo.Version = "Nero Burning ROM >= 5.5";
_imageInfo.ApplicationVersion = ">= 5.5";
}
else if(oldFormat)
{
_imageInfo.ImageSize = footerV1.FirstChunkOffset;
_imageInfo.Version = "Nero Burning ROM 4";
_imageInfo.ApplicationVersion = "4";
}
else
{
_imageInfo.ImageSize = footerV1.FirstChunkOffset;
_imageInfo.Version = "Nero Burning ROM <= 5.0";
_imageInfo.ApplicationVersion = "<= 5.0";
}
2017-12-19 20:33:03 +00:00
2024-05-01 04:05:22 +01:00
if(_neroSessions.Count == 0) _neroSessions.Add(1, currentTrack);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Building_offset_track_and_session_maps);
2022-03-16 11:47:00 +00:00
bool onlyOneSession = currentSession is 1 or 2;
2022-03-06 13:29:38 +00:00
currentSession = 1;
_neroSessions.TryGetValue(1, out uint currentSessionMaxTrack);
uint currentSessionCurrentTrack = 1;
var currentSessionStruct = new CommonTypes.Structs.Session();
ulong partitionSequence = 0;
ulong partitionStartByte = 0;
var trackCounter = 1;
2022-03-06 13:29:38 +00:00
_trackFlags = new Dictionary<uint, byte>();
2024-05-01 04:05:22 +01:00
if(currentSessionMaxTrack == 0) currentSessionMaxTrack = 1;
2022-03-06 13:29:38 +00:00
bool moreTracksThanSessionTracks = currentSessionMaxTrack < _neroTracks.Count;
2022-03-06 13:29:38 +00:00
// Process tracks
foreach(NeroTrack neroTrack in _neroTracks.Values)
{
if(neroTrack.Offset >= (_imageNewFormat ? footerV2.FirstChunkOffset : footerV1.FirstChunkOffset))
{
2025-08-20 18:51:05 +01:00
AaruLogging.Error(Localization.This_image_contains_a_track_that_is_set_to_start_outside_the_file);
2025-08-20 18:51:05 +01:00
AaruLogging.Error(Localization.Breaking_track_processing_and_trying_recovery_of_information);
2022-03-06 13:29:38 +00:00
break;
}
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\tcurrentSession = {0}", currentSession);
AaruLogging.Debug(MODULE_NAME, "\tcurrentSessionMaxTrack = {0}", currentSessionMaxTrack);
2025-08-20 18:51:05 +01:00
AaruLogging.Debug(MODULE_NAME, "\tcurrentSessionCurrentTrack = {0}", currentSessionCurrentTrack);
2022-03-06 13:29:38 +00:00
var track = new Track();
2022-03-06 13:29:38 +00:00
// Process indexes
if(_cuesheetV1?.Entries?.Count > 0)
2023-10-03 23:34:59 +01:00
{
2024-05-01 04:05:22 +01:00
foreach(CueEntryV1 entry in _cuesheetV1.Entries.Where(e => e.TrackNumber == neroTrack.Sequence)
.OrderBy(e => e.IndexNumber))
{
2022-03-06 13:29:38 +00:00
track.Indexes[entry.IndexNumber] =
2023-10-03 23:34:59 +01:00
entry.Minute * 60 * 75 + entry.Second * 75 + entry.Frame - 150;
2022-03-06 13:29:38 +00:00
_trackFlags[entry.TrackNumber] = (byte)((entry.Mode & 0xF0) >> 4);
}
2023-10-03 23:34:59 +01:00
}
2022-03-06 13:29:38 +00:00
else if(_cuesheetV2?.Entries?.Count > 0)
2023-10-03 23:34:59 +01:00
{
2024-05-01 04:05:22 +01:00
foreach(CueEntryV2 entry in _cuesheetV2.Entries.Where(e => e.TrackNumber == neroTrack.Sequence)
.OrderBy(e => e.IndexNumber))
2022-03-06 13:29:38 +00:00
{
track.Indexes[entry.IndexNumber] = entry.LbaStart;
_trackFlags[entry.TrackNumber] = (byte)((entry.Mode & 0xF0) >> 4);
}
2023-10-03 23:34:59 +01:00
}
2022-03-06 13:29:38 +00:00
// Act if there are no indexes
if(track.Indexes.Count == 0)
{
if(!neroTrack.UseLbaForIndex)
continue; // This track start is unknown, continue and pray the goddess
2022-03-06 13:29:38 +00:00
// This always happens in TAO discs and Nero uses 150 sectors of pregap for them
// but we need to move the offsets if it's the first track of a session
if(currentSessionCurrentTrack == 1)
{
2022-03-06 13:29:38 +00:00
track.Indexes[1] = (int)neroTrack.StartLba;
track.Indexes[0] = track.Indexes[1] - 150;
neroTrack.Offset -= (ulong)(150 * neroTrack.SectorSize);
neroTrack.Length += (ulong)(150 * neroTrack.SectorSize);
}
else
{
2022-03-06 13:29:38 +00:00
track.Indexes[0] = (int)neroTrack.StartLba;
track.Indexes[1] = track.Indexes[0] + 150;
}
2022-03-06 13:29:38 +00:00
}
2022-03-06 13:29:38 +00:00
// Prevent duplicate index 0
2024-05-01 04:05:22 +01:00
if(track.Indexes.ContainsKey(0) && track.Indexes[0] == track.Indexes[1]) track.Indexes.Remove(0);
2022-03-06 13:29:38 +00:00
// There's a pregap
if(track.Indexes.ContainsKey(0))
{
track.Pregap = (ulong)(track.Indexes[1] - track.Indexes[0]);
2022-03-06 13:29:38 +00:00
// Negative pregap, skip it
if(track.Indexes[0] < 0)
{
2022-03-06 13:29:38 +00:00
neroTrack.Length -= track.Pregap * neroTrack.SectorSize;
neroTrack.Offset += track.Pregap * neroTrack.SectorSize;
track.StartSector = (ulong)track.Indexes[1];
}
2022-03-06 13:29:38 +00:00
else
track.StartSector = (ulong)track.Indexes[0];
}
else
track.StartSector = (ulong)track.Indexes[1];
2022-03-06 13:29:38 +00:00
// Handle hidden tracks
if(neroTrack.Sequence == 1 && track.StartSector > 0)
2022-03-06 13:29:38 +00:00
{
neroTrack.Length += track.StartSector * neroTrack.SectorSize;
neroTrack.Offset -= track.StartSector * neroTrack.SectorSize;
track.StartSector = 0;
}
2022-03-06 13:29:38 +00:00
// Common track data
track.Description = StringHandlers.CToString(neroTrack.Isrc);
2023-10-03 23:34:59 +01:00
track.EndSector = neroTrack.Length / neroTrack.SectorSize + track.StartSector - 1;
2022-03-06 13:29:38 +00:00
track.Sequence = neroTrack.Sequence;
track.Session = currentSession;
track.Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode);
track.File = imageFilter.Filename;
track.Filter = imageFilter;
track.FileOffset = neroTrack.Offset;
track.FileType = "BINARY";
track.SubchannelType = TrackSubchannelType.None;
neroTrack.Sectors = neroTrack.Length / neroTrack.SectorSize;
// Flags not set for this track
if(!_trackFlags.ContainsKey(track.Sequence))
2023-10-03 23:34:59 +01:00
{
_trackFlags[track.Sequence] = track.Type switch
{
TrackType.Audio => 0,
TrackType.Data
or TrackType.CdMode1
or TrackType.CdMode2Formless
or TrackType.CdMode2Form1
or TrackType.CdMode2Form2 => 4,
_ => _trackFlags[track.Sequence]
};
2023-10-03 23:34:59 +01:00
}
2022-03-06 13:29:38 +00:00
// If ISRC is not empty
if(!string.IsNullOrWhiteSpace(track.Description))
{
_trackIsrCs[neroTrack.Sequence] = neroTrack.Isrc;
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdTrackIsrc))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackIsrc);
}
var rawMode1 = false;
var rawMode2 = false;
2022-03-06 13:29:38 +00:00
switch((DaoMode)neroTrack.Mode)
{
case DaoMode.AudioAlt:
case DaoMode.Audio:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.AudioSub:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
track.SubchannelType = TrackSubchannelType.RawInterleaved;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.Data:
case DaoMode.DataM2F1:
track.BytesPerSector = 2048;
track.RawBytesPerSector = 2048;
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataM2F2:
track.BytesPerSector = 2336;
track.RawBytesPerSector = 2336;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataM2Raw:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
rawMode2 = true;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataM2RawSub:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
track.SubchannelType = TrackSubchannelType.RawInterleaved;
rawMode2 = true;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataRaw:
track.BytesPerSector = 2048;
track.RawBytesPerSector = 2352;
rawMode1 = true;
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataRawSub:
track.BytesPerSector = 2048;
track.RawBytesPerSector = 2352;
track.SubchannelType = TrackSubchannelType.RawInterleaved;
rawMode1 = true;
2022-03-06 13:29:38 +00:00
break;
}
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\t\t _track.Description = {0}", track.Description);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\t\t _track.EndSector = {0}", track.EndSector);
AaruLogging.Debug(MODULE_NAME, "\t\t _track.Pregap = {0}", track.Pregap);
AaruLogging.Debug(MODULE_NAME, "\t\t _track.Sequence = {0}", track.Sequence);
AaruLogging.Debug(MODULE_NAME, "\t\t _track.Session = {0}", track.Session);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\t\t _track.StartSector = {0}", track.StartSector);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\t\t _track.Type = {0}", track.Type);
2022-03-06 13:29:38 +00:00
// Check readability of sector tags
if(rawMode1 || rawMode2)
{
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader) && rawMode2)
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
if(track.SubchannelType == TrackSubchannelType.RawInterleaved)
{
track.SubchannelFilter = imageFilter;
track.SubchannelFile = imageFilter.Filename;
track.SubchannelOffset = neroTrack.Offset;
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
}
2022-03-06 13:29:38 +00:00
Tracks.Add(track);
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
// Build session
if(currentSessionCurrentTrack == 1)
2023-10-03 23:34:59 +01:00
{
2022-03-06 13:29:38 +00:00
currentSessionStruct = new CommonTypes.Structs.Session
{
2022-03-06 13:29:38 +00:00
Sequence = currentSession,
StartSector = track.StartSector,
StartTrack = track.Sequence
};
2023-10-03 23:34:59 +01:00
}
2022-03-06 13:29:38 +00:00
currentSessionCurrentTrack++;
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
if(currentSessionCurrentTrack > currentSessionMaxTrack)
{
currentSession++;
_neroSessions.TryGetValue(currentSession, out currentSessionMaxTrack);
currentSessionCurrentTrack = 1;
currentSessionStruct.EndTrack = track.Sequence;
currentSessionStruct.EndSector = track.EndSector;
Sessions.Add(currentSessionStruct);
}
2022-03-06 13:29:38 +00:00
else if(trackCounter == _neroTracks.Count)
{
2022-03-06 13:29:38 +00:00
_neroSessions.TryGetValue(currentSession, out currentSessionMaxTrack);
currentSessionCurrentTrack = 1;
currentSessionStruct.EndTrack = track.Sequence;
currentSessionStruct.EndSector = track.EndSector;
Sessions.Add(currentSessionStruct);
}
2022-03-06 13:29:38 +00:00
// Add to offset map
_offsetmap.Add(track.Sequence, track.StartSector);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, "\t\t Offset[{0}]: {1}", track.Sequence, track.StartSector);
2022-03-06 13:29:38 +00:00
// Create partition
var partition = new Partition
{
Description = string.Format(Localization.Track_0, track.Sequence),
2022-03-06 13:29:38 +00:00
Size = neroTrack.EndOfTrack - neroTrack.Index1,
Name = StringHandlers.CToString(neroTrack.Isrc),
Sequence = partitionSequence,
Offset = partitionStartByte,
Start = (ulong)track.Indexes[1],
Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString()
};
partition.Length = partition.Size / neroTrack.SectorSize;
Partitions.Add(partition);
partitionSequence++;
partitionStartByte += partition.Size;
2024-05-01 04:05:22 +01:00
if(track.EndSector + 1 > _imageInfo.Sectors) _imageInfo.Sectors = track.EndSector + 1;
2022-03-06 13:29:38 +00:00
trackCounter++;
}
2022-03-06 13:29:38 +00:00
if(Tracks.Count == 0)
{
if(_neroTracks.Count != 1 ||
!_neroTracks.ContainsKey(1) ||
(_imageNewFormat ? footerV2.FirstChunkOffset : footerV1.FirstChunkOffset) %
_neroTracks[1].SectorSize !=
0)
2022-03-06 13:29:38 +00:00
{
2025-08-17 06:11:22 +01:00
AaruLogging.Error(Localization.Image_corrupted_beyond_recovery_cannot_open);
2022-03-06 13:29:38 +00:00
return ErrorNumber.InvalidArgument;
}
2022-11-14 01:23:52 +00:00
var track = new Track
{
// Common track data
Description = StringHandlers.CToString(_neroTracks[1].Isrc),
2024-05-01 04:05:22 +01:00
EndSector =
(_imageNewFormat ? footerV2.FirstChunkOffset : footerV1.FirstChunkOffset) /
_neroTracks[1].SectorSize -
150,
2022-11-14 01:23:52 +00:00
Sequence = _neroTracks[1].Sequence,
Session = currentSession,
Type = NeroTrackModeToTrackType((DaoMode)_neroTracks[1].Mode),
File = imageFilter.Filename,
Filter = imageFilter,
FileType = "BINARY",
SubchannelType = TrackSubchannelType.None,
Indexes =
{
[1] = 0
}
};
var rawMode1 = false;
var rawMode2 = false;
var subSize = 0;
2022-03-06 13:29:38 +00:00
switch((DaoMode)_neroTracks[1].Mode)
{
case DaoMode.AudioAlt:
case DaoMode.Audio:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.AudioSub:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
track.SubchannelType = TrackSubchannelType.RawInterleaved;
subSize = 96;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.Data:
case DaoMode.DataM2F1:
track.BytesPerSector = 2048;
track.RawBytesPerSector = 2048;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataM2F2:
track.BytesPerSector = 2336;
track.RawBytesPerSector = 2336;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataM2Raw:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
rawMode2 = true;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataM2RawSub:
track.BytesPerSector = 2352;
track.RawBytesPerSector = 2352;
track.SubchannelType = TrackSubchannelType.RawInterleaved;
rawMode2 = true;
subSize = 96;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataRaw:
track.BytesPerSector = 2048;
track.RawBytesPerSector = 2352;
rawMode1 = true;
2022-03-06 13:29:38 +00:00
break;
case DaoMode.DataRawSub:
track.BytesPerSector = 2048;
track.RawBytesPerSector = 2352;
track.SubchannelType = TrackSubchannelType.RawInterleaved;
rawMode1 = true;
subSize = 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
// Check readability of sector tags
if(rawMode1 || rawMode2)
{
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorHeader))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader);
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubHeader) && rawMode2)
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubHeader);
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEdc))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc);
}
2022-03-06 13:29:38 +00:00
if(track.SubchannelType == TrackSubchannelType.RawInterleaved)
{
track.SubchannelFilter = imageFilter;
track.SubchannelFile = imageFilter.Filename;
track.SubchannelOffset = (ulong)(150 * (track.RawBytesPerSector + subSize));
2022-03-06 13:29:38 +00:00
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
}
2022-03-06 13:29:38 +00:00
track.FileOffset = (ulong)(150 * (track.RawBytesPerSector + subSize));
_neroTracks[1].Offset = track.FileOffset;
_neroTracks[1].Sectors = track.EndSector - track.StartSector + 1;
2022-03-06 13:29:38 +00:00
// Add to offset map
_offsetmap.Add(track.Sequence, track.StartSector);
2022-03-06 13:29:38 +00:00
// This is basically what MagicISO does with DVD images
if(track.RawBytesPerSector == 2048)
{
_imageInfo.MediaType = CommonTypes.MediaType.DVDROM;
track.Type = TrackType.Data;
}
2022-03-06 13:29:38 +00:00
_imageInfo.Sectors = track.EndSector + 1;
2022-03-06 13:29:38 +00:00
Tracks.Add(track);
2022-03-06 13:29:38 +00:00
// Create partition
var partition = new Partition
{
Description = string.Format(Localization.Track_0, track.Sequence),
2022-03-06 13:29:38 +00:00
Length = track.EndSector - track.StartSector + 1,
Name = StringHandlers.CToString(_neroTracks[1].Isrc),
Sequence = 1,
Offset = 0,
Start = (ulong)track.Indexes[1],
Type = track.Type.ToString()
};
partition.Size = partition.Length * _neroTracks[1].SectorSize;
Partitions.Add(partition);
Sessions.Add(new CommonTypes.Structs.Session
{
Sequence = 1,
StartSector = 0,
StartTrack = 1,
EndTrack = 1,
EndSector = track.EndSector
});
2025-08-17 06:11:22 +01:00
AaruLogging.Error(Localization.Warning_This_image_is_missing_the_last_150_sectors);
2022-03-06 13:29:38 +00:00
}
2022-03-06 13:29:38 +00:00
// MagicISO meets these conditions when disc contains more than 15 tracks and a single session
if(_imageNewFormat &&
Tracks.Count > 0xF &&
moreTracksThanSessionTracks &&
onlyOneSession &&
Tracks.Any(t => t.Session > 0))
{
2024-05-01 04:05:22 +01:00
foreach(Track track in Tracks) track.Session = 1;
2022-03-06 13:29:38 +00:00
Sessions.Clear();
2022-03-06 13:29:38 +00:00
Track firstTrack = Tracks.First();
Track lastTrack = Tracks.Last();
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
Sessions.Add(new CommonTypes.Structs.Session
{
2022-03-06 13:29:38 +00:00
EndSector = lastTrack.EndSector,
StartSector = firstTrack.StartSector,
Sequence = 1,
EndTrack = lastTrack.Sequence,
StartTrack = firstTrack.Sequence
});
}
if(_trackFlags.Count > 0 && !_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdTrackFlags))
2022-03-06 13:29:38 +00:00
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackFlags);
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
_neroFilter = imageFilter;
2017-12-19 20:33:03 +00:00
2022-03-16 11:47:00 +00:00
if(_imageInfo.MediaType is CommonTypes.MediaType.Unknown or CommonTypes.MediaType.CD)
2022-03-06 13:29:38 +00:00
{
var data = false;
var mode2 = false;
var firstAudio = false;
var firstData = false;
var audio = false;
for(var i = 0; i < _neroTracks.Count; i++)
{
2022-03-06 13:29:38 +00:00
// First track is audio
firstAudio |= i == 0 &&
((DaoMode)_neroTracks.ElementAt(i).Value.Mode == DaoMode.Audio ||
(DaoMode)_neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioAlt ||
(DaoMode)_neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub);
2022-03-06 13:29:38 +00:00
// First track is data
firstData |= i == 0 &&
(DaoMode)_neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
2022-03-06 13:29:38 +00:00
(DaoMode)_neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioAlt &&
(DaoMode)_neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
// Any non first track is data
data |= i != 0 &&
(DaoMode)_neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
2022-03-06 13:29:38 +00:00
(DaoMode)_neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioAlt &&
(DaoMode)_neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
// Any non first track is audio
audio |= i != 0 &&
((DaoMode)_neroTracks.ElementAt(i).Value.Mode == DaoMode.Audio ||
(DaoMode)_neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioAlt ||
(DaoMode)_neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub);
2022-03-06 13:29:38 +00:00
mode2 = (DaoMode)_neroTracks.ElementAt(i).Value.Mode switch
{
DaoMode.DataM2F1
or DaoMode.DataM2F2
or DaoMode.DataM2Raw
or DaoMode.DataM2RawSub => true,
_ => mode2
};
}
if(!data && !firstData)
2022-03-06 13:29:38 +00:00
_imageInfo.MediaType = CommonTypes.MediaType.CDDA;
else if(firstAudio && data && Sessions.Count > 1 && mode2)
2022-03-06 13:29:38 +00:00
_imageInfo.MediaType = CommonTypes.MediaType.CDPLUS;
2023-10-03 23:34:59 +01:00
else if(firstData && audio || mode2)
2022-03-06 13:29:38 +00:00
_imageInfo.MediaType = CommonTypes.MediaType.CDROMXA;
else if(!audio)
_imageInfo.MediaType = CommonTypes.MediaType.CDROM;
else
_imageInfo.MediaType = CommonTypes.MediaType.CD;
}
_imageInfo.MetadataMediaType = MetadataMediaType.OpticalDisc;
2025-08-17 06:11:22 +01:00
AaruLogging.Verbose(Localization.Nero_image_contains_a_disc_of_type_0, _imageInfo.MediaType);
2022-03-06 13:29:38 +00:00
_sectorBuilder = new SectorBuilder();
2024-05-01 04:05:22 +01:00
_isCd = _imageInfo.MediaType is CommonTypes.MediaType.CD
or CommonTypes.MediaType.CDDA
or CommonTypes.MediaType.CDG
or CommonTypes.MediaType.CDEG
or CommonTypes.MediaType.CDI
or CommonTypes.MediaType.CDROM
or CommonTypes.MediaType.CDROMXA
or CommonTypes.MediaType.CDPLUS
or CommonTypes.MediaType.CDMO
or CommonTypes.MediaType.CDR
or CommonTypes.MediaType.CDRW
or CommonTypes.MediaType.CDMRW
or CommonTypes.MediaType.VCD
or CommonTypes.MediaType.SVCD
or CommonTypes.MediaType.PCD
or CommonTypes.MediaType.DTSCD
or CommonTypes.MediaType.CDMIDI
or CommonTypes.MediaType.CDV
or CommonTypes.MediaType.CDIREADY
or CommonTypes.MediaType.FMTOWNS
or CommonTypes.MediaType.PS1CD
or CommonTypes.MediaType.PS2CD
or CommonTypes.MediaType.MEGACD
or CommonTypes.MediaType.SATURNCD
or CommonTypes.MediaType.GDROM
or CommonTypes.MediaType.GDR
or CommonTypes.MediaType.MilCD
or CommonTypes.MediaType.SuperCDROM2
or CommonTypes.MediaType.JaguarCD
or CommonTypes.MediaType.ThreeDO
or CommonTypes.MediaType.PCFX
or CommonTypes.MediaType.NeoGeoCD
or CommonTypes.MediaType.CDTV
or CommonTypes.MediaType.CD32
or CommonTypes.MediaType.Playdia
or CommonTypes.MediaType.Pippin
or CommonTypes.MediaType.VideoNow
or CommonTypes.MediaType.VideoNowColor
or CommonTypes.MediaType.VideoNowXp
or CommonTypes.MediaType.CVD;
if(_isCd) return ErrorNumber.NoError;
2022-03-06 13:29:38 +00:00
foreach(Track track in Tracks)
{
track.Pregap = 0;
track.Indexes?.Clear();
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
_imageInfo.ReadableMediaTags.Remove(MediaTagType.CD_MCN);
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc);
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags);
return ErrorNumber.NoError;
}
2025-08-20 18:51:05 +01:00
catch(Exception ex)
{
2025-08-20 18:51:05 +01:00
SentrySdk.CaptureException(ex);
AaruLogging.Exception(ex, Localization.Exception_occurred_opening_file);
2025-08-17 06:11:22 +01:00
AaruLogging.Debug(MODULE_NAME, Localization.Exception_occurred_opening_file);
2022-03-06 13:29:38 +00:00
return ErrorNumber.UnexpectedException;
}
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadMediaTag(MediaTagType tag, out byte[] buffer)
{
buffer = null;
2022-03-06 13:29:38 +00:00
switch(tag)
{
case MediaTagType.CD_MCN:
buffer = _upc?.Clone() as byte[];
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
return buffer != null ? ErrorNumber.NoError : ErrorNumber.NoData;
2017-12-19 20:33:03 +00:00
2023-10-03 23:34:59 +01:00
case MediaTagType.CD_TEXT:
return ErrorNumber.NotImplemented;
default:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
}
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSector(ulong sectorAddress, bool negative, out byte[] buffer, out SectorStatus sectorStatus)
{
sectorStatus = SectorStatus.Dumped;
return ReadSectors(sectorAddress, negative, 1, out buffer, out _);
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorTag(ulong sectorAddress, bool negative, SectorTagType tag, out byte[] buffer) =>
ReadSectorsTag(sectorAddress, negative, 1, tag, out buffer);
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSector(ulong sectorAddress, uint track, out byte[] buffer, out SectorStatus sectorStatus)
{
sectorStatus = SectorStatus.Dumped;
return ReadSectors(sectorAddress, 1, track, out buffer, out _);
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorTag(ulong sectorAddress, uint track, SectorTagType tag, out byte[] buffer) =>
ReadSectorsTag(sectorAddress, 1, track, tag, out buffer);
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectors(ulong sectorAddress, bool negative, uint length, out byte[] buffer,
out SectorStatus[] sectorStatus)
2022-03-06 13:29:38 +00:00
{
buffer = null;
sectorStatus = null;
2017-12-19 20:33:03 +00:00
if(negative) return ErrorNumber.NotSupported;
2023-10-03 23:34:59 +01:00
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap
where sectorAddress >= kvp.Value
from track in Tracks
where track.Sequence == kvp.Key
2022-03-07 07:36:44 +00:00
where sectorAddress - kvp.Value <= track.EndSector - track.StartSector
select kvp)
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key, out buffer, out sectorStatus);
2022-03-06 13:29:38 +00:00
return ErrorNumber.SectorNotFound;
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorsTag(ulong sectorAddress, bool negative, uint length, SectorTagType tag,
out byte[] buffer)
2022-03-06 13:29:38 +00:00
{
buffer = null;
if(negative) return ErrorNumber.NotSupported;
2023-10-03 23:34:59 +01:00
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap
where sectorAddress >= kvp.Value
from track in Tracks
where track.Sequence == kvp.Key
2022-03-07 07:36:44 +00:00
where sectorAddress - kvp.Value <= track.EndSector - track.StartSector
select kvp)
2022-03-06 13:29:38 +00:00
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag, out buffer);
return ErrorNumber.SectorNotFound;
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectors(ulong sectorAddress, uint length, uint track, out byte[] buffer,
out SectorStatus[] sectorStatus)
2022-03-06 13:29:38 +00:00
{
buffer = null;
sectorStatus = null;
2017-12-19 20:33:03 +00:00
2024-05-01 04:05:22 +01:00
if(!_neroTracks.TryGetValue(track, out NeroTrack aaruTrack)) return ErrorNumber.SectorNotFound;
2017-12-19 20:33:03 +00:00
2024-05-01 04:05:22 +01:00
if(length > aaruTrack.Sectors) return ErrorNumber.OutOfRange;
2017-12-19 20:33:03 +00:00
sectorStatus = Enumerable.Repeat(SectorStatus.Dumped, (int)length).ToArray();
2022-03-06 13:29:38 +00:00
uint sectorOffset;
uint sectorSize;
uint sectorSkip;
var mode2 = false;
2022-03-06 13:29:38 +00:00
switch((DaoMode)aaruTrack.Mode)
{
case DaoMode.Data:
case DaoMode.DataM2F1:
{
sectorOffset = 0;
sectorSize = 2048;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataM2F2:
{
mode2 = true;
sectorOffset = 0;
sectorSize = 2336;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.Audio:
case DaoMode.AudioAlt:
{
sectorOffset = 0;
sectorSize = 2352;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataRaw:
{
sectorOffset = 16;
sectorSize = 2048;
sectorSkip = 288;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataM2Raw:
{
mode2 = true;
sectorOffset = 0;
sectorSize = 2352;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataRawSub:
{
sectorOffset = 16;
sectorSize = 2048;
sectorSkip = 288 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataM2RawSub:
{
mode2 = true;
sectorOffset = 0;
sectorSize = 2352;
sectorSkip = 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.AudioSub:
{
sectorOffset = 0;
sectorSize = 2352;
sectorSkip = 96;
2022-03-06 13:29:38 +00:00
break;
}
2023-10-03 23:34:59 +01:00
default:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
buffer = new byte[sectorSize * length];
2022-03-06 13:29:38 +00:00
_imageStream = _neroFilter.GetDataForkStream();
var br = new BinaryReader(_imageStream);
2022-03-07 07:36:44 +00:00
br.BaseStream.Seek((long)aaruTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
SeekOrigin.Begin);
2022-03-06 13:29:38 +00:00
if(mode2)
{
var mode2Ms = new MemoryStream((int)(sectorSize * length));
2022-03-06 13:29:38 +00:00
buffer = br.ReadBytes((int)((sectorSize + sectorSkip) * length));
for(var i = 0; i < length; i++)
2022-03-06 13:29:38 +00:00
{
var sector = new byte[sectorSize];
2022-03-06 13:29:38 +00:00
Array.Copy(buffer, (sectorSize + sectorSkip) * i, sector, 0, sectorSize);
sector = Sector.GetUserData(sector);
mode2Ms.Write(sector, 0, sector.Length);
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
buffer = mode2Ms.ToArray();
}
else if(sectorOffset == 0 && sectorSkip == 0)
2022-03-06 13:29:38 +00:00
buffer = br.ReadBytes((int)(sectorSize * length));
else
2023-10-03 23:34:59 +01:00
{
for(var i = 0; i < length; i++)
2022-03-06 13:29:38 +00:00
{
br.BaseStream.Seek(sectorOffset, SeekOrigin.Current);
byte[] sector = br.ReadBytes((int)sectorSize);
br.BaseStream.Seek(sectorSkip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
}
2023-10-03 23:34:59 +01:00
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
return ErrorNumber.NoError;
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
2023-10-03 23:34:59 +01:00
public ErrorNumber ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag,
2022-03-06 13:29:38 +00:00
out byte[] buffer)
{
buffer = null;
2024-05-01 04:05:22 +01:00
if(tag is SectorTagType.CdTrackFlags or SectorTagType.CdTrackIsrc) track = (uint)sectorAddress;
2024-05-01 04:05:22 +01:00
if(!_neroTracks.TryGetValue(track, out NeroTrack aaruTrack)) return ErrorNumber.SectorNotFound;
2024-05-01 04:05:22 +01:00
if(length > aaruTrack.Sectors) return ErrorNumber.OutOfRange;
2022-11-15 00:17:12 +00:00
uint sectorOffset = 0;
uint sectorSize = 0;
uint sectorSkip = 0;
2022-03-06 13:29:38 +00:00
switch(tag)
{
case SectorTagType.CdSectorEcc:
case SectorTagType.CdSectorEccP:
case SectorTagType.CdSectorEccQ:
case SectorTagType.CdSectorEdc:
case SectorTagType.CdSectorHeader:
case SectorTagType.CdSectorSubchannel:
case SectorTagType.CdSectorSubHeader:
2023-10-03 23:34:59 +01:00
case SectorTagType.CdSectorSync:
break;
2022-03-06 13:29:38 +00:00
case SectorTagType.CdTrackFlags:
2024-05-01 04:05:22 +01:00
if(!_trackFlags.TryGetValue(track, out byte flag)) return ErrorNumber.NoData;
2022-03-06 13:29:38 +00:00
2024-05-01 04:39:38 +01:00
buffer = [flag];
2022-03-06 13:29:38 +00:00
return ErrorNumber.NoError;
case SectorTagType.CdTrackIsrc:
buffer = aaruTrack.Isrc;
2022-03-06 13:29:38 +00:00
return ErrorNumber.NoError;
2023-10-03 23:34:59 +01:00
case SectorTagType.CdTrackText:
return ErrorNumber.NotImplemented;
default:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
}
2017-12-19 20:33:03 +00:00
2022-03-06 13:29:38 +00:00
switch((DaoMode)aaruTrack.Mode)
{
case DaoMode.Data:
2023-10-03 23:34:59 +01:00
case DaoMode.DataM2F1:
return ErrorNumber.NoData;
2022-03-06 13:29:38 +00:00
case DaoMode.DataM2F2:
{
2022-03-06 13:29:38 +00:00
switch(tag)
{
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSync:
case SectorTagType.CdSectorHeader:
case SectorTagType.CdSectorSubchannel:
case SectorTagType.CdSectorEcc:
case SectorTagType.CdSectorEccP:
2023-10-03 23:34:59 +01:00
case SectorTagType.CdSectorEccQ:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSubHeader:
{
2022-03-06 13:29:38 +00:00
sectorOffset = 0;
sectorSize = 8;
sectorSkip = 2328;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEdc:
{
sectorOffset = 2332;
sectorSize = 4;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
}
2022-03-06 13:29:38 +00:00
break;
}
case DaoMode.Audio:
2023-10-03 23:34:59 +01:00
case DaoMode.AudioAlt:
return ErrorNumber.NoData;
2022-03-06 13:29:38 +00:00
case DaoMode.DataRaw:
{
switch(tag)
{
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSync:
{
2022-03-06 13:29:38 +00:00
sectorOffset = 0;
sectorSize = 12;
sectorSkip = 2340;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorHeader:
{
sectorOffset = 12;
sectorSize = 4;
sectorSkip = 2336;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSubchannel:
2023-10-03 23:34:59 +01:00
case SectorTagType.CdSectorSubHeader:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEcc:
{
sectorOffset = 2076;
sectorSize = 276;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEccP:
{
sectorOffset = 2076;
sectorSize = 172;
sectorSkip = 104;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEccQ:
{
sectorOffset = 2248;
sectorSize = 104;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEdc:
{
sectorOffset = 2064;
sectorSize = 4;
sectorSkip = 284;
2022-03-06 13:29:38 +00:00
break;
}
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataM2RawSub:
switch(tag)
{
case SectorTagType.CdSectorSync:
{
sectorOffset = 0;
sectorSize = 12;
sectorSkip = 2340 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorHeader:
{
sectorOffset = 12;
sectorSize = 4;
sectorSkip = 2336 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSubHeader:
{
sectorOffset = 16;
sectorSize = 8;
sectorSkip = 2328 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEdc:
{
sectorOffset = 2348;
sectorSize = 4;
sectorSkip = 0 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSubchannel:
{
sectorOffset = 2352;
sectorSize = 96;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2023-10-03 23:34:59 +01:00
default:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
}
break;
case DaoMode.DataRawSub:
{
switch(tag)
{
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSync:
{
2022-03-06 13:29:38 +00:00
sectorOffset = 0;
sectorSize = 12;
sectorSkip = 2340 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorHeader:
{
sectorOffset = 12;
sectorSize = 4;
sectorSkip = 2336 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorSubchannel:
{
sectorOffset = 2352;
sectorSize = 96;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2023-10-03 23:34:59 +01:00
case SectorTagType.CdSectorSubHeader:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEcc:
{
sectorOffset = 2076;
sectorSize = 276;
sectorSkip = 0 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEccP:
{
sectorOffset = 2076;
sectorSize = 172;
sectorSkip = 104 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEccQ:
{
sectorOffset = 2248;
sectorSize = 104;
sectorSkip = 0 + 96;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case SectorTagType.CdSectorEdc:
{
sectorOffset = 2064;
sectorSize = 4;
sectorSkip = 284 + 96;
2022-03-06 13:29:38 +00:00
break;
}
}
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.AudioSub:
{
2024-05-01 04:05:22 +01:00
if(tag != SectorTagType.CdSectorSubchannel) return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
sectorOffset = 2352;
sectorSize = 96;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2023-10-03 23:34:59 +01:00
default:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
}
2022-03-06 13:29:38 +00:00
buffer = new byte[sectorSize * length];
2022-03-06 13:29:38 +00:00
_imageStream = _neroFilter.GetDataForkStream();
var br = new BinaryReader(_imageStream);
2022-03-07 07:36:44 +00:00
br.BaseStream.Seek((long)aaruTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)),
SeekOrigin.Begin);
if(sectorOffset == 0 && sectorSkip == 0)
2022-03-06 13:29:38 +00:00
buffer = br.ReadBytes((int)(sectorSize * length));
else
2023-10-03 23:34:59 +01:00
{
for(var i = 0; i < length; i++)
2022-03-06 13:29:38 +00:00
{
br.BaseStream.Seek(sectorOffset, SeekOrigin.Current);
byte[] sector = br.ReadBytes((int)sectorSize);
br.BaseStream.Seek(sectorSkip, SeekOrigin.Current);
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
}
2023-10-03 23:34:59 +01:00
}
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2022-03-06 13:29:38 +00:00
return ErrorNumber.NoError;
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorLong(ulong sectorAddress, bool negative, out byte[] buffer,
out SectorStatus sectorStatus)
{
sectorStatus = SectorStatus.Dumped;
return ReadSectorsLong(sectorAddress, negative, 1, out buffer, out _);
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorLong(ulong sectorAddress, uint track, out byte[] buffer, out SectorStatus sectorStatus)
{
sectorStatus = SectorStatus.Dumped;
return ReadSectorsLong(sectorAddress, 1, track, out buffer, out _);
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorsLong(ulong sectorAddress, bool negative, uint length, out byte[] buffer,
out SectorStatus[] sectorStatus)
2022-03-06 13:29:38 +00:00
{
buffer = null;
sectorStatus = null;
if(negative) return ErrorNumber.NotSupported;
2023-10-03 23:34:59 +01:00
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap
where sectorAddress >= kvp.Value
from track in Tracks
where track.Sequence == kvp.Key
2022-03-07 07:36:44 +00:00
where sectorAddress - kvp.Value <= track.EndSector - track.StartSector
select kvp)
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer, out sectorStatus);
2022-03-06 13:29:38 +00:00
return ErrorNumber.SectorNotFound;
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public ErrorNumber ReadSectorsLong(ulong sectorAddress, uint length, uint track, out byte[] buffer,
out SectorStatus[] sectorStatus)
2022-03-06 13:29:38 +00:00
{
buffer = null;
sectorStatus = null;
if(!_isCd) return ReadSectors(sectorAddress, length, track, out buffer, out sectorStatus);
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2024-05-01 04:05:22 +01:00
if(!_neroTracks.TryGetValue(track, out NeroTrack aaruTrack)) return ErrorNumber.SectorNotFound;
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2024-05-01 04:05:22 +01:00
if(length > aaruTrack.Sectors) return ErrorNumber.OutOfRange;
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
sectorStatus = Enumerable.Repeat(SectorStatus.Dumped, (int)length).ToArray();
2022-03-06 13:29:38 +00:00
uint sectorOffset;
uint sectorSize;
uint sectorSkip;
2022-03-06 13:29:38 +00:00
switch((DaoMode)aaruTrack.Mode)
{
case DaoMode.Data:
case DaoMode.DataM2F1:
{
sectorOffset = 0;
sectorSize = 2048;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataM2F2:
{
sectorOffset = 0;
sectorSize = 2336;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataRaw:
case DaoMode.DataM2Raw:
case DaoMode.Audio:
case DaoMode.AudioAlt:
{
sectorOffset = 0;
sectorSize = 2352;
sectorSkip = 0;
2022-03-06 13:29:38 +00:00
break;
}
2022-03-06 13:29:38 +00:00
case DaoMode.DataRawSub:
case DaoMode.DataM2RawSub:
case DaoMode.AudioSub:
{
sectorOffset = 0;
sectorSize = 2352;
sectorSkip = 96;
2022-03-06 13:29:38 +00:00
break;
}
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2023-10-03 23:34:59 +01:00
default:
return ErrorNumber.NotSupported;
2022-03-06 13:29:38 +00:00
}
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2022-03-06 13:29:38 +00:00
buffer = new byte[sectorSize * length];
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2022-03-06 13:29:38 +00:00
_imageStream = _neroFilter.GetDataForkStream();
var br = new BinaryReader(_imageStream);
2022-11-15 01:35:06 +00:00
br.BaseStream.Seek((long)aaruTrack.Offset + (long)(sectorAddress * (sectorSize + sectorSkip)),
2022-03-07 07:36:44 +00:00
SeekOrigin.Begin);
* DiscImageChef.DiscImages/CDRDAO.cs: Corrected typo on audio track matching. * DiscImageChef.DiscImages/CDRWin.cs: Corrected detection of images with CD-Text. Do not output partitions for index 0. * DiscImageChef.DiscImages/CopyQM.cs: Do not create debug image output. * DiscImageChef.DiscImages/Nero.cs: Added type for any dvd seen on old Nero version. Corrected handling of images where pregap is not indicated (nonetheless, Nero stores them). Corrected handling of track 1 (Lead-In is stored there). Corrected session count in discs with 1 session. Do not add partitions of index 0. Corrected partition start offset of disc start. Guess disc type for old Nero discs. Corrected output of Mode2 sectors stored in RAW mode. Do not throw exceptions on values that should be returned empty or null if not supported by image format. * DiscImageChef.Filesystems/FFS.cs: * DiscImageChef.Filesystems/BFS.cs: * DiscImageChef.Filesystems/ODS.cs: * DiscImageChef.Filesystems/FAT.cs: * DiscImageChef.Filesystems/APFS.cs: * DiscImageChef.Filesystems/NTFS.cs: * DiscImageChef.Filesystems/SysV.cs: * DiscImageChef.Filesystems/HPFS.cs: * DiscImageChef.Filesystems/Opera.cs: * DiscImageChef.Filesystems/Acorn.cs: * DiscImageChef.Filesystems/extFS.cs: * DiscImageChef.Filesystems/BTRFS.cs: * DiscImageChef.Filesystems/ext2FS.cs: * DiscImageChef.Filesystems/ProDOS.cs: * DiscImageChef.Filesystems/SolarFS.cs: * DiscImageChef.Filesystems/UNIXBFS.cs: * DiscImageChef.Filesystems/ISO9660.cs: * DiscImageChef.Filesystems/MinixFS.cs: * DiscImageChef.Filesystems/AmigaDOS.cs: * DiscImageChef.Filesystems/PCEngine.cs: * DiscImageChef.Filesystems/AppleHFS.cs: * DiscImageChef.Filesystems/AppleHFSPlus.cs: * DiscImageChef.Filesystems/AppleMFS/Info.cs: Do not try to read past partition end. * DiscImageChef/Commands/CreateSidecar.cs: Added points for skipping whole image checksum on debugging. Track starts at index 0.
2016-08-08 18:44:08 +01:00
2022-11-15 01:35:06 +00:00
if(sectorSkip == 0)
2022-03-06 13:29:38 +00:00
buffer = br.ReadBytes((int)(sectorSize * length));
else
2023-10-03 23:34:59 +01:00
{
for(var i = 0; i < length; i++)
{
2022-03-06 13:29:38 +00:00
br.BaseStream.Seek(sectorOffset, SeekOrigin.Current);
byte[] sector = br.ReadBytes((int)sectorSize);
br.BaseStream.Seek(sectorSkip, SeekOrigin.Current);
2022-03-06 13:29:38 +00:00
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
}
2023-10-03 23:34:59 +01:00
}
2022-03-06 13:29:38 +00:00
switch((DaoMode)aaruTrack.Mode)
{
case DaoMode.Data:
{
var fullSector = new byte[2352];
var fullBuffer = new byte[2352 * length];
2022-03-06 13:29:38 +00:00
for(uint i = 0; i < length; i++)
{
2022-03-06 13:29:38 +00:00
Array.Copy(buffer, i * 2048, fullSector, 16, 2048);
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode1, (long)(sectorAddress + i));
_sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode1);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
2022-03-06 13:29:38 +00:00
buffer = fullBuffer;
2022-03-06 13:29:38 +00:00
break;
}
case DaoMode.DataM2F1:
{
var fullSector = new byte[2352];
var fullBuffer = new byte[2352 * length];
2022-03-06 13:29:38 +00:00
for(uint i = 0; i < length; i++)
{
Array.Copy(buffer, i * 2048, fullSector, 24, 2048);
2022-03-07 07:36:44 +00:00
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Form1, (long)(sectorAddress + i));
2022-03-06 13:29:38 +00:00
_sectorBuilder.ReconstructEcc(ref fullSector, TrackType.CdMode2Form1);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
2022-03-06 13:29:38 +00:00
buffer = fullBuffer;
2022-03-06 13:29:38 +00:00
break;
}
case DaoMode.DataM2F2:
{
var fullSector = new byte[2352];
var fullBuffer = new byte[2352 * length];
2022-03-06 13:29:38 +00:00
for(uint i = 0; i < length; i++)
{
2024-05-01 04:05:22 +01:00
_sectorBuilder.ReconstructPrefix(ref fullSector,
TrackType.CdMode2Formless,
2022-03-06 13:29:38 +00:00
(long)(sectorAddress + i));
2023-10-03 23:34:59 +01:00
Array.Copy(buffer, i * 2336, fullSector, 16, 2336);
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
}
2022-03-06 13:29:38 +00:00
buffer = fullBuffer;
2022-03-06 13:29:38 +00:00
break;
}
}
2022-03-06 13:29:38 +00:00
return ErrorNumber.NoError;
}
2022-03-06 13:29:38 +00:00
/// <inheritdoc />
public List<Track> GetSessionTracks(CommonTypes.Structs.Session session) => GetSessionTracks(session.Sequence);
/// <inheritdoc />
public List<Track> GetSessionTracks(ushort session) => Tracks.Where(track => track.Session == session).ToList();
2023-10-03 23:34:59 +01:00
#endregion
}