ENGLISH page is here.
GET DinopSearchBar
サイト内検索:
HOME
VC++ TIPS
ダウンロード
DinopExifReader
DinopSearchBar
DinopSearchBar mini
DinopTabbingBar
for Firefox
大阪湾の生き物
甲子園浜の自然
甲子園浜の干潟
甲子園浜の水中
甲子園浜の野鳥
近畿の山々
植物図鑑
箕面マップ
水中機材
カメラ
ランキング
望遠鏡の世界
顕微鏡の世界
Googleのすべて
GoogleマップAPI
ニュース
読んだ本
日記
変な料理の作り方
遺伝子操作
論文紹介
デイトレード
自動売買でFX
ネットで小遣い稼ぎ
Solaris
電子工作
その他
問い合わせ
VC++用コード集
大阪湾の生き物
水中用機材
since:2000/11/15
dinopcom@gmail.com
www.dinop.comは
だいのっぷ・どっと・こむ
と読んでください。







« クイックソート関数の改良 | メイン | JPEG画像ファイルの読み込み(IDGライブラリ使用) »

MSRの読み込み(Win9x)




 ・使い方

 これでMSRのレジスタ0x2aが読み込まれる。
 このサンプルはCPUがMSRに対応しているかどうか判断していない。CPUIDを実行することで判別してから実行することが好ましい。

#include "Msr.h"

void	OnButton1() 
{
	DWORD	dwEAX;
	DWORD	dwEDX;
	CMsr	cMsr;
	CString	str;

	cMsr.ReadMSR(0x2a,&dwEAX,&dwEDX);

	str.Format("%X %X",dwEAX,dwEDX)
	AfxMessageBox(str);
}


 ・サンプル
class CMsr  
{
	#pragma pack(1)

	struct GDT_DESCRIPTOR
	{
		WORD Limit_0_15;
		WORD Base_0_15;
		BYTE Base_16_23;
		BYTE Type         : 4;
		BYTE System       : 1;
		BYTE DPL          : 2;
		BYTE Present      : 1;
		BYTE Limit_16_19  : 4;
		BYTE Available    : 1;
		BYTE Reserved     : 1;
		BYTE D_B          : 1;
		BYTE Granularity  : 1;
		BYTE Base_24_31;
	};

	struct CALLGATE_DESCRIPTOR
	{
		WORD Offset_0_15;
		WORD Selector;
		WORD ParamCount   : 5;
		WORD Unused       : 3;
		WORD Type         : 4;
		WORD System       : 1;
		WORD DPL          : 2;
		WORD Present      : 1;
		WORD Offset_16_31;
	};

	struct GDTR
	{
		WORD wGDTLimit;
		DWORD dwGDTBase;
	};
	#pragma pack()

	static	void	_RdMsr();

	bool	CallRing0(PVOID pvRing0FuncAddr, DWORD* lpdwEAX, DWORD* lpdwEBX, DWORD* lpdwECX, DWORD* lpdwEDX);

public:
	CMsr();
	virtual ~CMsr();

	bool  ReadMSR(DWORD dwAddr, DWORD* lpdwEAX, DWORD* lpdwEDX);

};





CMsr::CMsr()
{
}

CMsr::~CMsr()
{
}


//
//	ECXにrdmsrの読み出しレジスタ
//	EAX、EDXにDWORDへのポインタを入れる
//
//		EAXとEDXの値がそれぞれ[EAX]と[EDX]に返る
//
//
__declspec(naked) void CMsr::_RdMsr()
{
	_asm
	{
		push	eax
		push	edx
		mov		eax, dword ptr [ecx]
		mov		ecx, eax
		rdmsr
		pop		ebx
		mov		[ebx], edx
		pop		ebx
		mov		[ebx], eax
		retf
	}
}


//		for Windows9X
//
// ring 3モードからのring 0コード呼び出し
//
bool	CMsr::CallRing0(PVOID pvRing0FuncAddr, DWORD* lpdwEAX, DWORD* lpdwEBX, DWORD* lpdwECX, DWORD* lpdwEDX)
{

	GDT_DESCRIPTOR*		pGDTDescriptor;
	GDTR				gdtr;
	WORD				wGDTIndex;

	_asm	sgdt	[gdtr]		//Store Global/Interrupt Descriptor Table Register
	pGDTDescriptor = (GDT_DESCRIPTOR*)(gdtr.dwGDTBase + 8);	// Skip the null descriptor

	// Search for a free GDT descriptor
	for (wGDTIndex = 1; wGDTIndex < (gdtr.wGDTLimit / 8); wGDTIndex++)
	{
		if (pGDTDescriptor->Type == 0 && pGDTDescriptor->System == 0 && pGDTDescriptor->DPL == 0 && pGDTDescriptor->Present == 0)
		{
			// Typeなどが0のdescriptorを使用する。
			// selecter=0x28というのがring 0モードに対応する。
			// これで0~4GBまでの物理メモリにアクセスできる

			WORD					CallgateAddr[3];
			CALLGATE_DESCRIPTOR*	pCallgate;

			pCallgate =	(CALLGATE_DESCRIPTOR *) pGDTDescriptor;
			pCallgate->Offset_0_15 = LOWORD(pvRing0FuncAddr);
			pCallgate->Selector = 0x28;
			pCallgate->ParamCount =	0;
			pCallgate->Unused = 0;
			pCallgate->Type = 0xc;
			pCallgate->System = 0;
			pCallgate->DPL = 3;
			pCallgate->Present = 1;
			pCallgate->Offset_16_31 = HIWORD(pvRing0FuncAddr);

			// Prepare the far call parameters
			CallgateAddr[0] = 0x0;
			CallgateAddr[1] = 0x0;
			CallgateAddr[2] = (wGDTIndex << 3) | 3;

			_asm	mov		eax, [lpdwEAX]				// 引数を渡す
			_asm	mov		ebx, [lpdwEBX]				// 引数を渡す
			_asm	mov		ecx, [lpdwECX]				// 引数を渡す
			_asm	mov		edx, [lpdwEDX]				// 引数を渡す
			_asm	call	fword ptr [CallgateAddr]	// ring0の呼び出し

			memset(pGDTDescriptor, 0, 8);		//GDT descriptorの開放

			return true;
		}
		pGDTDescriptor++; 	// Advance to the next GDT descriptor
	}

	return false;
}

//		for Windows9X
//
//			MSR(Model Specific Registers)の読み出し
//
bool  CMsr::ReadMSR(DWORD dwAddr, DWORD* lpdwEAX, DWORD* lpdwEDX)
{
	bool	ret;

	DWORD	dwEAX;
	DWORD	dwEBX;
	DWORD	dwECX;
	DWORD	dwEDX;

	dwECX = dwAddr;
	ret = CallRing0((PVOID)_RdMsr, &dwEAX, &dwEBX, &dwECX, &dwEDX);

	*lpdwEAX = dwEAX;
	*lpdwEDX = dwEDX;

	return	ret;
}








Copyright (c) 1999-2007 issei. All rights reserved. (運営者情報