Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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_MINIDUMP_MINIDUMP_MODULE_WRITER_H_ | |
| 16 #define CRASHPAD_MINIDUMP_MINIDUMP_MODULE_WRITER_H_ | |
| 17 | |
| 18 #include <dbghelp.h> | |
| 19 #include <stdint.h> | |
| 20 #include <sys/types.h> | |
| 21 #include <time.h> | |
| 22 | |
| 23 #include <string> | |
| 24 #include <vector> | |
| 25 | |
| 26 #include "base/basictypes.h" | |
| 27 #include "base/memory/scoped_ptr.h" | |
| 28 #include "base/strings/string16.h" | |
| 29 #include "minidump/minidump_extensions.h" | |
| 30 #include "minidump/minidump_stream_writer.h" | |
| 31 #include "minidump/minidump_writable.h" | |
| 32 #include "util/file/file_writer.h" | |
| 33 | |
| 34 namespace crashpad { | |
| 35 | |
| 36 namespace internal { | |
| 37 class MinidumpUTF16StringWriter; | |
| 38 } // namespace internal | |
| 39 | |
| 40 //! \brief The base class for writers of CodeView records referenced by | |
| 41 //! MINIDUMP_MODULE::CvRecord in minidump files. | |
| 42 class MinidumpModuleCodeViewRecordWriter : public internal::MinidumpWritable { | |
| 43 public: | |
| 44 virtual ~MinidumpModuleCodeViewRecordWriter(); | |
| 45 | |
| 46 protected: | |
| 47 MinidumpModuleCodeViewRecordWriter() : MinidumpWritable() {} | |
| 48 | |
| 49 private: | |
| 50 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordWriter); | |
| 51 }; | |
| 52 | |
| 53 namespace internal { | |
| 54 | |
| 55 //! \brief The base class for writers of CodeView records that serve as links to | |
| 56 //! `.pdb` (program database) files. | |
| 57 template <typename CodeViewRecordType> | |
| 58 class MinidumpModuleCodeViewRecordPDBLinkWriter | |
| 59 : public MinidumpModuleCodeViewRecordWriter { | |
| 60 public: | |
| 61 //! \brief Sets the name of the `.pdb` file being linked to. | |
| 62 void SetPDBName(const std::string& pdb_name) { pdb_name_ = pdb_name; } | |
| 63 | |
| 64 protected: | |
| 65 MinidumpModuleCodeViewRecordPDBLinkWriter(); | |
| 66 virtual ~MinidumpModuleCodeViewRecordPDBLinkWriter(); | |
| 67 | |
| 68 // MinidumpWritable: | |
| 69 virtual size_t SizeOfObject() override; | |
| 70 virtual bool WriteObject(FileWriterInterface* file_writer) override; | |
| 71 | |
| 72 //! \brief Returns a pointer to the raw CodeView record’s data. | |
| 73 //! | |
| 74 //! Subclasses can use this to set fields in their codeview records other than | |
| 75 //! the `pdb_name` field. | |
| 76 CodeViewRecordType* codeview_record() { return &codeview_record_; } | |
| 77 | |
| 78 private: | |
| 79 CodeViewRecordType codeview_record_; | |
| 80 std::string pdb_name_; | |
| 81 | |
| 82 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDBLinkWriter); | |
| 83 }; | |
| 84 | |
| 85 } // namespace internal | |
| 86 | |
| 87 //! \brief The writer for a MinidumpModuleCodeViewRecordPDB20 object in a | |
| 88 //! minidump file. | |
| 89 //! | |
| 90 //! Most users will want MinidumpModuleCodeViewRecordPDB70Writer instead. | |
| 91 class MinidumpModuleCodeViewRecordPDB20Writer final | |
| 92 : public internal::MinidumpModuleCodeViewRecordPDBLinkWriter< | |
| 93 MinidumpModuleCodeViewRecordPDB20> { | |
| 94 public: | |
| 95 MinidumpModuleCodeViewRecordPDB20Writer() | |
| 96 : internal::MinidumpModuleCodeViewRecordPDBLinkWriter< | |
| 97 MinidumpModuleCodeViewRecordPDB20>() {} | |
| 98 | |
| 99 virtual ~MinidumpModuleCodeViewRecordPDB20Writer(); | |
| 100 | |
| 101 //! \brief Sets MinidumpModuleCodeViewRecordPDB20::timestamp and | |
| 102 //! MinidumpModuleCodeViewRecordPDB20::age. | |
| 103 void SetTimestampAndAge(time_t timestamp, uint32_t age); | |
| 104 | |
| 105 private: | |
| 106 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDB20Writer); | |
| 107 }; | |
| 108 | |
| 109 //! \brief The writer for a MinidumpModuleCodeViewRecordPDB20 object in a | |
|
Robert Sesek
2014/08/12 22:56:05
MinidumpModuleCodeViewRecordPDB70
| |
| 110 //! minidump file. | |
| 111 class MinidumpModuleCodeViewRecordPDB70Writer final | |
| 112 : public internal::MinidumpModuleCodeViewRecordPDBLinkWriter< | |
| 113 MinidumpModuleCodeViewRecordPDB70> { | |
| 114 public: | |
| 115 MinidumpModuleCodeViewRecordPDB70Writer() | |
| 116 : internal::MinidumpModuleCodeViewRecordPDBLinkWriter< | |
| 117 MinidumpModuleCodeViewRecordPDB70>() {} | |
| 118 | |
| 119 virtual ~MinidumpModuleCodeViewRecordPDB70Writer(); | |
| 120 | |
| 121 //! \brief Sets MinidumpModuleCodeViewRecordPDB70::uuid and | |
| 122 //! MinidumpModuleCodeViewRecordPDB70::age. | |
| 123 void SetUUIDAndAge(const UUID& uuid, uint32_t age) { | |
| 124 codeview_record()->uuid = uuid; | |
| 125 codeview_record()->age = age; | |
| 126 } | |
| 127 | |
| 128 private: | |
| 129 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleCodeViewRecordPDB70Writer); | |
| 130 }; | |
| 131 | |
| 132 //! \brief The writer for an IMAGE_DEBUG_MISC object in a minidump file. | |
| 133 //! | |
| 134 //! Most users will want MinidumpModuleCodeViewRecordPDB70Writer instead. | |
| 135 class MinidumpModuleMiscDebugRecordWriter final | |
| 136 : public internal::MinidumpWritable { | |
| 137 public: | |
| 138 MinidumpModuleMiscDebugRecordWriter(); | |
| 139 ~MinidumpModuleMiscDebugRecordWriter() {} | |
| 140 | |
| 141 //! \brief Sets IMAGE_DEBUG_MISC::DataType. | |
| 142 void SetDataType(uint32_t data_type) { | |
| 143 image_debug_misc_.DataType = data_type; | |
| 144 } | |
| 145 | |
| 146 //! \brief Sets IMAGE_DEBUG_MISC::Data, IMAGE_DEBUG_MISC::Length, and | |
| 147 //! IMAGE_DEBUG_MISC::Unicode. | |
| 148 //! | |
| 149 //! If \a utf16 is `true`, \a data will be treated as UTF-8 data and will be | |
| 150 //! converted to UTF-16, and IMAGE_DEBUG_MISC::Unicode will be set to `1`. | |
| 151 //! Otherwise, \a data will be used as-is and IMAGE_DEBUG_MISC::Unicode will | |
| 152 //! be set to `0`. | |
| 153 void SetData(const std::string& data, bool utf16); | |
| 154 | |
| 155 protected: | |
| 156 // MinidumpWritable: | |
| 157 virtual bool Freeze() override; | |
| 158 virtual size_t SizeOfObject() override; | |
| 159 virtual bool WriteObject(FileWriterInterface* file_writer) override; | |
| 160 | |
| 161 private: | |
| 162 IMAGE_DEBUG_MISC image_debug_misc_; | |
| 163 std::string data_; | |
| 164 string16 data_utf16_; | |
| 165 | |
| 166 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleMiscDebugRecordWriter); | |
| 167 }; | |
| 168 | |
| 169 //! \brief The writer for a MINIDUMP_MODULE object in a minidump file. | |
| 170 //! | |
| 171 //! Because MINIDUMP_MODULE objects only appear as elements of | |
| 172 //! MINIDUMP_MODULE_LIST objects, this class does not write any data on its own. | |
| 173 //! It makes its MINIDUMP_MODULE data available to its MinidumpModuleListWriter | |
| 174 //! parent, which writes it as part of a MINIDUMP_MODULE_LIST. | |
| 175 class MinidumpModuleWriter final : public internal::MinidumpWritable { | |
| 176 public: | |
| 177 MinidumpModuleWriter(); | |
| 178 ~MinidumpModuleWriter(); | |
| 179 | |
| 180 //! \brief Returns a MINIDUMP_MODULE referencing this object’s data. | |
| 181 //! | |
| 182 //! This method is expected to be called by a MinidumpModuleListWriter in | |
| 183 //! order to obtain a MINIDUMP_MODULE to include in its list. | |
| 184 //! | |
| 185 //! \note Valid in #kStateWritable. | |
| 186 const MINIDUMP_MODULE* MinidumpModule() const; | |
| 187 | |
| 188 //! \brief Arranges for MINIDUMP_MODULE::ModuleNameRva to point to a | |
| 189 //! MINIDUMP_STRING containing \a name. | |
| 190 //! | |
| 191 //! A name is required in all MINIDUMP_MODULE objects. | |
| 192 //! | |
| 193 //! \note Valid in #kStateMutable. | |
| 194 void SetName(const std::string& name); | |
| 195 | |
| 196 //! \brief Arranges for MINIDUMP_MODULE::CvRecord to point to a CodeView | |
| 197 //! record to be written by \a codeview_record. | |
| 198 //! | |
| 199 //! \a codeview_record will become a child of this object in the overall tree | |
| 200 //! of internal::MinidumpWritable objects. | |
| 201 //! | |
| 202 //! \note Valid in #kStateMutable. | |
| 203 void SetCodeViewRecord(MinidumpModuleCodeViewRecordWriter* codeview_record); | |
| 204 | |
| 205 //! \brief Arranges for MINIDUMP_MODULE::MiscRecord to point to an | |
| 206 //! IMAGE_DEBUG_MISC object to be written by \a misc_debug_record. | |
| 207 //! | |
| 208 //! \a misc_debug_record will become a child of this object in the overall | |
| 209 //! tree of internal::MinidumpWritable objects. | |
| 210 //! | |
| 211 //! \note Valid in #kStateMutable. | |
| 212 void SetMiscDebugRecord( | |
| 213 MinidumpModuleMiscDebugRecordWriter* misc_debug_record); | |
| 214 | |
| 215 //! \brief Sets IMAGE_DEBUG_MISC::BaseOfImage. | |
| 216 void SetImageBaseAddress(uint64_t image_base_address) { | |
| 217 module_.BaseOfImage = image_base_address; | |
| 218 } | |
| 219 | |
| 220 //! \brief Sets IMAGE_DEBUG_MISC::SizeOfImage. | |
| 221 void SetImageSize(uint32_t image_size) { module_.SizeOfImage = image_size; } | |
| 222 | |
| 223 //! \brief Sets IMAGE_DEBUG_MISC::CheckSum. | |
| 224 void SetChecksum(uint32_t checksum) { module_.CheckSum = checksum; } | |
| 225 | |
| 226 //! \brief Sets IMAGE_DEBUG_MISC::TimeDateStamp. | |
| 227 //! | |
| 228 //! \note Valid in #kStateMutable. | |
| 229 void SetTimestamp(time_t timestamp); | |
| 230 | |
| 231 //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileVersionMS | |
| 232 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileVersionMS" and \ref | |
| 233 //! VS_FIXEDFILEINFO::dwFileVersionLS | |
| 234 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileVersionLS". | |
| 235 //! | |
| 236 //! \note Valid in #kStateMutable. | |
| 237 void SetFileVersion(uint16_t version_0, | |
| 238 uint16_t version_1, | |
| 239 uint16_t version_2, | |
| 240 uint16_t version_3); | |
| 241 | |
| 242 //! \brief Sets \ref VS_FIXEDFILEINFO::dwProductVersionMS | |
| 243 //! "IMAGE_DEBUG_MISC::VersionInfo::dwProductVersionMS" and \ref | |
| 244 //! VS_FIXEDFILEINFO::dwProductVersionLS | |
| 245 //! "IMAGE_DEBUG_MISC::VersionInfo::dwProductVersionLS". | |
| 246 //! | |
| 247 //! \note Valid in #kStateMutable. | |
| 248 void SetProductVersion(uint16_t version_0, | |
| 249 uint16_t version_1, | |
| 250 uint16_t version_2, | |
| 251 uint16_t version_3); | |
| 252 | |
| 253 //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileFlags | |
| 254 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileFlags" and \ref | |
| 255 //! VS_FIXEDFILEINFO::dwFileFlagsMask | |
| 256 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileFlagsMask". | |
| 257 //! | |
| 258 //! \note Valid in #kStateMutable. | |
| 259 void SetFileFlagsAndMask(uint32_t file_flags, uint32_t file_flags_mask); | |
| 260 | |
| 261 //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileOS | |
| 262 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileOS". | |
| 263 void SetFileOS(uint32_t file_os) { module_.VersionInfo.dwFileOS = file_os; } | |
| 264 | |
| 265 //! \brief Sets \ref VS_FIXEDFILEINFO::dwFileType | |
| 266 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileType" and \ref | |
| 267 //! VS_FIXEDFILEINFO::dwFileSubtype | |
| 268 //! "IMAGE_DEBUG_MISC::VersionInfo::dwFileSubtype". | |
| 269 void SetFileTypeAndSubtype(uint32_t file_type, uint32_t file_subtype) { | |
| 270 module_.VersionInfo.dwFileType = file_type; | |
| 271 module_.VersionInfo.dwFileSubtype = file_subtype; | |
| 272 } | |
| 273 | |
| 274 protected: | |
| 275 // MinidumpWritable: | |
| 276 virtual bool Freeze() override; | |
| 277 virtual size_t SizeOfObject() override; | |
| 278 virtual std::vector<MinidumpWritable*> Children() override; | |
| 279 virtual bool WriteObject(FileWriterInterface* file_writer) override; | |
| 280 | |
| 281 private: | |
| 282 MINIDUMP_MODULE module_; | |
| 283 scoped_ptr<internal::MinidumpUTF16StringWriter> name_; | |
| 284 MinidumpModuleCodeViewRecordWriter* codeview_record_; // weak | |
| 285 MinidumpModuleMiscDebugRecordWriter* misc_debug_record_; // weak | |
| 286 | |
| 287 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleWriter); | |
| 288 }; | |
| 289 | |
| 290 //! \brief The writer for a MINIDUMP_MODULE_LIST stream in a minidump file, | |
| 291 //! containing a list of MINIDUMP_MODULE objects. | |
| 292 class MinidumpModuleListWriter final : public internal::MinidumpStreamWriter { | |
| 293 public: | |
| 294 MinidumpModuleListWriter(); | |
| 295 ~MinidumpModuleListWriter(); | |
| 296 | |
| 297 //! \brief Adds a MinidumpModuleWriter to the MINIDUMP_MODULE_LIST. | |
| 298 //! | |
| 299 //! \a module will become a child of this object in the overall tree of | |
| 300 //! internal::MinidumpWritable objects. | |
| 301 //! | |
| 302 //! \note Valid in #kStateMutable. | |
| 303 void AddModule(MinidumpModuleWriter* module); | |
| 304 | |
| 305 protected: | |
| 306 // MinidumpWritable: | |
| 307 virtual bool Freeze() override; | |
| 308 virtual size_t SizeOfObject() override; | |
| 309 virtual std::vector<MinidumpWritable*> Children() override; | |
| 310 virtual bool WriteObject(FileWriterInterface* file_writer) override; | |
| 311 | |
| 312 // MinidumpStreamWriter: | |
| 313 virtual MinidumpStreamType StreamType() const override; | |
| 314 | |
| 315 private: | |
| 316 MINIDUMP_MODULE_LIST module_list_base_; | |
| 317 std::vector<MinidumpModuleWriter*> modules_; // weak | |
| 318 | |
| 319 DISALLOW_COPY_AND_ASSIGN(MinidumpModuleListWriter); | |
| 320 }; | |
| 321 | |
| 322 } // namespace crashpad | |
| 323 | |
| 324 #endif // CRASHPAD_MINIDUMP_MINIDUMP_MODULE_WRITER_H_ | |
| OLD | NEW |