资源表

  1 TreeCtrlResource.DeleteAllItems();//清空树
  2     ListCtrlState.DeleteAllItems();//清空列表项
  3     while (ListCtrlState.DeleteColumn(0));    //清空表头项目
  4     ListCrtlStateTemp.DeleteAllItems();//清空列表项
  5     while (ListCrtlStateTemp.DeleteColumn(0));    //清空表头项目
  6     TreeCtrlResource.ModifyStyle(NULL, TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_SHOWSELALWAYS);
  7     DWORD dTempDword = 0;
  8     DWORD dVA = 0;
  9     DWORD dRVA = 0;
 10     DWORD dFA = 0;
 11     CString strVA;
 12     CString strRVA;
 13     CString strFA;
 14     DWORD dwRoot = m_NtHeader32.OptionalHeader.DataDirectory[2].VirtualAddress;
 15     if (!dwRoot)
 16     {
 17         return;
 18     }
 19     //打开文件
 20     HANDLE HandFile = CreateFile(m_strFileName, GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 21 
 22     HTREEITEM hmTump = TreeCtrlResource.InsertItem("Resource Directory");
 23     //获取到数据目录资源表
 24     dRVA = m_NtHeader32.OptionalHeader.DataDirectory[2].VirtualAddress;
 25     fnRVAConversion(dVA, dRVA, dFA, strVA, strRVA, strFA);
 26     DWORD ImageBaseTemp = dFA;
 27     //移动文件指针
 28     SetFilePointer(HandFile, dFA, 0, FILE_BEGIN);
 29     IMAGE_RESOURCE_DIRECTORY imgRc;
 30     //读取目录结构体
 31     if (!ReadFile(HandFile, &imgRc, sizeof(IMAGE_RESOURCE_DIRECTORY), &dTempDword, NULL))
 32     {
 33         AfxMessageBox("对不起,文件读取失败!");
 34     }
 35     dFA = SetFilePointer(HandFile, 0, 0, FILE_CURRENT);
 36     for (WORD i = 0; i < imgRc.NumberOfNamedEntries + imgRc.NumberOfIdEntries; i++)
 37     {
 38         fnTagResourceDirectory(hmTump, HandFile, dFA + (i * 8), ImageBaseTemp);
 39     }
 40     //关闭文件
 41     CloseHandle(HandFile);
 42     
 43     
 44     //用于递归资源表
 45 bool CMyCFFExplprerDlg::fnTagResourceDirectory(HTREEITEM hmDoer, HANDLE HandFile, DWORD m_Fa, DWORD m_ImageBase)
 46 {
 47     DWORD dTempDword = 0;
 48     DWORD dVA = 0;
 49     DWORD dRVA = 0;
 50     DWORD dFA = m_Fa;
 51     CString strVA;
 52     CString strRVA;
 53     CString strFA;
 54     DWORD dwFA = 0;
 55     HTREEITEM hmTump = 0;
 56     //移动文件指针到此位置
 57     SetFilePointer(HandFile, m_Fa, 0, FILE_BEGIN);
 58     //名字目录项结构体
 59     IMAGE_RESOURCE_DIRECTORY_ENTRY imgRede;
 60     if (!ReadFile(HandFile, &imgRede, sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY), &dTempDword, NULL))
 61     {
 62         AfxMessageBox("对不起,文件读取失败!");
 63         return false;
 64     }
 65     //如果目录项结构体前四个字节最高位为1,表示字符串命名
 66     if (imgRede.Name & 0x80000000)
 67     {
 68         //把目录项结构体前四个字节的最高位置0,并且加上资源表基址,得到字符串地址
 69         DWORD dwFile = imgRede.Name & ~0x80000000;
 70         dwFA = m_ImageBase + dwFile;
 71         //移动文件指针到此位置
 72         SetFilePointer(HandFile, dwFA, 0, FILE_BEGIN);
 73         //名字目录项结构体
 74         WORD nNameSize = 0;
 75         //读取名字长度
 76         if (!ReadFile(HandFile, &nNameSize, sizeof(WORD), &dTempDword, NULL))
 77         {
 78             AfxMessageBox("对不起,文件读取失败!");
 79             return false;
 80         }
 81         CString szBuff;
 82         char ch;
 83         for (WORD i = 0; i < nNameSize; i++)
 84         {
 85             if (!ReadFile(HandFile, &ch, 1, &dTempDword, NULL))
 86             {
 87                 AfxMessageBox("对不起,文件读取失败!");
 88                 return false;
 89             }
 90             szBuff.AppendChar(ch);
 91         }
 92         hmTump = TreeCtrlResource.InsertItem("Resorce Directory Entry ,Name:" + szBuff, hmDoer);
 93     }
 94     //如果目录项结构体前四个字节最高位为0,表示序号命名,取出序号,树控件申请一行
 95     else
 96     {
 97         WORD wID = (WORD)(imgRede.Name);
 98         CString strID;
 99         strID.Format("%hd", wID);
100         hmTump = TreeCtrlResource.InsertItem("Resorce Directory Entry ,ID:" + strID, hmDoer);
101 
102     }
103     //如果目录项结构体后四个字节最高位为1,则表示后面是个目录
104     if (imgRede.OffsetToData & 0x80000000)
105     {
106         HTREEITEM hwTump = 0;
107         //打印目录标题
108         if (hmTump != nullptr)
109         {
110             hwTump = TreeCtrlResource.InsertItem("Resource Directory", hmTump);
111         }
112         //拿到下一个目录的地址
113         DWORD dwFile = imgRede.OffsetToData & ~0x80000000;
114         dwFA = m_ImageBase + dwFile;
115         //移动文件指针到此位置
116         SetFilePointer(HandFile, dwFA, 0, FILE_BEGIN);
117         IMAGE_RESOURCE_DIRECTORY imgRc;
118         //读取目录结构体
119         if (!ReadFile(HandFile, &imgRc, sizeof(IMAGE_RESOURCE_DIRECTORY), &dTempDword, NULL))
120         {
121             AfxMessageBox("对不起,文件读取失败!");
122             return false;
123         }
124         dwFA = SetFilePointer(HandFile, 0, 0, FILE_CURRENT);
125         for (WORD i = 0; i < imgRc.NumberOfNamedEntries + imgRc.NumberOfIdEntries; i++)
126         {
127             fnTagResourceDirectory(hwTump, HandFile, dwFA + (i * 8), m_ImageBase);
128         }
129     }
130     else
131     {
132         //如果目录项结构体后四个字节最高位不是1,表示这后面是个数据的结构体
133         IMAGE_RESOURCE_DATA_ENTRY imgrde;
134         //读取数据结构体
135         if (!ReadFile(HandFile, &imgrde, sizeof(IMAGE_RESOURCE_DATA_ENTRY), &dTempDword, NULL))
136         {
137             AfxMessageBox("对不起,文件读取失败!");
138             return false;
139         }
140         TreeCtrlResource.InsertItem("Resource Data Entry", hmTump);
141         //dRVA = imgrde.OffsetToData;
142         //fnRVAConversion(dVA, dRVA, dFA, strVA, strRVA, strFA);
143         //SetFilePointer(HandFile, dFA, 0, FILE_BEGIN);
144 
145     }
146 
147 
148     //移动文件指针到此位置
149     SetFilePointer(HandFile, m_Fa, 0, FILE_BEGIN);
150     return true;
151 }

 

posted @ 2023-02-28 21:43  yhbb123  阅读(35)  评论(0)    收藏  举报