-
-
[求助]问个DLL加载到内存中的总大小问题
-
发表于: 2017-4-6 15:38 3198
-
本人小白一个,最近需要用到内存加载dll.在网上找了些资料看了看,关于下面这段代码有几个疑问,还望大家指点一二。
//计算对齐边界
int CMemLoadDll::GetAlignedSize(int nOrigin, int nAlignment)
{
//这里-1个字节是为了处理PE头大小刚好=nAlignment整数倍的情况
return (nOrigin + nAlignment - 1) / nAlignment * nAlignment;
}
//计算整个dll映像文件的尺寸
int CMemLoadDll::CalcTotalImageSize()
{
int nSize = 0;
if (m_pNTHeader == NULL)
{
return 0;
}
int nAlign = m_pNTHeader->OptionalHeader.SectionAlignment; //段对齐字节数
// 计算所有头的尺寸。包括dos, coff, pe头 和 段表的大小
nSize = GetAlignedSize(m_pNTHeader->OptionalHeader.SizeOfHeaders, nAlign);
// 计算所有节的大小
for (int i=0; i < m_pNTHeader->FileHeader.NumberOfSections; ++i)
{
//得到该节的大小
int nCodeSize = m_pSectionHeader[i].Misc.VirtualSize ;
int nLoadSize = m_pSectionHeader[i].SizeOfRawData;
int nMaxSize = (nLoadSize > nCodeSize) ? (nLoadSize) : (nCodeSize);
int nSectionSize = GetAlignedSize(m_pSectionHeader[i].VirtualAddress + nMaxSize, nAlign);
if (nSize < nSectionSize)
{
nSize = nSectionSize; //Use the Max;
}
}
return nSize;
}
以上的代码是在网上找的计算DLL加载到内存中的镜像的大小。
疑问一, IMAGE_OPTIONAL_HEADER32结构中的 SizeOfImage 这一项表示PE文件加载到内存中的总大小,为什么不用这一项而是采用计算的方式。
疑问二, for (int i=0; i < m_pNTHeader->FileHeader.NumberOfSections; ++i) 这个计算节大小的for语句,是否可以直接改成找到最后一个节的位置,
也就是说直接比较每个节的 VirtualAddress 值,取最大的,这个值加上本节按照SectionAlignment对其后的大小,这样得出的值不就是整个镜像文件的大小吗?而没必要把每个节的大小计算出来,按我的理解上面代码处理有点多此一举,毕竟我是个小白,对PE理解不深,如果非要按照上面的代码处理的话,想问问大家我有什么地方没考虑周全。谢谢!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课