访问 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的指令都得用这种方法来解决了。 |
相关文章推荐
- 用多种方法访问字符数组元素
- windows下通过VNC图形化访问Ubuntu桌面环境
- 数据访问框架(正在商业应用中的- -)
- MOSS 2010:Visual Studio 2010开发体验(17)——在Silverlight应用程序中访问客户端对象模型
- C# 读取 文件正由另一进程使用,因此该进程无法访问该文件。
- Openssl:构建CA的过程并实现web服务基于https访问的网络架构
- CentOS+Apache+php无法访问redis的解决方法 Redis server went away
- 用有效的网络访问来最优化下载
- ubuntu16.04 mongodb允许远程访问
- JavaWeb拦截器,查看用户是否登录过,未登录禁止访问页面并且跳转到登录页面
- Workbox 3.0 – Web 站点轻松做到离线可访问
- 用C#访问带密码ACCESS数据库(OLEDB连接各种数据库)
- 4种访问web元素的action
- win7隐藏分区的程序访问方法
- 内部类可以访问外部类的属性
- URL访问限制的 配置
- wininet InternetOpenUrlA 设置访问超时
- Samba常用配置及GUEST访问
- 解决SpringMVC 静态资源无法访问