MyResources.h MyResources.cpp
void MyResources::ShowResourcesInfo()
{
RESSENCONDINFO ResSendInfo;
RESTHIRDINFO ResThirdInfo;
AnalPE.pDatD=&( AnalPE.pOptH->DataDirectory[2]);
PIMAGE_RESOURCE_DIRECTORY pResD=(PIMAGE_RESOURCE_DIRECTORY)(AnalPE.buf+ AnalPE.CalcOffset(AnalPE.pDatD->VirtualAddress));
DWORD ReSize=pResD->NumberOfIdEntries+pResD->NumberOfNamedEntries;
PIMAGE_RESOURCE_DIRECTORY_ENTRY pResDE=(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((long)pResD+sizeof(IMAGE_RESOURCE_DIRECTORY));
//AnalPE
.OutPutPeInfo(m_Name,pResDE->NameIsString);
//AnalPE
.OutPutPeInfo(m_Id,ReSize);
//
另一种写法
m_Name.Format(L
"%04X"
,pResDE->NameIsString);
m_Id.Format(L
"%04X"
,ReSize);
HTREEITEM hItem ;
HTREEITEM hSubItem ;
//HTREEITEM
hThirdItem;
//
此处也可使用std::map 喜欢什么用什么吧
CString str;
for
(DWORD FirstOrder=0;FirstOrder<ReSize;FirstOrder++)
{
//
第一层 假如是字符串标识
if
(pResDE->NameIsString==1)
{
PIMAGE_RESOURCE_DIR_STRING_U pREsDStrU=(PIMAGE_RESOURCE_DIR_STRING_U)((long)pResD+pResDE->NameOffset);
//printf_s
(
"资源类型名:%s"
,pREsDStrU->NameString);
hItem = m_ResTreeList.InsertItem(pREsDStrU->NameString,NULL,NULL);
///root
就是节点的标题
}
//
假如是一直类型 用序号作为标识
else
{
switch (pResDE->Name)
{
case
0x1:
//printf_s
(
"第一层:%s\n"
,ResourceName[0]);
hItem = m_ResTreeList.InsertItem(L
"鼠标指针"
,NULL,NULL);
break
;
case
0x2:
//printf_s
(
"第一层:%s\n"
,ResourceName[1]);
hItem = m_ResTreeList.InsertItem(L
"位图"
,NULL,NULL);
break
;
case
0x3:
//printf_s
(
"第一层:%s\n"
,ResourceName[2]);
hItem = m_ResTreeList.InsertItem(L
"图标"
,NULL,NULL);
break
;
case
0x4:
//printf_s
(
"第一层:%s\n"
,ResourceName[3]);
hItem = m_ResTreeList.InsertItem(L
"菜单"
,NULL,NULL);
break
;
case
0x5:
//printf_s
(
"第一层:%s\n"
,ResourceName[4]);
hItem = m_ResTreeList.InsertItem(L
"对话框"
,NULL,NULL);
break
;
case
0x6:
//printf_s
(
"第一层:%s\n"
,ResourceName[5]);
hItem = m_ResTreeList.InsertItem(L
"字符串列表"
,NULL,NULL);
break
;
case
0x7:
//printf_s
(
"第一层:%s\n"
,ResourceName[6]);
hItem = m_ResTreeList.InsertItem(L
"字体目录"
,NULL,NULL);
break
;
case
0x8:
//printf_s
(
"第一层:%s\n"
,ResourceName[7]);
hItem = m_ResTreeList.InsertItem(L
"字体"
,NULL,NULL);
break
;
case
0x9:
//printf_s
(
"第一层:%s\n"
,ResourceName[8]);
hItem = m_ResTreeList.InsertItem(L
"快捷键"
,NULL,NULL);
break
;
case
0xA:
//printf_s
(
"第一层:%s\n"
,ResourceName[9]);
hItem = m_ResTreeList.InsertItem(L
"非格式化资源"
,NULL,NULL);
break
;
case
0xB:
//printf_s
(
"第一层:%s\n"
,ResourceName[10]);
hItem = m_ResTreeList.InsertItem(L
"消息列表"
,NULL,NULL);
break
;
case
0xC:
//printf_s
(
"第一层:%s\n"
,ResourceName[11]);
hItem = m_ResTreeList.InsertItem(L
"鼠标指针组"
,NULL,NULL);
break
;
case
0xE:
//printf_s
(
"第一层:%s\n"
,ResourceName[12]);
hItem = m_ResTreeList.InsertItem(L
"图标组"
,NULL,NULL);
break
;
case
0x10:
//printf_s
(
"第一层:%s\n"
,ResourceName[13]);
hItem = m_ResTreeList.InsertItem(L
"版本信息"
,NULL,NULL);
break
;
default:
//printf_s
(
"第一层:%d\n"
,pResDE->Name);
str.Format(L
"%d"
,pResDE->Name);
hItem = m_ResTreeList.InsertItem(str,NULL,NULL);
break
;
}
}
//
找第二层 注意OFFEST 是相对于pResD也就是资源开始位置的偏移
PIMAGE_RESOURCE_DIRECTORY pResD2=(PIMAGE_RESOURCE_DIRECTORY)((long)pResD+pResDE->OffsetToDirectory);
DWORD ReSize2=pResD2->NumberOfIdEntries+pResD2->NumberOfNamedEntries;
PIMAGE_RESOURCE_DIRECTORY_ENTRY pResDE2=(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((long)pResD2+sizeof(IMAGE_RESOURCE_DIRECTORY));
m_ResTreeList.SetItemData(hItem, FirstOrder);
//printf_s
(
"第er层[名称条目]->:%04X "
,pResDE2->NameIsString);
//AnalPE
.OutPutPeInfo(m_Name2,pResDE2->NameIsString);
ResSendInfo.NameIsString=pResD2->NumberOfNamedEntries;
ResSendInfo.ReSize2=pResD2->NumberOfIdEntries;
m_VecResSedInfo.push_back(ResSendInfo);
//printf_s
(
"第er层[ID条目]->:%04X \n"
,pResDE2->Id);
//AnalPE
.OutPutPeInfo(m_Id2,ReSize2);
DWORD SecondOrder=0;
for
(;SecondOrder<ReSize2;SecondOrder++)
{
if
(pResDE2->DataIsDirectory==1)
{
//
输出第二层资源的标识看是数字还是字符串
if
(pResDE2->NameIsString==1)
{
PIMAGE_RESOURCE_DIR_STRING_U pREsDStrU2=(PIMAGE_RESOURCE_DIR_STRING_U)((long)pResD+pResDE2->NameOffset);
//
输出资源类型名字
//printf
(
"第二层->资源类型名:%ls "
,pREsDStrU2->NameString);
hSubItem = m_ResTreeList.InsertItem(pREsDStrU2->NameString,NULL,NULL,hItem);
m_ResTreeList.SetItemData(hSubItem, SecondOrder);
}
else
{
//printf_s
(
"第二层->资源类型名ID:%d "
,pResDE2->Id);
str.Format(L
"%d"
,pResDE2->Id);
hSubItem = m_ResTreeList.InsertItem(str,NULL,NULL,hItem);
m_ResTreeList.SetItemData(hSubItem, SecondOrder);
}
//
解析第三层
PIMAGE_RESOURCE_DIRECTORY pResD3=(PIMAGE_RESOURCE_DIRECTORY)((long)pResD+pResDE2->OffsetToDirectory);
PIMAGE_RESOURCE_DIRECTORY_ENTRY pResDE3=(PIMAGE_RESOURCE_DIRECTORY_ENTRY)((long)pResD3+sizeof(IMAGE_RESOURCE_DIRECTORY));
PIMAGE_RESOURCE_DATA_ENTRY pResDataE=(PIMAGE_RESOURCE_DATA_ENTRY)((long)pResD+pResDE3->OffsetToData);
//printf_s
(
"第三层->RVA:%08X "
,pResDataE->OffsetToData);
//AnalPE
.OutPutPeInfo()
//
根据第一层 也就是父节点 区分
ResThirdInfo.Rva=pResDataE->OffsetToData;
ResThirdInfo.Offset=(AnalPE.CalcOffset(pResDataE->OffsetToData));
ResThirdInfo.Size=pResDataE->Size;
m_VecResthdInfo[FirstOrder].push_back(ResThirdInfo);
//
str.Format(L
"%08X"
,pResDataE->OffsetToData);
//
m_ResTreeList.InsertItem(str,NULL,NULL,hSubItem);
////
printf_s(
"第三层->偏移:%08X "
,(AnalPE.CalcOffset(pResDataE->OffsetToData)));
//
str.Format(L
"%08X"
,(AnalPE.CalcOffset(pResDataE->OffsetToData)));
//
m_ResTreeList.InsertItem(str,NULL,NULL,hSubItem);
////
printf_s(
"第三层->大小:%08X\n"
,pResDataE->Size);
//
str.Format(L
"%08X"
,pResDataE->Size);
//
m_ResTreeList.InsertItem(str,NULL,NULL,hSubItem);
}
else
{
break
;
}
pResDE2++;
}
//
保存父节点的句柄
m_VecHtreeItem.push_back(hItem);
pResDE++;
}
m_Name2.Format(L
"%04X"
,m_VecResSedInfo[0].NameIsString);
m_Id2.Format(L
"%04X"
,m_VecResSedInfo[0].ReSize2);
UpdateData(FALSE);
}