private int[] ReadOffsets(IReader reader, Pointer indexTableLocation, int count) { reader.SeekTo(indexTableLocation.AsOffset()); int[] offsets = new int[count]; for (int i = 0; i < count; i++) offsets[i] = reader.ReadInt32(); return offsets; }
private IReader DecryptData(IReader reader, Pointer dataLocation, int tableSize, AESKey key) { // Round the table size to an AES block size tableSize = (tableSize + 0xF) & ~0xF; reader.SeekTo(dataLocation.AsOffset()); byte[] data = reader.ReadBlock(tableSize); if (key != null) data = AES.Decrypt(data, key.Key, key.IV); return new EndianReader(new MemoryStream(data), Endian.BigEndian); }
public void ReadRequestedStrings(IReader reader, Pointer baseLocation, CachedStringTable output) { uint baseOffset = baseLocation.AsOffset(); int lastEnd = -1; foreach (int offset in _requestedStrings) { if (offset <= lastEnd) continue; reader.SeekTo(baseOffset + offset); string str = reader.ReadAscii(); output.CacheString(offset, str); lastEnd = offset + str.Length; } }
private IList<IScriptParameter> LoadParameters(IReader reader, StructureValueCollection values, MetaAddressConverter addrConverter, BuildInformation buildInfo) { int paramCount = (int)values.GetNumber("number of parameters"); Pointer paramListLocation = new Pointer(values.GetNumber("address of parameter list"), addrConverter); StructureLayout layout = buildInfo.GetLayout("script parameter entry"); List<IScriptParameter> result = new List<IScriptParameter>(); reader.SeekTo(paramListLocation.AsOffset()); for (int i = 0; i < paramCount; i++) { StructureValueCollection paramValues = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenScriptParameter(paramValues)); } return result; }
public bool Equals(Pointer obj) { return (AsOffset() == obj.AsOffset()); }
private ExpressionTable LoadScriptExpressions(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, StringTableReader stringReader, StructureLayout entryLayout) { int exprCount = (int)values.GetNumber("number of script expressions"); ScriptExpressionsLocation = new Pointer(values.GetNumber("script expression table address"), addrConverter); ExpressionTable result = new ExpressionTable(); reader.SeekTo(ScriptExpressionsLocation.AsOffset()); for (int i = 0; i < exprCount; i++) { StructureValueCollection exprValues = StructureReader.ReadStructure(reader, entryLayout); result.AddExpression(new ThirdGenExpression(exprValues, (ushort)i, stringReader)); } foreach (IExpression expr in result) { // FIXME: hax if (expr != null) ((ThirdGenExpression)expr).ResolveReferences(result); } return result; }
private List<IScript> LoadScripts(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, ExpressionTable expressions, StructureLayout entryLayout, BuildInformation buildInfo) { int script = (int)values.GetNumber("number of scripts"); ScriptsLocation = new Pointer(values.GetNumber("script table address"), addrConverter); // Read all of the script entries first, then go back and create the objects // ThirdGenScript reads parameters from its constructor - this may or may not need cleaning up to make this more obvious reader.SeekTo(ScriptsLocation.AsOffset()); List<StructureValueCollection> scriptData = new List<StructureValueCollection>(); for (int i = 0; i < script; i++) scriptData.Add(StructureReader.ReadStructure(reader, entryLayout)); List<IScript> result = new List<IScript>(); foreach (StructureValueCollection scriptValues in scriptData) result.Add(new ThirdGenScript(reader, scriptValues, addrConverter, stringIDs, expressions, buildInfo)); return result; }
private List<IGlobalObject> LoadScriptObjects(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, StructureLayout entryLayout) { int objectsCount = (int)values.GetNumber("number of script objects"); ScriptObjectsLocation = new Pointer(values.GetNumber("script object table address"), addrConverter); List<IGlobalObject> result = new List<IGlobalObject>(); reader.SeekTo(ScriptObjectsLocation.AsOffset()); for (int i = 0; i < objectsCount; i++) { StructureValueCollection objValues = StructureReader.ReadStructure(reader, entryLayout); result.Add(new ThirdGenGlobalObject(objValues, stringIDs)); } return result; }
private List<IGlobal> LoadScriptGlobals(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, ExpressionTable expressions, StructureLayout entryLayout) { int globalsCount = (int)values.GetNumber("number of script globals"); ScriptGlobalsLocation = new Pointer(values.GetNumber("script global table address"), addrConverter); List<IGlobal> result = new List<IGlobal>(); reader.SeekTo(ScriptGlobalsLocation.AsOffset()); for (int i = 0; i < globalsCount; i++) { StructureValueCollection globalValues = StructureReader.ReadStructure(reader, entryLayout); result.Add(new ThirdGenGlobal(globalValues, expressions)); } return result; }
/// <summary> /// Converts a Pointer into a pointer which can be written to the file. /// </summary> /// <param name="pointer">The Pointer to convert.</param> /// <returns>The raw value of the Pointer.</returns> public uint PointerToRaw(Pointer pointer) { return OffsetToPointer(pointer.AsOffset()); }
private List<ITagClass> ReadClasses(IReader reader, Pointer classTableLocation, int numClasses, BuildInformation buildInfo) { StructureLayout layout = buildInfo.GetLayout("class entry"); List<ITagClass> result = new List<ITagClass>(); reader.SeekTo(classTableLocation.AsOffset()); for (int i = 0; i < numClasses; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenTagClass(values)); } return result; }
private List<ITag> ReadTags(IReader reader, Pointer tagTableLocation, int numTags, BuildInformation buildInfo, MetaAddressConverter converter) { StructureLayout layout = buildInfo.GetLayout("tag entry"); List<ITag> result = new List<ITag>(); reader.SeekTo(tagTableLocation.AsOffset()); for (int i = 0; i < numTags; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenTag(values, (ushort)i, converter, _classes)); } return result; }