永发信息网

如何将导出表的rva转成foa

答案:2  悬赏:40  手机版
解决时间 2021-03-21 02:41
如何将导出表的rva转成foa
最佳答案
/将RVA转换为FOA(可由lpFoa传出FOA、可由lpSection传出节序号,不在节中节序号为-1)
    BOOL RvaToFoa(DWORD dwRva, LPDWORD lpFoa = NULL, LPWORD lpSection = NULL) const;

    //将FOA转换为RVA(可由lpRva传出RVA、可由lpSection传出节序号,不在节中节序号为-1)
    BOOL FoaToRva(DWORD dwFoa, LPDWORD lpRva = NULL, LPWORD lpSection = NULL) const;


BOOL CPeFile::RvaToFoa(DWORD dwRva, LPDWORD lpFoa, LPWORD lpSection) const
{
    assert(IsAttch());
    WORD nSection = m_lpNtHeader->FileHeader.NumberOfSections;
    DWORD dwAlignment = m_lpNtHeader->OptionalHeader.SectionAlignment;
    for (size_t i = 0; i < (size_t)nSection; ++i)
    {
        DWORD dwBegin = m_lpSectionHeader[i].VirtualAddress;
        if (i == 0U && dwRva < dwBegin)
        {
            if (lpFoa)
                *lpFoa = dwRva;
            if (lpSection)
                *lpSection = (WORD)-1;
            return TRUE;
        }
        DWORD dwBlockCount = m_lpSectionHeader[i].SizeOfRawData / dwAlignment;
        dwBlockCount += m_lpSectionHeader[i].SizeOfRawData % dwAlignment ? 1 : 0;
        if (dwRva >= dwBegin && dwRva < dwBegin + dwBlockCount * dwAlignment)
        {
            if (lpFoa)
                *lpFoa = m_lpSectionHeader[i].PointerToRawData + dwRva - dwBegin;
            if (lpSection)
                *lpSection = (WORD)i;
            return TRUE;
        }
    }

    return FALSE;
}

BOOL CPeFile::FoaToRva(DWORD dwFoa, LPDWORD lpRva, LPWORD lpSection) const
{
    assert(IsAttch());
    WORD nSection = m_lpNtHeader->FileHeader.NumberOfSections;
    for (size_t i = 0; i < (size_t)nSection; ++i)
    {
        DWORD dwBegin = m_lpSectionHeader[i].PointerToRawData;
        if (i == 0U && dwFoa < dwBegin)
        {
            if (lpRva)
                *lpRva = dwFoa;
            if (lpSection)
                *lpSection = (WORD)-1;
            return TRUE;
        }
        if (dwFoa >= dwBegin && dwFoa < dwBegin + m_lpSectionHeader[i].SizeOfRawData)
        {
            if (lpRva)
                *lpRva = m_lpSectionHeader[i].VirtualAddress + (dwFoa - m_lpSectionHeader[i].PointerToRawData);
            if (lpSection)
                *lpSection = (WORD)i;
            return TRUE;
        }
    }
    return FALSE;
}
全部回答
期待看到有用的回答!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
梦见钓鱼钓到嘴上
求助,暗黑三全屏模式为什么找不到鼠标
说理题:如图,在△ABC和△DEF中,∠A=∠D,A
丽水市人民医院莲都分院在哪里啊,我有事要去
由中国发起的关于亚洲发展的扶贫组织叫什么
男人进来帮我看看这个问题
中脉生态家会所这个地址在什么地方,我要处理
如何给大使馆写信
快到过年了 最后一个月她会压你工资嘛 会压多
WOW熊T要多少命中或者精准比较合适?
浙江的女孩怎么样?歧视北方人嘛?
用iphone6p已经一年左右了,平时在外都是用的
下列长江流域的商品粮基地,依干流从上游到下
万州烤鱼(桂花路店)地址在什么地方,想过去办
好了买的鞋是正品吗
推荐资讯
魔神拿12红字无用 魔战肩 空城泪 穿厄运6能不
Adodc1.Refresh,在这里有黄色光标,错误提示
我找不到题了
节假日或双休日,和全家老少去郊游并野炊一把
please tap the check box next to the file
计算机死机通常是指
单选题选出下列几组全是主谓句的一组A.会场上
paypal客户使用商品和服务打钱给我但都有一个
单选题澳大利亚最大的工业中心和港口城市是A.
奥康名品空间地址有知道的么?有点事想过去
R7000,近千元的路由器也没有带宽控制功能吗
我本买份保险,但十年前得过重疾住过院,能查
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?