Example #1
0
        bool xExtract(string xOut, bool Sub)
        {
            if (!VariousFunctions.xCheckDirectory(xOut))
            {
                return(false);
            }
            FATXReadContents xread = xRead();

            if (xread == null)
            {
                return(false);
            }
            foreach (FATXFileEntry x in xread.Files)
            {
                DJsIO xIOOut = new DJsIO(xOut + "/" + x.Name, DJFileMode.Create, true);
                if (!xIOOut.Accessed)
                {
                    continue;
                }
                x.xExtract(ref xIOOut);
                xIOOut.Dispose();
            }
            if (!Sub)
            {
                return(true);
            }
            foreach (FATXFolderEntry x in xread.Folders)
            {
                x.xExtract(xOut + "/" + x.Name, Sub);
            }
            return(true);
        }
Example #2
0
        /* Note: Have plans for safer and better manipulation to prevent
         * minimal block loss to human error */

        /// <summary>
        /// Adds a folder
        /// </summary>
        /// <param name="FolderName"></param>
        /// <returns></returns>
        public bool AddFolder(string FolderName)
        {
            FolderName.IsValidXboxName();
            if (xDrive.ActiveCheck())
            {
                return(false);
            }
            try
            {
                FATXReadContents xconts = xRead();
                foreach (FATXFolderEntry x in xconts.xfolds)
                {
                    if (x.Name == FolderName)
                    {
                        return(xDrive.xActive = false);
                    }
                }
                DJsIO xIOIn = new DJsIO(new byte[Partition.xBlockSize], true);
                uint  xnew  = 0;
                long  xpos  = GetNewEntryPos(out xnew);
                if (xpos == -1)
                {
                    return(xDrive.xActive = false);
                }
                uint[] blocks = Partition.xTable.GetNewBlockChain(xIOIn.BlockCountFATX(Partition), xnew + 1);
                if (blocks.Length == 0)
                {
                    return(xDrive.xActive = false);
                }
                if (!Partition.WriteFile(blocks, ref xIOIn))
                {
                    return(xDrive.xActive = false);
                }
                FATXEntry y = new FATXEntry(FolderName, blocks[0], (int)xIOIn.Length, xpos, true, ref xDrive);
                if (!y.xWriteEntry())
                {
                    return(xDrive.xActive = false);
                }
                if (xnew > 0)
                {
                    List <uint> fileblocks = new List <uint>(Partition.xTable.GetBlocks(xStartBlock));
                    fileblocks.Add(xnew);
                    uint[] xtemp = fileblocks.ToArray();
                    if (!Partition.xTable.WriteChain(ref xtemp))
                    {
                        return(xDrive.xActive = false);
                    }
                }
                if (!Partition.xTable.WriteChain(ref blocks))
                {
                    return(xDrive.xActive = false);
                }
                if (Partition.WriteAllocTable())
                {
                    return(!(xDrive.xActive = false));
                }
                return(xDrive.xActive = false);
            }
            catch { return(xDrive.xActive = false); }
        }
Example #3
0
        public FATXEntry GetSubEntry(string fileName, FATXReadContents parent)
        {
            FATXEntry ret = GetSubFolder(fileName, parent);

            if (ret == null)
            {
                ret = GetSubFile(fileName, parent);
            }
            return(ret);
        }
Example #4
0
        /// <summary>
        /// Reads the contents
        /// </summary>
        /// <returns></returns>
        public FATXReadContents Read()
        {
            if (xDrive.ActiveCheck())
            {
                return(null);
            }
            FATXReadContents xReturn = xRead();

            xDrive.xActive = false;
            return(xReturn);
        }
Example #5
0
        /// <summary>
        /// Attempts to read to a specified location
        /// </summary>
        /// <param name="Path">Path to read to</param>
        /// <param name="xFolderOut">FATXFolder of result</param>
        /// <returns></returns>
        public FATXReadContents ReadToFolder(string Path, out FATXFolderEntry xFolderOut)
        {
            if (ActiveCheck())
            {
                xFolderOut = null;
                return(null);
            }
            FATXReadContents xreturn = xReadToFolder(Path, out xFolderOut);

            xactive = false;
            return(xreturn);
        }
Example #6
0
        public FATXEntry GetSubFile(string fileName, FATXReadContents parent)
        {
            FATXEntry ret = null;

            for (int x = 0; x < parent.Files.Length; x++)
            {
                var subFile = parent.Files[x];
                if (string.Compare(subFile.Name, fileName, true) == 0)
                {
                    ret = subFile;
                    break;
                }
            }
            return(ret);
        }
Example #7
0
        internal FATXReadContents xRead()
        {
            FATXReadContents xreturn = new FATXReadContents();

            try
            {
                xDrive.GetIO();
                List <FATXEntry> xEntries = new List <FATXEntry>();
                uint[]           xBlocks  = Partition.xTable.GetBlocks(xStartBlock);
                for (int i = 0; i < xBlocks.Length; i++)
                {
                    long xCurrent = Partition.BlockToOffset(xBlocks[i]);
                    if (xCurrent == -1)
                    {
                        break;
                    }
                    for (int x = 0; x < Partition.xEntryCount; x++)
                    {
                        xDrive.xIO.Position = xCurrent + (0x40 * x);
                        FATXEntry z = new FATXEntry((xCurrent + (0x40 * x)), xDrive.xIO.ReadBytes(0x40), ref xDrive);
                        z.SetAtts(Partition);
                        if (z.xIsValid)
                        {
                            xEntries.Add(z);
                        }
                        else if (z.xNLen != 0xE5)
                        {
                            break;
                        }
                    }
                }
                xreturn.xfolds = new List <FATXFolderEntry>();
                xreturn.xfiles = new List <FATXFileEntry>();
                for (int i = 0; i < xEntries.Count; i++)
                {
                    if (xEntries[i].IsFolder)
                    {
                        xreturn.xfolds.Add(new FATXFolderEntry(xEntries[i], ref xDrive));
                    }
                    else
                    {
                        xreturn.xfiles.Add(new FATXFileEntry(xEntries[i], ref xDrive));
                    }
                }
                return(xreturn);
            }
            catch { return(xreturn = null); }
        }
Example #8
0
        public FATXReadContents GetPartitionContents(int partition)
        {
            FATXReadContents xread = new FATXReadContents();

            xread.xfiles = new List <FATXFileEntry>();
            xread.xfolds = new List <FATXFolderEntry>();
            foreach (FATXFolderEntry xz in Partitions[partition].Folders)
            {
                xread.xfolds.Add(xz);
            }
            foreach (FATXPartition xz in Partitions[partition].SubPartitions)
            {
                xread.xsubparts.Add(xz);
            }
            return(xread);
        }
Example #9
0
        public FATXEntry GetSubFolder(string folderName, FATXReadContents parent)
        {
            FATXEntry ret = null;

            for (int x = 0; x < parent.Folders.Length; x++)
            {
                var subFolder = parent.Folders[x];
                if (string.Compare(subFolder.Name, folderName, true) == 0)
                {
                    ret = subFolder;

                    break;
                }
            }
            return(ret);
        }
