OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file contains unit tests for PEImage. | 5 // This file contains unit tests for PEImage. |
6 #include <algorithm> | 6 #include <algorithm> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 base::FilePath pe_image_test_path; | 95 base::FilePath pe_image_test_path; |
96 ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path)); | 96 ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path)); |
97 pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image")); | 97 pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image")); |
98 | 98 |
99 #if defined(ARCH_CPU_64_BITS) | 99 #if defined(ARCH_CPU_64_BITS) |
100 pe_image_test_path = | 100 pe_image_test_path = |
101 pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll")); | 101 pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll")); |
102 const int sections = 6; | 102 const int sections = 6; |
103 const int imports_dlls = 2; | 103 const int imports_dlls = 2; |
104 const int delay_dlls = 2; | 104 const int delay_dlls = 2; |
105 const int exports = 2; | 105 const int exports = 3; |
106 const int imports = 69; | 106 const int imports = 70; |
107 const int delay_imports = 2; | 107 const int delay_imports = 2; |
108 const int relocs = 632; | 108 const int relocs = 976; |
109 #else | 109 #else |
110 pe_image_test_path = | 110 pe_image_test_path = |
111 pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll")); | 111 pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll")); |
112 const int sections = 5; | 112 const int sections = 5; |
113 const int imports_dlls = 2; | 113 const int imports_dlls = 2; |
114 const int delay_dlls = 2; | 114 const int delay_dlls = 2; |
115 const int exports = 2; | 115 const int exports = 3; |
116 const int imports = 66; | 116 const int imports = 66; |
117 const int delay_imports = 2; | 117 const int delay_imports = 2; |
118 const int relocs = 1586; | 118 const int relocs = 2114; |
119 #endif | 119 #endif |
120 | 120 |
121 HMODULE module = LoadLibrary(pe_image_test_path.value().c_str()); | 121 HMODULE module = LoadLibrary(pe_image_test_path.value().c_str()); |
122 ASSERT_TRUE(NULL != module); | 122 ASSERT_TRUE(NULL != module); |
123 | 123 |
124 PEImage pe(module); | 124 PEImage pe(module); |
125 int count = 0; | 125 int count = 0; |
126 EXPECT_TRUE(pe.VerifyMagic()); | 126 EXPECT_TRUE(pe.VerifyMagic()); |
127 | 127 |
128 pe.EnumSections(SectionsCallback, &count); | 128 pe.EnumSections(SectionsCallback, &count); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
167 | 167 |
168 FARPROC address1 = pe.GetProcAddress("RegEnumKeyExW"); | 168 FARPROC address1 = pe.GetProcAddress("RegEnumKeyExW"); |
169 FARPROC address2 = pe.GetProcAddress(reinterpret_cast<char*>(ordinal)); | 169 FARPROC address2 = pe.GetProcAddress(reinterpret_cast<char*>(ordinal)); |
170 EXPECT_TRUE(address1 != NULL); | 170 EXPECT_TRUE(address1 != NULL); |
171 EXPECT_TRUE(address2 != NULL); | 171 EXPECT_TRUE(address2 != NULL); |
172 EXPECT_TRUE(address1 == address2); | 172 EXPECT_TRUE(address1 == address2); |
173 | 173 |
174 FreeLibrary(module); | 174 FreeLibrary(module); |
175 } | 175 } |
176 | 176 |
177 // Tests that we can locate a forwarded export. | |
178 TEST(PEImageTest, ForwardedExport) { | |
179 base::FilePath pe_image_test_path; | |
180 ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path)); | |
181 pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image")); | |
182 | |
183 #if defined(ARCH_CPU_64_BITS) | |
184 pe_image_test_path = | |
185 pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll")); | |
186 #else | |
187 pe_image_test_path = | |
188 pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll")); | |
189 #endif | |
190 | |
191 HMODULE module = LoadLibrary(pe_image_test_path.value().c_str()); | |
192 ASSERT_TRUE(NULL != module); | |
193 | |
194 PEImage pe(module); | |
195 | |
196 FARPROC addr = pe.GetProcAddress("FwdExport"); | |
197 EXPECT_EQ(FARPROC(-1), addr); | |
Nico
2015/12/24 14:11:11
same question
Will Harris
2015/12/24 19:22:03
Acknowledged.
| |
198 | |
199 PDWORD export_entry = pe.GetExportEntry("FwdExport"); | |
200 EXPECT_NE(nullptr, export_entry); | |
201 PVOID fwd_addr = pe.RVAToAddr(*export_entry); | |
202 const char expected_fwd[] = "KERNEL32.CreateFileA"; | |
203 EXPECT_STREQ(expected_fwd, reinterpret_cast<char*>(fwd_addr)); | |
204 | |
205 FreeLibrary(module); | |
Nico
2015/12/24 14:11:11
(i'm a bit surprised we don't have a ScopedFoo for
Will Harris
2015/12/24 19:22:03
yes, we do, it's base::ScopedNativeLibrary so I sw
| |
206 } | |
207 | |
177 // Test that we can get debug id out of a module. | 208 // Test that we can get debug id out of a module. |
178 TEST(PEImageTest, GetDebugId) { | 209 TEST(PEImageTest, GetDebugId) { |
179 HMODULE module = LoadLibrary(L"advapi32.dll"); | 210 HMODULE module = LoadLibrary(L"advapi32.dll"); |
180 ASSERT_TRUE(NULL != module); | 211 ASSERT_TRUE(NULL != module); |
181 | 212 |
182 PEImage pe(module); | 213 PEImage pe(module); |
183 GUID guid = {0}; | 214 GUID guid = {0}; |
184 DWORD age = 0; | 215 DWORD age = 0; |
185 EXPECT_TRUE(pe.GetDebugId(&guid, &age)); | 216 EXPECT_TRUE(pe.GetDebugId(&guid, &age)); |
186 | 217 |
187 GUID empty_guid = {0}; | 218 GUID empty_guid = {0}; |
188 EXPECT_TRUE(!IsEqualGUID(empty_guid, guid)); | 219 EXPECT_TRUE(!IsEqualGUID(empty_guid, guid)); |
189 EXPECT_NE(0U, age); | 220 EXPECT_NE(0U, age); |
190 FreeLibrary(module); | 221 FreeLibrary(module); |
191 } | 222 } |
192 | 223 |
193 } // namespace win | 224 } // namespace win |
194 } // namespace base | 225 } // namespace base |
OLD | NEW |