// 找出最大的节的长度,此节一般是代码所在的节(.text 节)
//HdrLen是PE中从文件头到块的长度,section是PE中第一个块的首地址
DWORD MaxLen = HdrLen; 
int ii=0; for (i = 0;i<(DWORD)pNTHeader->FileHeader.NumberOfSections;i++)
{
if(MaxLen < section[i].VirtualAddress + section[i].SizeOfRawData) 
{
MaxLen = section[i].VirtualAddress + section[i].SizeOfRawData; 
}
}
section[i].VirtualAddress + section[i].SizeOfRawData是表示块的长度么?为什么用加号?并且是VirtualAddress,SizeOfRawData的和?直接用VirtualSize不就是该块的真实长度么?

解决方案 »

  1.   

    如果把DLL以资源形式加入到内存中,PE中IMAGE_OPTIONAL_HEADER32和IMAGE_SECTION_HEADER中的地址数据项会有什么变化?
      

  2.   

    自己结贴
    一个 DLL 作为资源文件放到 EXE 文件中,PE中IMAGE_OPTIONAL_HEADER32和IMAGE_SECTION_HEADER中的关于地址的数据项不会变化。
    上面的代码的目的是程序自装载PE时求所要分配的内存。
      

  3.   

    自装载时的大小通过VirtualSize得不到吗?
      

  4.   

    VirtualSize是块对齐前的长度,没有经过SectionAlignment对齐