public static FileData GetFileData(string filepath) { FileData result = new FileData(); //Basic Info result.FilePath = filepath; result.FileName = Path.GetFileNameWithoutExtension(filepath); result.FileNameWithExt = Path.GetFileName(filepath); if (CheckXCI(filepath)) { //Get File Size GetFileSize(ref result); //Load Deep File Info (Probably we should clean it a bit more) string actualHash; byte[] hashBuffer; long offset; long[] SecureSize = { }; long[] NormalSize = { }; long[] SecureOffset = { }; long[] NormalOffset = { }; long gameNcaOffset = -1; long gameNcaSize = -1; long PFS0Offset = -1; long PFS0Size = -1; FileStream fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read); HFS0.HSF0_Entry[] array = new HFS0.HSF0_Entry[HFS0.HFS0_Headers[0].FileCount]; fileStream.Position = XCI.XCI_Headers[0].HFS0OffsetPartition + 16 + 64 * HFS0.HFS0_Headers[0].FileCount; List <char> chars = new List <char>(); long num = XCI.XCI_Headers[0].HFS0OffsetPartition + XCI.XCI_Headers[0].HFS0SizeParition; byte[] array2 = new byte[64]; byte[] array3 = new byte[16]; byte[] array4 = new byte[24]; for (int i = 0; i < HFS0.HFS0_Headers[0].FileCount; i++) { fileStream.Position = XCI.XCI_Headers[0].HFS0OffsetPartition + 16 + 64 * i; fileStream.Read(array2, 0, 64); array[i] = new HFS0.HSF0_Entry(array2); fileStream.Position = XCI.XCI_Headers[0].HFS0OffsetPartition + 16 + 64 * HFS0.HFS0_Headers[0].FileCount + array[i].Name_ptr; int num2; while ((num2 = fileStream.ReadByte()) != 0 && num2 != 0) { chars.Add((char)num2); } array[i].Name = new string(chars.ToArray()); chars.Clear(); offset = num + array[i].Offset; hashBuffer = new byte[array[i].HashedRegionSize]; fileStream.Position = offset; fileStream.Read(hashBuffer, 0, array[i].HashedRegionSize); actualHash = SHA256Bytes(hashBuffer); HFS0.HFS0_Header[] array5 = new HFS0.HFS0_Header[1]; fileStream.Position = array[i].Offset + num; fileStream.Read(array3, 0, 16); array5[0] = new HFS0.HFS0_Header(array3); if (array[i].Name == "secure") { SecureSize = new long[array5[0].FileCount]; SecureOffset = new long[array5[0].FileCount]; } if (array[i].Name == "normal") { NormalSize = new long[array5[0].FileCount]; NormalOffset = new long[array5[0].FileCount]; } HFS0.HSF0_Entry[] array6 = new HFS0.HSF0_Entry[array5[0].FileCount]; for (int j = 0; j < array5[0].FileCount; j++) { fileStream.Position = array[i].Offset + num + 16 + 64 * j; fileStream.Read(array2, 0, 64); array6[j] = new HFS0.HSF0_Entry(array2); fileStream.Position = array[i].Offset + num + 16 + 64 * array5[0].FileCount + array6[j].Name_ptr; if (array[i].Name == "secure") { SecureSize[j] = array6[j].Size; SecureOffset[j] = array[i].Offset + array6[j].Offset + num + 16 + array5[0].StringTableSize + array5[0].FileCount * 64; } if (array[i].Name == "normal") { NormalSize[j] = array6[j].Size; NormalOffset[j] = array[i].Offset + array6[j].Offset + num + 16 + array5[0].StringTableSize + array5[0].FileCount * 64; } while ((num2 = fileStream.ReadByte()) != 0 && num2 != 0) { chars.Add((char)num2); } array6[j].Name = new string(chars.ToArray()); chars.Clear(); offset = array[i].Offset + array6[j].Offset + num + 16 + array5[0].StringTableSize + array5[0].FileCount * 64; hashBuffer = new byte[array6[j].HashedRegionSize]; fileStream.Position = offset; fileStream.Read(hashBuffer, 0, array6[j].HashedRegionSize); actualHash = SHA256Bytes(hashBuffer); } } long num3 = -9223372036854775808L; for (int k = 0; k < SecureSize.Length; k++) { if (SecureSize[k] > num3) { gameNcaSize = SecureSize[k]; gameNcaOffset = SecureOffset[k]; num3 = SecureSize[k]; } } PFS0Offset = gameNcaOffset + 32768; fileStream.Position = PFS0Offset; fileStream.Read(array3, 0, 16); PFS0.PFS0_Headers[0] = new PFS0.PFS0_Header(array3); PFS0.PFS0_Entry[] array8; array8 = new PFS0.PFS0_Entry[PFS0.PFS0_Headers[0].FileCount]; for (int m = 0; m < PFS0.PFS0_Headers[0].FileCount; m++) { fileStream.Position = PFS0Offset + 16 + 24 * m; fileStream.Read(array4, 0, 24); array8[m] = new PFS0.PFS0_Entry(array4); PFS0Size += array8[m].Size; } for (int n = 0; n < PFS0.PFS0_Headers[0].FileCount; n++) { fileStream.Position = PFS0Offset + 16 + 24 * PFS0.PFS0_Headers[0].FileCount + array8[n].Name_ptr; int num4; while ((num4 = fileStream.ReadByte()) != 0 && num4 != 0) { chars.Add((char)num4); } array8[n].Name = new string(chars.ToArray()); chars.Clear(); } fileStream.Close(); NCA.NCA_Headers[0] = new NCA.NCA_Header(DecryptNCAHeader(filepath, gameNcaOffset)); result.TitleID = NCA.NCA_Headers[0].TitleID.ToString("X"); } return(result); }