public static TreeNode ConstructAssemblyNode(Win32Assembly assembly)
{
TreeNode assemblyNode = CreateNode(assembly.Path.Substring(assembly.Path.LastIndexOf('\\') + 1), assembly);
assemblyNode.Nodes.AddRange(new TreeNode[] {
CreateNode("Dos Header", assembly.MZHeader),
CreateNode("NT Header", assembly.NTHeader).AddSubNodes(new TreeNode[] {
CreateNode("File Header", assembly.NTHeader.FileHeader),
CreateNode("Optional Header", assembly.NTHeader.OptionalHeader).AddSubNodes(new TreeNode[] {
CreateArrayNode("Data Directories", assembly.NTHeader.OptionalHeader.DataDirectories, (obj) => { return ((DataDirectory)obj).Name.ToString(); }),
})
}),
CreateArrayNode("Sections", assembly.NTHeader.Sections.ToArray(), (obj) => { return ((Section)obj).Name; }),
CreateArrayNode("Export Directory", assembly.LibraryExports.ToArray()),
CreateArrayNode("Import Directory", assembly.LibraryImports.ToArray(), (obj) => { return ((LibraryReference)obj).LibraryName; }).AddForEachNode((tag) => { return ((LibraryReference)tag.Object).ImportMethods; }, (obj) => { return ((ImportMethod)obj).Name;}),
CreateNode("Resource Directory", assembly.RootResourceDirectory, TreeNodeType.ResourcesTree),
CreateNode(".NET Directory", assembly.NETHeader, (netHeader)=> { return assembly.NTHeader.IsManagedAssembly; }).AddSubNodes(new TreeNode[] {
CreateNode("MetaData Header", assembly.NETHeader.MetaDataHeader),
CreateArrayNode("MetaData Streams", (assembly.NETHeader.MetaDataStreams != null ? assembly.NETHeader.MetaDataStreams.ToArray() : null), (obj) => { return ((MetaDataStream)obj).Name; }).AddForEachNode((tag) => { return (tag.Object is TablesHeap ? tag.Object : null); } , (obj) => { return "Tables";}, TreeNodeType.TablesTree)
}),
CreateNode("Hex Editor", new DynamicFileByteProvider(assembly.Image.Stream), TreeNodeType.HexBox),
CreateNode("Disassembler", assembly.Disassembler, TreeNodeType.Disassembler),
});
return assemblyNode;
}