| // 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__ |