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 33a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include "client/windows/tests/crash_generation_app/crash_generation_app.h" 34a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org 35a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include <windows.h> 36a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include <tchar.h> 37a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org 38a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include "client/windows/crash_generation/client_info.h" 39a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include "client/windows/crash_generation/crash_generation_server.h" 40a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include "client/windows/handler/exception_handler.h" 41a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include "client/windows/common/ipc_protocol.h" 42a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org 43a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org#include "client/windows/tests/crash_generation_app/abstract_class.h" 44eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 45eeca9921c563d802cccc5593bf55dcb7683e7250mmentovainamespace google_breakpad { 46eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 47eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiconst int kMaxLoadString = 100; 4872bafd378d836d9a1fe81a1f26c91d51b2a7892bdoshimunconst wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashServices\\TestServer"; 49eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 50eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiconst DWORD kEditBoxStyles = WS_CHILD | 51eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WS_VISIBLE | 52eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WS_VSCROLL | 53eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_LEFT | 54eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_MULTILINE | 55eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_AUTOVSCROLL | 56eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ES_READONLY; 57eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 58eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Maximum length of a line in the edit box. 59eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiconst size_t kMaximumLineLength = 256; 60eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 61eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// CS to access edit control in a thread safe way. 62eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic CRITICAL_SECTION* cs_edit = NULL; 63eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 64eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Edit control. 65eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic HWND client_status_edit_box; 66eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 67eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiHINSTANCE current_instance; // Current instance. 68eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiTCHAR title[kMaxLoadString]; // Title bar text. 69eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiTCHAR window_class[kMaxLoadString]; // Main window class name. 70eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 71eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiATOM MyRegisterClass(HINSTANCE instance); 72eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiBOOL InitInstance(HINSTANCE, int); 73eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 74eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiINT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 75eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 768602aa71ecba32d26985bdbbddc8e618ca203ff9doshimunstatic int kCustomInfoCount = 2; 778602aa71ecba32d26985bdbbddc8e618ca203ff9doshimunstatic CustomInfoEntry kCustomInfoEntries[] = { 788602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun CustomInfoEntry(L"prod", L"CrashTestApp"), 798602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun CustomInfoEntry(L"ver", L"1.0"), 808602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun}; 810ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 82eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic ExceptionHandler* handler = NULL; 83eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic CrashGenerationServer* crash_server = NULL; 84eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 85eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Registers the window class. 86eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 87eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// This function and its usage are only necessary if you want this code 88eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// to be compatible with Win32 systems prior to the 'RegisterClassEx' 89eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// function that was added to Windows 95. It is important to call this 90eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// function so that the application will get 'well formed' small icons 91eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// associated with it. 92eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiATOM MyRegisterClass(HINSTANCE instance) { 93eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WNDCLASSEX wcex; 94eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.cbSize = sizeof(WNDCLASSEX); 95eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.style = CS_HREDRAW | CS_VREDRAW; 96eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.lpfnWndProc = WndProc; 97eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.cbClsExtra = 0; 98eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.cbWndExtra = 0; 99eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hInstance = instance; 100eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hIcon = LoadIcon(instance, 101eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP)); 102eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 103eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 104eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP); 105eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.lpszClassName = window_class; 106eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 107eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 108eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return RegisterClassEx(&wcex); 109eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 110eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 111eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Saves instance handle and creates main window 112eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 113eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// In this function, we save the instance handle in a global variable and 114eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// create and display the main program window. 115eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiBOOL InitInstance(HINSTANCE instance, int command_show) { 116eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_instance = instance; 117eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HWND wnd = CreateWindow(window_class, 118eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai title, 119eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WS_OVERLAPPEDWINDOW, 120eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CW_USEDEFAULT, 121eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 122eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CW_USEDEFAULT, 123eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 124eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 125eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 126eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai instance, 127eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL); 128eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 129eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!wnd) { 130eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return FALSE; 131eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 132eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 133eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowWindow(wnd, command_show); 134eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UpdateWindow(wnd); 135eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 136eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return TRUE; 137eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 138eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 139eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic void AppendTextToEditBox(TCHAR* text) { 140eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EnterCriticalSection(cs_edit); 141eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SYSTEMTIME current_time; 142eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai GetLocalTime(¤t_time); 143eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR line[kMaximumLineLength]; 144eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 145eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 146eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai L"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s", 147eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wMonth, 148eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wDay, 149eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wYear, 150eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wHour, 151eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wMinute, 152eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai current_time.wSecond, 153eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai text); 154eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 155eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 156eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 157eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 158eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 159eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int length = GetWindowTextLength(client_status_edit_box); 160eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SendMessage(client_status_edit_box, 161eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EM_SETSEL, 162eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (WPARAM)length, 163eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (LPARAM)length); 164eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SendMessage(client_status_edit_box, 165eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EM_REPLACESEL, 166eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (WPARAM)FALSE, 167eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai (LPARAM)line); 168eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LeaveCriticalSection(cs_edit); 169eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 170eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 171eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaistatic DWORD WINAPI AppendTextWorker(void* context) { 172eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* text = reinterpret_cast<TCHAR*>(context); 173eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 174eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai AppendTextToEditBox(text); 175eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] text; 176eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 177eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return 0; 178eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 179eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 180c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.combool ShowDumpResults(const wchar_t* dump_path, 181c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com const wchar_t* minidump_id, 182c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com void* context, 183c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com EXCEPTION_POINTERS* exinfo, 184c79141e306dc44eff2d3646ddc153b7dfc128d21doshimun@gmail.com MDRawAssertionInfo* assertion, 185eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool succeeded) { 186eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* text = new TCHAR[kMaximumLineLength]; 1878602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun text[0] = _T('\0'); 188eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(text, 189eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 190eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TEXT("Dump generation request %s\r\n"), 191eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai succeeded ? TEXT("succeeded") : TEXT("failed")); 192eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 193eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete [] text; 194eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 195eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 196ae4d8370ee0ca72df810a1638f09c058748b8d1enealsid QueueUserWorkItem(AppendTextWorker, text, WT_EXECUTEDEFAULT); 197eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return succeeded; 198eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 199eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 20020335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.comstatic void ShowClientConnected(void* context, 20120335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.com const ClientInfo* client_info) { 202eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* line = new TCHAR[kMaximumLineLength]; 2038602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 204eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 205eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 206eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai L"Client connected:\t\t%d\r\n", 207eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_info->pid()); 208eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 209eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 210eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] line; 211eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 212eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 213eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 214eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 215eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 216eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 21720335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.comstatic void ShowClientCrashed(void* context, 21820335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.com const ClientInfo* client_info, 21920335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.com const wstring* dump_path) { 220eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* line = new TCHAR[kMaximumLineLength]; 2218602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 222eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 223eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 224eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TEXT("Client requested dump:\t%d\r\n"), 225eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_info->pid()); 226eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 227eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 228eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] line; 229eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 230eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 231eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 232eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 2330ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 2347ab126ecdd5237ccd566f415cc560b39f87e8a0fdoshimun CustomClientInfo custom_info = client_info->GetCustomInfo(); 2358602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun if (custom_info.count <= 0) { 2360ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun return; 2370ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2380ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 2390ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun wstring str_line; 240a91e414f841dedc96efcae583f2fee6067fc637ferikwright@chromium.org for (size_t i = 0; i < custom_info.count; ++i) { 2410ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun if (i > 0) { 2420ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun str_line += L", "; 2430ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2448602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun str_line += custom_info.entries[i].name; 2450ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun str_line += L": "; 2468602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun str_line += custom_info.entries[i].value; 2470ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2480ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 2490ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun line = new TCHAR[kMaximumLineLength]; 2508602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 2510ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun result = swprintf_s(line, 2520ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun kMaximumLineLength, 2530ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun L"%s\n", 2540ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun str_line.c_str()); 2550ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun if (result == -1) { 2560ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun delete[] line; 2570ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun return; 2580ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun } 2590ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 260eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 261eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 26220335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.comstatic void ShowClientExited(void* context, 26320335445a30a0fe9941eb946c82fc7a945d85a24ted.mielczarek@gmail.com const ClientInfo* client_info) { 264eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TCHAR* line = new TCHAR[kMaximumLineLength]; 2658602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun line[0] = _T('\0'); 266eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int result = swprintf_s(line, 267eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaximumLineLength, 268eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TEXT("Client exited:\t\t%d\r\n"), 269eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_info->pid()); 270eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 271eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (result == -1) { 272eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete[] line; 273eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 274eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 275eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 276eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); 277eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 278eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 279eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid CrashServerStart() { 280eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Do not create another instance of the server. 281eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (crash_server) { 282eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return; 283eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 284eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 285eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai std::wstring dump_path = L"C:\\Dumps\\"; 2863ab3514cc1a952cad2eefb9b75a9add218d6b0d4ted.mielczarek@gmail.com 2873ab3514cc1a952cad2eefb9b75a9add218d6b0d4ted.mielczarek@gmail.com if (_wmkdir(dump_path.c_str()) && (errno != EEXIST)) { 2883ab3514cc1a952cad2eefb9b75a9add218d6b0d4ted.mielczarek@gmail.com MessageBoxW(NULL, L"Unable to create dump directory", L"Dumper", MB_OK); 2893ab3514cc1a952cad2eefb9b75a9add218d6b0d4ted.mielczarek@gmail.com return; 2903ab3514cc1a952cad2eefb9b75a9add218d6b0d4ted.mielczarek@gmail.com } 2913ab3514cc1a952cad2eefb9b75a9add218d6b0d4ted.mielczarek@gmail.com 292eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai crash_server = new CrashGenerationServer(kPipeName, 29335c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun NULL, 294eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowClientConnected, 295eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 296eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowClientCrashed, 297eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 298eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ShowClientExited, 299eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 300eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org NULL, 301eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org NULL, 302eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai true, 303eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai &dump_path); 304eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 305eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!crash_server->Start()) { 306eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MessageBoxW(NULL, L"Unable to start server", L"Dumper", MB_OK); 307eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete crash_server; 308eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai crash_server = NULL; 309eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 310eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 311eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 312eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid CrashServerStop() { 313eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete crash_server; 314eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai crash_server = NULL; 315eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 316eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 317eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid DerefZeroCrash() { 318eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int* x = 0; 319eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai *x = 1; 320eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 321eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 322eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid InvalidParamCrash() { 323eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai printf(NULL); 324eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 325eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 326eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid PureCallCrash() { 327eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai Derived derived; 328eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 329eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 330eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid RequestDump() { 331eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!handler->WriteMinidump()) { 332eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MessageBoxW(NULL, L"Dump request failed", L"Dumper", MB_OK); 333eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 3348602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun kCustomInfoEntries[1].set_value(L"1.1"); 335eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 336eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 337eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaivoid CleanUp() { 338eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (cs_edit) { 339eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DeleteCriticalSection(cs_edit); 340eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete cs_edit; 341eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 342eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 343eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (handler) { 344eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete handler; 345eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 346eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 347eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (crash_server) { 348eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai delete crash_server; 349eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 350eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 351eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 352eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Processes messages for the main window. 353eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 354f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com// WM_COMMAND - process the application menu. 355f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com// WM_PAINT - Paint the main window. 356f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com// WM_DESTROY - post a quit message and return. 357eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiLRESULT CALLBACK WndProc(HWND wnd, 358eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UINT message, 359eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WPARAM w_param, 360eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LPARAM l_param) { 361eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int message_id; 362eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int message_event; 363eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai PAINTSTRUCT ps; 364eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HDC hdc; 365eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 36637941410f3b94627d29415cd0e8021d2816c9f1athestig@chromium.org HINSTANCE instance = (HINSTANCE)GetWindowLongPtr(wnd, GWLP_HINSTANCE); 367eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 368eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai switch (message) { 369eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_COMMAND: 370eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parse the menu selections. 371eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai message_id = LOWORD(w_param); 372eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai message_event = HIWORD(w_param); 373eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai switch (message_id) { 374eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case IDM_ABOUT: 375eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DialogBox(current_instance, 376eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MAKEINTRESOURCE(IDD_ABOUTBOX), 377eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wnd, 378eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai About); 379eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 380eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case IDM_EXIT: 381eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DestroyWindow(wnd); 382eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 383eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_SERVER_START: 384eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashServerStart(); 385eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 386eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_SERVER_STOP: 387eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashServerStop(); 388eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 389eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_DEREFZERO: 390eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DerefZeroCrash(); 391eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 392eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_INVALIDPARAM: 393eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai InvalidParamCrash(); 394eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 395eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_PURECALL: 396eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai PureCallCrash(); 397eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 398eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case ID_CLIENT_REQUESTEXPLICITDUMP: 399eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai RequestDump(); 400eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 401eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai default: 402eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return DefWindowProc(wnd, message, w_param, l_param); 403eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 404eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 405eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_CREATE: 406eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai client_status_edit_box = CreateWindow(TEXT("EDIT"), 407eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 408eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kEditBoxStyles, 409eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 410eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 411eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 412eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 413eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai wnd, 414eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 415eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai instance, 416eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL); 417eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 418f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com case WM_SIZE: 419f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com // Make the edit control the size of the window's client area. 420f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com MoveWindow(client_status_edit_box, 421eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 422eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 0, 423eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LOWORD(l_param), // width of client area. 424eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HIWORD(l_param), // height of client area. 425eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TRUE); // repaint window. 426eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 427f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com case WM_SETFOCUS: 428eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai SetFocus(client_status_edit_box); 429eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 430eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_PAINT: 431eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai hdc = BeginPaint(wnd, &ps); 432eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EndPaint(wnd, &ps); 433eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 434eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_DESTROY: 435eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CleanUp(); 436eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai PostQuitMessage(0); 437eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 438eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai default: 439eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return DefWindowProc(wnd, message, w_param, l_param); 440eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 441eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 442eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return 0; 443eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 444eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 445eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Message handler for about box. 446eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiINT_PTR CALLBACK About(HWND dlg, 447eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UINT message, 448eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai WPARAM w_param, 449eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LPARAM l_param) { 450eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UNREFERENCED_PARAMETER(l_param); 451eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai switch (message) { 452eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_INITDIALOG: 453eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (INT_PTR)TRUE; 454eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 455eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai case WM_COMMAND: 456eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) { 457eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EndDialog(dlg, LOWORD(w_param)); 458eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (INT_PTR)TRUE; 459eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 460eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai break; 461eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 462eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 463eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return (INT_PTR)FALSE; 464eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 465eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 466eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} // namespace google_breakpad 467eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 468eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiint APIENTRY _tWinMain(HINSTANCE instance, 469eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HINSTANCE previous_instance, 470eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LPTSTR command_line, 471eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai int command_show) { 472eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai using namespace google_breakpad; 473eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 474eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UNREFERENCED_PARAMETER(previous_instance); 475eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai UNREFERENCED_PARAMETER(command_line); 476eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 477eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai cs_edit = new CRITICAL_SECTION(); 478eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai InitializeCriticalSection(cs_edit); 479eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 4808602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun CustomClientInfo custom_info = {kCustomInfoEntries, kCustomInfoCount}; 4810ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 482ae4d8370ee0ca72df810a1638f09c058748b8d1enealsid CrashServerStart(); 483eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // This is needed for CRT to not show dialog for invalid param 484eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // failures and instead let the code handle it. 485eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai _CrtSetReportMode(_CRT_ASSERT, 0); 486eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai handler = new ExceptionHandler(L"C:\\dumps\\", 487eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 488eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai google_breakpad::ShowDumpResults, 489eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai NULL, 490eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ExceptionHandler::HANDLER_ALL, 491eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MiniDumpNormal, 4920ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun kPipeName, 4930ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun &custom_info); 494eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 495eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Initialize global strings. 496eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString); 497eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai LoadString(instance, 498eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IDC_CRASHGENERATIONAPP, 499eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai window_class, 500eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai kMaxLoadString); 501eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MyRegisterClass(instance); 502eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 503eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Perform application initialization. 504f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com if (!InitInstance(instance, command_show)) { 505eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai return FALSE; 506eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 507eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 508eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HACCEL accel_table = LoadAccelerators( 509eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai instance, 510eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP)); 511eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 512eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Main message loop. 513eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MSG msg; 514eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai while (GetMessage(&msg, NULL, 0, 0)) { 515eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) { 516eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai TranslateMessage(&msg); 517eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DispatchMessage(&msg); 518eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 519eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 520eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 521f7838a8665eb5e46f2eb136679b27707d6adb523ivan.penkov@gmail.com return static_cast<int>(msg.wParam); 522eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} 523