internal void ReadTableHeaders() { SetupCodedIndexes(); for (int i = 0; i < 45; i++) { if (tablesHeap.HasTable((MetaDataTableType)i)) { long headerOffset = reader.BaseStream.Position + tablesHeap.StreamOffset; MetaDataTable table = CreateTable((MetaDataTableType)i, reader.ReadInt32(), headerOffset); tablesHeap.tables[i] = table; } } uint tableOffset = (uint)(tablesHeap.StreamOffset + Marshal.SizeOf(typeof(Structures.METADATA_TABLE_HEADER)) + (tablesHeap.tablecount) * 4); foreach (MetaDataTable table in tablesHeap.tables) { if (table != null) { table.TableOffset = tableOffset; tableOffset += (uint)table.PhysicalSize; } } }
internal NETTableReader(TablesHeap tablesheap) { reader = new BinaryReader(new MemoryStream(tablesheap.Contents)); tablesheap.header = ASMGlobals.ReadStructureFromReader <Structures.METADATA_TABLE_HEADER>(reader); this.tablesHeap = tablesheap; for (int i = 0; i < 45; i++) { if (tablesHeap.HasTable((MetaDataTableType)i)) { tablesHeap.tablecount++; } } tablesHeap.tablereader = this; if ((tablesHeap.HeapOffsetSizes & 1) == 1) { tablesHeap.netheader.StringsHeap.indexsize = 4; } if ((tablesHeap.HeapOffsetSizes & 2) == 2) { tablesHeap.netheader.GuidHeap.indexsize = 4; } if ((tablesHeap.HeapOffsetSizes & 4) == 4) { tablesHeap.netheader.BlobHeap.indexsize = 4; } // ReadTables(); }
public override void VisitAssemblyDefinition(AssemblyDefinition asm) { if (!m_tHeap.HasTable(AssemblyTable.RId)) { throw new ReflectionException("No assembly manifest"); } asm.MetadataToken = new MetadataToken(TokenType.Assembly, 1); m_asmDef = asm; switch (m_img.MetadataRoot.Header.Version) { case "v1.0.3705": asm.Runtime = TargetRuntime.NET_1_0; break; case "v1.1.4322": asm.Runtime = TargetRuntime.NET_1_1; break; case "v2.0.50727": asm.Runtime = TargetRuntime.NET_2_0; break; case "v4.0.30319": asm.Runtime = TargetRuntime.NET_4_0; break; } if ((m_img.PEFileHeader.Characteristics & ImageCharacteristics.Dll) != 0) { asm.Kind = AssemblyKind.Dll; } else if (m_img.PEOptionalHeader.NTSpecificFields.SubSystem == SubSystem.WindowsGui || m_img.PEOptionalHeader.NTSpecificFields.SubSystem == SubSystem.WindowsCeGui) { asm.Kind = AssemblyKind.Windows; } else { asm.Kind = AssemblyKind.Console; } }
internal void RemoveEmptyTables() { ulong validMask = 0; for (int i = 0; i < 45; i++) { if (tablesHeap.HasTable((MetaDataTableType)i)) { MetaDataTable table = tablesHeap.GetTable((MetaDataTableType)i); if (table.Members.Length > 0) { validMask |= ((ulong)1 << i); } else { tablesHeap.tables[i] = null; } } } tablesHeap.MaskValid = validMask; }
void addTableItem_Click(object sender, EventArgs e) { List <object> tablesLeft = new List <object>(); for (int i = 0; i < 45; i++) { if (!currentTablesHeap.HasTable((MetaDataTableType)i)) { tablesLeft.Add((MetaDataTableType)i); } } ComboBoxDlg dlg = new ComboBoxDlg("Select table to add.", "Add table", tablesLeft.ToArray()); if (dlg.ShowDialog() == DialogResult.OK) { currentTablesHeap.AddTable((MetaDataTableType)dlg.SelectedObject); } }
private void CollectMembers(TablesHeap tablesHeap, Workspace workspace) { Constructor.Log("Collecting .NET metadata members."); for (int i = 0; i < tablesHeap._tables.Length; i++) { MetaDataTableType tableType = (MetaDataTableType)i; if (tablesHeap.HasTable(tableType)) { MetaDataTable table = tablesHeap.GetTable(tableType); if (table.Members.Count != 0) { MetaDataMemberInfo[] subMembers = new MetaDataMemberInfo[table.Members.Count]; for (int j = 0; j < subMembers.Length; j++) { subMembers[j] = new MetaDataMemberInfo(table.Members[j]); } workspace.Members.Add(tableType, subMembers); } } } }
public override void VisitTypeDefinitionCollection(TypeDefinitionCollection types) { // type def reading TypeDefTable typesTable = m_tableReader.GetTypeDefTable(); m_typeDefs = new TypeDefinition [typesTable.Rows.Count]; for (int i = 0; i < typesTable.Rows.Count; i++) { TypeDefRow type = typesTable [i]; TypeDefinition t = new TypeDefinition( m_root.Streams.StringsHeap [type.Name], m_root.Streams.StringsHeap [type.Namespace], type.Flags); t.MetadataToken = MetadataToken.FromMetadataRow(TokenType.TypeDef, i); m_typeDefs [i] = t; } // nested types if (m_tHeap.HasTable(NestedClassTable.RId)) { NestedClassTable nested = m_tableReader.GetNestedClassTable(); for (int i = 0; i < nested.Rows.Count; i++) { NestedClassRow row = nested [i]; TypeDefinition parent = GetTypeDefAt(row.EnclosingClass); TypeDefinition child = GetTypeDefAt(row.NestedClass); parent.NestedTypes.Add(child); } } foreach (TypeDefinition type in m_typeDefs) { types.Add(type); } // type ref reading if (m_tHeap.HasTable(TypeRefTable.RId)) { TypeRefTable typesRef = m_tableReader.GetTypeRefTable(); m_typeRefs = new TypeReference [typesRef.Rows.Count]; for (int i = 0; i < typesRef.Rows.Count; i++) { AddTypeRef(typesRef, i); } } else { m_typeRefs = new TypeReference [0]; } ReadTypeSpecs(); ReadMethodSpecs(); ReadMethods(); ReadGenericParameters(); // set base types for (int i = 0; i < typesTable.Rows.Count; i++) { TypeDefRow type = typesTable [i]; TypeDefinition child = m_typeDefs [i]; child.BaseType = GetTypeDefOrRef(type.Extends, new GenericContext(child)); } CompleteMethods(); ReadAllFields(); ReadMemberReferences(); }