dispro 2014-06-29 06:32 采纳率: 0%
浏览 707

再次被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类型的啊,为什么还要显示的转换下?

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-03-13 13:01
    关注

    该回答引用ChatGPT

    在 C++ 中,指针是一种数据类型,它包含一个地址,该地址指向内存中的另一个位置。指针的数据类型与指向的对象类型相关联,例如,一个指向 DWORD 类型的指针可以被定义为 DWORD*。


    在上面的代码中,pCurrentModelDosHeader 是一个指向 IMAGE_DOS_HEADER 结构体的指针。该结构体中包含一个成员 e_lfanew,其数据类型为 LONG,因此在表达式 pCurrentModelDosHeader->e_lfanew 中,e_lfanew 的类型为 LONG。另一方面,DWORD 是一个 32 位的无符号整数类型。在这种情况下,使用显式类型转换将 e_lfanew 转换为 DWORD 类型是合理的。


    对于 shl ecx, 6 这一行代码,它将 ecx 寄存器的值向左移动 6 位,相当于将 ecx 乘以 64。这是因为在 IMAGE_DOS_HEADER 结构体中,e_lfanew 成员表示从结构体开头到 IMAGE_NT_HEADERS32 结构体的偏移量,该结构体的大小为 64 个字节。因此,将 e_lfanew 乘以 64 可以得到 IMAGE_NT_HEADERS32 结构体的地址。


    然而,如果在这里使用指针类型转换,则会发生指针算术。在这种情况下,指针加上一个整数值会导致指针指向另一个内存位置,而不是将该值视为指针的偏移量。因此,应该使用 DWORD 类型进行指针算术,而不是指针类型转换。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog