/// <summary> /// Reads a subfile from file table metadata. /// </summary> /// <param name="reader">The .ppx file reader.</param> public static ArchiveFileSource ReadFromTable(BinaryReader reader, ExtendedArchive archive) { ArchiveFileSource file = new ArchiveFileSource(); file.BaseArchive = archive; ushort len = reader.ReadUInt16(); file.ArchiveName = Encoding.Unicode.GetString(reader.ReadBytes(len)); len = reader.ReadUInt16(); file.Name = Encoding.Unicode.GetString(reader.ReadBytes(len)); len = reader.ReadUInt16(); file.EmulatedName = Encoding.Unicode.GetString(reader.ReadBytes(len)); file.Type = (ArchiveFileType)reader.ReadUInt16(); file.Md5 = reader.ReadBytes(16); file.ChunkID = reader.ReadUInt32(); file.Offset = reader.ReadUInt64(); file.Size = (uint)reader.ReadUInt64(); return(file); }
internal static ExtendedArchiveChunk ReadFromTable(BinaryReader reader, ExtendedArchive archive) { ExtendedArchiveChunk chunk = new ExtendedArchiveChunk(); chunk.baseArchive = archive; chunk.ID = reader.ReadUInt32(); chunk.Compression = (ArchiveChunkCompression)reader.ReadByte(); chunk.CRC32 = reader.ReadUInt32(); chunk.Offset = reader.ReadUInt64(); chunk.CompressedLength = reader.ReadUInt64(); chunk.UncompressedLength = reader.ReadUInt64(); return(chunk); }
public static byte[] CreateHeader(ExtendedArchive arc) { throw new NotImplementedException("bork"); byte[] headerBuf = new byte[HeaderSize(arc.ArchiveFiles.Count)]; using (MemoryStream mem = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(mem)) { writer.Write(ppVersionBytes); writer.Write(DecryptHeaderBytes(BitConverter.GetBytes(Version))); writer.Write(DecryptHeaderBytes(new byte[] { FirstByte })); writer.Write(DecryptHeaderBytes(BitConverter.GetBytes(arc.ArchiveFiles.Count))); byte[] fileHeaderBuf = new byte[288 * arc.ArchiveFiles.Count]; uint fileOffset = (uint)headerBuf.Length; uint largestSize = 0; var list = arc.ArchiveFiles.ToArray(); for (int i = 0; i < arc.ArchiveFiles.Count; i++) { int idx = i * 288; if (largestSize < list[i].Size) { largestSize = list[i].Size; } Utility.EncodingShiftJIS.GetBytes(list[i].Name).CopyTo(fileHeaderBuf, idx); BitConverter.GetBytes(list[i].Size).CopyTo(fileHeaderBuf, idx + 260); BitConverter.GetBytes((uint)headerBuf.Length).CopyTo(fileHeaderBuf, idx + 264); BitConverter.GetBytes(list[i].Size).CopyTo(fileHeaderBuf, idx + 284); } writer.Write(DecryptHeaderBytes(fileHeaderBuf)); writer.Write(DecryptHeaderBytes(BitConverter.GetBytes(headerBuf.Length))); #warning investigate this byte[] dummy = new byte[largestSize]; EncryptPP(dummy); writer.Write(dummy); writer.Flush(); return(mem.ToArray()); } }
static Manager() { #if DEBUG System.Diagnostics.Debugger.Launch(); #endif string dllsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"x86");//Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) var assemblies = new List <Assembly>(); foreach (string path in new DirectoryInfo(dllsPath).GetFiles("*.dll").Select(x => x.FullName)) { try { assemblies.Add(Assembly.LoadFile(path)); } catch (Exception ex) { } } /* * foreach (string path in new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).GetFiles("*.dll").Select(x => x.FullName)) * { * try * { * assemblies.Add(Assembly.LoadFile(path)); * } * catch (Exception ex) * { * * } * }*/ AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { return(assemblies.First(x => args.Name == x.FullName)); }; Settings = Settings.Load(); foreach (string dir in Directory.EnumerateFiles(Settings.PPXLocation, "*.ppx", SearchOption.TopDirectoryOnly).OrderBy(x => x)) { var archive = new ExtendedArchive(dir); foreach (var file in archive.ArchiveFiles) { ISubfile subfile = SubfileFactory.Create(file, file.ArchiveName); FileCache[new FileEntry(subfile.ArchiveName.Replace(".pp", "").ToLower(), subfile.Name.ToLower())] = subfile; } using (FileStream fs = new FileStream(dir, FileMode.Open, FileAccess.Read, FileShare.Read)) using (BinaryReader br = new BinaryReader(fs)) { byte[] buffer = new byte[4096]; while (0 < br.Read(buffer, 0, 4096)) { } } LoadedArchives.Add(archive); } Dictionary <string, List <string> > ppf = new Dictionary <string, List <string> >(); foreach (var kv in FileCache) { if (!ppf.ContainsKey(kv.Key.Archive)) { ppf.Add(kv.Key.Archive, new List <string>()); } ppf[kv.Key.Archive].Add(kv.Key.File); } foreach (var arc in ppf) { File.WriteAllBytes(Settings.PlaceholdersLocation + "\\" + arc.Key + ".pp", Utility.CreateHeader(arc.Value)); } }