您的位置:首页 > 职场人生

访问 CR4寄存器

2010-05-12 17:46 639 查看
CR4寄存器

void NTAPI HookInt_0D()

{

// 设置CR4寄存器的Time Stamp Disable位,ring3执行rdtsc会引发#GP(0)

// 接管0D中断

PINT_VECTOR pInt0D = 0;

//_asm int 3

__asm

{

cli

//

rdtsc

mov ts.Low,eax // 设置初始值

mov ts.High,edx

lea eax, idtr // load offset into EAX

sidt [eax]

_emit 0x0F // mov eax,cr4,Set TSD

_emit 0x20

_emit 0xE0

or eax,0x4

_emit 0x0F // mov cr4,eax

_emit 0x22

_emit 0xE0

}

//

pInt0D = (PINT_VECTOR)(idtr.Base + 0x0D * 8);

oldInt_0D = (((ULONG)(pInt0D->HighOffset))<<0x10) | ((ULONG)(pInt0D->LowOffset));

pInt0D->HighOffset = (USHORT)(((ULONG)(NewInt0D) >> 0x10) & 0xFFFF);

pInt0D->LowOffset = (USHORT)(NewInt0D);

_asm sti

}

今天写一个驱动时需要访问cr4寄存器,于是我写了如下代码:

ULONG regCR4;
__asm
{
mov eax,cr4
mov regCR4,eax
}


用2003 SP1 DDK编译时却发生错误:error C2094: label ‘cr4′ was undefined

咦?怎么提示cr4未定义?把cr4换成cr3又能正确编译,奇怪……

Google了一下,在国外的网站上找到了解决方法,如下:

ULONG regCR4;
__asm
{
_emit 0x0F
_emit 0x20
_emit 0xE0
mov regCR4,eax
}


代码中用_emit关键字定义了3个字节的数据0F 20 E0,这3个字节是mov eax,cr4的机器码。测试了一下编译和运行都没问题。到驱网上问了一下,貌似也没有其它方便一点的解决方法,看来以后所有包含cr4的指令都得用这种方法来解决了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 ASM