#define CONVERT_POINTER(addr, ret) \
ret = 0; \
for(i = 0; i < m_dwSectionCount; ++i) \
{ \
if ( addr < pSectHdr[i].VirtualAddress + m_pSectionsSize[i] && addr >=     pSectHdr[i].VirtualAddress ) \
{ \
ret = (addr - pSectHdr[i].VirtualAddress) + DWORD(m_pSectionsBase[i]); \
break; \
} \
}

解决方案 »

  1.   

    去vc\mfc区,此地乃cb区看名字这是个转换指针的宏,把addr转成指针存在ret里
      

  2.   

    一个宏定义,通过一个addr参数,然后在pSectHdr数组中满足那个if条件的地址,如果存在,ret返回。
      

  3.   

    通常载入dll的时候,载入的基地址不再是缺省的0x10000000,从而,section在内存的指针(m_pSectionsBase)也变化了;但是,在section中的偏移(addr - pSectHdr[i].VirtualAddress)是不变的;估计,这里是把文件中的指定 section 中的偏移指针,转换成装载到内存中的对应指针
      

  4.   

    判断addr在哪一个section 里,返回addr在当section中的偏移地址+m_pSectionsBase[i]
      

  5.   

    通过addr参数,然后在pSectHdr数组中满足那个if中的两个条件,判断addr在哪一个地址区域里,满足条件ret = (addr - pSectHdr[i].VirtualAddress) + DWORD(m_pSectionsBase[i]); ret就是偏移的地址 ,并跳出循环,不满足则继续循环知道达到满足的条件为止。