15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main entry point for a DLL that can be instructed to crash on 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// load or unload by setting an environment variable appropriately. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: This code has no CRT to lean on, because some versions of the CRT 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have a bug whereby they leave dangling state after taking an exception 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// during DLL_PROCESS_ATTACH. This in turn causes the loading process to 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// crash on exit. To work around this, this DLL has its entrypoint set 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the DllMain routine and does not link with the CRT. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "crash_dll.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Crash() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* null_pointer = reinterpret_cast<char*>(kCrashAddress); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *null_pointer = '\0'; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CrashConditionally(const wchar_t* name) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wchar_t value[1024]; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD ret = ::GetEnvironmentVariable(name, value, ARRAYSIZE(value)); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0 || ERROR_ENVVAR_NOT_FOUND != ::GetLastError()) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Crash(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPVOID reserved) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reason == DLL_PROCESS_ATTACH) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashConditionally(kCrashOnLoadMode); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (reason == DLL_PROCESS_DETACH) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrashConditionally(kCrashOnUnloadMode); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40