TextMap.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. #if !READ_ONLY
  12. using RVA = System.UInt32;
  13. namespace Mono.Cecil.PE {
  14. enum TextSegment {
  15. ImportAddressTable,
  16. CLIHeader,
  17. Code,
  18. Resources,
  19. Data,
  20. StrongNameSignature,
  21. // Metadata
  22. MetadataHeader,
  23. TableHeap,
  24. StringHeap,
  25. UserStringHeap,
  26. GuidHeap,
  27. BlobHeap,
  28. PdbHeap,
  29. // End Metadata
  30. DebugDirectory,
  31. ImportDirectory,
  32. ImportHintNameTable,
  33. StartupStub,
  34. }
  35. sealed class TextMap {
  36. readonly Range [] map = new Range [17 /*Enum.GetValues (typeof (TextSegment)).Length*/];
  37. public void AddMap (TextSegment segment, int length)
  38. {
  39. map [(int) segment] = new Range (GetStart (segment), (uint) length);
  40. }
  41. public void AddMap (TextSegment segment, int length, int align)
  42. {
  43. align--;
  44. AddMap (segment, (length + align) & ~align);
  45. }
  46. public void AddMap (TextSegment segment, Range range)
  47. {
  48. map [(int) segment] = range;
  49. }
  50. public Range GetRange (TextSegment segment)
  51. {
  52. return map [(int) segment];
  53. }
  54. public DataDirectory GetDataDirectory (TextSegment segment)
  55. {
  56. var range = map [(int) segment];
  57. return new DataDirectory (range.Length == 0 ? 0 : range.Start, range.Length);
  58. }
  59. public RVA GetRVA (TextSegment segment)
  60. {
  61. return map [(int) segment].Start;
  62. }
  63. public RVA GetNextRVA (TextSegment segment)
  64. {
  65. var i = (int) segment;
  66. return map [i].Start + map [i].Length;
  67. }
  68. public int GetLength (TextSegment segment)
  69. {
  70. return (int) map [(int) segment].Length;
  71. }
  72. RVA GetStart (TextSegment segment)
  73. {
  74. var index = (int) segment;
  75. return index == 0 ? ImageWriter.text_rva : ComputeStart (index);
  76. }
  77. RVA ComputeStart (int index)
  78. {
  79. index--;
  80. return map [index].Start + map [index].Length;
  81. }
  82. public uint GetLength ()
  83. {
  84. var range = map [(int) TextSegment.StartupStub];
  85. return range.Start - ImageWriter.text_rva + range.Length;
  86. }
  87. }
  88. }
  89. #endif