public Field(FieldDescriptor fd, Dictionary<uint, string> unhash, long pos, DbxFile tmpdbx) { this.descriptor = fd; this.name = unhash[fd.hash]; this.absPos = pos; this.dbx = tmpdbx; }
public CasCat(string catPath, Main handle) { this.mainForm = handle; this.casPath = Path.GetDirectoryName(catPath) + "\\"; this.modName = Path.GetFileName(catPath); this.setUserDefaultDirectory(); this.casWriterNumber = 0; this.guidTable = new Dictionary <byte[], string>(new ByteArrayComparer()); this.casReaders = new Dictionary <int, BinaryReader>(); this.catEntries = new List <CatEntry>(); using (BinaryReader binaryReader = new BinaryReader(File.Open(catPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { if (new string(binaryReader.ReadChars(16)) != "NyanNyanNyanNyan") { throw new Exception("No Nyan found. Invalid cat file header."); } while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length / 1L) { CatEntry catEntry = new CatEntry(binaryReader); this.catEntries.Add(catEntry); BinaryReader binaryReader2 = this.getBinaryReader((int)catEntry.archiveNumber); binaryReader2.BaseStream.Position = (long)((ulong)catEntry.offset); uint num = binaryReader2.ReadUInt32(); if (num == 263377358u) { DbxFile dbxFile = new DbxFile(binaryReader2, catEntry, this); dbxFile.InitializeFilename(binaryReader2); this.guidTable[dbxFile.dbxHeader.fileGuid] = dbxFile.filename; this.addToTreeView(dbxFile); } } } }
public CasCat(string catPath, Main handle) { this.mainForm = handle; this.casPath = Path.GetDirectoryName(catPath) + "\\"; this.modName = Path.GetFileName(catPath); this.setUserDefaultDirectory(); this.casWriterNumber = 0; this.guidTable = new Dictionary<byte[], string>(new ByteArrayComparer()); this.casReaders = new Dictionary<int, BinaryReader>(); this.catEntries = new List<CatEntry>(); using (BinaryReader binaryReader = new BinaryReader(File.Open(catPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { if (new string(binaryReader.ReadChars(16)) != "NyanNyanNyanNyan") { throw new Exception("No Nyan found. Invalid cat file header."); } while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length / 1L) { CatEntry catEntry = new CatEntry(binaryReader); this.catEntries.Add(catEntry); BinaryReader binaryReader2 = this.getBinaryReader((int)catEntry.archiveNumber); binaryReader2.BaseStream.Position = (long)((ulong)catEntry.offset); uint num = binaryReader2.ReadUInt32(); if (num == 263377358u) { DbxFile dbxFile = new DbxFile(binaryReader2, catEntry, this); dbxFile.InitializeFilename(binaryReader2); this.guidTable[dbxFile.dbxHeader.fileGuid] = dbxFile.filename; this.addToTreeView(dbxFile); } } } }
public Field(FieldDescriptor fd, Dictionary <uint, string> unhash, long pos, DbxFile tmpdbx) { this.descriptor = fd; this.name = unhash[fd.hash]; this.absPos = pos; this.dbx = tmpdbx; }
public void InitializeFilename(BinaryReader fCas) { fCas.BaseStream.Position = (long)((ulong)this.payloadSectionStart); foreach (InstanceRepeater current in this.instanceRepeaters) { int num = 0; while ((long)num < (long)((ulong)current.repetitions)) { byte[] first = fCas.ReadBytes(16); if (first.SequenceEqual(this.dbxHeader.primaryInstanceGuid)) { ComplexDescriptor complexDescriptor = this.complexDescriptors[(int)current.complexIndex]; FieldDescriptor fieldDescriptor = this.fieldDescriptors[(int)complexDescriptor.fieldStartIndex]; ComplexDescriptor complexDescriptor2 = this.complexDescriptors[(int)fieldDescriptor.reference]; while (true) { if (complexDescriptor2.numField > 1) { for (int i = 0; i < (int)complexDescriptor2.numField; i++) { fieldDescriptor = this.fieldDescriptors[(int)(complexDescriptor2.fieldStartIndex + (uint)i)]; if (!(this.unhash[fieldDescriptor.hash] != "Name")) { goto IL_199; } } } if (complexDescriptor2.numField == 0) { break; } complexDescriptor2 = this.complexDescriptors[(int)this.fieldDescriptors[(int)complexDescriptor2.fieldStartIndex].reference]; } for (int j = 0; j < (int)complexDescriptor.numField; j++) { fieldDescriptor = this.fieldDescriptors[(int)(complexDescriptor.fieldStartIndex + (uint)j)]; if (!(this.unhash[fieldDescriptor.hash] != "Name")) { goto IL_199; } } throw new Exception("No Name found."); IL_199: fCas.BaseStream.Position += (long)((ulong)fieldDescriptor.offset); fCas.BaseStream.Position = (long)((ulong)(this.stringSectionStart + fCas.ReadUInt32())); this.filename = DbxFile.readNullTerminatedString(fCas); return; } fCas.BaseStream.Position += (long)((ulong)this.complexDescriptors[(int)current.complexIndex].size); num++; } } }
public void addSubNode(DbxFile dbxfile, int index, List<string> elems, TreeNode tn) { string text = elems[index]; if (!tn.Nodes.ContainsKey(text)) { tn.Nodes.Add(text, text); } if (elems.Count - 1 == index) { tn.Nodes[text].Tag = dbxfile; return; } this.addSubNode(dbxfile, index + 1, elems.ToList<string>(), tn.Nodes[text]); }
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { DbxFile dbxFile = e.Node.Tag as DbxFile; if (dbxFile == null) { this.propertyGrid1.SelectedObject = null; return; } if (dbxFile.instances == null) { dbxFile.InitializePayload(); } this.propertyGrid1.SelectedObject = dbxFile; }
public void addSubNode(DbxFile dbxfile, int index, List <string> elems, TreeNode tn) { string text = elems[index]; if (!tn.Nodes.ContainsKey(text)) { tn.Nodes.Add(text, text); } if (elems.Count - 1 == index) { tn.Nodes[text].Tag = dbxfile; return; } this.addSubNode(dbxfile, index + 1, elems.ToList <string>(), tn.Nodes[text]); }
public void addToTreeView(DbxFile dbxfile) { string[] array = dbxfile.filename.Split(new char[] { '/' }); if (!this.mainForm.treeView1.Nodes.ContainsKey(array[0])) { this.mainForm.treeView1.Nodes.Add(array[0], array[0]); } if (array.Count <string>() == 1) { this.mainForm.treeView1.Nodes[array[0]].Tag = dbxfile; return; } this.addSubNode(dbxfile, 1, array.ToList <string>(), this.mainForm.treeView1.Nodes[array[0]]); }
public BinaryWriter getWriter(DbxFile dbx) { if (dbx.catEntry.archiveNumber >= 50u) { try { this.casWriter = new BinaryWriter(File.Open(string.Concat(new object[] { this.casPath, "cas_", dbx.catEntry.archiveNumber, ".cas" }), FileMode.Open, FileAccess.Write, FileShare.ReadWrite)); } catch (Exception) { } return(this.casWriter); } uint num = 4294967295u; uint num2 = 4294967295u; if (this.casWriterNumber >= 50) { try { this.casWriter = new BinaryWriter(File.Open(string.Concat(new object[] { this.casPath, "cas_", this.casWriterNumber, ".cas" }), FileMode.Open, FileAccess.Write, FileShare.ReadWrite)); } catch (Exception) { } this.casWriter.Seek(0, SeekOrigin.End); num = (uint)this.casWriterNumber; num2 = (uint)this.casWriter.BaseStream.Position + 32u; } else { for (int i = 50; i < 100; i++) { if (!File.Exists(string.Concat(new object[] { this.casPath, "cas_", i, ".cas" }))) { this.casWriterNumber = i; this.casWriter = new BinaryWriter(File.Open(string.Concat(new object[] { this.casPath, "cas_", i, ".cas" }), FileMode.Create, FileAccess.Write, FileShare.ReadWrite)); num = (uint)i; num2 = 32u; break; } } } if (this.casWriter == null || num == 4294967295u) { throw new Exception("Cannot create new cas file in the range 50-99"); } BinaryReader binaryReader = this.casReaders[(int)dbx.catEntry.archiveNumber]; uint offset = dbx.catEntry.offset; BinaryWriter binaryWriter = new BinaryWriter(File.Open(this.casPath + this.modName, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)); binaryReader.BaseStream.Position = (long)((ulong)(offset - 32u)); this.casWriter.Write(binaryReader.ReadBytes((int)(dbx.catEntry.size + 32u))); for (int j = 0; j < this.catEntries.Count <CatEntry>(); j++) { if (this.catEntries[j].sha1.SequenceEqual(dbx.catEntry.sha1)) { int num3 = 16 + j * 32; this.catEntries[j].archiveNumber = num; this.catEntries[j].offset = num2; binaryWriter.Seek(num3 + 20, SeekOrigin.Begin); binaryWriter.Write(num2); binaryWriter.Seek(4, SeekOrigin.Current); binaryWriter.Write(num); binaryWriter.Close(); break; } } return(this.casWriter); }
public void addToTreeView(DbxFile dbxfile) { string[] array = dbxfile.filename.Split(new char[] { '/' }); if (!this.mainForm.treeView1.Nodes.ContainsKey(array[0])) { this.mainForm.treeView1.Nodes.Add(array[0], array[0]); } if (array.Count<string>() == 1) { this.mainForm.treeView1.Nodes[array[0]].Tag = dbxfile; return; } this.addSubNode(dbxfile, 1, array.ToList<string>(), this.mainForm.treeView1.Nodes[array[0]]); }
public BinaryWriter getWriter(DbxFile dbx) { if (dbx.catEntry.archiveNumber >= 50u) { try { this.casWriter = new BinaryWriter(File.Open(string.Concat(new object[] { this.casPath, "cas_", dbx.catEntry.archiveNumber, ".cas" }), FileMode.Open, FileAccess.Write, FileShare.ReadWrite)); } catch (Exception) { } return this.casWriter; } uint num = 4294967295u; uint num2 = 4294967295u; if (this.casWriterNumber >= 50) { try { this.casWriter = new BinaryWriter(File.Open(string.Concat(new object[] { this.casPath, "cas_", this.casWriterNumber, ".cas" }), FileMode.Open, FileAccess.Write, FileShare.ReadWrite)); } catch (Exception) { } this.casWriter.Seek(0, SeekOrigin.End); num = (uint)this.casWriterNumber; num2 = (uint)this.casWriter.BaseStream.Position + 32u; } else { for (int i = 50; i < 100; i++) { if (!File.Exists(string.Concat(new object[] { this.casPath, "cas_", i, ".cas" }))) { this.casWriterNumber = i; this.casWriter = new BinaryWriter(File.Open(string.Concat(new object[] { this.casPath, "cas_", i, ".cas" }), FileMode.Create, FileAccess.Write, FileShare.ReadWrite)); num = (uint)i; num2 = 32u; break; } } } if (this.casWriter == null || num == 4294967295u) { throw new Exception("Cannot create new cas file in the range 50-99"); } BinaryReader binaryReader = this.casReaders[(int)dbx.catEntry.archiveNumber]; uint offset = dbx.catEntry.offset; BinaryWriter binaryWriter = new BinaryWriter(File.Open(this.casPath + this.modName, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)); binaryReader.BaseStream.Position = (long)((ulong)(offset - 32u)); this.casWriter.Write(binaryReader.ReadBytes((int)(dbx.catEntry.size + 32u))); for (int j = 0; j < this.catEntries.Count<CatEntry>(); j++) { if (this.catEntries[j].sha1.SequenceEqual(dbx.catEntry.sha1)) { int num3 = 16 + j * 32; this.catEntries[j].archiveNumber = num; this.catEntries[j].offset = num2; binaryWriter.Seek(num3 + 20, SeekOrigin.Begin); binaryWriter.Write(num2); binaryWriter.Seek(4, SeekOrigin.Current); binaryWriter.Write(num); binaryWriter.Close(); break; } } return this.casWriter; }
public DbxPropertyDescriptor(string name, Complex elem, DbxFile dbxa) : base(name, null) { this.complex = elem; }
public void InitializeMetaData(BinaryReader fCas) { this.dbxHeader = new DbxHeader(fCas); this.arraySectionStart = this.catEntry.offset + this.dbxHeader.stringOffset + this.dbxHeader.lenString + this.dbxHeader.lenPayload; this.stringSectionStart = this.catEntry.offset + this.dbxHeader.stringOffset; this.payloadSectionStart = this.catEntry.offset + this.dbxHeader.stringOffset + this.dbxHeader.lenString; this.externalGuids = new List <Tuple <byte[], byte[]> >((int)this.dbxHeader.numExternalGuid); int num = 0; while ((long)num < (long)((ulong)this.dbxHeader.numExternalGuid)) { this.externalGuids.Add(new Tuple <byte[], byte[]>(fCas.ReadBytes(16), fCas.ReadBytes(16))); num++; } this.unhash = new Dictionary <uint, string>(); byte[] array = new byte[this.dbxHeader.lenKeyword]; fCas.BaseStream.Read(array, 0, (int)this.dbxHeader.lenKeyword); int num2 = 0; int num3 = 0; while ((long)num3 < (long)((ulong)this.dbxHeader.lenKeyword)) { if (array[num3] == 0) { string @string = Encoding.ASCII.GetString(array, num2, num3 - num2); if (@string != "") { this.unhash.Add(DbxFile.hasher(@string), @string); } num2 = num3 + 1; } num3++; } this.fieldDescriptors = new List <FieldDescriptor>((int)this.dbxHeader.numField); int num4 = 0; while ((long)num4 < (long)((ulong)this.dbxHeader.numField)) { FieldDescriptor item = new FieldDescriptor(fCas); this.fieldDescriptors.Add(item); num4++; } this.complexDescriptors = new List <ComplexDescriptor>((int)this.dbxHeader.numComplex); int num5 = 0; while ((long)num5 < (long)((ulong)this.dbxHeader.numComplex)) { ComplexDescriptor item2 = new ComplexDescriptor(fCas); this.complexDescriptors.Add(item2); num5++; } this.instanceRepeaters = new List <InstanceRepeater>(); int num6 = 0; while ((long)num6 < (long)((ulong)this.dbxHeader.numInstanceRepeater)) { this.instanceRepeaters.Add(new InstanceRepeater(fCas)); num6++; } long num7 = 16L - (fCas.BaseStream.Position - (long)((ulong)this.catEntry.offset)) % 16L; if (num7 != 16L) { fCas.ReadBytes((int)num7); } this.arrayRepeaters = new List <ArrayRepeater>(); int num8 = 0; while ((long)num8 < (long)((ulong)this.dbxHeader.numArrayRepeater)) { this.arrayRepeaters.Add(new ArrayRepeater(fCas)); num8++; } }
private Field parseField(FieldDescriptor fieldDesc, BinaryReader b) { Field field = new Field(fieldDesc, this.unhash, b.BaseStream.Position - (long)((ulong)this.catEntry.offset), this); FieldType type = fieldDesc.type; if (type <= FieldType.Int8) { if (type <= FieldType.Array) { if (type <= FieldType.Complex) { if (type != FieldType.Inheritance && type != FieldType.Complex) { return(field); } } else { if (type == FieldType.Guid) { field.value = b.ReadUInt32(); return(field); } if (type != FieldType.Array) { return(field); } ArrayRepeater arrayRepeater = this.arrayRepeaters[b.ReadInt32()]; ComplexDescriptor cd = this.complexDescriptors[(int)fieldDesc.reference]; FieldDescriptor fieldDesc2 = this.fieldDescriptors[(int)cd.fieldStartIndex]; if (arrayRepeater.repetitions == 0u) { field.value = "*nullArray*"; return(field); } b.BaseStream.Position = (long)((ulong)(this.arraySectionStart + arrayRepeater.offset)); Complex complex = new Complex(cd, this.unhash); int num = 0; while ((long)num < (long)((ulong)arrayRepeater.repetitions)) { complex.fields.Add(this.parseField(fieldDesc2, b)); num++; } field.value = complex; return(field); } } else { if (type <= FieldType.String) { if (type == FieldType.Enum) { Enum @enum = new Enum(); @enum.selection = b.ReadUInt32(); ComplexDescriptor complexDescriptor = this.complexDescriptors[(int)fieldDesc.reference]; for (int i = 0; i < (int)complexDescriptor.numField; i++) { Field field2 = new Field(this.fieldDescriptors[(int)(complexDescriptor.fieldStartIndex + (uint)i)], this.unhash, b.BaseStream.Position, this); @enum.choices.Add(new Tuple <uint, string>(field2.descriptor.offset, field2.name)); } field.value = @enum; return(field); } if (type != FieldType.String) { return(field); } long position = b.BaseStream.Position; b.BaseStream.Position = (long)((ulong)(this.stringSectionStart + b.ReadUInt32())); field.value = DbxFile.readNullTerminatedString(b); b.BaseStream.Position = position + 4L; return(field); } else { if (type == FieldType.Bool) { field.value = (b.ReadByte() != 0); return(field); } if (type != FieldType.Int8) { return(field); } field.value = b.ReadByte(); return(field); } } } else { if (type <= FieldType.UInt32) { if (type <= FieldType.Int16) { if (type == FieldType.UInt16) { field.value = b.ReadUInt16(); return(field); } if (type != FieldType.Int16) { return(field); } field.value = b.ReadInt16(); return(field); } else { if (type == FieldType.Int32) { field.value = b.ReadInt32(); return(field); } if (type != FieldType.UInt32) { return(field); } field.value = b.ReadUInt32(); return(field); } } else { if (type <= FieldType.Double) { if (type == FieldType.Single) { field.value = b.ReadSingle(); return(field); } if (type != FieldType.Double) { return(field); } field.value = b.ReadDouble(); return(field); } else { if (type == FieldType.RawGuid) { field.value = b.ReadBytes(16); return(field); } if (type != FieldType.Complex2) { return(field); } } } } field.value = this.parseComplex((int)fieldDesc.reference, b); return(field); }