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 14 #include <windows.h> 15 16 #include "crash_dll.h" 17 18 void Crash() { 19 char* null_pointer = reinterpret_cast<char*>(kCrashAddress); 20 21 *null_pointer = '\0'; 22 } 23 24 void CrashConditionally(const wchar_t* name) { 25 wchar_t value[1024]; 26 DWORD ret = ::GetEnvironmentVariable(name, value, ARRAYSIZE(value)); 27 if (ret != 0 || ERROR_ENVVAR_NOT_FOUND != ::GetLastError()) 28 Crash(); 29 } 30 31 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, 32 LPVOID reserved) { 33 if (reason == DLL_PROCESS_ATTACH) 34 CrashConditionally(kCrashOnLoadMode); 35 else if (reason == DLL_PROCESS_DETACH) 36 CrashConditionally(kCrashOnUnloadMode); 37 38 return 1; 39 } 40