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