diff --git a/Dalamud/Game/SigScanner.cs b/Dalamud/Game/SigScanner.cs index 1242935ef..8449098a3 100644 --- a/Dalamud/Game/SigScanner.cs +++ b/Dalamud/Game/SigScanner.cs @@ -83,6 +83,21 @@ namespace Dalamud.Game /// public int DataSectionSize { get; private set; } + /// + /// Gets the base address of the .rdata section search area. + /// + public IntPtr RDataSectionBase => new IntPtr(this.SearchBase.ToInt64() + this.RDataSectionOffset); + + /// + /// Gets the offset of the .rdata section from the base of the module. + /// + public long RDataSectionOffset { get; private set; } + + /// + /// Gets the size of the .rdata section. + /// + public int RDataSectionSize { get; private set; } + /// /// Gets the ProcessModule on which the search is performed. /// @@ -126,7 +141,8 @@ namespace Dalamud.Game instrAddr = IntPtr.Add(instrAddr, 1); num = Marshal.ReadInt32(instrAddr) + (long)instrAddr + 4 - bAddr; } - while (!(num >= this.DataSectionOffset && num <= this.DataSectionOffset + this.DataSectionSize)); + while (!(num >= this.DataSectionOffset && num <= this.DataSectionOffset + this.DataSectionSize) + && !(num >= this.RDataSectionOffset && num <= this.RDataSectionOffset + this.RDataSectionSize)); return IntPtr.Add(instrAddr, Marshal.ReadInt32(instrAddr) + 4); } @@ -322,6 +338,10 @@ namespace Dalamud.Game this.DataSectionOffset = Marshal.ReadInt32(sectionCursor, 12); this.DataSectionSize = Marshal.ReadInt32(sectionCursor, 8); break; + case 0x61746164722E: // .rdata + this.RDataSectionOffset = Marshal.ReadInt32(sectionCursor, 12); + this.RDataSectionSize = Marshal.ReadInt32(sectionCursor, 8); + break; } sectionCursor += 40;