Example #10
0
 internal FATXReadContents xRead()
 {
     FATXReadContents xreturn = new FATXReadContents();
     try
     {
         xDrive.GetIO();
         List<FATXEntry> xEntries = new List<FATXEntry>();
         uint[] xBlocks = Partition.xTable.GetBlocks(xStartBlock);
         for (int i = 0; i < xBlocks.Length; i++)
         {
             long xCurrent = Partition.BlockToOffset(xBlocks[i]);
             if (xCurrent == -1)
                 break;
             for (int x = 0; x < Partition.xEntryCount; x++)
             {
                 xDrive.xIO.Position = xCurrent + (0x40 * x);
                 FATXEntry z = new FATXEntry((xCurrent + (0x40 * x)), xDrive.xIO.ReadBytes(0x40), ref xDrive);
                 z.SetAtts(Partition);
                 if (z.xIsValid)
                     xEntries.Add(z);
                 else if (z.xNLen != 0xE5)
                         break;
             }
         }
         xreturn.xfolds = new List<FATXFolderEntry>();
         xreturn.xfiles = new List<FATXFileEntry>();
         for (int i = 0; i < xEntries.Count; i++)
         {
             if (xEntries[i].IsFolder)
                 xreturn.xfolds.Add(new FATXFolderEntry(xEntries[i], ref xDrive));
             else xreturn.xfiles.Add(new FATXFileEntry(xEntries[i], ref xDrive));
         }
         return xreturn;
     }
     catch { return (xreturn = null); }
 }
 public USBDriveEntry(string name, FATXReadContents contents, FATXFolderEntry entry)
 {
     this.entry = entry;
     this.name = name;
     this.contents = contents;
 }
        public FATXReadContents xRead()
        {
            FATXReadContents xreturn = new FATXReadContents();
            try
            {
                xDrive.GetIO();

                if (!Partition.xTable.xAllocTable.Accessed)
                {
                    return null;
                }
                List<FATXEntry> xEntries = new List<FATXEntry>();
                uint[] xBlocks = Partition.xTable.GetBlocks(xStartBlock);

                for (int i = 0; i < xBlocks.Length; i++)
                {
                    long xCurrent = Partition.BlockToOffset(xBlocks[i]);
                    if (xCurrent == -1)
                        break;

                    for (int x = 0; x < Partition.xEntryCount; x++)
                    {
                        xDrive.xIO.Position = xCurrent + (0x40 * x);
                        FATXEntry z = new FATXEntry(Partition.FatType,
                            (xCurrent + (0x40 * x)),
                            xDrive.xIO.ReadBytes(0x40),
                            ref xDrive);

                        z.SetAtts(Partition);

                        if (z.xIsValid)
                        {
                            xEntries.Add(z);
                        }
                        else
                        {
                            if (z.xNLen != 0xE5)
                                break;
                        }
                    }
                }
                xreturn.xfolds = new List<FATXFolderEntry>();
                xreturn.xfiles = new List<FATXFileEntry>();
                for (int i = 0; i < xEntries.Count; i++)
                {
                    if (xEntries[i].IsFolder)
                    {
                        if (string.Compare(xEntries[i].Name, this.Name, true) != 0)
                        {
                            var f = new FATXFolderEntry(this, xEntries[i], Path + "/" + xEntries[i].Name);

                            xreturn.xfolds.Add(f);
                        }
                    }
                    else
                    {
                        var f = new FATXFileEntry(this, xEntries[i]);

                        xreturn.xfiles.Add(f);
                    }
                }
                return xreturn;
            }
            catch { return (xreturn = null); }
        }
        public FATXReadContents xReadToFolder(string Path, out FATXFolderEntry xFolderOut)
        {
            xFolderOut = null;

            List<string> findFolders = GetPathFromString(Path);
            if (findFolders == null || findFolders.Count == 0)
                return null;

            string findPartition = findFolders[0];

            var partition = GetPartition(findPartition);
            if (partition == null)
                return null;

            int partIndex = GetPartitionIndex(partition);
            if (partIndex == -1)
                return null;

            var contents = GetPartitionContents(partIndex);
            if (contents == null)
                return null;

            if (findFolders.Count == 1)
            {
                xFolderOut = new FATXFolderEntry(contents.Folders[0].Parent, contents.Folders[0], Path);
                return contents;
            }

            findFolders.RemoveAt(0);
            while (findFolders.Count > 0)
            {
                var entry = GetSubEntry(findFolders[0], contents);

                if (entry != null)
                {
                    if (entry.xIsValid)
                    {
                        if (entry.IsFolder)
                        {
                            var fe = entry as FATXFolderEntry;
                            if (fe != null)
                            {
                                xFolderOut = fe;

                                contents = fe.xRead();
                            }
                            else
                            {
                                xFolderOut = null;
                                contents = null;
                            }
                        }
                        else
                        {
                            var fe = entry as FATXFileEntry;
                            if (fe != null)
                            {
                                xFolderOut = null;
                                contents = new FATXReadContents();
                                contents.xfiles = new List<FATXFileEntry>();
                                contents.xfolds = new List<FATXFolderEntry>();
                                contents.xfiles.Add(fe);
                            }
                            else
                            {
                                xFolderOut = null;
                                contents = null;
                            }
                        }
                    }
                }
                findFolders.RemoveAt(0);
                if (contents == null)
                    return null;

            }

            return contents;
            /*
            if (Folders.Length == 1)
            {
                return partContents;
            }

            int curFolder=1;

            FATXPartition xcurpart = xPartitions[PartitionIndex];
            int idx = 1;
            for (int i = 0; i < xcurpart.SubPartitions.Length; i++)
            {
                if (xcurpart.SubPartitions[i].PartitionName.ToLower() != Folders[1].ToLower())
                    continue;
                xcurpart = xcurpart.SubPartitions[i];
                idx++;
                if (Folders.Length == 2)
                {
                    FATXReadContents xread = new FATXReadContents();
                    xread.xfiles = new List<FATXFileEntry>();
                    xread.xfolds = new List<FATXFolderEntry>();
                    foreach (FATXFolderEntry xz in xcurpart.Folders)
                        xread.xfolds.Add(xz);
                    return xread;
                }
                break;
            }
            FATXFolderEntry xFold = null;
            foreach (FATXFolderEntry x in xcurpart.Folders)
            {
                if (x.Name.ToLower() != Folders[idx].ToLower())
                    continue;
                xFold = x;
                break;
            }
            if (xFold == null)
                return null;
            idx++;
            FATXReadContents xreadct;
            for (int i = idx; i < Folders.Length; i++)
            {
                bool found = false;
                xreadct = xFold.xRead();
                foreach (FATXFolderEntry x in xreadct.Folders)
                {
                    if (x.Name.ToLower() != Folders[i].ToLower())
                        continue;
                    found = true;
                    xFold = x;
                    break;
                }
                if (!found)
                    return null;
            }
            xFolderOut = xFold;
            return xFold.xRead();*/
        }
        public FATXEntry GetSubFolder(string folderName, FATXReadContents parent)
        {
            FATXEntry ret = null;
            for (int x = 0; x < parent.Folders.Length; x++)
            {
                var subFolder = parent.Folders[x];
                if (string.Compare(subFolder.Name, folderName, true) == 0)
                {

                    ret = subFolder;

                    break;
                }
            }
            return ret;
        }
 public FATXEntry GetSubFile(string fileName, FATXReadContents parent)
 {
     FATXEntry ret = null;
     for (int x = 0; x < parent.Files.Length; x++)
     {
         var subFile = parent.Files[x];
         if (string.Compare(subFile.Name, fileName, true) == 0)
         {
             ret = subFile;
             break;
         }
     }
     return ret;
 }
 public FATXEntry GetSubEntry(string fileName, FATXReadContents parent)
 {
     FATXEntry ret = GetSubFolder(fileName, parent);
     if (ret == null)
         ret = GetSubFile(fileName, parent);
     return ret;
 }
 public FATXReadContents GetPartitionContents(int partition)
 {
     FATXReadContents xread = new FATXReadContents();
     xread.xfiles = new List<FATXFileEntry>();
     xread.xfolds = new List<FATXFolderEntry>();
     foreach (FATXFolderEntry xz in Partitions[partition].Folders)
         xread.xfolds.Add(xz);
     foreach (FATXPartition xz in Partitions[partition].SubPartitions)
         xread.xsubparts.Add(xz);
     return xread;
 }
