Ejemplo n.º 1
0
        public override void WriteFooter(Stream stream, List <IWriteFile> files, int[] sizes, int[] CRCs)
        {
            DirPosition = (int)stream.Position;

            ICryptoTransform cryptoTrans  = new CryptoTransformOneCode(DirMask);
            CryptoStream     cryptoStream = new CryptoStream(stream, cryptoTrans, CryptoStreamMode.Write);
            BinaryWriter     cryptoWriter = new BinaryWriter(cryptoStream);

            byte[] nameBuf = new byte[128];
            for (int i = 0, offset = 4; i < files.Count; i++)
            {
                cryptoWriter.Write(offset);
                cryptoWriter.Write(sizes[i]);

                Utility.EncodingShiftJIS.GetBytes(files[i].Name).CopyTo(nameBuf, 0);
                int len = files[i].Name.Length;
                while (len < nameBuf.Length && nameBuf[len] != 0)
                {
                    nameBuf[len++] = 0;
                }
                cryptoWriter.Write(nameBuf);

                cryptoWriter.Write(CRCs[i]);

                offset += sizes[i];
            }

            BinaryWriter writer = new BinaryWriter(stream);

            writer.Write(DirMask);
            writer.Write(DirPosition);
        }
Ejemplo n.º 2
0
        public override List <IWriteFile> ReadDirectory(string path)
        {
            List <IWriteFile> subfiles = null;

            using (BinaryReader reader = new BinaryReader(File.OpenRead(path)))
            {
                int numFiles = reader.ReadInt32() & (int)~0x80000000;
                reader.BaseStream.Seek(-8, SeekOrigin.End);
                DirMask     = reader.ReadBytes(4);
                DirPosition = reader.ReadInt32();
                reader.BaseStream.Seek(DirPosition, SeekOrigin.Begin);

                ICryptoTransform cryptoTrans  = new CryptoTransformOneCode(DirMask);
                CryptoStream     cryptoStream = new CryptoStream(reader.BaseStream, cryptoTrans, CryptoStreamMode.Read);
                using (BinaryReader cryptoReader = new BinaryReader(cryptoStream))
                {
                    subfiles = new List <IWriteFile>(numFiles);
                    for (int i = 0; i < numFiles; i++)
                    {
                        fpkSubfile subfile = new fpkSubfile(path);
                        subfile.offset = cryptoReader.ReadUInt32();
                        subfile.size   = cryptoReader.ReadUInt32();
                        byte[] nameBuf = cryptoReader.ReadBytes(128);
                        int    len     = 0;
                        while (len < nameBuf.Length && nameBuf[len] != 0)
                        {
                            len++;
                        }
                        subfile.Name = Utility.EncodingShiftJIS.GetString(nameBuf, 0, len);
                        subfile.crc  = cryptoReader.ReadInt32();
                        subfiles.Add(subfile);

                        try
                        {
                            if (Hash(nameBuf) != subfile.crc)
                            {
                                Report.ReportLog("bad hash code for <" + subfile.Name + ">");
                            }
                        }
                        catch
                        {
                        }
                    }
                }
            }

            return(subfiles);
        }