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