예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
        }
예제 #3
0
파일: Utility.cs 프로젝트: linkanon/PPeX
        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());
                }
        }
예제 #4
0
파일: Manager.cs 프로젝트: linkanon/PPeX
        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));
            }
        }