我正在尝试使用内联汇编从 cpu 控制寄存器读取数据。我最初的目标是 x86-64。我对 c 或汇编不太熟悉,但我设法进行了一个非常简单的尝试,如下所示:
#include <stdio.h>
#include <stdint.h>
int main() {
uint64_t result;
asm ("movq %%cr4, %0;"
: "=r" (result) ::
);
printf("result: %d \n", result);
return 0;
}
这可以编译,但会在 gdb 中引发运行时错误:
Thread 1 received signal SIGILL, Illegal instruction.
main () at main.c:6
6 asm ("movq %%cr4, %0;"
我认为 c/汇编是正确的,因为我能够从其他寄存器中提取值。我认为该错误是由于我没有在内核模式下运行(根据我所读到的内容),但我不完全理解这意味着什么,并且由于我对 c/汇编的理解有限,我不知道当然我应该现在就使用内核模式。
在内核模式之外还有其他方法可以做到这一点吗?例如,此信息是否可以通过某处公开的 dll 调用获得。
我欢迎任何关于在内核模式下运行应用程序的影响的评论。
Update:这个答案不适合 CR 寄存器,根据这条评论 https://stackoverflow.com/questions/46459328/read-the-value-of-a-cpu-control-register-from-admin-privilege-app-windows/46461572?noredirect=1#comment91333791_46461572.
您正在寻找的是所谓的“WinRing0.sys”驱动程序,它公开了一个 API,允许您从用户模式读取仅可用于内核(环 0)代码的所有各种有趣的 MSR。
这是一个开源组件,但最重要的是,有人已经付费签署了驱动程序,以便可以将其加载到 Windows 中(作为个人,即使您愿意付费,实际上也不可能签署当前的 Windows 驱动程序) 。您可以找到 32 位和 64 位 (WinRing0x64.sys) 二进制文件here https://github.com/openhardwaremonitor/openhardwaremonitor/tree/master/Hardware.
更多详细信息请参阅这个答案 https://stackoverflow.com/a/45494255/149138- 问题在于对性能计数器进行编程,但所需的访问权限是相同的,并且 WinRing0.sys 将适用于这两种用例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)