AtomicEditor.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. using System.IO;
  3. using System.Diagnostics;
  4. using System.Collections.Generic;
  5. using System.Collections.Immutable;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Reflection.Metadata;
  9. using System.Reflection.PortableExecutable;
  10. using System.Reflection.Metadata.Ecma335;
  11. using System.Text;
  12. using AtomicEngine;
  13. using File = System.IO.File;
  14. namespace AtomicEditor
  15. {
  16. class AssemblyInspector
  17. {
  18. public static bool ParseEnum(TypeDefinition enumTypeDef, PEReader peFile, MetadataReader metaReader)
  19. {
  20. // TODO: verify that int32 is the enums storage type for constant read below
  21. var fields = enumTypeDef.GetFields ();
  22. foreach (var fieldHandle in fields) {
  23. var inspectorField = new InspectorField ();
  24. var fieldDef = metaReader.GetFieldDefinition (fieldHandle);
  25. if ( (fieldDef.Attributes & FieldAttributes.HasDefault) != 0)
  26. {
  27. var constantHandle = fieldDef.GetDefaultValue();
  28. var constant = metaReader.GetConstant(constantHandle);
  29. BlobReader constantReader = metaReader.GetBlobReader (constant.Value);
  30. Console.WriteLine("{0} {1}", metaReader.GetString(fieldDef.Name), constantReader.ReadInt32());
  31. }
  32. }
  33. return true;
  34. }
  35. public static void InspectAssembly (String pathToAssembly)
  36. {
  37. try {
  38. using (var stream = File.OpenRead (pathToAssembly))
  39. using (var peFile = new PEReader (stream)) {
  40. var reader = peFile.GetMetadataReader ();
  41. foreach (var handle in reader.TypeDefinitions)
  42. {
  43. var typeDef = reader.GetTypeDefinition(handle);
  44. var baseTypeHandle = typeDef.BaseType;
  45. if (baseTypeHandle.Kind == HandleKind.TypeReference)
  46. {
  47. var typeRef = reader.GetTypeReference((TypeReferenceHandle)baseTypeHandle);
  48. if (reader.GetString(typeRef.Name) == "Enum")
  49. {
  50. ParseEnum(typeDef, peFile, reader);
  51. }
  52. // TODO: validate assembly of CSComponent typeref
  53. if (reader.GetString(typeRef.Name) != "CSComponent")
  54. continue;
  55. var inspector = new CSComponentInspector(typeDef, peFile, reader);
  56. inspector.Inspect();
  57. }
  58. }
  59. //uint size, packingSize;
  60. //bool hasLayout = entry.GetTypeLayout(out size, out packingSize);
  61. /*
  62. Console.WriteLine(reader.GetString(entry.Name));
  63. var fields = entry.GetFields();
  64. foreach (var fieldHandle in fields)
  65. {
  66. // FieldDefinitionHandle
  67. var fieldDef = reader.GetFieldDefinition(fieldHandle);
  68. Console.WriteLine("Field! {0}", reader.GetString(fieldDef.Name));
  69. }
  70. var methods = entry.GetMethods();
  71. foreach (var methodHandle in methods)
  72. {
  73. // FieldDefinitionHandle
  74. var methodDef = reader.GetMethodDefinition(methodHandle);
  75. if (reader.GetString(methodDef.Name) == ".ctor")
  76. {
  77. Console.WriteLine("Dumping ctor");
  78. var body = peFile.GetMethodBody(methodDef.RelativeVirtualAddress);
  79. /*
  80. var value = CSComponentInspector.Instance.DumpMethod(
  81. reader,
  82. entry,
  83. body.MaxStack,
  84. body.GetILContent(),
  85. ImmutableArray.Create<CSComponentInspector.LocalInfo>(), // TODO
  86. ImmutableArray.Create<CSComponentInspector.HandlerSpan>());
  87. Console.WriteLine("IL: \n{0}", value);
  88. */
  89. /*
  90. }
  91. }
  92. }
  93. */
  94. }
  95. } catch (Exception ex) {
  96. Console.WriteLine (ex.Message);
  97. }
  98. }
  99. }
  100. }