private void button_Click(object sender, RoutedEventArgs e) { Config.bUseExternalDeLess = false; if (checkBox.IsChecked.Value == true) { Config.bUseExternalDeLess = true; } OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "Select FHD file"; openFileDialog.Filter = "FHD file|*.FHD"; openFileDialog.FileName = string.Empty; if (openFileDialog.ShowDialog().Value) { string filename = openFileDialog.FileName; FatalFrame.GetFHDInfo(filename); } MessageBox.Show("Operation completed"); }
public static bool PatchIMG(string FHD_name) { string directoryName = Path.GetDirectoryName(FHD_name);//Get FHD file directory string patchFolderName = String.Format("{0}\\Patch", directoryName); if (!File.Exists(patchFolderName)) //If the Patch folder does not exist,Create Patch folder { Directory.CreateDirectory(String.Format("{0}\\Patch", directoryName)); } FatalFrame.FHD2INI(FHD_name);//Export ini table from currently selected FHD file List <FHDInfo> list = new List <FHDInfo>(); GetIndexInfo(String.Format("{0}\\zero.ini", directoryName), list);//Get struct list fileInfo m_fileInfo; FileStream fStream = new FileStream(FHD_name, FileMode.Open, FileAccess.ReadWrite);//Open FHD file stream BinaryReader fp = new BinaryReader(fStream); BinaryWriter fhd_writer = new BinaryWriter(fStream); fp.BaseStream.Seek(0, SeekOrigin.Begin); fhd_writer.BaseStream.Seek(0, SeekOrigin.Begin); string IMG_NAME = String.Format("{0}\\IMG_BD.bin", directoryName);//Open the IMG_BD file stream FileStream IMG_Stream = new FileStream(IMG_NAME, FileMode.Open, FileAccess.ReadWrite); BinaryWriter img = new BinaryWriter(IMG_Stream); uint sig = fp.ReadUInt32(); if (sig != 0x46484400) { Base.WriteLogging(String.Format("Error: Not a FHD file:{0}", FHD_name)); MessageBox.Show("Error: Not a FHD file"); fp.Close(); fStream.Close(); return(false); } else { fp.BaseStream.Seek(8, SeekOrigin.Begin); m_fileInfo.baseName = FHD_name; m_fileInfo.baseSize = fp.ReadInt32(); m_fileInfo.baseNums = fp.ReadInt32(); m_fileInfo.BLOCK0_OFFSET = fp.ReadInt32(); // Decompressed BLOCK m_fileInfo.BLOCK1_OFFSET = fp.ReadInt32(); // TYPE BLOCK m_fileInfo.BLOCK2_OFFSET = fp.ReadInt32(); // SIZE BLOCK m_fileInfo.BLOCK3_OFFSET = fp.ReadInt32(); // NAME BLOCK m_fileInfo.BLOCK4_OFFSET = fp.ReadInt32(); // LBA BLOCK fp.BaseStream.Seek(m_fileInfo.BLOCK0_OFFSET, SeekOrigin.Begin); // goto Block 0 Base.WriteLogging(String.Format("{0} files need to patch", list.Count)); for (int i = 0; i < list.Count; i++) { FHDInfo m_FHDInfo = list[i]; //Get the FHD pointer address according to the current ID long LBA_POS = m_fileInfo.BLOCK4_OFFSET + m_FHDInfo.FHD_ID * 4; long SIZE_POS = m_fileInfo.BLOCK2_OFFSET + m_FHDInfo.FHD_ID * 4; long NAME_POS = m_fileInfo.BLOCK3_OFFSET + m_FHDInfo.FHD_ID * 8; long DEC_POS = m_fileInfo.BLOCK0_OFFSET + m_FHDInfo.FHD_ID * 4; string pfName = String.Format("{0}\\Patch\\{1}{2}", directoryName, m_FHDInfo.FolderName.Replace("..", ""), m_FHDInfo.FileName); FileStream pfStream = new FileStream(pfName, FileMode.Open, FileAccess.ReadWrite);//Open patch file file stream BinaryReader pfReader = new BinaryReader(pfStream); pfReader.BaseStream.Seek(0, SeekOrigin.Begin); if (m_FHDInfo.LBA_OFFSET == -1)//The file is appended to the end of IMG_BD { img.BaseStream.Seek(0, SeekOrigin.End); long currentPosition = img.BaseStream.Position; long tmp_offset = Convert.ToUInt32(currentPosition); m_FHDInfo.LBA_OFFSET = tmp_offset; Base.WriteLogging(String.Format("Writing {0} to the end of img --->{1}", pfName, m_FHDInfo.LBA_OFFSET)); byte[] data = pfReader.ReadBytes(Convert.ToInt32(pfStream.Length)); img.Write(data); if (Convert.ToInt32(pfStream.Length) % 0x800 != 0) { img.Write(Base.FillByteArray(0x800 - Convert.ToInt32(pfStream.Length) % 0x800)); } img.Flush(); } else { long tmp_offset = m_FHDInfo.LBA_OFFSET; img.BaseStream.Seek(tmp_offset, SeekOrigin.Begin); byte[] data = pfReader.ReadBytes(Convert.ToInt32(pfStream.Length)); img.Write(data); img.Flush(); } fStream.Position = LBA_POS; fStream.Write(System.BitConverter.GetBytes(m_FHDInfo.LBA_OFFSET / 0x800), 0, 4); fStream.Position = SIZE_POS; fStream.Write(System.BitConverter.GetBytes(m_FHDInfo.CompressedSize << 1), 0, 4); fStream.Position = DEC_POS; fStream.Write(System.BitConverter.GetBytes(m_FHDInfo.DecompressedSize), 0, 4); pfReader.Close(); pfStream.Close(); } fp.Close(); fStream.Close(); IMG_Stream.Close(); img.Close(); return(true); } }