public XbfProperty(XbfReader xbf, BinaryReader reader) { Flags = (XbfPropertyFlags)reader.ReadInt32(); int typeID = reader.ReadInt32(); Type = xbf.TypeTable[typeID]; int nameID = reader.ReadInt32(); Name = xbf.StringTable[nameID]; }
public XbfType(XbfReader xbf, BinaryReader reader) { Flags = (XbfTypeFlags)reader.ReadInt32(); int namespaceID = reader.ReadInt32(); Namespace = xbf.TypeNamespaceTable[namespaceID]; int nameID = reader.ReadInt32(); Name = xbf.StringTable[nameID]; }
public XbfPreviewViewModel(byte[] data) { using (MemoryStream memoryStream = new MemoryStream(data)) { XbfReader xbfReader = new XbfReader(memoryStream); if (xbfReader.Header.MajorFileVersion != 2) { throw new Exception("Only XBF2 files can be decompiled."); } Xaml = xbfReader.RootObject.ToString(); } }
static void Main(string[] args) { var reader = new XbfReader(); reader.ReadModel(@"D:\_CODE\C#\LSRutil.NET\Examples\ReadRF\bin\Debug\netcoreapp3.1\extract-old\worlds\city\ctrack\ctchican\ctchican.xbf"); }
private void ProcessFile(string path) { LogBoldLine(); LogMessage("File: " + path); try { var xbf = new XbfReader(path); // Header info LogMessage("File version: {0}.{1}", xbf.Header.MajorFileVersion, xbf.Header.MinorFileVersion); LogMessage("Metadata Size: {0} (0x{0:X})", xbf.Header.MetadataSize); LogMessage("Node Size: {0} (0x{0:X})", xbf.Header.NodeSize); // The offset values seem to be off by 12 bytes compared to the actual positions of these elements in the XBF files. // Displaying these as adjusted values to make external analysis easier. LogMessage("Adjusted String Table Offset: {0} (0x{0:X})", xbf.Header.StringTableOffset + 12); LogMessage("Adjusted Assembly Table Offset: {0} (0x{0:X})", xbf.Header.AssemblyTableOffset + 12); LogMessage("Adjusted Type Namespace Table Offset: {0} (0x{0:X})", xbf.Header.TypeNamespaceTableOffset + 12); LogMessage("Adjusted Type Table Offset: {0} (0x{0:X})", xbf.Header.TypeTableOffset + 12); LogMessage("Adjusted Property Table Offset: {0} (0x{0:X})", xbf.Header.PropertyTableOffset + 12); LogMessage("Adjusted XML Namespace Table Offset: {0} (0x{0:X})", xbf.Header.XmlNamespaceTableOffset + 12); LogMessage(); // String table LogLine(); LogMessage("String table:"); for (int i = 0; i < xbf.StringTable.Length; i++) LogHexAddressMessage(i, xbf.StringTable[i]); LogMessage(); // Assembly table LogLine(); LogMessage("Assembly table:"); for (int i = 0; i < xbf.AssemblyTable.Length; i++) { var assembly = xbf.AssemblyTable[i]; LogHexAddressMessage(i, "{0} (Kind: {1})", assembly.Name, assembly.Kind); } LogMessage(); // Type namespace table LogLine(); LogMessage("Type namespace table:"); for (int i = 0; i < xbf.TypeNamespaceTable.Length; i++) { var typeNamespace = xbf.TypeNamespaceTable[i]; LogHexAddressMessage(i, "{0} (Assembly: {1})", typeNamespace.Name, typeNamespace.Assembly.Name); } LogMessage(); // Type table LogLine(); LogMessage("Type table:"); for (int i = 0; i < xbf.TypeTable.Length; i++) { var type = xbf.TypeTable[i]; LogHexAddressMessage(i, "{0} (Namespace: {1}, Flags: {2})", type.Name, type.Namespace.Name, type.Flags); } LogMessage(); // Property table LogLine(); LogMessage("Property table:"); for (int i = 0; i < xbf.PropertyTable.Length; i++) { var property = xbf.PropertyTable[i]; LogHexAddressMessage(i, "{0} (Type: {1}, Flags: {2})", property.Name, property.Type.Name, property.Flags); } LogMessage(); // XML namespace table LogLine(); LogMessage("XML namespace table:"); for (int i = 0; i < xbf.XmlNamespaceTable.Length; i++) LogHexAddressMessage(i, xbf.XmlNamespaceTable[i]); LogMessage(); // Nodes LogLine(); if (xbf.Header.MajorFileVersion < 2) { LogMessage("Parsing XBF v1 nodes is not currently supported."); } else { LogMessage("XAML objects:"); if (!string.IsNullOrEmpty(xbf.NodeParserError)) { LogMessage(xbf.NodeParserError); LogMessage(); LogMessage("Partial node results:"); } LogMessage(xbf.NodeResultString); } } catch (Exception ex) { LogMessage("Error: " + ex.ToString()); } }
private void ProcessFile(string path) { LogBoldLine(); LogMessage("File: " + path); try { var xbf = new XbfReader(path); // Header info LogMessage("File version: {0}.{1}", xbf.Header.MajorFileVersion, xbf.Header.MinorFileVersion); LogMessage("Metadata Size: {0} (0x{0:X})", xbf.Header.MetadataSize); LogMessage("Node Size: {0} (0x{0:X})", xbf.Header.NodeSize); // The offset values seem to be off by 12 bytes compared to the actual positions of these elements in the XBF files. // Displaying these as adjusted values to make external analysis easier. LogMessage("Adjusted String Table Offset: {0} (0x{0:X})", xbf.Header.StringTableOffset + 12); LogMessage("Adjusted Assembly Table Offset: {0} (0x{0:X})", xbf.Header.AssemblyTableOffset + 12); LogMessage("Adjusted Type Namespace Table Offset: {0} (0x{0:X})", xbf.Header.TypeNamespaceTableOffset + 12); LogMessage("Adjusted Type Table Offset: {0} (0x{0:X})", xbf.Header.TypeTableOffset + 12); LogMessage("Adjusted Property Table Offset: {0} (0x{0:X})", xbf.Header.PropertyTableOffset + 12); LogMessage("Adjusted XML Namespace Table Offset: {0} (0x{0:X})", xbf.Header.XmlNamespaceTableOffset + 12); LogMessage(); // String table LogLine(); LogMessage("String table:"); for (int i = 0; i < xbf.StringTable.Length; i++) { LogHexAddressMessage(i, xbf.StringTable[i]); } LogMessage(); // Assembly table LogLine(); LogMessage("Assembly table:"); for (int i = 0; i < xbf.AssemblyTable.Length; i++) { var assembly = xbf.AssemblyTable[i]; LogHexAddressMessage(i, "{0} (Kind: {1})", assembly.Name, assembly.Kind); } LogMessage(); // Type namespace table LogLine(); LogMessage("Type namespace table:"); for (int i = 0; i < xbf.TypeNamespaceTable.Length; i++) { var typeNamespace = xbf.TypeNamespaceTable[i]; LogHexAddressMessage(i, "{0} (Assembly: {1})", typeNamespace.Name, typeNamespace.Assembly.Name); } LogMessage(); // Type table LogLine(); LogMessage("Type table:"); for (int i = 0; i < xbf.TypeTable.Length; i++) { var type = xbf.TypeTable[i]; LogHexAddressMessage(i, "{0} (Namespace: {1}, Flags: {2})", type.Name, type.Namespace.Name, type.Flags); } LogMessage(); // Property table LogLine(); LogMessage("Property table:"); for (int i = 0; i < xbf.PropertyTable.Length; i++) { var property = xbf.PropertyTable[i]; LogHexAddressMessage(i, "{0} (Type: {1}, Flags: {2})", property.Name, property.Type.Name, property.Flags); } LogMessage(); // XML namespace table LogLine(); LogMessage("XML namespace table:"); for (int i = 0; i < xbf.XmlNamespaceTable.Length; i++) { LogHexAddressMessage(i, xbf.XmlNamespaceTable[i]); } LogMessage(); if (xbf.Header.MajorFileVersion < 2) { LogMessage("Parsing XBF v1 nodes is not currently supported."); } else { // Node section table LogLine(); LogMessage("Node section table:"); for (int i = 0; i < xbf.NodeSectionTable.Length; i++) { LogHexAddressMessage(i, "Node offset: {0} (0x{0:X}) Positional offset: {1} (0x{1:X})", xbf.NodeSectionTable[i].NodeOffset, xbf.NodeSectionTable[i].PositionalOffset); } LogMessage(); // Nodes LogLine(); string xaml = xbf.RootObject.ToString(); LogMessage("XAML objects:"); LogMessage(xaml); } } catch (Exception ex) { LogMessage("Error: " + ex.ToString()); } ShowLog(); }
public XbfAssembly(XbfReader xbf, BinaryReader reader) { Kind = (XbfAssemblyKind)reader.ReadInt32(); int stringID = reader.ReadInt32(); Name = xbf.StringTable[stringID]; }