Example #18
0
        public FATXReadContents xReadToFolder(string Path, out FATXFolderEntry xFolderOut)
        {
            xFolderOut = null;

            List <string> findFolders = GetPathFromString(Path);

            if (findFolders == null || findFolders.Count == 0)
            {
                return(null);
            }


            string findPartition = findFolders[0];

            var partition = GetPartition(findPartition);

            if (partition == null)
            {
                return(null);
            }

            int partIndex = GetPartitionIndex(partition);

            if (partIndex == -1)
            {
                return(null);
            }

            var contents = GetPartitionContents(partIndex);

            if (contents == null)
            {
                return(null);
            }

            if (findFolders.Count == 1)
            {
                xFolderOut = new FATXFolderEntry(contents.Folders[0].Parent, contents.Folders[0], Path);
                return(contents);
            }

            findFolders.RemoveAt(0);
            while (findFolders.Count > 0)
            {
                var entry = GetSubEntry(findFolders[0], contents);

                if (entry != null)
                {
                    if (entry.xIsValid)
                    {
                        if (entry.IsFolder)
                        {
                            var fe = entry as FATXFolderEntry;
                            if (fe != null)
                            {
                                xFolderOut = fe;

                                contents = fe.xRead();
                            }
                            else
                            {
                                xFolderOut = null;
                                contents   = null;
                            }
                        }
                        else
                        {
                            var fe = entry as FATXFileEntry;
                            if (fe != null)
                            {
                                xFolderOut      = null;
                                contents        = new FATXReadContents();
                                contents.xfiles = new List <FATXFileEntry>();
                                contents.xfolds = new List <FATXFolderEntry>();
                                contents.xfiles.Add(fe);
                            }
                            else
                            {
                                xFolderOut = null;
                                contents   = null;
                            }
                        }
                    }
                }
                findFolders.RemoveAt(0);
                if (contents == null)
                {
                    return(null);
                }
            }



            return(contents);

            /*
             * if (Folders.Length == 1)
             * {
             *  return partContents;
             * }
             *
             * int curFolder=1;
             *
             *
             *
             * FATXPartition xcurpart = xPartitions[PartitionIndex];
             * int idx = 1;
             * for (int i = 0; i < xcurpart.SubPartitions.Length; i++)
             * {
             *  if (xcurpart.SubPartitions[i].PartitionName.ToLower() != Folders[1].ToLower())
             *      continue;
             *  xcurpart = xcurpart.SubPartitions[i];
             *  idx++;
             *  if (Folders.Length == 2)
             *  {
             *      FATXReadContents xread = new FATXReadContents();
             *      xread.xfiles = new List<FATXFileEntry>();
             *      xread.xfolds = new List<FATXFolderEntry>();
             *      foreach (FATXFolderEntry xz in xcurpart.Folders)
             *          xread.xfolds.Add(xz);
             *      return xread;
             *  }
             *  break;
             * }
             * FATXFolderEntry xFold = null;
             * foreach (FATXFolderEntry x in xcurpart.Folders)
             * {
             *  if (x.Name.ToLower() != Folders[idx].ToLower())
             *      continue;
             *  xFold = x;
             *  break;
             * }
             * if (xFold == null)
             *  return null;
             * idx++;
             * FATXReadContents xreadct;
             * for (int i = idx; i < Folders.Length; i++)
             * {
             *  bool found = false;
             *  xreadct = xFold.xRead();
             *  foreach (FATXFolderEntry x in xreadct.Folders)
             *  {
             *      if (x.Name.ToLower() != Folders[i].ToLower())
             *          continue;
             *      found = true;
             *      xFold = x;
             *      break;
             *  }
             *  if (!found)
             *      return null;
             * }
             * xFolderOut = xFold;
             * return xFold.xRead();*/
        }
