示例#1
0
        /// <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)));
        }
示例#2
0
 public static extern bool GetThreadContext(IntPtr hThread, ref ThreadContext32 lpContext);
示例#3
0
 public static extern bool SetThreadContext(IntPtr hThread, [MarshalAs(UnmanagedType.Struct)] ref ThreadContext32 lpContext);
示例#4
0
 internal void InitializeForWalk()
 {
     Context = Thread.GetContext();
 }