2017-08-04 2 views
1

msrを読み取るのに次のコードを使用しますが、実行中にクラッシュしました。どうしてか分かりません。msrを読み取るためにインラインアセンブリコードを使用してCコードを書き込みましたが、失敗しました

#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の値を変更できないことを意味しますか?しかし、RWEという名前のツールがあります。どのように動作するのか知っていますか?ご回答有難うございます! –

+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があります。

これは最終的に、ユーザー空間からのmsrsの読み取りと書き込みをIOCTLに提供します。 hereを使用するいくつかのC#コードを見つけることができますが、WinRing0という他のユーザーがたくさんいるので、例が不足している必要はありません。

また、類似のアクセスを提供する他のいくつかの利用可能なドライバの1つをコンパイルすることもできますが、WinRin0の利点は、すでに署名されており、 。

関連する問題