Example #19
0
        /// <summary>
        /// Adds a file
        /// </summary>
        /// <param name="FileName"></param>
        /// <param name="FileLocation"></param>
        /// <param name="xType"></param>
        /// <returns></returns>
        public bool AddFile(string FileName, string FileLocation, AddType xType)
        {
            FileName.IsValidXboxName();
            if (xDrive.ActiveCheck())
            {
                return(false);
            }
            DJsIO xIOIn = null;

            try { xIOIn = new DJsIO(FileLocation, DJFileMode.Open, true); }
            catch { return(xDrive.xActive = false); }
            try
            {
                FATXReadContents xconts = xRead();
                foreach (FATXFileEntry x in xconts.xfiles)
                {
                    if (x.Name == FileName)
                    {
                        bool xreturn = false;
                        if (xType == AddType.NoOverWrite)
                        {
                            return(xDrive.xActive = false);
                        }
                        else if (xType == AddType.Inject)
                        {
                            xreturn = x.xInject(xIOIn);
                        }
                        else
                        {
                            xreturn = x.xReplace(xIOIn);
                        }
                        return(xreturn & !(xDrive.xActive = false));
                    }
                }
                uint xnew = 0;
                long xpos = GetNewEntryPos(out xnew);
                if (xpos == -1)
                {
                    return(xDrive.xActive = false);
                }
                uint[] blocks = Partition.xTable.GetNewBlockChain(xIOIn.BlockCountFATX(Partition), xnew + 1);
                if (blocks.Length == 0)
                {
                    return(xDrive.xActive = false);
                }
                if (!Partition.WriteFile(blocks, ref xIOIn))
                {
                    return(xDrive.xActive = false);
                }
                FATXEntry y = new FATXEntry(FileName, blocks[0], (int)xIOIn.Length, xpos, false, ref xDrive);
                if (!y.xWriteEntry())
                {
                    return(xDrive.xActive = false);
                }
                if (xnew > 0)
                {
                    List <uint> fileblocks = new List <uint>(Partition.xTable.GetBlocks(xStartBlock));
                    fileblocks.Add(xnew);
                    uint[] xtemp = fileblocks.ToArray();
                    if (!Partition.xTable.WriteChain(ref xtemp))
                    {
                        return(xDrive.xActive = false);
                    }
                }
                if (!Partition.xTable.WriteChain(ref blocks))
                {
                    return(xDrive.xActive = false);
                }
                if (Partition.WriteAllocTable())
                {
                    return(!(xDrive.xActive = false));
                }
                return(xDrive.xActive = false);
            }
            catch { xIOIn.Close(); return(xDrive.xActive = false); }
        }
