/// <summary> /// Gets the linear address of a specified segment. /// </summary> /// <param name="segment">The segment to get.</param> /// <param name="context">The context.</param> /// <returns>A <see cref="IntPtr" /> pointer corresponding to the linear address of the segment.</returns> /// <exception cref="InvalidEnumArgumentException">segment</exception> public IntPtr GetRealSegmentAddress(SegmentRegisters segment, ref ThreadContext32 context) { // Get a selector entry for the segment LdtEntry entry; switch (segment) { case SegmentRegisters.Cs: entry = ThreadCore.GetThreadSelectorEntry(Handle, context.SegCs); break; case SegmentRegisters.Ds: entry = ThreadCore.GetThreadSelectorEntry(Handle, context.SegDs); break; case SegmentRegisters.Es: entry = ThreadCore.GetThreadSelectorEntry(Handle, context.SegEs); break; case SegmentRegisters.Fs: entry = ThreadCore.GetThreadSelectorEntry(Handle, context.SegFs); break; case SegmentRegisters.Gs: entry = ThreadCore.GetThreadSelectorEntry(Handle, context.SegGs); break; case SegmentRegisters.Ss: entry = ThreadCore.GetThreadSelectorEntry(Handle, context.SegSs); break; default: throw new InvalidEnumArgumentException(nameof(segment), (int)segment, typeof(SegmentRegisters)); } // Compute the linear address return(new IntPtr(entry.BaseLow | (entry.BaseMid << 16) | (entry.BaseHi << 24))); }
public static extern bool GetThreadContext(IntPtr hThread, ref ThreadContext32 lpContext);
public static extern bool SetThreadContext(IntPtr hThread, [MarshalAs(UnmanagedType.Struct)] ref ThreadContext32 lpContext);
internal void InitializeForWalk() { Context = Thread.GetContext(); }