首页
社区
课程
招聘
[己解决]关于第15章,区块合并有出入?
2009-6-2 17:41 5916

[己解决]关于第15章,区块合并有出入?

2009-6-2 17:41
5916
BOOL MergeSection()
{
        UINT                                        nSectionNum = 0;
        PIMAGE_SECTION_HEADER        psecHeader = m_psecHeader;
        UINT                                        nspareSize=NULL;
        UINT                                        nMergeVirtualSize =0;

        try
        {   
                //区块数
                nSectionNum   = m_pntHeaders->FileHeader.NumberOfSections;
                //.code,.rdata,.data,.idata
                for (UINT nIndex = 0; nIndex < nSectionNum; nIndex ++, psecHeader ++)
                {
                        if ((m_psecHeader->Characteristics & IMAGE_SCN_MEM_SHARED) != 0)//共享区块不融合
                                break;               

                        if ((strcmp((char *)psecHeader->Name, ".edata") == 0))
                                break;

                        if ((strcmp((char *)psecHeader->Name, ".rsrc") == 0))
                                break;                       

                        nMergeVirtualSize += psecHeader->Misc.VirtualSize;
                }
                //所有能压缩的区块合并成一个区块
                m_psecHeader->Misc.VirtualSize = nMergeVirtualSize;

                m_pntHeaders->FileHeader.NumberOfSections = nSectionNum - nIndex+1;// 现在的区块数
                //(nIndex+1)*sizeof(IMAGE_SECTION_HEADER)//;剩余区块表的长度
                memcpy(m_psecHeader+1,psecHeader,(nSectionNum - nIndex)*sizeof(IMAGE_SECTION_HEADER));//将剩余的区块移前
               
                nspareSize=(nSectionNum - m_pntHeaders->FileHeader.NumberOfSections)*sizeof(IMAGE_SECTION_HEADER);//多余区块长度
       
//这一句m_psecHeader这就是多合并之后的块,为什么把其清零了,还+nSectionNum - nIndex+1这几个字节?
        memset(m_psecHeader+nSectionNum - nIndex+1,0,nspareSize);

        }
        catch (...)
        {
                return FALSE;
        }
        return TRUE;

}
       
//这一句m_psecHeader这就是多合并之后的块,为什么把其清零了,还+nSectionNum - nIndex+1这几个字节?
       
        memset(m_psecHeader+nSectionNum - nIndex+1,0,nspareSize);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yerong 2009-6-2 20:11
2
0
我知道了,m_psecHeader+nSectionNum - nIndex+1这个是移至空闲区块的首地址。明白了。原来是这样
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
perrych 2011-3-21 19:13
3
0
m_pntHeaders->FileHeader.NumberOfSections = nSectionNum - nIndex+1;// 现在的区块数

这个nIndex在for循环外面了??
难道外层也有定义一个nIndex变量,而且还符合当下的语意?
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xuwenfeng 2011-9-19 20:29
4
0
这个nIndex在for外面确实可用,而且还保留其值,这只在VC6.0里面适用,在高版本的开发环境中编译会通不过,例如VS2010。。。。。
游客
登录 | 注册 方可回帖
返回