// 循环依次读出SECTION数据到映象中的虚拟地址处
for (nIndex = 0, psecHeader = m_psecHeader; nIndex < nSectionNum; ++ nIndex, ++ psecHeader)
{
nRawDataSize = psecHeader->SizeOfRawData;
nRawDataOffset = psecHeader->PointerToRawData;
nVirtualAddress = psecHeader->VirtualAddress;
nVirtualSize = psecHeader->Misc.VirtualSize;
// 定位到SECTION数据起始处
SetFilePointer(hFile, nRawDataOffset, NULL, FILE_BEGIN);
// 读SECTION数据到映象中
ReadFile(hFile, &m_pImageBase[nVirtualAddress], nRawDataSize,&NumberOfBytesRW, NULL); // &m_pImageBase[nVirtualAddress] 还是指向段的VirtualAddress的地方, 只是变了种形式
if(IsDelShare)//设置区块共享 属性
psecHeader->Characteristics = psecHeader->Characteristics & ~IMAGE_SCN_MEM_SHARED;
}
psecHeader -- ; // 上面的循环结束后 psecHeader指向了 最后个段表的后一个字节,然后减一个结构大小,回到了 最后一个段表 首地址
// 修正可能存在的ImageSize没有对齐的情况
m_pntHeaders->OptionalHeader.SizeOfImage = psecHeader->VirtualAddress + psecHeader->Misc.VirtualSize; //最后个段内存地址+ 段大小 赋值给 内存映像大小
//***********额外数据读取********************/
/*保存地址:MapOfSData */
/*大小:nMapOfSDataSize */
/********************************************/
if(IsSaveSData)
{
nMapOfSDataSize=nFileSize - (psecHeader->PointerToRawData + psecHeader->SizeOfRawData); // 判断是否有额外数据, nMapOfSDataSize为长度
if(nMapOfSDataSize>0) // 一般来说 文件尺寸= 末段文件偏移+末段文件大小,但我们复制到内存的时候 是根据段开头 与 段大小 对齐放到 内存的
{ //就是说忽略了 不属于任何段 的内容,所以产生 文件尺寸不相等
MapOfSData = new char[nMapOfSDataSize];
memset(MapOfSData , 0, nMapOfSDataSize);
ReadFile(hFile, MapOfSData, nMapOfSDataSize,&NumberOfBytesRW, NULL);
// 问题就在ReadFile这里,在上面一个循环中,文件指针指向了 最后一个段的 首地址,这里就将 额外数据空间 复制过来,实际复制的是 最后一个段的内容呀?
// 我觉得 既然是对 额外数据空间 的内容进行处理,那么应该是 检查一个段的 文件偏移 是否等于 前一个段的 文件偏移PointerOfRawData+ 段文件大小RawDataSize,多余的部分就是 额外数据了,而本书的例子 让我完全看不懂头脑
AddLine(hDlg,"额外数据读取完毕.");
}
else
{
AddLine(hDlg,"没有额外数据.");
}
}
CloseHandle(hFile);
AddLine(hDlg,"文件读入完成.");
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课