TextMap.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //
  2. // Author:
  3. // Jb Evain (jbevain@gmail.com)
  4. //
  5. // Copyright (c) 2008 - 2015 Jb Evain
  6. // Copyright (c) 2008 - 2011 Novell, Inc.
  7. //
  8. // Licensed under the MIT/X11 license.
  9. //
  10. using System;
  11. using RVA = System.UInt32;
  12. namespace ILRuntime.Mono.Cecil.PE {
  13. enum TextSegment {
  14. ImportAddressTable,
  15. CLIHeader,
  16. Code,
  17. Resources,
  18. Data,
  19. StrongNameSignature,
  20. // Metadata
  21. MetadataHeader,
  22. TableHeap,
  23. StringHeap,
  24. UserStringHeap,
  25. GuidHeap,
  26. BlobHeap,
  27. PdbHeap,
  28. // End Metadata
  29. DebugDirectory,
  30. ImportDirectory,
  31. ImportHintNameTable,
  32. StartupStub,
  33. }
  34. sealed class TextMap {
  35. readonly Range [] map = new Range [17 /*Enum.GetValues (typeof (TextSegment)).Length*/];
  36. public void AddMap (TextSegment segment, int length)
  37. {
  38. map [(int) segment] = new Range (GetStart (segment), (uint) length);
  39. }
  40. public void AddMap (TextSegment segment, int length, int align)
  41. {
  42. align--;
  43. AddMap (segment, (length + align) & ~align);
  44. }
  45. public void AddMap (TextSegment segment, Range range)
  46. {
  47. map [(int) segment] = range;
  48. }
  49. public Range GetRange (TextSegment segment)
  50. {
  51. return map [(int) segment];
  52. }
  53. public DataDirectory GetDataDirectory (TextSegment segment)
  54. {
  55. var range = map [(int) segment];
  56. return new DataDirectory (range.Length == 0 ? 0 : range.Start, range.Length);
  57. }
  58. public RVA GetRVA (TextSegment segment)
  59. {
  60. return map [(int) segment].Start;
  61. }
  62. public RVA GetNextRVA (TextSegment segment)
  63. {
  64. var i = (int) segment;
  65. return map [i].Start + map [i].Length;
  66. }
  67. public int GetLength (TextSegment segment)
  68. {
  69. return (int) map [(int) segment].Length;
  70. }
  71. RVA GetStart (TextSegment segment)
  72. {
  73. var index = (int) segment;
  74. return index == 0 ? ImageWriter.text_rva : ComputeStart (index);
  75. }
  76. RVA ComputeStart (int index)
  77. {
  78. index--;
  79. return map [index].Start + map [index].Length;
  80. }
  81. public uint GetLength ()
  82. {
  83. var range = map [(int) TextSegment.StartupStub];
  84. return range.Start - ImageWriter.text_rva + range.Length;
  85. }
  86. }
  87. }