public static ulong GetInstructionPointer(this ProcessThread thread, bool wow64Process) { var threadHandle = thread.GetNativeHandle(NT.ThreadAccess.GET_CONTEXT); ulong instructionPointer = 0; if (wow64Process) { NT.CONTEXT ctx = new NT.CONTEXT() { ContextFlags = NT.CONTEXT_FLAGS.CONTEXT_CONTROL }; NT.GetThreadContext(threadHandle, ref ctx); instructionPointer = ctx.Eip; } else { NT.CONTEXT64 ctx = new NT.CONTEXT64() { ContextFlags = NT.CONTEXT_FLAGS.CONTEXT_CONTROL }; NT.GetThreadContext(threadHandle, ref ctx); instructionPointer = ctx.Rip; } NT.CloseHandle(threadHandle); return(instructionPointer); }
public static ulong GetRealStartAddress(this ProcessThread thread) { var handle = thread.GetNativeHandle(NT.ThreadAccess.QUERY_INFORMATION); ulong startAddress = 0; NT.NtQueryInformationThread((IntPtr)handle, NT.ThreadInfoClass.ThreadQuerySetWin32StartAddress, new IntPtr(&startAddress), 8, IntPtr.Zero); NT.CloseHandle(handle); return(startAddress); }