Example #20
0
 internal FATXReadContents xReadToFolder(string Path, out FATXFolderEntry xFolderOut)
 {
     xFolderOut = null;
     if (Path == null || Path == "")
         return null;
     Path = Path.Replace("\\", "/");
     if (Path[0] == '/')
         Path = Path.Substring(1, Path.Length - 1);
     if (Path[Path.Length - 1] == '/')
         Path = Path.Substring(0, Path.Length - 1);
     string[] Folders = Path.Split(new char[] { '/' });
     sbyte PartitionIndex = -1;
     for (int i = 0; i < xPartitions.Count; i++)
     {
         if (xPartitions[i].PartitionName.ToLower() != Folders[0].ToLower())
             continue;
         PartitionIndex = (sbyte)i;
         break;
     }
     if (PartitionIndex == -1)
         return null;
     if (Folders.Length == 1)
     {
         FATXReadContents xread = new FATXReadContents();
         xread.xfiles = new List<FATXFileEntry>();
         xread.xfolds = new List<FATXFolderEntry>();
         foreach (FATXFolderEntry xz in Partitions[PartitionIndex].Folders)
             xread.xfolds.Add(xz);
         foreach (FATXPartition xz in Partitions[PartitionIndex].SubPartitions)
             xread.xsubparts.Add(xz);
         return xread;
     }
     FATXPartition xcurpart = xPartitions[PartitionIndex];
     int idx = 1;
     for (int i = 0; i < xcurpart.SubPartitions.Length; i++)
     {
         if (xcurpart.SubPartitions[i].PartitionName.ToLower() != Folders[1].ToLower())
             continue;
         xcurpart = xcurpart.SubPartitions[i];
         idx++;
         if (Folders.Length == 2)
         {
             FATXReadContents xread = new FATXReadContents();
             xread.xfiles = new List<FATXFileEntry>();
             xread.xfolds = new List<FATXFolderEntry>();
             foreach (FATXFolderEntry xz in xcurpart.Folders)
                 xread.xfolds.Add(xz);
             return xread;
         }
         break;
     }
     FATXFolderEntry xFold = null;
     foreach (FATXFolderEntry x in xcurpart.Folders)
     {
         if (x.Name.ToLower() != Folders[idx].ToLower())
             continue;
         xFold = x;
         break;
     }
     if (xFold == null)
         return null;
     idx++;
     FATXReadContents xreadct;
     for (int i = idx; i < Folders.Length; i++)
     {
         bool found = false;
         xreadct = xFold.xRead();
         foreach (FATXFolderEntry x in xreadct.Folders)
         {
             if (x.Name.ToLower() != Folders[i].ToLower())
                 continue;
             found = true;
             xFold = x;
             break;
         }
         if (!found)
             return null;
     }
     xFolderOut = xFold;
     return xFold.xRead();
 }
