crash_generation_app.cc revision ae4d8370ee0ca72df810a1638f09c058748b8d1e
1eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Copyright (c) 2008, Google Inc. 2eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// All rights reserved. 3eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 4eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Redistribution and use in source and binary forms, with or without 5eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// modification, are permitted provided that the following conditions are 6eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// met: 7eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 8eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// * Redistributions of source code must retain the above copyright 9eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// notice, this list of conditions and the following disclaimer. 10eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// * Redistributions in binary form must reproduce the above 11eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// copyright notice, this list of conditions and the following disclaimer 12eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// in the documentation and/or other materials provided with the 13eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// distribution. 14eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// * Neither the name of Google Inc. nor the names of its 15eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// contributors may be used to endorse or promote products derived from 16eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// this software without specific prior written permission. 17eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 18eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 30eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// crash_generation_app.cpp : Defines the entry point for the application. 31eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 32eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 33eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include "precompile.h" 34eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 35eeca9921c563d802cccc5593bf55dcb7683e7250mmentovainamespace google_breakpad { 36eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 37eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiconst int kMaxLoadString = 100; 3872bafd378d836d9a1fe81a1f26c91d51b2a7892bdoshimunconst wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashServices\\TestServer"; 39eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 40eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiconst DWORD kEditBoxStyles = WS_CHILD | 41eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WS_VISIBLE | 42eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WS_VSCROLL | 43eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_LEFT | 44eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_MULTILINE | 45eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_AUTOVSCROLL | 46eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_READONLY; 47eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 48eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Maximum length of a line in the edit box. 49eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiconst size_t kMaximumLineLength = 256; 50eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 51eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// CS to access edit control in a thread safe way. 52eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic CRITICAL_SECTION* cs_edit = NULL; 53eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 54eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Edit control. 55eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic HWND client_status_edit_box; 56eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 57eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiHINSTANCE current_instance; // Current instance. 58eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiTCHAR title[kMaxLoadString]; // Title bar text. 59eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiTCHAR window_class[kMaxLoadString]; // Main window class name. 60eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 61eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiATOM MyRegisterClass(HINSTANCE instance); 62eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiBOOL InitInstance(HINSTANCE, int); 63eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 64eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiINT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 65eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 668602aa71ecba32d26985bdbbddc8e618ca203ff9doshimunstatic int kCustomInfoCount = 2; 678602aa71ecba32d26985bdbbddc8e618ca203ff9doshimunstatic CustomInfoEntry kCustomInfoEntries[] = { 688602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun CustomInfoEntry(L"prod", L"CrashTestApp"), 698602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun CustomInfoEntry(L"ver", L"1.0"), 708602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun}; 710ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 72eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic ExceptionHandler* handler = NULL; 73eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic CrashGenerationServer* crash_server = NULL; 74eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 75eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Registers the window class. 76eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 77eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// This function and its usage are only necessary if you want this code 78eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// to be compatible with Win32 systems prior to the 'RegisterClassEx' 79eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// function that was added to Windows 95. It is important to call this 80eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// function so that the application will get 'well formed' small icons 81eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// associated with it. 82eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiATOM MyRegisterClass(HINSTANCE instance) { 83eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WNDCLASSEX wcex; 84eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.cbSize = sizeof(WNDCLASSEX); 85eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.style = CS_HREDRAW | CS_VREDRAW; 86eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.lpfnWndProc = WndProc; 87eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.cbClsExtra = 0; 88eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.cbWndExtra = 0; 89eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hInstance = instance; 90eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hIcon = LoadIcon(instance, 91eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP)); 92eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 93eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 94eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP); 95eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.lpszClassName = window_class; 96eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 97eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 98eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return RegisterClassEx(&wcex); 99eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 100eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 101eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Saves instance handle and creates main window 102eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 103eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// In this function, we save the instance handle in a global variable and 104eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// create and display the main program window. 105eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiBOOL InitInstance(HINSTANCE instance, int command_show) { 106eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_instance = instance; 107eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HWND wnd = CreateWindow(window_class, 108eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai title, 109eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WS_OVERLAPPEDWINDOW, 110eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CW_USEDEFAULT, 111eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 112eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CW_USEDEFAULT, 113eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 114eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 115eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 116eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai instance, 117eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL); 118eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 119eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!wnd) { 120eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return FALSE; 121eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 122eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 123eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowWindow(wnd, command_show); 124eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UpdateWindow(wnd); 125eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 126eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return TRUE; 127eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 128eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 129eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic void AppendTextToEditBox(TCHAR* text) { 130eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EnterCriticalSection(cs_edit); 131eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SYSTEMTIME current_time; 132eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai GetLocalTime(¤t_time); 133eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR line[kMaximumLineLength]; 134eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 135eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 136eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai L"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s", 137eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wMonth, 138eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wDay, 139eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wYear, 140eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wHour, 141eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wMinute, 142eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wSecond, 143eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai text); 144eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 145eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 146eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 147eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 148eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 149eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int length = GetWindowTextLength(client_status_edit_box); 150eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SendMessage(client_status_edit_box, 151eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EM_SETSEL, 152eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (WPARAM)length, 153eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (LPARAM)length); 154eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SendMessage(client_status_edit_box, 155eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EM_REPLACESEL, 156eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (WPARAM)FALSE, 157eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (LPARAM)line); 158eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LeaveCriticalSection(cs_edit); 159eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 160eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 161eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic DWORD WINAPI AppendTextWorker(void* context) { 162eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* text = reinterpret_cast<TCHAR*>(context); 163eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 164eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai AppendTextToEditBox(text); 165eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] text; 166eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 167eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return 0; 168eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 169eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 170c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.combool ShowDumpResults(const wchar_t* dump_path, 171c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com const wchar_t* minidump_id, 172c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com void* context, 173c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com EXCEPTION_POINTERS* exinfo, 174c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com MDRawAssertionInfo* assertion, 175eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool succeeded) { 176eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* text = new TCHAR[kMaximumLineLength]; 1778602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun text[0] = _T('\0'); 178eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(text, 179eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 180eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TEXT("Dump generation request %s\r\n"), 181eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai succeeded ? TEXT("succeeded") : TEXT("failed")); 182eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 183eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete [] text; 184eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 185eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 186ae4d8370ee0ca72df810a1638f09c058748b8d1enealsid QueueUserWorkItem(AppendTextWorker, text, WT_EXECUTEDEFAULT); 187eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return succeeded; 188eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 189eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 190eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic void _cdecl ShowClientConnected(void* context, 191eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai const ClientInfo* client_info) { 192eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* line = new TCHAR[kMaximumLineLength]; 1938602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 194eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 195eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 196eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai L"Client connected:\t\t%d\r\n", 197eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_info->pid()); 198eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 199eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 200eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] line; 201eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 202eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 203eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 204eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 205eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 206eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 207eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic void _cdecl ShowClientCrashed(void* context, 2089033edcd7bab5a25c748dd1979f51853bbe06f87doshimun const ClientInfo* client_info, 2099033edcd7bab5a25c748dd1979f51853bbe06f87doshimun const wstring* dump_path) { 210eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* line = new TCHAR[kMaximumLineLength]; 2118602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 212eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 213eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 214eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TEXT("Client requested dump:\t%d\r\n"), 215eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_info->pid()); 216eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 217eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 218eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] line; 219eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 220eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 221eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 222eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 2230ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 2247ab126ecdd5237ccd566f415cc560b39f87e8a0fdoshimun CustomClientInfo custom_info = client_info->GetCustomInfo(); 2258602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun if (custom_info.count <= 0) { 2260ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun return; 2270ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2280ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 2290ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun wstring str_line; 2308602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun for (int i = 0; i < custom_info.count; ++i) { 2310ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun if (i > 0) { 2320ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun str_line += L", "; 2330ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2348602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun str_line += custom_info.entries[i].name; 2350ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun str_line += L": "; 2368602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun str_line += custom_info.entries[i].value; 2370ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2380ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 2390ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun line = new TCHAR[kMaximumLineLength]; 2408602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 2410ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun result = swprintf_s(line, 2420ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun kMaximumLineLength, 2430ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun L"%s\n", 2440ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun str_line.c_str()); 2450ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun if (result == -1) { 2460ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun delete[] line; 2470ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun return; 2480ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2490ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 250eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 251eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 252eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic void _cdecl ShowClientExited(void* context, 253eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai const ClientInfo* client_info) { 254eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* line = new TCHAR[kMaximumLineLength]; 2558602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 256eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 257eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 258eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TEXT("Client exited:\t\t%d\r\n"), 259eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_info->pid()); 260eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 261eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 262eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] line; 263eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 264eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 265eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 266eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 267eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 268eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 269eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid CrashServerStart() { 270eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Do not create another instance of the server. 271eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (crash_server) { 272eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 273eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 274eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 275eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai std::wstring dump_path = L"C:\\Dumps\\"; 276eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai crash_server = new CrashGenerationServer(kPipeName, 27735c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun NULL, 278eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowClientConnected, 279eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 280eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowClientCrashed, 281eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 282eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowClientExited, 283eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 284eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai true, 285eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai &dump_path); 286eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 287eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!crash_server->Start()) { 288eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MessageBoxW(NULL, L"Unable to start server", L"Dumper", MB_OK); 289eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete crash_server; 290eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai crash_server = NULL; 291eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 292eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 293eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 294eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid CrashServerStop() { 295eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete crash_server; 296eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai crash_server = NULL; 297eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 298eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 299eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid DerefZeroCrash() { 300eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int* x = 0; 301eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai *x = 1; 302eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 303eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 304eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid InvalidParamCrash() { 305eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai printf(NULL); 306eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 307eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 308eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid PureCallCrash() { 309eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai Derived derived; 310eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 311eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 312eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid RequestDump() { 313eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!handler->WriteMinidump()) { 314eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MessageBoxW(NULL, L"Dump request failed", L"Dumper", MB_OK); 315eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 3168602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun kCustomInfoEntries[1].set_value(L"1.1"); 317eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 318eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 319eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid CleanUp() { 320eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (cs_edit) { 321eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DeleteCriticalSection(cs_edit); 322eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete cs_edit; 323eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 324eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 325eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (handler) { 326eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete handler; 327eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 328eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 329eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (crash_server) { 330eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete crash_server; 331eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 332eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 333eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 334eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Processes messages for the main window. 335eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 336eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// WM_COMMAND - process the application menu. 337eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// WM_PAINT - Paint the main window. 338eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// WM_DESTROY - post a quit message and return. 339eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiLRESULT CALLBACK WndProc(HWND wnd, 340eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UINT message, 341eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WPARAM w_param, 342eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LPARAM l_param) { 343eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int message_id; 344eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int message_event; 345eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai PAINTSTRUCT ps; 346eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HDC hdc; 347eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 348eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#pragma warning(push) 349eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#pragma warning(disable:4312) 350eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Disable warning C4312: 'type cast' : conversion from 'LONG' to 351eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 'HINSTANCE' of greater size. 352eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // The value returned by GetwindowLong in the case below returns unsigned. 353eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HINSTANCE instance = (HINSTANCE)GetWindowLong(wnd, GWL_HINSTANCE); 354eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#pragma warning(pop) 355eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 356eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai switch (message) { 357eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_COMMAND: 358eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parse the menu selections. 359eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai message_id = LOWORD(w_param); 360eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai message_event = HIWORD(w_param); 361eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai switch (message_id) { 362eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case IDM_ABOUT: 363eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DialogBox(current_instance, 364eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MAKEINTRESOURCE(IDD_ABOUTBOX), 365eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wnd, 366eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai About); 367eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 368eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case IDM_EXIT: 369eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DestroyWindow(wnd); 370eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 371eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_SERVER_START: 372eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashServerStart(); 373eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 374eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_SERVER_STOP: 375eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashServerStop(); 376eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 377eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_DEREFZERO: 378eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DerefZeroCrash(); 379eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 380eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_INVALIDPARAM: 381eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai InvalidParamCrash(); 382eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 383eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_PURECALL: 384eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai PureCallCrash(); 385eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 386eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_REQUESTEXPLICITDUMP: 387eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai RequestDump(); 388eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 389eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai default: 390eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return DefWindowProc(wnd, message, w_param, l_param); 391eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 392eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 393eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_CREATE: 394eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_status_edit_box = CreateWindow(TEXT("EDIT"), 395eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 396eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kEditBoxStyles, 397eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 398eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 399eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 400eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 401eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wnd, 402eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 403eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai instance, 404eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL); 405eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 406eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_SIZE: 407eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Make the edit control the size of the window's client area. 408eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MoveWindow(client_status_edit_box, 409eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 410eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 411eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LOWORD(l_param), // width of client area. 412eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HIWORD(l_param), // height of client area. 413eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TRUE); // repaint window. 414eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 415eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_SETFOCUS: 416eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SetFocus(client_status_edit_box); 417eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 418eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_PAINT: 419eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai hdc = BeginPaint(wnd, &ps); 420eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EndPaint(wnd, &ps); 421eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 422eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_DESTROY: 423eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CleanUp(); 424eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai PostQuitMessage(0); 425eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 426eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai default: 427eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return DefWindowProc(wnd, message, w_param, l_param); 428eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 429eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 430eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return 0; 431eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 432eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 433eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Message handler for about box. 434eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiINT_PTR CALLBACK About(HWND dlg, 435eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UINT message, 436eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WPARAM w_param, 437eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LPARAM l_param) { 438eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UNREFERENCED_PARAMETER(l_param); 439eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai switch (message) { 440eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_INITDIALOG: 441eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (INT_PTR)TRUE; 442eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 443eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_COMMAND: 444eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) { 445eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EndDialog(dlg, LOWORD(w_param)); 446eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (INT_PTR)TRUE; 447eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 448eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 449eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 450eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 451eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (INT_PTR)FALSE; 452eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 453eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 454eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} // namespace google_breakpad 455eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 456eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiint APIENTRY _tWinMain(HINSTANCE instance, 457eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HINSTANCE previous_instance, 458eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LPTSTR command_line, 459eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int command_show) { 460eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai using namespace google_breakpad; 461eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 462eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UNREFERENCED_PARAMETER(previous_instance); 463eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UNREFERENCED_PARAMETER(command_line); 464eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 465eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai cs_edit = new CRITICAL_SECTION(); 466eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai InitializeCriticalSection(cs_edit); 467eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 4688602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun CustomClientInfo custom_info = {kCustomInfoEntries, kCustomInfoCount}; 4690ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 470ae4d8370ee0ca72df810a1638f09c058748b8d1enealsid CrashServerStart(); 471eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // This is needed for CRT to not show dialog for invalid param 472eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // failures and instead let the code handle it. 473eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai _CrtSetReportMode(_CRT_ASSERT, 0); 474eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai handler = new ExceptionHandler(L"C:\\dumps\\", 475eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 476eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai google_breakpad::ShowDumpResults, 477eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 478eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ExceptionHandler::HANDLER_ALL, 479eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MiniDumpNormal, 4800ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun kPipeName, 4810ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun &custom_info); 482eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 483eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Initialize global strings. 484eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString); 485eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LoadString(instance, 486eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IDC_CRASHGENERATIONAPP, 487eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai window_class, 488eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaxLoadString); 489eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MyRegisterClass(instance); 490eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 491eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Perform application initialization. 492eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!InitInstance (instance, command_show)) { 493eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return FALSE; 494eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 495eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 496eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HACCEL accel_table = LoadAccelerators( 497eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai instance, 498eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP)); 499eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 500eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Main message loop. 501eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MSG msg; 502eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai while (GetMessage(&msg, NULL, 0, 0)) { 503eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) { 504eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TranslateMessage(&msg); 505eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DispatchMessage(&msg); 506eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 507eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 508eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 509eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (int)msg.wParam; 510eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 511eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 512