private static long GetBaseBlockForMeta2(ref NANDReader reader) { reader.RawSeek(reader.FsRoot.Offset / 0x200 * 0x210 + 0x200, SeekOrigin.Begin); var meta = NANDSpare.GetMetaData(reader.RawReadBytes(0x10)); var reserved = 0x1E0; reserved -= meta.Meta2.FsPageCount; reserved -= meta.Meta2.FsSize0 << 2; return(reserved * 8); }
public static void TestMetaUtils(string file) { var reader = new NANDReader(file); var metaType = reader.MetaType; for (long i = 0; i < reader.RawLength; i += 0x4200) { Debug.SendDebug("Seeking to page 0 of block 0x{0:X}", i / 0x4200); reader.RawSeek(i + 0x200, SeekOrigin.Begin); var meta = GetMetaData(reader.RawReadBytes(0x10)); Main.SendInfo("Block 0x{0:X} Page 0 Information:\r\n", i / 0x4200); Main.SendInfo("LBA: 0x{0:X}\r\n", GetLba(ref meta)); Main.SendInfo("Block Type: 0x{0:X}\r\n", GetBlockType(ref meta)); Main.SendInfo("FSSize: 0x{0:X}\r\n", GetFsSize(ref meta)); Main.SendInfo("FsFreePages: 0x{0:X}\r\n", GetFsFreePages(ref meta)); Main.SendInfo("FsSequence: 0x{0:X}\r\n", GetFsSequence(ref meta)); Main.SendInfo("BadBlock Marker: 0x{0:X}\r\n", GetBadBlockMarker(ref meta)); } }
internal static MetaType DetectSpareType(NANDReader reader, bool firsttry = true) { if (!reader.HasSpare) { return(MetaType.MetaTypeNone); } if (firsttry) { reader.RawSeek(0x4400, SeekOrigin.Begin); } else { reader.RawSeek(reader.RawLength - 0x4000, SeekOrigin.Begin); } var tmp = reader.RawReadBytes(0x10); var mdata = GetMetaData(tmp); if (!CheckIsBadBlockSpare(ref tmp, MetaType.MetaType0)) { if (GetLbaRaw0(ref mdata) == 1) { return(MetaType.MetaType0); } if (GetLbaRaw1(ref mdata) == 1) { return(MetaType.MetaType1); } } if (!CheckIsBadBlockSpare(ref tmp, MetaType.MetaType2)) { if (firsttry) { reader.RawSeek(0x21200, SeekOrigin.Begin); } else if (reader.RawLength <= 0x4200000) { reader.RawSeek(reader.RawLength - 0x4000, SeekOrigin.Begin); } else { reader.RawSeek(0x4200000 - 0x4000, SeekOrigin.Begin); } tmp = reader.RawReadBytes(0x10); if (!CheckIsBadBlockSpare(ref tmp, MetaType.MetaType2)) { if (BlockIdFromSpare(ref tmp, MetaType.MetaType2) == 1) { return(MetaType.MetaType2); } } } else if (Main.VerifyVerbosityLevel(1)) { Main.SendInfo(firsttry ? "\r\nBlock 1 is bad!" : "\r\nThe last system block is bad!"); } if (firsttry) { return(DetectSpareType(reader, false)); } throw new X360UtilsException(X360UtilsException.X360UtilsErrors.UnkownMetaType); }