SetThreadContext x64 volatile registers
SetThreadContext x64 volatile registers
我有一个问题与SetThreadContext。我不能改变任何volatile寄存器(表在这里)。
data.context.ContextFlags = CONTEXT_FULL;
SuspendThread(hThread);
GetThreadContext(hThread, &data.context);
...
CONTEXT* ctx = &data.context;
ctx->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
ctx->Rax = (DWORD64)0x1000;
ctx->Rcx = (DWORD64)-1;
ctx->Rip = (DWORD64)allocatedMemory;
ctx->R10 = (DWORD64)0x12345678;
ctx->Rbp = (DWORD64)0xFFFFFFFF;
SetThreadContext(hThread, ctx);
ResumeThread(hThread);
代码改变了Rip和Rbp寄存器,因为它们是非易失性的。GetLastError返回0。以THREAD_SET_CONTEXT | THREAD_GET_CONTEXT | THREAD_SUSPEND_RESUME | THREAD_SET_INFORMATION权限打开的线程。
为什么我不能改变易失性寄存器在x64应用程序?在x86应用程序中,我可以更改任何寄存器(这与volatile与否无关)。
注:是的,我试图调用SetThreadContext与ctx->ContextFlags = CONTEXT_FULL;
在64位windows上,SetThreadContext只设置非易失性寄存器。(参见WRK中/base/ntos/ps/amd64/psctxamd64.c中的PspGetSetContextInternal) 1
可设置的寄存器有:Rbx、Rsp、Rbp、Rsi、Rdi、R12-R15、Xmm6-Xmm15。
相关文章:
- 在一个读写器队列中,我可以用volatile替换原子吗
- c++ visual studio 64bit | save registers value
- GCC 8 无法编译make_shared<volatile int>()
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 如何使用"asm volatile"编写 btr 指令
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`
- volatile, std::sig_atomic_t, and atomic_signal_fence
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- 了解C++中的'volatile'关键字
- 错误 C2678:二进制"+":未找到采用类型 'volatile A' 的左侧操作数的运算符(或者没有可接受的转换)
- 为什么GCC在将未初始化的volatile指针强制转换为"void"时发出警告
- reinterpret_cast<volatile uint8_t*>(37)"不是常量表达式
- C++:为什么volatile访问需要排序
- C++合成的move构造函数如何受到volatile和虚拟成员的影响
- C++11是否允许(不要求)volatile关键字的发布/获取语义
- 什么是类型*volatile*name=value
- Can编译器有时会缓存声明为volatile的变量
- SetThreadContext x64 volatile registers