副标题#e#
3个单选框中只能有一个是选中状态,为了记录哪个单选框是选中状态,在类中定义一个成员变量m_nSelect。对3个单选框,分别使m_nSelect值为1、2和3。下面来看主要的代码。
在单击“计算”按钮后,响应该按钮的代码如下:
void CPeParseDlg::OnBtnCalc()
{
// TODO: Add your control notification handler code here
DWORD dwAddr = 0;
// 获取的地址
dwAddr = GetAddr();
// 地址所在的节
int nInNum = GetAddrInSecNum(dwAddr);
// 计算其他地址
CalcAddr(nInNum, dwAddr);
}
分别看一下GetAddr()、GetAddrInSecNum()和CalcAddr()的实现。
获取在编辑框中输入的地址内容的代码如下:
DWORD CPeParseDlg::GetAddr()
{
char szAddr[10] = { 0 };
DWORD dwAddr = 0;
switch ( m_nSelect )
{
case 1:
{
GetDlgItemText(IDC_EDIT_VA, szAddr, 10);
HexStrToInt(szAddr, &dwAddr);
break;
}
case 2:
{
GetDlgItemText(IDC_EDIT_RVA, szAddr, 10);
HexStrToInt(szAddr, &dwAddr);
break;
}
case 3:
{
GetDlgItemText(IDC_EDIT_FILEOFFSET, szAddr, 10);
HexStrToInt(szAddr, &dwAddr);
break;
}
}
return dwAddr;
}
获取该地址所属的第几个节的代码如下:
int CPeParseDlg::GetAddrInSecNum(DWORD dwAddr)
{
int nInNum = 0;
int nSecNum = m_pNtHdr->FileHeader.NumberOfSections;
switch ( m_nSelect )
{
case 1:
{
DWORD dwImageBase = m_pNtHdr->OptionalHeader.ImageBase;
#p#副标题#e#
for ( nInNum = 0; nInNum < nSecNum; nInNum ++ )
{
if ( dwAddr >= dwImageBase + m_pSecHdr[nInNum].VirtualAddress
&& dwAddr <= dwImageBase + m_pSecHdr[nInNum].VirtualAddress
+ m_pSecHdr[nInNum].Misc.VirtualSize)
{
return nInNum;
}
}
break;
}
case 2:
{
for ( nInNum = 0; nInNum < nSecNum; nInNum ++ )
{
if ( dwAddr >= m_pSecHdr[nInNum].VirtualAddress
&& dwAddr <= m_pSecHdr[nInNum].VirtualAddress
+ m_pSecHdr[nInNum].Misc.VirtualSize)
{
return nInNum;
}
}
break;
}
case 3:
{
for ( nInNum = 0; nInNum < nSecNum; nInNum ++ )
{
if ( dwAddr >= m_pSecHdr[nInNum].PointerToRawData
&& dwAddr <= m_pSecHdr[nInNum].PointerToRawData
+ m_pSecHdr[nInNum].SizeOfRawData)
{
return nInNum;
}
}
break;
}
}
return -1;