1 // Copyright 2016 The Crashpad Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef CRASHPAD_UTIL_WIN_INITIAL_CLIENT_DATA_H_ 16 #define CRASHPAD_UTIL_WIN_INITIAL_CLIENT_DATA_H_ 17 18 #include <windows.h> 19 20 #include <string> 21 22 #include "base/macros.h" 23 #include "util/win/address_types.h" 24 25 namespace crashpad { 26 27 //! \brief A container for the data associated with the `--initial-client-data` 28 //! method for initializing the handler process on Windows. 29 class InitialClientData { 30 public: 31 //! \brief Constructs an unintialized instance to be used with 32 //! InitializeFromString(). 33 InitialClientData(); 34 35 //! \brief Constructs an instance of InitialClientData. This object does not 36 //! take ownership of any of the referenced HANDLEs. 37 //! 38 //! \param[in] request_crash_dump An event signalled from the client on crash. 39 //! \param[in] request_non_crash_dump An event signalled from the client when 40 //! it would like a dump to be taken, but allowed to continue afterwards. 41 //! \param[in] non_crash_dump_completed An event signalled from the handler to 42 //! tell the client that the non-crash dump has completed, and it can 43 //! continue execution. 44 //! \param[in] first_pipe_instance The server end and first instance of a pipe 45 //! that will be used for communication with all other clients after this 46 //! initial one. 47 //! \param[in] client_process A process handle for the client being 48 //! registered. 49 //! \param[in] crash_exception_information The address, in the client's 50 //! address space, of an ExceptionInformation structure, used when 51 //! handling a crash dump request. 52 //! \param[in] non_crash_exception_information The address, in the client's 53 //! address space, of an ExceptionInformation structure, used when 54 //! handling a non-crashing dump request. 55 //! \param[in] debug_critical_section_address The address, in the client 56 //! process's address space, of a `CRITICAL_SECTION` allocated with a 57 //! valid .DebugInfo field. This can be accomplished by using 58 //! InitializeCriticalSectionWithDebugInfoIfPossible() or equivalent. This 59 //! value can be `0`, however then limited lock data will be available in 60 //! minidumps. 61 InitialClientData(HANDLE request_crash_dump, 62 HANDLE request_non_crash_dump, 63 HANDLE non_crash_dump_completed, 64 HANDLE first_pipe_instance, 65 HANDLE client_process, 66 WinVMAddress crash_exception_information, 67 WinVMAddress non_crash_exception_information, 68 WinVMAddress debug_critical_section_address); 69 70 //! \brief Returns whether the object has been initialized successfully. IsValid()71 bool IsValid() const { return is_valid_; } 72 73 //! Initializes this object from a string representation presumed to have been 74 //! created by StringRepresentation(). 75 //! 76 //! \param[in] str The output of StringRepresentation(). 77 //! 78 //! \return `true` on success, or `false` with a message logged on failure. 79 bool InitializeFromString(const std::string& str); 80 81 //! \brief Returns a string representation of the data of this object, 82 //! suitable for passing on the command line. 83 std::string StringRepresentation() const; 84 request_crash_dump()85 HANDLE request_crash_dump() const { return request_crash_dump_; } request_non_crash_dump()86 HANDLE request_non_crash_dump() const { return request_non_crash_dump_; } non_crash_dump_completed()87 HANDLE non_crash_dump_completed() const { return non_crash_dump_completed_; } first_pipe_instance()88 HANDLE first_pipe_instance() const { return first_pipe_instance_; } client_process()89 HANDLE client_process() const { return client_process_; } crash_exception_information()90 WinVMAddress crash_exception_information() const { 91 return crash_exception_information_; 92 } non_crash_exception_information()93 WinVMAddress non_crash_exception_information() const { 94 return non_crash_exception_information_; 95 } debug_critical_section_address()96 WinVMAddress debug_critical_section_address() const { 97 return debug_critical_section_address_; 98 } 99 100 private: 101 WinVMAddress crash_exception_information_; 102 WinVMAddress non_crash_exception_information_; 103 WinVMAddress debug_critical_section_address_; 104 HANDLE request_crash_dump_; 105 HANDLE request_non_crash_dump_; 106 HANDLE non_crash_dump_completed_; 107 HANDLE first_pipe_instance_; 108 HANDLE client_process_; 109 bool is_valid_; 110 111 DISALLOW_COPY_AND_ASSIGN(InitialClientData); 112 }; 113 114 } // namespace crashpad 115 116 #endif // CRASHPAD_UTIL_WIN_INITIAL_CLIENT_DATA_H_ 117