c c++-再次被c++诡异的语法打败

问题描述

再次被c++诡异的语法打败

下面是问题的关键代码
IMAGE_DOS_HEADER* pCurrentModelDosHeader =(IMAGE_DOS_HEADER*) ::GetModuleHandle(NULL);
IMAGE_NT_HEADERS32* pCurrentModelNtHeader = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + pCurrentModelDosHeader);//出错
IMAGE_NT_HEADERS32* pCurrentModelNtHeader2 = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + (DWORD)pCurrentModelDosHeader);//正确
WORD MagicNumber= pCurrentModelNtHeader2->OptionalHeader.Magic;

///////////////////////////////////////


反汇编代码对比
IMAGE_NT_HEADERS32* pCurrentModelNtHeader = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + pCurrentModelDosHeader);//出错
012B7544 mov eax,dword ptr [pCurrentModelDosHeader]

012B7547 mov ecx,dword ptr [eax+3Ch]

012B754A shl ecx,6

012B754D add ecx,dword ptr [pCurrentModelDosHeader]

012B7550 mov dword ptr [pCurrentModelNtHeader],ecx

IMAGE_NT_HEADERS32* pCurrentModelNtHeader2 = (IMAGE_NT_HEADERS32*)(pCurrentModelDosHeader->e_lfanew + (DWORD)pCurrentModelDosHeader);//正确
012B7553 mov eax,dword ptr [pCurrentModelDosHeader]

012B7556 mov ecx,dword ptr [eax+3Ch]

012B7559 add ecx,dword ptr [pCurrentModelDosHeader]

012B755C mov dword ptr [pCurrentModelNtHeader2],ecx
多出的这句shl ecx,6 把原先结构体成员e_lfanew的偏移乘上了64导致错误结果,可是指针本身应该就是dword类型的啊,为什么还要显示的转换下?

时间: 2025-01-07 01:26:39

c c++-再次被c++诡异的语法打败的相关文章

JavaScript 姿势提升简略

本文讲的是JavaScript 姿势提升简略, JavaScript 是一门入门容易,但是相当难以精通的语言.可现今一些文章总假设你已经精通了它. 我从 1995 年 JavaScript 还以 LiveScript 名字出现的时候就开始用它了,但后来逐渐从前端开发撤回服务器的安全怀抱中,直到五年前才重拾.很高兴看到如今的浏览器更加的强大和易于调试.但 JavaScript 已经演变得越来越复杂且难以精通了.不过最近我终于得出结论,我并不需要_精通_ Javascript,只需要比以前更进一步就

ASP技巧之定义数组方法

技巧|数组 [注意:本文提到的数组是Visual Basic中数组的定义,对asp编程有一定的参考价值!] 数组是有序数据的集合.数组中的元素可以不属于同一个数据类型.用一个统一的数组名和下标来唯一地确定数组中的元素,更改其中一个元素并不会影响其它元素.数组的下标是有界的,分为下界和上界.数组可以用Dim.Private.Public或Static来声明,它们的语法格式相同.下面只介绍用Dim声明数组的方法. 1.数组的定义与声明 数组的定义语法如下: Dim 数组名( [[下标下界 To ]

如何安全地使用电子邮件

虽然电子邮件的使用几乎遍及全球,但并非人人都懂得如何正确使用.以下的使用指南,内容将涵盖邮件病毒.垃圾邮件.网络钓鱼保护.邮件礼节,以及如何处理附件等方面.这些内容能够帮助你捍卫企业利益,也可以帮助你的用户学会如何安全可靠地操作邮件.如今,电子邮件已经是人们工作中不可缺的重要工具.但许多用户不会正确地使用它,他们草率的对待安全隐患,占用过多的带宽,甚至让邮件礼节变得没有约束.这里要给出一些基本的电子邮件使用指导,帮助你的用户进行可靠的电子邮件操作,并保护你企业的安全. 1.阻止病毒发作和垃圾邮件

对语言之争的看法

又看到语言之争,各种吐嘈,唉-- 说说我的看法,我觉得一门编程语言用到极致就行了,何必纠结语法层面的差异? 因为历史原因,我用.NET比较多,当然Windows编程.Java编程.Linux/Unix编程.C/C++编程.Python,JavaScript等动态语言甚至是汇编编程我也粗有研究,也测试过一门动态编程语言Python.刨去Visual Studio昂贵的费用(我一开始用的是盗版,当然现在因为Bizspark的关系终于用上正版了--),说实话我还是比较喜欢C#的,做项目的时候,我这个人

《Swift iOS应用开发实战》——导读

前言 苹果公司在2014年6月的WWDC(Worldwide Developers Conference,苹果全球开发者大会)上向公众展现了全新的iOS 8移动操作系统和Yosemite桌面操作系统.作为开发者,大会开幕之前的任何爆料,我都是不会错过的.在大会开幕的前一天,我得知本届大会的宣传标语为:编写代码改变世界(Write the Code. Change the World).历届WWDC的宣传标语都是以全新.卓越.领先.创新.引领等作为关键词,而这次却使用了非常接地气的"编写代码&qu

用Thread替代Timer——简单的多线程处理(一)

工作需要一个动态的窗口,有自动倒计时.后台发送数据.后台打印等功能. 第一版Demo采用了Timer作为后台处理机制核心,代码量少,可读性高.但是实际效果差强人意,特别是多timer阻塞的情况很严重. 总结了一下实际需求和后台事件,决定用Thread代替原有的Timer. 顺便一提,C#的Thread加上语法糖真是甜,原来需要写一大段的代码现在只要一行: Thread t = new Thread(() => void(parameter)); t.IsBackground = true;//设

讨喜的隔离可变性(三)创建角色

正如前面曾经提到过的那样,虽然我们有很多支持角色的类库可供选择,但是在本书中我们将使用Akka.这是一个基于Scala的类库,该类库拥有非常好的性能和可扩展性.并同时支持角色和STM.此外,该类库还可以被用于多种JVM上的语言中.在本章中,我们将注意力集中在Java和Scala身上.而在下一章,我们将会学习如何在其他语言中使用Akka的角色.   图 8‑2 某个角色的生存周期 由于Akka是用Scala实现的,所以在Scala中创建和使用角色非常简单并且更加自然,从Akka API的实现里我们

软件事务内存导论(八)提交和回滚事件

提交和回滚事件 Java的try-catch-finally语法结构不但使我们可以安全地处理异常,还能够在程序抛出异常时选择性地执行一些代码.同样地,我们也可以控制程序在事务成功提交之后去执行某段代码,而当事务回滚时则去执行另一段代码.StmUtils中的deferred()和compensatiing()这两个函数分别提供了上述功能.特别地,在实现事务的过程中,为保证事务能顺利完成,我们通常会加入一些带副作用的逻辑,而deferred()函数则是一个执行所有这部分逻辑的绝佳地点. Java中的

ASP定义数组方法的技巧_应用技巧

数组是有序数据的集合.数组中的元素可以不属于同一个数据类型.用一个统一的数组名和下标来唯一地确定数组中的元素,更改其中一个元素并不会影响其它元素.数组的下标是有界的,分为下界和上界.数组可以用Dim.Private.Public或Static来声明,它们的语法格式相同.下面只介绍用Dim声明数组的方法. 1.数组的定义与声明 数组的定义语法如下: Dim 数组名( [[下标下界 To ] 下标上界] ) [As 数据类型] 例如(假设在当前模块中 数组的缺省下界为0)): ① Dim A(10)