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#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ 31eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ 32eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 33de9fe36b16a45972571b9d650633fe5cb156b536ted.mielczarek@gmail.com#include <windows.h> 34de9fe36b16a45972571b9d650633fe5cb156b536ted.mielczarek@gmail.com#include <dbghelp.h> 350ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun#include "client/windows/common/ipc_protocol.h" 3630054c0d2d06f509718fab13c2bf4e1860afd8dethestig@chromium.org#include "common/scoped_ptr.h" 37eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include "google_breakpad/common/minidump_format.h" 38eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 39eeca9921c563d802cccc5593bf55dcb7683e7250mmentovainamespace google_breakpad { 40eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 41eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiclass CrashGenerationServer; 42eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 43eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Abstraction for a crash client process. 44eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiclass ClientInfo { 45eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai public: 46eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Creates an instance with the given values. Gets the process 47eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // handle for the given process id and creates necessary event 48eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // objects. 49eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ClientInfo(CrashGenerationServer* crash_server, 50eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DWORD pid, 51eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MINIDUMP_TYPE dump_type, 52eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DWORD* thread_id, 53eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EXCEPTION_POINTERS** ex_info, 540ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun MDRawAssertionInfo* assert_info, 550ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun const CustomClientInfo& custom_client_info); 56eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 57eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ~ClientInfo(); 58eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 59eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashGenerationServer* crash_server() const { return crash_server_; } 60eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DWORD pid() const { return pid_; } 61eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MINIDUMP_TYPE dump_type() const { return dump_type_; } 62eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EXCEPTION_POINTERS** ex_info() const { return ex_info_; } 63eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MDRawAssertionInfo* assert_info() const { return assert_info_; } 64eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DWORD* thread_id() const { return thread_id_; } 65eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE process_handle() const { return process_handle_; } 66eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE dump_requested_handle() const { return dump_requested_handle_; } 67eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE dump_generated_handle() const { return dump_generated_handle_; } 68eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org DWORD crash_id() const { return crash_id_; } 69c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com const CustomClientInfo& custom_client_info() const { 70c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com return custom_client_info_; 71c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com } 72eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 73eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void set_dump_request_wait_handle(HANDLE value) { 74eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai dump_request_wait_handle_ = value; 75eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 76eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 77eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void set_process_exit_wait_handle(HANDLE value) { 78eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai process_exit_wait_handle_ = value; 79eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai } 80eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 8155cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // Unregister the dump request wait operation and wait for all callbacks 8255cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // that might already be running to complete before returning. 8355cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com void UnregisterDumpRequestWaitAndBlockUntilNoPending(); 8455cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com 8555cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // Unregister the process exit wait operation. If block_until_no_pending is 8655cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // true, wait for all callbacks that might already be running to complete 8755cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // before returning. 8855cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com void UnregisterProcessExitWait(bool block_until_no_pending); 89eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 90eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool Initialize(); 91eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; 92eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool GetClientThreadId(DWORD* thread_id) const; 938602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun 940ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun // Reads the custom information from the client process address space. 950ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun bool PopulateCustomInfo(); 968602aa71ecba32d26985bdbbddc8e618ca203ff9doshimun 970ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun // Returns the client custom information. 987ab126ecdd5237ccd566f415cc560b39f87e8a0fdoshimun CustomClientInfo GetCustomInfo() const; 99eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 100eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai private: 1013a516e41775099eb27533e7d2b3178c5f353a3a8doshimun // Calcualtes the uptime for the client process, converts it to a string and 1023a516e41775099eb27533e7d2b3178c5f353a3a8doshimun // stores it in the last entry of client custom info. 1033a516e41775099eb27533e7d2b3178c5f353a3a8doshimun void SetProcessUptime(); 1043a516e41775099eb27533e7d2b3178c5f353a3a8doshimun 105eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Crash generation server. 106eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashGenerationServer* crash_server_; 107eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 108eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Client process ID. 109eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DWORD pid_; 110eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 111eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Dump type requested by the client. 112eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MINIDUMP_TYPE dump_type_; 113eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 114eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Address of an EXCEPTION_POINTERS* variable in the client 115eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // process address space that will point to an instance of 116eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // EXCEPTION_POINTERS containing information about crash. 117eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 118eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // WARNING: Do not dereference these pointers as they are pointers 119eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // in the address space of another process. 120eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai EXCEPTION_POINTERS** ex_info_; 121eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 122eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Address of an instance of MDRawAssertionInfo in the client 123eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // process address space that will contain information about 124eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // non-exception related crashes like invalid parameter assertion 125eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // failures and pure calls. 126eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 127eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // WARNING: Do not dereference these pointers as they are pointers 128eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // in the address space of another process. 129eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai MDRawAssertionInfo* assert_info_; 130eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 1310ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun // Custom information about the client. 1320ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun CustomClientInfo custom_client_info_; 1330ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 1340ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun // Contains the custom client info entries read from the client process 1350ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun // memory. This will be populated only if the method GetClientCustomInfo 1360ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun // is called. 1370ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun scoped_array<CustomInfoEntry> custom_info_entries_; 1380ded3d718f4b090d106014bb0ea9dbb7af4e1d81doshimun 139eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Address of a variable in the client process address space that 140eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // will contain the thread id of the crashing client thread. 141eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 142eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // WARNING: Do not dereference these pointers as they are pointers 143eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // in the address space of another process. 144eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai DWORD* thread_id_; 145eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 146eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Client process handle. 147eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE process_handle_; 148eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 149eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Dump request event handle. 150eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE dump_requested_handle_; 151eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 152eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Dump generated event handle. 153eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE dump_generated_handle_; 154eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 155eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Wait handle for dump request event. 156eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE dump_request_wait_handle_; 157eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 158eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Wait handle for process exit event. 159eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE process_exit_wait_handle_; 160eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 1613a516e41775099eb27533e7d2b3178c5f353a3a8doshimun // Time when the client process started. It is used to determine the uptime 1623a516e41775099eb27533e7d2b3178c5f353a3a8doshimun // for the client process when it signals a crash. 1633a516e41775099eb27533e7d2b3178c5f353a3a8doshimun FILETIME start_time_; 1643a516e41775099eb27533e7d2b3178c5f353a3a8doshimun 165eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org // The crash id which can be used to request an upload. This will be the 166eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org // value of the low order dword of the process creation time for the process 167eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org // being dumped. 168eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org DWORD crash_id_; 169eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org 170eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Disallow copy ctor and operator=. 171eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ClientInfo(const ClientInfo& client_info); 172eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ClientInfo& operator=(const ClientInfo& client_info); 173eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai}; 174eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 175eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} // namespace google_breakpad 176eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 177eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ 178