2017-08-04 32 views
1

我使用以下代碼讀取msr,但運行時崩潰。我不知道爲什麼。我使用內聯彙編代碼編寫c代碼來讀取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); 
    */ 
} 
+0

rdmsr的[docs](http://www.felixcloutier.com/x86/RDMSR.html)表示'該指令必須在特權級別0執行。換句話說:您必須是設備驅動程序或內核的一部分。 –

+0

這意味着我無法通過我的代碼修改msr值?但有一個名爲RWEverything的工具可以做到這一點,你知道它是如何工作的嗎?感謝您的回答! –

+0

[從C/C++代碼執行RDMSR和WRMSR指令]可能重複(https://stackoverflow.com/questions/5875778/execute-rdmsr-and-wrmsr-instructions-from-cc-code) –

回答

1

可以使用現有WinRing0.sys(32位)和WinRing0x64.sys(64位)的驅動程序,以允許從用戶空間MSR訪問。您可以找到帶有開放和許可許可證(「WinRing0許可證」)的副本here

這最終爲您提供IOCTLs來從用戶空間讀取和寫入msrs。你可以找到一些使用它的C#代碼here,但有很多WinRing0的其他用戶,所以應該不缺少例子。

您也可以編寫自己的驅動程序,或編譯提供類似訪問的其他幾種可用驅動程序之一,但WinRin0的優勢在於它已經簽名,個人不再可以真正使用該進程,並且當然不會免費。