|
MSDNに「カーネルモード・ドライバでも構造化例外処理が使える」とあったので、SysinfoのReadMSR()で試してみました。
【URI】(長いので、途中で改行を入れています。)
http://msdn.microsoft.com/library/default.asp
?url=/library/en-us/kmarch/hh/kmarch/Other_f7259c51-1557-42e6-8264-ac8dae0177e3.xml.asp
【pcidebug.cの修正(サンプル)】
NTSTATUS
ReadMSR( ULONG IoctlCode,
void *lpInBuffer,
ULONG nInBufferSize,
void *lpOutBuffer,
ULONG nOutBufferSize,
ULONG_PTR* lpBytesReturned)
{
ULONG ulECX = *(ULONG*)lpInBuffer;
ULONG ulEAX = 0;
ULONG ulEDX = 0;
#ifndef _AMD64
try{
_asm{
mov ecx,ulECX
rdmsr
mov ulEAX,eax
mov ulEDX,edx
}
} except (EXCEPTION_EXECUTE_HANDLER) {
*lpBytesReturned = 0;
return STATUS_UNSUCCESSFUL;
}
memcpy((PULONG)lpOutBuffer,&ulEAX,4);
memcpy((PULONG)lpOutBuffer+1,&ulEDX,4);
*lpBytesReturned = 8;
return STATUS_SUCCESS;
#else
try{
ULONG64 data = __readmsr(ulECX);
} except (EXCEPTION_EXECUTE_HANDLER) {
*lpBytesReturned = 0;
return STATUS_UNSUCCESSFUL;
}
memcpy((PULONG)lpOutBuffer,&data,8);
*lpBytesReturned = 8;
return STATUS_SUCCESS;
#endif
}
32ビット(WinXP)で試してみたところ、うまくいきました。未定義のMSRに対してRDMSRしてもOSが落ちなくなります。
つきましては、対応をご検討方くださいますようお願いいたします。
(64ビットについても試そうとしたのですが、DDK(3790.1289)でx64用のビルドをしようとすると大量のエラーが出てしまい断念しました。)
OSが落ちる心配から解放されればMSR Editorでもっと気軽にRDMSR/WRMSRできるようになり、あわよくば(インテル秘蔵の)隠しMSR発見、Pentium4の倍率可変化への一歩になるのではと...
P.S. リンクありがとうございました。
|
|