Example #1
0
        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);
        }
Example #2
0
        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));
            }
        }
Example #3
0
        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);
        }