| // 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_CRASH_GENERATION_CLIENT_H_ |
| #define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ |
| |
| #include <windows.h> |
| #include <dbghelp.h> |
| #include <string> |
| #include <utility> |
| #include "client/windows/common/ipc_protocol.h" |
| #include "common/scoped_ptr.h" |
| |
| namespace google_breakpad { |
| |
| struct CustomClientInfo; |
| |
| // Abstraction of client-side implementation of out of process |
| // crash generation. |
| // |
| // The process that desires to have out-of-process crash dump |
| // generation service can use this class in the following way: |
| // |
| // * Create an instance. |
| // * Call Register method so that the client tries to register |
| // with the server process and check the return value. If |
| // registration is not successful, out-of-process crash dump |
| // generation will not be available |
| // * Request dump generation by calling either of the two |
| // overloaded RequestDump methods - one in case of exceptions |
| // and the other in case of assertion failures |
| // |
| // Note that it is the responsibility of the client code of |
| // this class to set the unhandled exception filter with the |
| // system by calling the SetUnhandledExceptionFilter function |
| // and the client code should explicitly request dump generation. |
| class CrashGenerationClient { |
| public: |
| CrashGenerationClient(const wchar_t* pipe_name, |
| MINIDUMP_TYPE dump_type, |
| const CustomClientInfo* custom_info); |
| |
| CrashGenerationClient(HANDLE pipe_handle, |
| MINIDUMP_TYPE dump_type, |
| const CustomClientInfo* custom_info); |
| |
| ~CrashGenerationClient(); |
| |
| // Registers the client process with the crash server. |
| // |
| // Returns true if the registration is successful; false otherwise. |
| bool Register(); |
| |
| // Requests the crash server to upload a previous dump with the |
| // given crash id. |
| bool RequestUpload(DWORD crash_id); |
| |
| bool RequestDump(EXCEPTION_POINTERS* ex_info, |
| MDRawAssertionInfo* assert_info); |
| |
| // Requests the crash server to generate a dump with the given |
| // exception information. |
| // |
| // Returns true if the dump was successful; false otherwise. Note that |
| // if the registration step was not performed or it was not successful, |
| // false will be returned. |
| bool RequestDump(EXCEPTION_POINTERS* ex_info); |
| |
| // Requests the crash server to generate a dump with the given |
| // assertion information. |
| // |
| // Returns true if the dump was successful; false otherwise. Note that |
| // if the registration step was not performed or it was not successful, |
| // false will be returned. |
| bool RequestDump(MDRawAssertionInfo* assert_info); |
| |
| // If the crash generation client is running in a sandbox that prevents it |
| // from opening the named pipe directly, the server process may open the |
| // handle and duplicate it into the client process with this helper method. |
| // Returns INVALID_HANDLE_VALUE on failure. The process must have been opened |
| // with the PROCESS_DUP_HANDLE access right. |
| static HANDLE DuplicatePipeToClientProcess(const wchar_t* pipe_name, |
| HANDLE hProcess); |
| |
| private: |
| // Connects to the appropriate pipe and sets the pipe handle state. |
| // |
| // Returns the pipe handle if everything goes well; otherwise Returns NULL. |
| HANDLE ConnectToServer(); |
| |
| // Performs a handshake with the server over the given pipe which should be |
| // already connected to the server. |
| // |
| // Returns true if handshake with the server was successful; false otherwise. |
| bool RegisterClient(HANDLE pipe); |
| |
| // Validates the given server response. |
| bool ValidateResponse(const ProtocolMessage& msg) const; |
| |
| // Returns true if the registration step succeeded; false otherwise. |
| bool IsRegistered() const; |
| |
| // Connects to the given named pipe with given parameters. |
| // |
| // Returns true if the connection is successful; false otherwise. |
| HANDLE ConnectToPipe(const wchar_t* pipe_name, |
| DWORD pipe_access, |
| DWORD flags_attrs); |
| |
| // Signals the crash event and wait for the server to generate crash. |
| bool SignalCrashEventAndWait(); |
| |
| // Pipe name to use to talk to server. |
| std::wstring pipe_name_; |
| |
| // Pipe handle duplicated from server process. Only valid before |
| // Register is called. |
| HANDLE pipe_handle_; |
| |
| // Custom client information |
| CustomClientInfo custom_info_; |
| |
| // Type of dump to generate. |
| MINIDUMP_TYPE dump_type_; |
| |
| // Event to signal in case of a crash. |
| HANDLE crash_event_; |
| |
| // Handle to wait on after signaling a crash for the server |
| // to finish generating crash dump. |
| HANDLE crash_generated_; |
| |
| // Handle to a mutex that will become signaled with WAIT_ABANDONED |
| // if the server process goes down. |
| HANDLE server_alive_; |
| |
| // Server process id. |
| DWORD server_process_id_; |
| |
| // Id of the thread that caused the crash. |
| DWORD thread_id_; |
| |
| // Exception pointers for an exception crash. |
| EXCEPTION_POINTERS* exception_pointers_; |
| |
| // Assertion info for an invalid parameter or pure call crash. |
| MDRawAssertionInfo assert_info_; |
| |
| // Disable copy ctor and operator=. |
| CrashGenerationClient(const CrashGenerationClient& crash_client); |
| CrashGenerationClient& operator=(const CrashGenerationClient& crash_client); |
| }; |
| |
| } // namespace google_breakpad |
| |
| #endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ |