1

我使用以下代码读取 msr,但运行时崩溃。我不知道为什么。

#include <stdio.h>
#include <stdlib.h>

int main()  
{    
    register long ecx asm("%ecx");
    register long eax asm("%eax");
    register long edx asm("%edx");

    asm("mov %1, %0":"=r"(ecx):"i"(0x1B0));
    asm("rdmsr");
    /*
    asm("xor %1, %0":"+r"(eax):"r"(eax));
    asm("xor %1, %0":"+r"(edx):"r"(edx));
    asm("mov %1, %0":"=r"(eax):"i"(0x01));
    printf("%ld %ld %ld",ecx,eax,edx);
    */
}
4

1 回答 1

1

您可以使用现有的WinRing0.sys(32 位)和WinRing0x64.sys(64 位)驱动程序来允许从用户空间访问 MSR。您可以在此处找到具有开放许可许可证(“WinRing0 许可证”)的副本。

这最终为您提供了从用户空间读取和写入 msr 的 IOCTL。您可以在此处找到一些使用它的 C# 代码,但还有很多其他用户使用它,WinRing0因此不应该缺少示例。

您还可以编写自己的驱动程序,或编译提供类似访问权限的其他几个可用驱动程序之一,但优点WinRin0是它已经签名,个人不再真正可用的过程,当然也不是免费的。

于 2017-08-06T17:52:13.557 回答