private void Write(ResourceDirectory directory, int writeDepth, int currentDepth, ref int offset, Dictionary <string, int> strings, ref int stringTableOffset, ByteBuffer stringTable) { if (currentDepth == writeDepth) { ushort namedEntries = directory.SortEntries(); // directory header win32_resources.WriteUInt32(directory.Characteristics); win32_resources.WriteUInt32(directory.TimeDateStamp); win32_resources.WriteUInt16(directory.MajorVersion); win32_resources.WriteUInt16(directory.MinVersion); win32_resources.WriteUInt16(namedEntries); win32_resources.WriteUInt16((ushort)(directory.Entries.Count - namedEntries)); foreach (ResourceEntry entry in directory.Entries) { WriteEntry(entry, ref offset, strings, ref stringTableOffset, stringTable); } } else { foreach (ResourceEntry entry in directory.Entries) { Write(entry.Directory, writeDepth, currentDepth + 1, ref offset, strings, ref stringTableOffset, stringTable); } } }
private void WriteNameOrOrdinal(ResourceEntry entry, Dictionary <string, int> strings, ref int stringTableOffset, ByteBuffer stringTable) { if (entry.Name == null) { win32_resources.WriteUInt32(entry.Id); } else { int stringOffset; if (!strings.TryGetValue(entry.Name, out stringOffset)) { stringOffset = stringTableOffset; strings.Add(entry.Name, stringOffset); stringTableOffset += entry.Name.Length * 2 + 2; stringTable.WriteUInt16((ushort)entry.Name.Length); foreach (char c in entry.Name) { stringTable.WriteInt16((short)c); } } win32_resources.WriteUInt32(0x80000000U | (uint)stringOffset); } }
void PatchRawSmallSection(ByteBuffer buffer, MetadataBuilder metadata) { var length = ReadByte (); buffer.WriteByte (length); Advance (2); buffer.WriteUInt16 (0); var count = length / 12; PatchRawExceptionHandlers (buffer, metadata, count, false); }
void PatchRawFatMethod(ByteBuffer buffer, MethodSymbols symbols, CodeWriter writer, out MetadataToken local_var_token) { var flags = ReadUInt16 (); buffer.WriteUInt16 (flags); buffer.WriteUInt16 (ReadUInt16 ()); symbols.code_size = ReadInt32 (); buffer.WriteInt32 (symbols.code_size); local_var_token = ReadToken (); if (local_var_token.RID > 0) { var variables = symbols.variables = ReadVariables (local_var_token); buffer.WriteUInt32 (variables != null ? writer.GetStandAloneSignature (symbols.variables).ToUInt32 () : 0); } else buffer.WriteUInt32 (0); PatchRawCode (buffer, symbols.code_size, writer); if ((flags & 0x8) != 0) PatchRawSection (buffer, writer.metadata); }
void PatchRawExceptionHandlers(ByteBuffer buffer, MetadataBuilder metadata, int count, bool fat_entry) { const int fat_entry_size = 16; const int small_entry_size = 6; for (int i = 0; i < count; i++) { ExceptionHandlerType handler_type; if (fat_entry) { var type = ReadUInt32 (); handler_type = (ExceptionHandlerType) (type & 0x7); buffer.WriteUInt32 (type); } else { var type = ReadUInt16 (); handler_type = (ExceptionHandlerType) (type & 0x7); buffer.WriteUInt16 (type); } buffer.WriteBytes (ReadBytes (fat_entry ? fat_entry_size : small_entry_size)); switch (handler_type) { case ExceptionHandlerType.Catch: var exception = reader.LookupToken (ReadToken ()); buffer.WriteUInt32 (metadata.LookupToken (exception).ToUInt32 ()); break; default: buffer.WriteUInt32 (ReadUInt32 ()); break; } } }
private void WriteNameOrOrdinal(ResourceEntry entry, Dictionary<string, int> strings, ref int stringTableOffset, ByteBuffer stringTable) { if (entry.Name == null) { win32_resources.WriteUInt32(entry.Id); } else { int stringOffset; if (!strings.TryGetValue(entry.Name, out stringOffset)) { stringOffset = stringTableOffset; strings.Add(entry.Name, stringOffset); stringTableOffset += entry.Name.Length * 2 + 2; stringTable.WriteUInt16((ushort)entry.Name.Length); foreach (char c in entry.Name) stringTable.WriteInt16((short)c); } win32_resources.WriteUInt32(0x80000000U | (uint)stringOffset); } }