// Copyright (c) 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ #define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ #include <windows.h> #include <dbghelp.h> #include "client/windows/common/ipc_protocol.h" #include "common/scoped_ptr.h" #include "google_breakpad/common/minidump_format.h" namespace google_breakpad { class CrashGenerationServer; // Abstraction for a crash client process. class ClientInfo { public: // Creates an instance with the given values. Gets the process // handle for the given process id and creates necessary event // objects. ClientInfo(CrashGenerationServer* crash_server, DWORD pid, MINIDUMP_TYPE dump_type, DWORD* thread_id, EXCEPTION_POINTERS** ex_info, MDRawAssertionInfo* assert_info, const CustomClientInfo& custom_client_info); ~ClientInfo(); CrashGenerationServer* crash_server() const { return crash_server_; } DWORD pid() const { return pid_; } MINIDUMP_TYPE dump_type() const { return dump_type_; } EXCEPTION_POINTERS** ex_info() const { return ex_info_; } MDRawAssertionInfo* assert_info() const { return assert_info_; } DWORD* thread_id() const { return thread_id_; } HANDLE process_handle() const { return process_handle_; } HANDLE dump_requested_handle() const { return dump_requested_handle_; } HANDLE dump_generated_handle() const { return dump_generated_handle_; } DWORD crash_id() const { return crash_id_; } const CustomClientInfo& custom_client_info() const { return custom_client_info_; } void set_dump_request_wait_handle(HANDLE value) { dump_request_wait_handle_ = value; } void set_process_exit_wait_handle(HANDLE value) { process_exit_wait_handle_ = value; } // Unregister the dump request wait operation and wait for all callbacks // that might already be running to complete before returning. void UnregisterDumpRequestWaitAndBlockUntilNoPending(); // Unregister the process exit wait operation. If block_until_no_pending is // true, wait for all callbacks that might already be running to complete // before returning. void UnregisterProcessExitWait(bool block_until_no_pending); bool Initialize(); bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; bool GetClientThreadId(DWORD* thread_id) const; // Reads the custom information from the client process address space. bool PopulateCustomInfo(); // Returns the client custom information. CustomClientInfo GetCustomInfo() const; private: // Calcualtes the uptime for the client process, converts it to a string and // stores it in the last entry of client custom info. void SetProcessUptime(); // Crash generation server. CrashGenerationServer* crash_server_; // Client process ID. DWORD pid_; // Dump type requested by the client. MINIDUMP_TYPE dump_type_; // Address of an EXCEPTION_POINTERS* variable in the client // process address space that will point to an instance of // EXCEPTION_POINTERS containing information about crash. // // WARNING: Do not dereference these pointers as they are pointers // in the address space of another process. EXCEPTION_POINTERS** ex_info_; // Address of an instance of MDRawAssertionInfo in the client // process address space that will contain information about // non-exception related crashes like invalid parameter assertion // failures and pure calls. // // WARNING: Do not dereference these pointers as they are pointers // in the address space of another process. MDRawAssertionInfo* assert_info_; // Custom information about the client. CustomClientInfo custom_client_info_; // Contains the custom client info entries read from the client process // memory. This will be populated only if the method GetClientCustomInfo // is called. scoped_array<CustomInfoEntry> custom_info_entries_; // Address of a variable in the client process address space that // will contain the thread id of the crashing client thread. // // WARNING: Do not dereference these pointers as they are pointers // in the address space of another process. DWORD* thread_id_; // Client process handle. HANDLE process_handle_; // Dump request event handle. HANDLE dump_requested_handle_; // Dump generated event handle. HANDLE dump_generated_handle_; // Wait handle for dump request event. HANDLE dump_request_wait_handle_; // Wait handle for process exit event. HANDLE process_exit_wait_handle_; // Time when the client process started. It is used to determine the uptime // for the client process when it signals a crash. FILETIME start_time_; // The crash id which can be used to request an upload. This will be the // value of the low order dword of the process creation time for the process // being dumped. DWORD crash_id_; // Disallow copy ctor and operator=. ClientInfo(const ClientInfo& client_info); ClientInfo& operator=(const ClientInfo& client_info); }; } // namespace google_breakpad #endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__