示例#1
0
 public NARC.DirectoryEntry GetDirectoryByPath(string Path)
 {
     if (Path == this.Name.Replace("root", "\\"))
     {
         return(this);
     }
     if (!Path.StartsWith(this.Name.Replace("root", "\\")))
     {
         return((NARC.DirectoryEntry)null);
     }
     Path = Path.Remove(0, this.Name.Replace("root", "\\").Length);
     string[] strArray = Path.Split(new string[1] {
         "\\"
     }, StringSplitOptions.RemoveEmptyEntries);
     for (int index = 0; index < this.Subdirs.Count; ++index)
     {
         NARC.DirectoryEntry directoryByPath = this.Subdirs[index].GetDirectoryByPath(string.Join("\\", strArray));
         if (directoryByPath != null)
         {
             return(directoryByPath);
         }
     }
     return((NARC.DirectoryEntry)null);
 }
示例#2
0
 public void GetNarcData(
     ref EndianBinaryWriter er2,
     ref EndianBinaryWriter er4,
     bool isRoot,
     sbyte depth,
     NARC.DirectoryEntry Root,
     ref short items,
     ref List <sbyte> mapID_,
     ref sbyte mapID,
     int j = 0)
 {
     if (isRoot)
     {
         for (int index = 0; index < this.Subdirs.Count; ++index)
         {
             mapID_.Add(mapID);
             er2.Write((sbyte)(this.Subdirs[index].Name.Length + 128));
             er2.Write(this.Subdirs[index].Name, Encoding.ASCII, false);
             er2.Write(mapID);
             er2.Write((byte)240);
             mapID += (sbyte)(this.Subdirs[index].Subdirs.Count + 1);
         }
         for (int index = 0; index < this.Files.Count; ++index)
         {
             er2.Write((sbyte)this.Files[index].Name.Length);
             er2.Write(this.Files[index].Name, Encoding.ASCII, false);
             ++items;
         }
         List <sbyte> mapID_1 = new List <sbyte>();
         sbyte        mapID1  = (sbyte)((int)depth + 1);
         for (int j1 = 0; j1 < this.Subdirs.Count; ++j1)
         {
             er2.Write((byte)0);
             er4.Write((int)er2.BaseStream.Position + (8 + Root.NrOfDirs * 8));
             er4.Write(items);
             er4.Write((sbyte)0);
             er4.Write((byte)240);
             this.Subdirs[j1].GetNarcData(ref er2, ref er4, false, (sbyte)((int)depth + 1), Root, ref items, ref mapID_1, ref mapID1, j1);
         }
     }
     else
     {
         for (int index = 0; index < this.Subdirs.Count; ++index)
         {
             mapID_.Add(mapID);
             er2.Write((sbyte)(this.Subdirs[index].Name.Length + 128));
             er2.Write(this.Subdirs[index].Name, Encoding.ASCII, false);
             er2.Write(mapID);
             er2.Write((byte)240);
             mapID += (sbyte)(this.Subdirs[index].Subdirs.Count + 1);
         }
         if (j != Root.Subdirs.Count && depth == (sbyte)2)
         {
             ++mapID;
         }
         for (int index = 0; index < this.Files.Count; ++index)
         {
             er2.Write((sbyte)this.Files[index].Name.Length);
             er2.Write(this.Files[index].Name, Encoding.ASCII, false);
             ++items;
         }
         sbyte        mapID1  = (sbyte)((int)depth + 1);
         List <sbyte> mapID_1 = new List <sbyte>();
         for (int index = 0; index < this.Subdirs.Count; ++index)
         {
             er2.Write((byte)0);
             er4.Write((int)er2.BaseStream.Position + (8 + Root.NrOfDirs * 8));
             er4.Write(items);
             er4.Write(mapID_[index]);
             er4.Write((byte)240);
             this.Subdirs[index].GetNarcData(ref er2, ref er4, false, (sbyte)((int)depth + 1), Root, ref items, ref mapID_1, ref mapID1, 0);
         }
     }
 }
