OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #include <windows.h> | 4 #include <windows.h> |
5 | 5 |
6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
7 #include "base/scoped_native_library.h" | 7 #include "base/scoped_native_library.h" |
8 | 8 |
9 namespace { | 9 namespace { |
10 | 10 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 // CFG exception will be thrown. | 213 // CFG exception will be thrown. |
214 // | 214 // |
215 // - The DoPatch() function then overwrites with a small, custom change. This | 215 // - The DoPatch() function then overwrites with a small, custom change. This |
216 // change will simply add 16 (0x10) to the real function address in EAX/RAX | 216 // change will simply add 16 (0x10) to the real function address in EAX/RAX |
217 // about to be checked. This will maintain the 16-byte alignment required in | 217 // about to be checked. This will maintain the 16-byte alignment required in |
218 // a target address by CFG, but also ensure that it fails the check. | 218 // a target address by CFG, but also ensure that it fails the check. |
219 // | 219 // |
220 // The whole purpose of this unittest is to ensure that a failed CFG check in | 220 // The whole purpose of this unittest is to ensure that a failed CFG check in |
221 // a Microsoft binary results in an exception. If CFG is not properly | 221 // a Microsoft binary results in an exception. If CFG is not properly |
222 // enabled for a process, no exception will be thrown. | 222 // enabled for a process, no exception will be thrown. |
223 // This test EXE is built with | 223 // All Chromium projects should be linked with "common_linker_setup" config |
224 // configs += [ "//build/config/win:win_msvc_cfg" ] | 224 // (build\config\win\BUILD.gn), which should result in CFG enabled on the |
225 // which should result in CFG enabled on the process. | 225 // process. |
226 // | 226 // |
227 // - The patches (x86 or x64) were carefully constructed to be valid and not | 227 // - The patches (x86 or x64) were carefully constructed to be valid and not |
228 // mess up the executing instructions. Need to ensure that the CFG check | 228 // mess up the executing instructions. Need to ensure that the CFG check |
229 // fully happens, and that nothing else goes wrong before OR AFTER that | 229 // fully happens, and that nothing else goes wrong before OR AFTER that |
230 // point. The only exception expected is a very intentional one. | 230 // point. The only exception expected is a very intentional one. |
231 // **The patches also allow the call to GetSystemMetrics to SUCCEED if CFG is | 231 // **The patches also allow the call to GetSystemMetrics to SUCCEED if CFG is |
232 // NOT enabled for the process! This makes for very clear behaviour. | 232 // NOT enabled for the process! This makes for very clear behaviour. |
233 void TestMsIndirect() { | 233 void TestMsIndirect() { |
234 base::ScopedNativeLibrary user32(base::FilePath(L"user32.dll")); | 234 base::ScopedNativeLibrary user32(base::FilePath(L"user32.dll")); |
235 if (!user32.is_valid()) | 235 if (!user32.is_valid()) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 case 1: | 286 case 1: |
287 TestMsIndirect(); | 287 TestMsIndirect(); |
288 break; | 288 break; |
289 // Unsupported argument. | 289 // Unsupported argument. |
290 default: | 290 default: |
291 _exit(-1); | 291 _exit(-1); |
292 } | 292 } |
293 | 293 |
294 return 0; | 294 return 0; |
295 } | 295 } |
OLD | NEW |