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(&current_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