访问 CR4寄存器

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,职场,休闲,CR4)