From ebb6c1fd877822ab55b317e4ee8f1e9a821d9680 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 31 Jan 2016 08:05:56 +0000 Subject: [PATCH] * DiscImageChef.CommonTypes/MediaTypeFromSCSI.cs: * DiscImageChef.CommonTypes/DiscImageChef.CommonTypes.csproj: Added method to calculate MediaType from SCSI parameters (mode, density, medium type, device type, etc). * DiscImageChef.Metadata/DeviceReport.cs: Added command to guess drive and media parameters and output an XML report of them. * DiscImageChef/Commands/DeviceReport.cs: * DiscImageChef.Metadata/DiscImageChef.Metadata.csproj: Added command to guess drive and media parameters and output an XML report of them. * DiscImageChef/Commands/DumpMedia.cs: Added preliminary command to dump media. Only SCSI for now. CDs and tapes are not supported. Errors are blalanty ignored. Options are incomplete. Not yet usable. * DiscImageChef/Core/Checksum.cs: * DiscImageChef/Commands/CreateSidecar.cs: Moved checksum generation to a separate class. * CICMMetadata: Added support for ADIP. * DiscImageChef.CommonTypes/MediaType.cs: Added parameters of UDO media. Moved DataPlay outside of Iomega, as it's not from that manufacturer. Added missing Exatape media and corrected 160m XL one. Added SyJet media. Added all ECMA defined magneto-optical (sectors calculated from specifications, unchecked). Added PD media. Added Imation 320Gb RDX. Added generic USB flash drives. * DiscImageChef.Decoders/SCSI/Enums.cs: Make enumerations public. * DiscImageChef.Decoders/SCSI/Inquiry.cs: * DiscImageChef.Devices/Device/Constructor.cs: Trim space padded strings on SCSI INQUIRY. * DiscImageChef.Devices/Device/ScsiCommands/MMC.cs: Added PREVENT ALLOW MEDIUM REMOVAL. Added START STOP UNIT. * DiscImageChef.Devices/Device/ScsiCommands/NEC.cs: Rename NEC methods. * DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs: Corrected Pioneer transfer length calculation. * DiscImageChef.Devices/Device/ScsiCommands/Plextor.cs: Renamed Plextor methods. * DiscImageChef.Devices/Device/ScsiCommands/SPC.cs: Renamed SSC PREVENT ALLOW MEDIUM REMOVAL to uncollide with MMC same name but different command. * DiscImageChef.Devices/DiscImageChef.Devices.csproj: Set platform target to x86 (does it really matter?). * DiscImageChef.Devices/Linux/Command.cs: Reduced allocation for readlink() to current kernel MAX_PATH. * DiscImageChef.Devices/Linux/Enums.cs: Modified Linux ioctl to 32-bit. Works on 64-bit also. Solves commands not working on 32-bit environments. * DiscImageChef.DiscImages/ZZZRawImage.cs: Changed ECMA-184 and ECMA-183 enums. * DiscImageChef.Metadata/Dimensions.cs: Added all ECMA defined magneto-opticals. Added PD media. Added 320Gb RDX. Corrected Exatape 160m XL. Added Exatape 22m and 28m. * DiscImageChef.Metadata/MediaType.cs: Added 356mm magneto-optical media. Changed ECMA-184 and ECMA-183 enums. Added USB generic flash drive. * DiscImageChef/Commands/DeviceInfo.cs: Corrected SCSI INQUIRY naming. Corrected SCSI MODE SENSE (6) parameters. Reduced SCSI MODE SENSE timeout, some devices just get stuck with unsupported MODE SENSE commanda and must be left to timeout. Changed FUJITSU vendor string comparison. * DiscImageChef/Commands/MediaInfo.cs: Added method to calculate MediaType from SCSI parameters (mode, density, medium type, device type, etc). Changed some error WriteLine() to debug ones. Too much verbosity. Added DVD media type decoding from PFI. Found a drive that dumps ADIP, enabling it again (not decoded). * DiscImageChef/Commands/MediaScan.cs: Added option to generate ImgBurn compatible log to media-scan command. * DiscImageChef/DiscImageChef.csproj: Moved checksum generation to a separate class. Added command to guess drive and media parameters and output an XML report of them. Added preliminary command to dump media. Only SCSI for now. CDs and tapes are not supported. Errors are blalanty ignored. Options are incomplete. Not yet usable. * DiscImageChef/Main.cs: Added command to guess drive and media parameters and output an XML report of them. Added preliminary command to dump media. Only SCSI for now. CDs and tapes are not supported. Errors are blalanty ignored. Options are incomplete. Not yet usable. * DiscImageChef/Options.cs: Added command to guess drive and media parameters and output an XML report of them. Added preliminary command to dump media. Only SCSI for now. CDs and tapes are not supported. Errors are blalanty ignored. Options are incomplete. Not yet usable. Added option to generate ImgBurn compatible log to media-scan command. --- DiscImageChef.CommonTypes.csproj | 1 + MediaType.cs | 92 +- MediaTypeFromSCSI.cs | 1621 ++++++++++++++++++++++++++++++ 3 files changed, 1697 insertions(+), 17 deletions(-) create mode 100644 MediaTypeFromSCSI.cs diff --git a/DiscImageChef.CommonTypes.csproj b/DiscImageChef.CommonTypes.csproj index 19f4a6a..0aa6320 100644 --- a/DiscImageChef.CommonTypes.csproj +++ b/DiscImageChef.CommonTypes.csproj @@ -36,6 +36,7 @@ + \ No newline at end of file diff --git a/MediaType.cs b/MediaType.cs index 723645a..217d263 100644 --- a/MediaType.cs +++ b/MediaType.cs @@ -184,9 +184,12 @@ namespace DiscImageChef.CommonTypes #endregion MiniDisc based #region Plasmon UDO - /// Ultra Density Optical + /// 5.25", Phase-Change, 1834348 sectors, 8192 bytes/sector, Ultra Density Optical, ECMA-350, ISO 17345 UDO, + /// 5.25", Phase-Change, 3669724 sectors, 8192 bytes/sector, Ultra Density Optical 2, ECMA-380, ISO 11976 UDO2, + /// 5.25", Write-Once, 3668759 sectors, 8192 bytes/sector, Ultra Density Optical 2, ECMA-380, ISO 11976 + UDO2_WORM, #endregion Plasmon UDO #region Sony game media @@ -399,18 +402,6 @@ namespace DiscImageChef.CommonTypes ECMA_78, /// 5,25", DS, DD, 80 tracks, 9 spt, 512 bytes/sector, FM ECMA_78_2, - /// 3,5", M.O., 250000 sectors, 512 bytes/sector - ECMA_154, - /// 5,25", M.O., 940470 sectors, 512 bytes/sector - ECMA_183_512, - /// 5,25", M.O., 520902 sectors, 1024 bytes/sector - ECMA_183_1024, - /// 5,25", M.O., 1165600 sectors, 512 bytes/sector - ECMA_184_512, - /// 5,25", M.O., 639200 sectors, 1024 bytes/sector - ECMA_184_1024, - /// 3,5", M.O., 448500 sectors, 512 bytes/sector - ECMA_201, #endregion ECMA floppy standards #region FDFORMAT, non-standard floppy formats @@ -449,7 +440,6 @@ namespace DiscImageChef.CommonTypes #region Iomega Bernoulli, Bernoulli2, - DataPlay, Ditto, DittoMax, Jaz, @@ -501,7 +491,9 @@ namespace DiscImageChef.CommonTypes #region Exatape Exatape15m, + Exatape22m, Exatape22mAME, + Exatape28m, Exatape40m, Exatape45m, Exatape54m, @@ -509,7 +501,7 @@ namespace DiscImageChef.CommonTypes Exatape76m, Exatape80m, Exatape106m, - Exatape106mXL, + Exatape160mXL, Exatape112m, Exatape125m, Exatape150m, @@ -540,6 +532,7 @@ namespace DiscImageChef.CommonTypes SQ800, SQ1500, SQ2000, + SyJet, #endregion SyQuest #region Nintendo @@ -679,9 +672,64 @@ namespace DiscImageChef.CommonTypes VXA3, #endregion VXA + #region Magneto-optical + /// 5,25", M.O., ??? sectors, 1024 bytes/sector, ECMA-153, ISO 11560 + ECMA_153, + /// 5,25", M.O., ??? sectors, 512 bytes/sector, ECMA-153, ISO 11560 + ECMA_153_512, + /// 3,5", M.O., 249850 sectors, 512 bytes/sector, ECMA-154, ISO 10090 + ECMA_154, + /// 5,25", M.O., 904995 sectors, 512 bytes/sector, ECMA-183, ISO 13481 + ECMA_183_512, + /// 5,25", M.O., 498526 sectors, 1024 bytes/sector, ECMA-183, ISO 13481 + ECMA_183, + /// 5,25", M.O., 1128772 or 1163337 sectors, 512 bytes/sector, ECMA-183, ISO 13549 + ECMA_184_512, + /// 5,25", M.O., 603466 or 637041 sectors, 1024 bytes/sector, ECMA-183, ISO 13549 + ECMA_184, + /// 300mm, M.O., ??? sectors, 1024 bytes/sector, ECMA-189, ISO 13614 + ECMA_189, + /// 300mm, M.O., ??? sectors, 1024 bytes/sector, ECMA-190, ISO 13403 + ECMA_190, + /// 5,25", M.O., 936921 or 948770 sectors, 1024 bytes/sector, ECMA-195, ISO 13842 + ECMA_195, + /// 5,25", M.O., 1644581 or 1647371 sectors, 512 bytes/sector, ECMA-195, ISO 13842 + ECMA_195_512, + /// 3,5", M.O., 446325 sectors, 512 bytes/sector, ECMA-201, ISO 13963 + ECMA_201, + /// 3,5", M.O., 429975 sectors, 512 bytes/sector, embossed, ISO 13963 + ECMA_201_ROM, + /// 3,5", M.O., 371371 sectors, 1024 bytes/sector, ECMA-223 + ECMA_223, + /// 3,5", M.O., 694929 sectors, 512 bytes/sector, ECMA-223 + ECMA_223_512, + /// 5,25", M.O., 1244621 sectors, 1024 bytes/sector, ECMA-238, ISO 15486 + ECMA_238, + /// 3,5", M.O., 318988, 320332 or 321100 sectors, 2048 bytes/sector, ECMA-239, ISO 15498 + ECMA_239, + /// 356mm, M.O., 14476734 sectors, 1024 bytes/sector, ECMA-260, ISO 15898 + ECMA_260, + /// 356mm, M.O., 24445990 sectors, 1024 bytes/sector, ECMA-260, ISO 15898 + ECMA_260_Double, + /// 5,25", M.O., 1128134 sectors, 2048 bytes/sector, ECMA-280, ISO 18093 + ECMA_280, + /// 300mm, M.O., 7355716 sectors, 2048 bytes/sector, ECMA-317, ISO 20162 + ECMA_317, + /// 5,25", M.O., 1095840 sectors, 4096 bytes/sector, ECMA-322, ISO 22092 + ECMA_322, + /// 5,25", M.O., 2043664 sectors, 2048 bytes/sector, ECMA-322, ISO 22092 + ECMA_322_2k, + /// 3,5", M.O., 605846 sectors, 2048 bytes/sector, Cherry Book, GigaMo, ECMA-351, ISO 17346 + GigaMo, + /// 3,5", M.O., 1063146 sectors, 2048 bytes/sector, Cherry Book 2, GigaMo 2, ECMA-353, ISO 22533 + GigaMo2, + UnknownMO, + #endregion Magneto-optical + #region Other floppy standards CompactFloppy, DemiDiskette, + /// 3.5", 652 tracks, 2 sides, 512 bytes/sector, Floptical, ECMA-207, ISO 14169 Floptical, HiFD, LS120, @@ -713,13 +761,23 @@ namespace DiscImageChef.CommonTypes SmartMedia, xD, XQD, + DataPlay, + /// 120mm, Phase-Change, 1298496 sectors, 512 bytes/sector, PD650, ECMA-240, ISO 15485 + PD650, + /// 120mm, Write-Once, 1281856 sectors, 512 bytes/sector, PD650, ECMA-240, ISO 15485 + PD650_WORM, #endregion Miscellaneous #region Generic hard disks Microdrive, RDX, - GENERIC_HDD + /// Imation 320Gb RDX + RDX320, + GENERIC_HDD, + Zone_HDD, + // USB flash drives + FlashDrive #endregion Generic hard disks }; } - + \ No newline at end of file diff --git a/MediaTypeFromSCSI.cs b/MediaTypeFromSCSI.cs new file mode 100644 index 0000000..5687a49 --- /dev/null +++ b/MediaTypeFromSCSI.cs @@ -0,0 +1,1621 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : MediaTypeFromSCSI.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Component +// +// Revision : $Revision$ +// Last change by : $Author$ +// Date : $Date$ +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright (C) 2011-2015 Claunia.com +// ****************************************************************************/ +// //$Id$ + +namespace DiscImageChef.CommonTypes +{ + public static class MediaTypeFromSCSI + { + public static MediaType Get(byte scsiPeripheralType, string vendor, string model, byte mediumType, byte densityCode, ulong blocks, uint blockSize) + { + switch (scsiPeripheralType) + { + // Direct access device + case 0x00: + // Simpilified access device + case 0x0E: + { + if (mediumType == 0x03 || mediumType == 0x05 || mediumType == 0x07) + { + goto case 0x07; + } + + if (vendor.ToLowerInvariant() == "syquest") + { + if (blocks == 173400 && blockSize == 256) + return MediaType.SQ400; + if (blockSize == 512) + { + if (model.ToLowerInvariant().StartsWith("syjet")) + return MediaType.SyJet; + + switch (blocks) + { + case 262144: + return MediaType.EZ135; + case 524288: + return MediaType.SQ327; + } + } + + return MediaType.Unknown; + } + + if (model.ToLowerInvariant().StartsWith("zip")) + { + if (blockSize == 512) + { + if (blocks == 196608) + return MediaType.ZIP100; + if (blocks == 489532) + return MediaType.ZIP250; + return MediaType.ZIP750; + } + + return MediaType.Unknown; + } + + if (model.ToLowerInvariant().StartsWith("jaz")) + { + if (blockSize == 512) + { + if (blocks == 2091050) + return MediaType.Jaz; + if (blocks == 3915600) + return MediaType.Jaz2; + } + + return MediaType.Unknown; + } + + if (model.ToLowerInvariant().StartsWith("ls-")) + { + if (blockSize == 512) + { + if (blocks == 246528) + return MediaType.LS120; + if (blocks == 2880) + return MediaType.DOS_35_HD; + if (blocks == 1440) + return MediaType.DOS_35_DS_DD_9; + } + + return MediaType.Unknown; + } + + if (model.ToLowerInvariant().StartsWith("rdx")) + { + if (blockSize == 512) + { + if (blocks == 625134256) + return MediaType.RDX320; + return MediaType.RDX; + } + + return MediaType.Unknown; + } + + switch (mediumType) + { + case 0x01: + switch (blockSize) + { + case 128: + switch (blocks) + { + case 720: + return MediaType.ATARI_525_SD; + case 1040: + return MediaType.ATARI_525_DD; + case 1898: + return MediaType.IBM33FD_128; + case 2002: + return MediaType.ECMA_54; + } + break; + case 256: + switch (blocks) + { + case 322: + return MediaType.ECMA_66; + case 400: + return MediaType.ACORN_525_SS_SD_40; + case 455: + return MediaType.Apple32SS; + case 560: + return MediaType.Apple33SS; + case 640: + return MediaType.ACORN_525_SS_DD_40; + case 720: + return MediaType.ATARI_525_DD; + case 800: + return MediaType.ACORN_525_SS_SD_80; + case 1121: + return MediaType.IBM33FD_256; + case 1280: + return MediaType.ACORN_525_SS_DD_80; + case 2002: + return MediaType.RX02; + } + break; + case 319: + switch (blocks) + { + case 256: + return MediaType.IBM23FD; + } + break; + case 512: + switch (blocks) + { + case 320: + return MediaType.DOS_525_DS_DD_8; + case 360: + return MediaType.DOS_35_SS_DD_9; + case 610: + return MediaType.IBM33FD_512; + case 640: + return MediaType.DOS_35_SS_DD_8; + case 720: + return MediaType.DOS_35_DS_DD_9; + case 800: + return MediaType.AppleSonySS; + case 249850: + return MediaType.ECMA_154; + case 429975: + return MediaType.ECMA_201_ROM; + case 446325: + return MediaType.ECMA_201; + case 694929: + return MediaType.ECMA_223_512; + case 904995: + return MediaType.ECMA_183_512; + case 1128772: + case 1163337: + return MediaType.ECMA_184_512; + case 1281856: + return MediaType.PD650_WORM; + case 1298496: + return MediaType.PD650; + case 1644581: + case 1647371: + return MediaType.ECMA_195_512; + } + break; + case 1024: + { + switch (blocks) + { + case 371371: + return MediaType.ECMA_223; + case 498526: + return MediaType.ECMA_183; + case 603466: + case 637041: + return MediaType.ECMA_184; + case 936921: + case 948770: + return MediaType.ECMA_195; + case 1244621: + return MediaType.ECMA_238; + case 14476734: + return MediaType.ECMA_260; + case 24445990: + return MediaType.ECMA_260_Double; + } + } + break; + case 2048: + { + switch (blocks) + { + case 318988: + case 320332: + case 321100: + return MediaType.ECMA_239; + case 605846: + return MediaType.GigaMo; + case 1063146: + return MediaType.GigaMo2; + case 1128134: + return MediaType.ECMA_280; + case 2043664: + return MediaType.ECMA_322_2k; + case 7355716: + return MediaType.ECMA_317; + } + } + break; + case 4096: + { + switch (blocks) + { + case 1095840: + return MediaType.ECMA_322; + } + } + break; + case 8192: + { + switch (blocks) + { + case 1834348: + return MediaType.UDO; + case 3668759: + return MediaType.UDO2_WORM; + case 3669724: + return MediaType.UDO2; + } + } + break; + } + return MediaType.Unknown; + case 0x02: + switch (blockSize) + { + case 128: + switch (blocks) + { + case 3848: + return MediaType.IBM43FD_128; + case 4004: + return MediaType.ECMA_59; + } + break; + case 256: + switch (blocks) + { + case 910: + return MediaType.Apple32DS; + case 1120: + return MediaType.Apple33DS; + case 1280: + return MediaType.ECMA_70; + case 2560: + return MediaType.ECMA_78; + case 3848: + return MediaType.IBM53FD_256; + case 4004: + return MediaType.ECMA_99_26; + } + break; + case 512: + switch (blocks) + { + case 640: + return MediaType.DOS_525_DS_DD_8; + case 720: + return MediaType.DOS_525_DS_DD_9; + case 1280: + return MediaType.DOS_35_DS_DD_8; + case 1440: + return MediaType.ECMA_100; + case 1600: + return MediaType.ACORN_35_DS_DD; + case 1640: + return MediaType.FDFORMAT_35_DD; + case 1760: + return MediaType.CBM_AMIGA_35_DD; + case 2242: + return MediaType.IBM53FD_512; + case 2332: + return MediaType.ECMA_99_15; + case 2400: + return MediaType.DOS_525_HD; + case 2788: + return MediaType.FDFORMAT_525_HD; + case 2880: + return MediaType.ECMA_125; + case 3360: + return MediaType.DMF; + case 3444: + return MediaType.FDFORMAT_35_HD; + case 3520: + return MediaType.CBM_AMIGA_35_HD; + case 5760: + return MediaType.ECMA_147; + case 249850: + return MediaType.ECMA_154; + case 429975: + return MediaType.ECMA_201_ROM; + case 446325: + return MediaType.ECMA_201; + case 694929: + return MediaType.ECMA_223_512; + case 904995: + return MediaType.ECMA_183_512; + case 1128772: + case 1163337: + return MediaType.ECMA_184_512; + case 1281856: + return MediaType.PD650_WORM; + case 1298496: + return MediaType.PD650; + case 1644581: + case 1647371: + return MediaType.ECMA_195_512; + } + break; + case 1024: + switch (blocks) + { + case 1220: + return MediaType.IBM53FD_1024; + case 1232: + return MediaType.SHARP_35; + case 1268: + return MediaType.ECMA_69_8; + case 1280: + return MediaType.NEC_525_HD; + case 1316: + return MediaType.ECMA_99_8; + case 371371: + return MediaType.ECMA_223; + case 498526: + return MediaType.ECMA_183; + case 603466: + case 637041: + return MediaType.ECMA_184; + case 936921: + case 948770: + return MediaType.ECMA_195; + case 1244621: + return MediaType.ECMA_238; + case 14476734: + return MediaType.ECMA_260; + case 24445990: + return MediaType.ECMA_260_Double; + } + break; + case 2048: + { + switch (blocks) + { + case 318988: + case 320332: + case 321100: + return MediaType.ECMA_239; + case 605846: + return MediaType.GigaMo; + case 1063146: + return MediaType.GigaMo2; + case 1128134: + return MediaType.ECMA_280; + case 2043664: + return MediaType.ECMA_322_2k; + case 7355716: + return MediaType.ECMA_317; + } + } + break; + case 4096: + { + switch (blocks) + { + case 1095840: + return MediaType.ECMA_322; + } + } + break; + case 8192: + { + switch (blocks) + { + case 1834348: + return MediaType.UDO; + case 3668759: + return MediaType.UDO2_WORM; + case 3669724: + return MediaType.UDO2; + } + } + break; + } + return MediaType.Unknown; + case 0x09: + return MediaType.ECMA_54; + case 0x0A: + return MediaType.ECMA_59; + case 0x0B: + switch (blockSize) + { + case 256: + return MediaType.ECMA_69_26; + case 512: + return MediaType.ECMA_69_15; + case 1024: + return MediaType.ECMA_69_8; + } + return MediaType.Unknown; + case 0x0E: + return MediaType.ECMA_66; + case 0x12: + return MediaType.ECMA_70; + case 0x16: + switch (blockSize) + { + case 256: + return MediaType.ECMA_78; + case 512: + return MediaType.ECMA_78_2; + } + return MediaType.Unknown; + case 0x1A: + switch (blockSize) + { + case 256: + return MediaType.ECMA_99_26; + case 512: + return MediaType.ECMA_99_15; + case 1024: + return MediaType.ECMA_99_8; + } + return MediaType.Unknown; + case 0x1E: + return MediaType.ECMA_100; + case 0x93: + return MediaType.NEC_35_HD_15; + case 0x94: + return MediaType.ECMA_125; + } + + switch (blockSize) + { + case 128: + { + switch (blocks) + { + case 720: + return MediaType.ATARI_525_SD; + case 1040: + return MediaType.ATARI_525_ED; + case 1898: + return MediaType.IBM33FD_128; + case 2002: + return MediaType.ECMA_54; + case 3848: + return MediaType.IBM43FD_128; + case 4004: + return MediaType.ECMA_59; + } + } + break; + case 256: + { + switch (blocks) + { + case 322: + return MediaType.ECMA_66; + case 400: + return MediaType.ACORN_525_SS_SD_40; + case 455: + return MediaType.Apple32SS; + case 560: + return MediaType.Apple33SS; + case 640: + return MediaType.ACORN_525_SS_DD_40; + case 720: + return MediaType.ATARI_525_DD; + case 800: + return MediaType.ACORN_525_SS_SD_80; + case 910: + return MediaType.Apple32DS; + case 1120: + return MediaType.Apple33DS; + case 1121: + return MediaType.IBM33FD_256; + case 1280: + return MediaType.ECMA_70; + case 2002: + return MediaType.RX02; + case 2560: + return MediaType.ECMA_78; + case 3848: + return MediaType.IBM53FD_256; + case 4004: + return MediaType.ECMA_99_26; + } + } + break; + case 319: + switch (blocks) + { + case 256: + return MediaType.IBM23FD; + } + break; + case 512: + { + switch (blocks) + { + case 320: + return MediaType.DOS_525_SS_DD_8; + case 360: + return MediaType.DOS_525_SS_DD_9; + case 610: + return MediaType.IBM33FD_512; + case 640: + return MediaType.DOS_525_DS_DD_8; + case 720: + return MediaType.DOS_525_DS_DD_9; + case 800: + return MediaType.AppleSonySS; + case 1280: + return MediaType.DOS_35_DS_DD_8; + case 1440: + return MediaType.ECMA_100; + case 1600: + return MediaType.ACORN_35_DS_DD; + case 1640: + return MediaType.FDFORMAT_35_DD; + case 1760: + return MediaType.CBM_AMIGA_35_DD; + case 2242: + return MediaType.IBM53FD_512; + case 2332: + return MediaType.ECMA_99_15; + case 2400: + return MediaType.DOS_525_HD; + case 2788: + return MediaType.FDFORMAT_525_HD; + case 2880: + return MediaType.ECMA_125; + case 3360: + return MediaType.DMF; + case 3444: + return MediaType.FDFORMAT_35_HD; + case 3520: + return MediaType.CBM_AMIGA_35_HD; + case 5760: + return MediaType.ECMA_147; + } + } + break; + case 1024: + { + switch (blocks) + { + case 1220: + return MediaType.IBM53FD_1024; + case 1232: + return MediaType.SHARP_35; + case 1268: + return MediaType.ECMA_69_8; + case 1280: + return MediaType.NEC_525_HD; + case 1316: + return MediaType.ECMA_99_8; + } + } + break; + } + + return MediaType.Unknown; + } + // Sequential access device + case 0x01: + { + switch (mediumType) + { + case 0x00: + switch (densityCode) + { + case 0x04: + return MediaType.QIC11; + case 0x05: + return MediaType.QIC24; + case 0x09: + return MediaType.IBM3490; + case 0x0F: + return MediaType.QIC120; + case 0x10: + return MediaType.QIC150; + case 0x28: + return MediaType.IBM3490E; + case 0x40: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO; + if (model.ToLowerInvariant().StartsWith("sdz")) + return MediaType.SAIT1; + break; + } + case 0x41: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO2; + break; + } + case 0x42: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO2; + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T9840A; + break; + } + case 0x43: + { + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T9940A; + break; + } + case 0x44: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO3; + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T9940B; + break; + } + case 0x45: + { + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T9840C; + break; + } + case 0x46: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO4; + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T9840D; + break; + } + case 0x4A: + { + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T10000A; + break; + } + case 0x4B: + { + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T10000B; + break; + } + case 0x4C: + { + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T10000C; + break; + } + case 0x4D: + { + if (vendor.ToLowerInvariant() == "stk") + return MediaType.T10000D; + break; + } + case 0x58: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO5; + break; + } + } + break; + case 0x01: + { + switch (densityCode) + { + case 0x44: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO3WORM; + break; + } + case 0x46: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO4WORM; + break; + } + case 0x58: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO5WORM; + break; + } + } + } + break; + case 0x18: + { + switch (densityCode) + { + case 0x00: + case 0x40: + { + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO; + break; + } + } + } + } + break; + case 0x28: + { + switch (densityCode) + { + case 0x00: + case 0x42: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO2; + break; + } + } + } + break; + case 0x33: + { + switch (densityCode) + { + case 0x00: + case 0x25: + { + if (model.ToLowerInvariant().StartsWith("dat")) + return MediaType.DDS3; + break; + } + } + } + break; + case 0x34: + { + switch (densityCode) + { + case 0x00: + case 0x26: + { + if (model.ToLowerInvariant().StartsWith("dat")) + return MediaType.DDS4; + break; + } + } + } + break; + case 0x35: + { + switch (densityCode) + { + case 0x00: + case 0x47: + { + if (model.ToLowerInvariant().StartsWith("dat")) + return MediaType.DAT72; + break; + } + } + } + break; + case 0x38: + { + switch (densityCode) + { + case 0x00: + case 0x44: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO3; + break; + } + } + } + break; + case 0x3C: + { + switch (densityCode) + { + case 0x00: + case 0x44: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO3WORM; + break; + } + } + } + break; + case 0x48: + { + switch (densityCode) + { + case 0x00: + case 0x46: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO4; + break; + } + } + } + break; + case 0x4C: + { + switch (densityCode) + { + case 0x00: + case 0x46: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO4WORM; + break; + } + } + } + break; + case 0x58: + { + switch (densityCode) + { + case 0x00: + case 0x58: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO5; + break; + } + } + } + break; + case 0x5C: + { + switch (densityCode) + { + case 0x00: + case 0x58: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO5WORM; + break; + } + } + } + break; + case 0x68: + { + switch (densityCode) + { + case 0x00: + case 0x5A: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO6; + break; + } + } + } + break; + case 0x6C: + { + switch (densityCode) + { + case 0x00: + case 0x5A: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO6WORM; + break; + } + } + } + break; + case 0x78: + { + switch (densityCode) + { + case 0x00: + case 0x5C: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO7; + break; + } + } + } + break; + case 0x7C: + { + switch (densityCode) + { + case 0x00: + case 0x5C: + { + if (model.ToLowerInvariant().StartsWith("ult")) + return MediaType.LTO7WORM; + break; + } + } + } + break; + case 0x81: + { + switch (densityCode) + { + case 0x00: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape15m; + if (vendor.ToLowerInvariant() == "ibm") + return MediaType.IBM3592; + if (model.ToLowerInvariant().StartsWith("vxa")) + return MediaType.VXA1; + break; + } + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape15m; + break; + } + case 0x29: + case 0x2A: + { + if (vendor.ToLowerInvariant() == "ibm") + return MediaType.IBM3592; + break; + } + case 0x80: + { + if (model.ToLowerInvariant().StartsWith("vxa")) + return MediaType.VXA1; + break; + } + } + } + break; + case 0x82: + { + switch (densityCode) + { + case 0x00: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape28m; + if (vendor.ToLowerInvariant() == "ibm") + return MediaType.IBM3592; + break; + } + case 0x0A: + { + if (model.ToLowerInvariant().StartsWith("dlt")) + return MediaType.CompactTapeI; + break; + } + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape28m; + break; + } + case 0x16: + { + if (model.ToLowerInvariant().StartsWith("dlt")) + return MediaType.CompactTapeII; + break; + } + case 0x29: + case 0x2A: + { + if (vendor.ToLowerInvariant() == "ibm") + return MediaType.IBM3592; + break; + } + case 0x81: + { + if (model.ToLowerInvariant().StartsWith("vxa")) + return MediaType.VXA2; + break; + } + case 0x82: + { + if (model.ToLowerInvariant().StartsWith("vxa")) + return MediaType.VXA3; + break; + } + } + } + break; + case 0x83: + { + switch (densityCode) + { + case 0x00: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape54m; + if (model.ToLowerInvariant().StartsWith("dlt")) + return MediaType.DLTtapeIII; + break; + } + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape54m; + break; + } + case 0x17: + case 0x18: + case 0x19: + case 0x80: + case 0x81: + { + if (model.ToLowerInvariant().StartsWith("dlt")) + return MediaType.DLTtapeIII; + break; + } + } + } + break; + case 0x84: + { + switch (densityCode) + { + case 0x00: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape80m; + if (model.ToLowerInvariant().StartsWith("dlt")) + return MediaType.DLTtapeIIIxt; + break; + } + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape80m; + break; + } + case 0x19: + case 0x80: + case 0x81: + { + if (model.ToLowerInvariant().StartsWith("dlt")) + return MediaType.DLTtapeIIIxt; + break; + } + } + } + break; + case 0x85: + { + switch (densityCode) + { + case 0x00: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape106m; + if (model.ToLowerInvariant().StartsWith("dlt") || + model.ToLowerInvariant().StartsWith("sdlt") || + model.ToLowerInvariant().StartsWith("superdlt")) + return MediaType.DLTtapeIV; + if (model.ToLowerInvariant().StartsWith("stt")) + return MediaType.Travan5; + break; + } + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape106m; + break; + } + case 0x1A: + case 0x1B: + case 0x40: + case 0x41: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + case 0x88: + case 0x89: + { + if (model.ToLowerInvariant().StartsWith("dlt") || + model.ToLowerInvariant().StartsWith("sdlt") || + model.ToLowerInvariant().StartsWith("superdlt")) + return MediaType.DLTtapeIV; + break; + } + case 0x46: + { + if (model.ToLowerInvariant().StartsWith("stt")) + return MediaType.Travan5; + break; + } + } + } + break; + case 0x86: + { + switch (densityCode) + { + case 0x00: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape160mXL; + if (model.ToLowerInvariant().StartsWith("dlt") || + model.ToLowerInvariant().StartsWith("sdlt") || + model.ToLowerInvariant().StartsWith("superdlt")) + return MediaType.SDLT1; + break; + } + case 0x8C: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape160mXL; + break; + } + case 0x91: + case 0x92: + case 0x93: + { + if (model.ToLowerInvariant().StartsWith("dlt") || + model.ToLowerInvariant().StartsWith("sdlt") || + model.ToLowerInvariant().StartsWith("superdlt")) + return MediaType.SDLT1; + break; + } + } + } + break; + case 0x87: + { + switch (densityCode) + { + case 0x00: + case 0x4A: + { + if (model.ToLowerInvariant().StartsWith("dlt") || + model.ToLowerInvariant().StartsWith("sdlt") || + model.ToLowerInvariant().StartsWith("superdlt")) + return MediaType.SDLT2; + break; + } + } + } + break; + case 0x90: + { + switch (densityCode) + { + case 0x00: + case 0x50: + case 0x98: + case 0x99: + { + if (model.ToLowerInvariant().StartsWith("dlt") || + model.ToLowerInvariant().StartsWith("sdlt") || + model.ToLowerInvariant().StartsWith("superdlt")) + return MediaType.VStapeI; + break; + } + } + } + break; + case 0x95: + { + if (model.ToLowerInvariant().StartsWith("stt")) + return MediaType.Travan7; + } + break; + case 0xC1: + { + switch (densityCode) + { + case 0x00: + case 0x14: + case 0x15: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape22m; + break; + } + } + } + break; + case 0xC2: + { + switch (densityCode) + { + case 0x00: + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape40m; + break; + } + } + } + break; + case 0xC3: + { + switch (densityCode) + { + case 0x00: + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape76m; + break; + } + } + } + break; + case 0xC4: + { + switch (densityCode) + { + case 0x00: + case 0x14: + case 0x15: + case 0x27: + case 0x8C: + case 0x90: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape112m; + break; + } + } + } + break; + case 0xD1: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape22mAME; + break; + } + } + } + break; + case 0xD2: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape170m; + break; + } + } + } + break; + case 0xD3: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape125m; + break; + } + } + } + break; + case 0xD4: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape45m; + break; + } + } + } + break; + case 0xD5: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape225m; + break; + } + } + } + break; + case 0xD6: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape150m; + break; + } + } + } + break; + case 0xD7: + { + switch (densityCode) + { + case 0x00: + case 0x27: + case 0x28: + { + if (model.ToLowerInvariant().StartsWith("exb")) + return MediaType.Exatape75m; + break; + } + } + } + break; + } + + return MediaType.Unknown; + } + // Write-once device + case 0x04: + // Optical device + case 0x07: + { + if (mediumType == 0x01 || mediumType == 0x02 || mediumType == 0x03 || mediumType == 0x05 || mediumType == 0x07) + { + switch (blockSize) + { + case 512: + { + switch (blocks) + { + case 249850: + return MediaType.ECMA_154; + case 429975: + return MediaType.ECMA_201_ROM; + case 446325: + return MediaType.ECMA_201; + case 694929: + return MediaType.ECMA_223_512; + case 904995: + return MediaType.ECMA_183_512; + case 1128772: + case 1163337: + return MediaType.ECMA_184_512; + case 1281856: + return MediaType.PD650_WORM; + case 1298496: + return MediaType.PD650; + case 1644581: + case 1647371: + return MediaType.ECMA_195_512; + default: + return MediaType.UnknownMO; + } + } + case 1024: + { + switch (blocks) + { + case 371371: + return MediaType.ECMA_223; + case 498526: + return MediaType.ECMA_183; + case 603466: + case 637041: + return MediaType.ECMA_184; + case 936921: + case 948770: + return MediaType.ECMA_195; + case 1244621: + return MediaType.ECMA_238; + case 14476734: + return MediaType.ECMA_260; + case 24445990: + return MediaType.ECMA_260_Double; + default: + return MediaType.UnknownMO; + } + } + case 2048: + { + switch (blocks) + { + case 318988: + case 320332: + case 321100: + return MediaType.ECMA_239; + case 605846: + return MediaType.GigaMo; + case 1063146: + return MediaType.GigaMo2; + case 1128134: + return MediaType.ECMA_280; + case 2043664: + return MediaType.ECMA_322_2k; + case 7355716: + return MediaType.ECMA_317; + default: + return MediaType.UnknownMO; + } + } + case 4096: + { + switch (blocks) + { + case 1095840: + return MediaType.ECMA_322; + default: + return MediaType.UnknownMO; + } + } + case 8192: + { + switch (blocks) + { + case 1834348: + return MediaType.UDO; + case 3668759: + return MediaType.UDO2_WORM; + case 3669724: + return MediaType.UDO2; + default: + return MediaType.UnknownMO; + } + } + default: + return MediaType.UnknownMO; + } + } + + return MediaType.UnknownMO; + } + // MultiMedia Device + case 0x05: + { + switch (mediumType) + { + case 0x00: + return MediaType.CD; + case 0x01: + case 0x05: + return MediaType.CDROM; + case 0x02: + case 0x06: + return MediaType.CDDA; + case 0x03: + case 0x07: + return MediaType.CDPLUS; + case 0x04: + return MediaType.PCD; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + return MediaType.CDR; + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + return MediaType.CDRW; + case 0x80: + if (model.ToLowerInvariant().StartsWith("ult")) + { + switch (densityCode) + { + case 0x42: + return MediaType.LTO2; + case 0x44: + return MediaType.LTO3; + case 0x46: + return MediaType.LTO4; + case 0x58: + return MediaType.LTO5; + } + } + break; + } + } + break; + // Host managed zoned block device + case 0x14: + { + return MediaType.Zone_HDD; + } + } + + return MediaType.Unknown; + } + } +} \ No newline at end of file