示例#3
0
        public static byte[] Pack(NARC.DirectoryEntry indir)
        {
            MemoryStream       memoryStream1      = new MemoryStream();
            EndianBinaryWriter endianBinaryWriter = new EndianBinaryWriter((Stream)memoryStream1, Endianness.LittleEndian);

            endianBinaryWriter.Write(nameof(NARC), Encoding.ASCII, false);
            endianBinaryWriter.Write(new byte[4]
            {
                (byte)254,
                byte.MaxValue,
                (byte)0,
                (byte)1
            }, 0, 4);
            endianBinaryWriter.Write(0);
            endianBinaryWriter.Write((short)16);
            endianBinaryWriter.Write((short)3);
            endianBinaryWriter.Write("BTAF", Encoding.ASCII, false);
            int nrOfFiles = indir.NrOfFiles;

            endianBinaryWriter.Write(12 + nrOfFiles * 8);
            endianBinaryWriter.Write(nrOfFiles);
            int num = 0;

            for (int id = 0; id < nrOfFiles; ++id)
            {
                endianBinaryWriter.Write(num);
                num += indir.GetFile(id).Content.Length;
                endianBinaryWriter.Write(num);
                while (num % 4 != 0)
                {
                    ++num;
                }
            }
            MemoryStream       memoryStream2 = new MemoryStream();
            EndianBinaryWriter er2           = new EndianBinaryWriter((Stream)memoryStream2, Endianness.LittleEndian);
            MemoryStream       memoryStream3 = new MemoryStream();
            EndianBinaryWriter er4           = new EndianBinaryWriter((Stream)memoryStream3, Endianness.LittleEndian);

            er4.Write(8 + indir.NrOfDirs * 8);
            er4.Write((short)0);
            er4.Write((short)(indir.NrOfDirs + 1));
            List <sbyte> mapID_     = new List <sbyte>();
            List <sbyte> sbyteList1 = new List <sbyte>();
            List <sbyte> sbyteList2 = new List <sbyte>();
            sbyte        mapID      = 1;
            short        items      = 0;

            indir.GetNarcData(ref er2, ref er4, true, (sbyte)1, indir, ref items, ref mapID_, ref mapID, 0);
            er2.Write((byte)0);
            while (er2.BaseStream.Length % 4L != 0L)
            {
                er2.Write(byte.MaxValue);
            }
            er2.Close();
            er4.Close();
            endianBinaryWriter.Write("BTNF", Encoding.ASCII, false);
            endianBinaryWriter.Write(memoryStream2.ToArray().Length + memoryStream3.ToArray().Length + 8);
            byte[] array1 = memoryStream3.ToArray();
            endianBinaryWriter.Write(array1, 0, array1.Length);
            byte[] array2 = memoryStream2.ToArray();
            endianBinaryWriter.Write(array2, 0, array2.Length);
            MemoryStream       memoryStream4 = new MemoryStream();
            EndianBinaryWriter er3           = new EndianBinaryWriter((Stream)memoryStream4, Endianness.LittleEndian);

            indir.WriteFileData(ref er3);
            er3.Close();
            endianBinaryWriter.Write("GMIF", Encoding.ASCII, false);
            endianBinaryWriter.Write(memoryStream4.ToArray().Length + 8);
            byte[] array3 = memoryStream4.ToArray();
            endianBinaryWriter.Write(array3, 0, array3.Length);
            endianBinaryWriter.BaseStream.Position = 8L;
            endianBinaryWriter.Write((int)endianBinaryWriter.BaseStream.Length);
            byte[] array4 = memoryStream1.ToArray();
            endianBinaryWriter.Close();
            return(array4);
        }
