| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 // |
| 5 // Main entry point for a DLL that can be instructed to crash on |
| 6 // load or unload by setting an environment variable appropriately. |
| 7 // |
| 8 // Note: This code has no CRT to lean on, because some versions of the CRT |
| 9 // have a bug whereby they leave dangling state after taking an exception |
| 10 // during DLL_PROCESS_ATTACH. This in turn causes the loading process to |
| 11 // crash on exit. To work around this, this DLL has its entrypoint set |
| 12 // to the DllMain routine and does not link with the CRT. |
| 13 #include <windows.h> |
| 14 #include "crash_dll.h" |
| 15 |
| 16 void Crash() { |
| 17 char* null_pointer = reinterpret_cast<char*>(kCrashAddress); |
| 18 |
| 19 *null_pointer = '\0'; |
| 20 } |
| 21 |
| 22 void CrashConditionally(const wchar_t* name) { |
| 23 wchar_t value[1024]; |
| 24 DWORD ret = ::GetEnvironmentVariable(name, value, ARRAYSIZE(value)); |
| 25 if (ret != 0 || ERROR_ENVVAR_NOT_FOUND != ::GetLastError()) |
| 26 Crash(); |
| 27 } |
| 28 |
| 29 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, |
| 30 DWORD reason, |
| 31 LPVOID reserved) { |
| 32 if (reason == DLL_PROCESS_ATTACH) { |
| 33 CrashConditionally(kCrashOnLoadMode); |
| 34 } else if (reason == DLL_PROCESS_DETACH) { |
| 35 CrashConditionally(kCrashOnUnloadMode); |
| 36 } |
| 37 |
| 38 return 1; |
| 39 } |
| OLD | NEW |