Example #21
0
        internal FATXReadContents xReadToFolder(string Path, out FATXFolderEntry xFolderOut)
        {
            xFolderOut = null;
            if (Path == null || Path == "")
            {
                return(null);
            }
            Path = Path.Replace("\\", "/");
            if (Path[0] == '/')
            {
                Path = Path.Substring(1, Path.Length - 1);
            }
            if (Path[Path.Length - 1] == '/')
            {
                Path = Path.Substring(0, Path.Length - 1);
            }
            string[] Folders        = Path.Split(new char[] { '/' });
            sbyte    PartitionIndex = -1;

            for (int i = 0; i < xPartitions.Count; i++)
            {
                if (xPartitions[i].PartitionName.ToLower() != Folders[0].ToLower())
                {
                    continue;
                }
                PartitionIndex = (sbyte)i;
                break;
            }
            if (PartitionIndex == -1)
            {
                return(null);
            }
            if (Folders.Length == 1)
            {
                FATXReadContents xread = new FATXReadContents();
                xread.xfiles = new List <FATXFileEntry>();
                xread.xfolds = new List <FATXFolderEntry>();
                foreach (FATXFolderEntry xz in Partitions[PartitionIndex].Folders)
                {
                    xread.xfolds.Add(xz);
                }
                foreach (FATXPartition xz in Partitions[PartitionIndex].SubPartitions)
                {
                    xread.xsubparts.Add(xz);
                }
                return(xread);
            }
            FATXPartition xcurpart = xPartitions[PartitionIndex];
            int           idx      = 1;

            for (int i = 0; i < xcurpart.SubPartitions.Length; i++)
            {
                if (xcurpart.SubPartitions[i].PartitionName.ToLower() != Folders[1].ToLower())
                {
                    continue;
                }
                xcurpart = xcurpart.SubPartitions[i];
                idx++;
                if (Folders.Length == 2)
                {
                    FATXReadContents xread = new FATXReadContents();
                    xread.xfiles = new List <FATXFileEntry>();
                    xread.xfolds = new List <FATXFolderEntry>();
                    foreach (FATXFolderEntry xz in xcurpart.Folders)
                    {
                        xread.xfolds.Add(xz);
                    }
                    return(xread);
                }
                break;
            }
            FATXFolderEntry xFold = null;

            foreach (FATXFolderEntry x in xcurpart.Folders)
            {
                if (x.Name.ToLower() != Folders[idx].ToLower())
                {
                    continue;
                }
                xFold = x;
                break;
            }
            if (xFold == null)
            {
                return(null);
            }
            idx++;
            FATXReadContents xreadct;

            for (int i = idx; i < Folders.Length; i++)
            {
                bool found = false;
                xreadct = xFold.xRead();
                foreach (FATXFolderEntry x in xreadct.Folders)
                {
                    if (x.Name.ToLower() != Folders[i].ToLower())
                    {
                        continue;
                    }
                    found = true;
                    xFold = x;
                    break;
                }
                if (!found)
                {
                    return(null);
                }
            }
            xFolderOut = xFold;
            return(xFold.xRead());
        }