示例#4
0
        public static NARC.DirectoryEntry Unpack(byte[] infile)
        {
            List <int>    intList1 = new List <int>();
            List <int>    intList2 = new List <int>();
            List <string> source1  = new List <string>();
            List <int>    intList3 = new List <int>();
            List <string> source2  = new List <string>();
            List <int>    source3  = new List <int>();
            List <int>    intList4 = new List <int>();

            NARC.DirectoryEntry directoryEntry1 = new NARC.DirectoryEntry("root", 0);
            NARC.DirectoryEntry directoryEntry2 = directoryEntry1;
            bool flag = true;
            EndianBinaryReader endianBinaryReader = new EndianBinaryReader((Stream) new MemoryStream(infile), Endianness.LittleEndian);

            if (endianBinaryReader.ReadString(Encoding.ASCII, 4) == nameof(NARC))
            {
                endianBinaryReader.ReadBytes(4);
                endianBinaryReader.ReadInt32();
                int num1 = (int)endianBinaryReader.ReadInt16();
                int num2 = (int)endianBinaryReader.ReadInt16();
                if (endianBinaryReader.ReadString(Encoding.ASCII, 4) == "BTAF")
                {
                    endianBinaryReader.ReadInt32();
                    int num3 = endianBinaryReader.ReadInt32();
                    for (int index = 0; index < num3; ++index)
                    {
                        intList1.Add(endianBinaryReader.ReadInt32());
                        intList2.Add(endianBinaryReader.ReadInt32());
                    }
                    if (endianBinaryReader.ReadString(Encoding.ASCII, 4) == "BTNF")
                    {
                        int id1;
                        if (endianBinaryReader.ReadInt32() == 16)
                        {
                            for (id1 = 0; id1 < num3; ++id1)
                            {
                                directoryEntry1.Files.Add(new NARC.FileEntry("Unknown file " + id1.ToString() + ".bin", id1));
                            }
                            flag = false;
                            endianBinaryReader.ReadBytes(8);
                        }
                        else
                        {
                            int position = (int)endianBinaryReader.BaseStream.Position;
                            int num4     = endianBinaryReader.ReadInt32();
                            int num5     = (int)endianBinaryReader.ReadInt16();
                            int num6     = (int)endianBinaryReader.ReadInt16();
                            endianBinaryReader.ReadInt32();
                            int num7 = (int)endianBinaryReader.ReadInt16();
                            int num8 = (int)endianBinaryReader.ReadInt16();
                            int id2  = 0;
                            endianBinaryReader.BaseStream.Position = (long)(position + num4);
                            for (int index = 0; index < num3 + (num6 - 1); ++index)
                            {
                                byte num9 = endianBinaryReader.ReadByte();
                                if (num9 < (byte)128 && num9 > (byte)0)
                                {
                                    source1.Add(endianBinaryReader.ReadString(Encoding.ASCII, (int)num9));
                                    intList3.Add(id2);
                                    directoryEntry2.Files.Add(new NARC.FileEntry(source1.Last <string>(), intList3.Count - 1));
                                }
                                else if (num9 > (byte)128 && num9 < (byte)176)
                                {
                                    byte num10 = (byte)((uint)num9 - 128U);
                                    source2.Add(endianBinaryReader.ReadString(Encoding.ASCII, (int)num10));
                                    source3.Add((int)endianBinaryReader.ReadByte());
                                    intList4.Add(id2);
                                    int num11 = (int)endianBinaryReader.ReadByte();
                                    directoryEntry2.Subdirs.Add(new NARC.DirectoryEntry(source2.Last <string>(), source3.Last <int>()));
                                }
                                else
                                {
                                    ++id2;
                                    directoryEntry2 = directoryEntry1.GetDirById(id2);
                                    --index;
                                }
                            }
                        }
                        while (!(endianBinaryReader.ReadString(Encoding.ASCII, 4) == "GMIF"))
                        {
                            endianBinaryReader.BaseStream.Position -= 3L;
                        }
                        endianBinaryReader.ReadInt32();
                        int position1 = (int)endianBinaryReader.BaseStream.Position;
                        for (id1 = 0; id1 < num3; ++id1)
                        {
                            endianBinaryReader.BaseStream.Position = (long)(position1 + intList1[id1]);
                            directoryEntry1.SetFile(endianBinaryReader.ReadBytes(intList2[id1] - intList1[id1]), id1);
                        }
                    }
                    else
                    {
                        int num12 = (int)MessageBox.Show("Error2", "error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    }
                }
                else
                {
                    int num13 = (int)MessageBox.Show("Error1", "error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                }
            }
            else
            {
                int num = (int)MessageBox.Show("It isn't a narc file, or it is compressed.", "error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
            }
            endianBinaryReader.Close();
            return(directoryEntry1);
        }
示例#5
0
 public static void Pack(NARC.DirectoryEntry indir, string outfile)
 {
     System.IO.File.Create(outfile).Close();
     System.IO.File.WriteAllBytes(outfile, NARC.Pack(indir));
 }