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 }