synth_minidump.cc revision 233501d467e38955ba38065b7c717486b94c1da9
19244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Copyright (c) 2010, Google Inc. 29244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// All rights reserved. 39244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// 49244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Redistribution and use in source and binary forms, with or without 59244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// modification, are permitted provided that the following conditions are 69244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// met: 79244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// 89244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// * Redistributions of source code must retain the above copyright 99244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// notice, this list of conditions and the following disclaimer. 109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// * Redistributions in binary form must reproduce the above 119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// copyright notice, this list of conditions and the following disclaimer 129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// in the documentation and/or other materials provided with the 139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// distribution. 149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// * Neither the name of Google Inc. nor the names of its 159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// contributors may be used to endorse or promote products derived from 169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// this software without specific prior written permission. 179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// 189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> 319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy// synth_minidump.cc: Implementation of SynthMinidump. See synth_minidump.h 339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy#include "processor/synth_minidump.h" 359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 369244496c6f875ef1f7166d65f218d57ae92cabaajimblandynamespace google_breakpad { 379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 389244496c6f875ef1f7166d65f218d57ae92cabaajimblandynamespace SynthMinidump { 399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 409244496c6f875ef1f7166d65f218d57ae92cabaajimblandySection::Section(const Dump &dump) 416f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarek : test_assembler::Section(dump.endianness()) { } 429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 436f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid Section::CiteLocationIn(test_assembler::Section *section) const { 449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy if (this) 459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy (*section).D32(size_).D32(file_offset_); 469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy else 479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy (*section).D32(0).D32(0); 489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 506f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid Stream::CiteStreamIn(test_assembler::Section *section) const { 519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy section->D32(type_); 529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy CiteLocationIn(section); 539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 559244496c6f875ef1f7166d65f218d57ae92cabaajimblandySystemInfo::SystemInfo(const Dump &dump, 569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDRawSystemInfo &system_info, 579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const String &csd_version) 589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy : Stream(dump, MD_SYSTEM_INFO_STREAM) { 599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D16(system_info.processor_architecture); 609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D16(system_info.processor_level); 619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D16(system_info.processor_revision); 629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D8(system_info.number_of_processors); 639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D8(system_info.product_type); 649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.major_version); 659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.minor_version); 669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.build_number); 679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.platform_id); 689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy csd_version.CiteStringIn(this); 699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D16(system_info.suite_mask); 709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D16(system_info.reserved2); // Well, why not? 719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // MDCPUInformation cpu; 739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy if (system_info.processor_architecture == MD_CPU_ARCHITECTURE_X86) { 749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.cpu.x86_cpu_info.vendor_id[0]); 759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.cpu.x86_cpu_info.vendor_id[1]); 769244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.cpu.x86_cpu_info.vendor_id[2]); 779244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.cpu.x86_cpu_info.version_information); 789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.cpu.x86_cpu_info.feature_information); 799244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(system_info.cpu.x86_cpu_info.amd_extended_cpu_features); 809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy } else { 819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D64(system_info.cpu.other_cpu_info.processor_features[0]); 829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D64(system_info.cpu.other_cpu_info.processor_features[1]); 839244496c6f875ef1f7166d65f218d57ae92cabaajimblandy } 849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 869244496c6f875ef1f7166d65f218d57ae92cabaajimblandyconst MDRawSystemInfo SystemInfo::windows_x86 = { 879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_CPU_ARCHITECTURE_X86, // processor_architecture 889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 6, // processor_level 899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xd08, // processor_revision 909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1, // number_of_processors 919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1, // product_type 929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 5, // major_version 939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1, // minor_version 949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2600, // build_number 959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2, // platform_id 969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xdeadbeef, // csd_version_rva 979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x100, // suite_mask 989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0, // reserved2 999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy { // cpu 1009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy { // x86_cpu_info 1019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id 1029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x6d8, // version_information 1039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xafe9fbff, // feature_information 1049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0xffffffff // amd_extended_cpu_features 1059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy } 1069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy } 1079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy}; 1089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1099244496c6f875ef1f7166d65f218d57ae92cabaajimblandyconst string SystemInfo::windows_x86_csd_version = "Service Pack 2"; 1109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1119244496c6f875ef1f7166d65f218d57ae92cabaajimblandyString::String(const Dump &dump, const string &contents) : Section(dump) { 1129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(contents.size() * 2); 1139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy for (string::const_iterator i = contents.begin(); i != contents.end(); i++) 1149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D16(*i); 1159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1176f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid String::CiteStringIn(test_assembler::Section *section) const { 1189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy section->D32(file_offset_); 1199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1216f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarekvoid Memory::CiteMemoryIn(test_assembler::Section *section) const { 1229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy section->D64(address_); 1239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy CiteLocationIn(section); 1249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1269244496c6f875ef1f7166d65f218d57ae92cabaajimblandyContext::Context(const Dump &dump, const MDRawContextX86 &context) 1279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy : Section(dump) { 1289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // The caller should have properly set the CPU type flag. 129233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // The high 24 bits identify the CPU. Note that context records with no CPU 130233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com // type information can be valid (e.g. produced by ::RtlCaptureContext). 131233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com assert(((context.context_flags & MD_CONTEXT_CPU_MASK) == 0) || 132233501d467e38955ba38065b7c717486b94c1da9ivan.penkov@gmail.com (context.context_flags & MD_CONTEXT_X86)); 1339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // It doesn't make sense to store x86 registers in big-endian form. 1349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy assert(dump.endianness() == kLittleEndian); 1359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.context_flags); 1369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.dr0); 1379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.dr1); 1389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.dr2); 1399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.dr3); 1409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.dr6); 1419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.dr7); 1429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.control_word); 1439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.status_word); 1449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.tag_word); 1459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.error_offset); 1469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.error_selector); 1479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.data_offset); 1489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.data_selector); 1499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // context.float_save.register_area[] contains 8-bit quantities and 1509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // does not need to be swapped. 1519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Append(context.float_save.register_area, 1529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy sizeof(context.float_save.register_area)); 1539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.float_save.cr0_npx_state); 1549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.gs); 1559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.fs); 1569244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.es); 1579244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.ds); 1589244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.edi); 1599244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.esi); 1609244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.ebx); 1619244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.edx); 1629244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.ecx); 1639244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.eax); 1649244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.ebp); 1659244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.eip); 1669244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.cs); 1679244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.eflags); 1689244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.esp); 1699244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(context.ss); 1709244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // context.extended_registers[] contains 8-bit quantities and does 1719244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // not need to be swapped. 1729244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Append(context.extended_registers, sizeof(context.extended_registers)); 1739244496c6f875ef1f7166d65f218d57ae92cabaajimblandy assert(Size() == sizeof(MDRawContextX86)); 1749244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 1759244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 1761a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekContext::Context(const Dump &dump, const MDRawContextARM &context) 1771a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek : Section(dump) { 1781a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek // The caller should have properly set the CPU type flag. 1791a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek assert((context.context_flags & MD_CONTEXT_ARM) || 1801a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek (context.context_flags & MD_CONTEXT_ARM_OLD)); 1811a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek // It doesn't make sense to store ARM registers in big-endian form. 1821a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek assert(dump.endianness() == kLittleEndian); 1831a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(context.context_flags); 1841a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i) 1851a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(context.iregs[i]); 1861a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(context.cpsr); 1871a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D64(context.float_save.fpscr); 1881a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT; ++i) 1891a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D64(context.float_save.regs[i]); 1901a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT; ++i) 1911a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(context.float_save.extra[i]); 1921a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek assert(Size() == sizeof(MDRawContextARM)); 1931a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek} 1941a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 1959244496c6f875ef1f7166d65f218d57ae92cabaajimblandyThread::Thread(const Dump &dump, 1969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t thread_id, const Memory &stack, const Context &context, 1979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t suspend_count, u_int32_t priority_class, 1989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t priority, u_int64_t teb) : Section(dump) { 1999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(thread_id); 2009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(suspend_count); 2019244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(priority_class); 2029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(priority); 2039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D64(teb); 2049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stack.CiteMemoryIn(this); 2059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy context.CiteLocationIn(this); 2069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy assert(Size() == sizeof(MDRawThread)); 2079244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 2089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2099244496c6f875ef1f7166d65f218d57ae92cabaajimblandyModule::Module(const Dump &dump, 2109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int64_t base_of_image, 2119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t size_of_image, 2129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const String &name, 2139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t time_date_stamp, 2149244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t checksum, 2159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const MDVSFixedFileInfo &version_info, 2169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const Section *cv_record, 2179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy const Section *misc_record) : Section(dump) { 2189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D64(base_of_image); 2199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(size_of_image); 2209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(checksum); 2219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(time_date_stamp); 2229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy name.CiteStringIn(this); 2239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.signature); 2249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.struct_version); 2259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_version_hi); 2269244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_version_lo); 2279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.product_version_hi); 2289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.product_version_lo); 2299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_flags_mask); 2309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_flags); 2319244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_os); 2329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_type); 2339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_subtype); 2349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_date_hi); 2359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version_info.file_date_lo); 2369244496c6f875ef1f7166d65f218d57ae92cabaajimblandy cv_record->CiteLocationIn(this); 2379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy misc_record->CiteLocationIn(this); 2389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D64(0).D64(0); 2399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 2409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2419244496c6f875ef1f7166d65f218d57ae92cabaajimblandyconst MDVSFixedFileInfo Module::stock_version_info = { 2429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_SIGNATURE, // signature 2439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_VERSION, // struct_version 2449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x11111111, // file_version_hi 2459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x22222222, // file_version_lo 2469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x33333333, // product_version_hi 2479244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0x44444444, // product_version_lo 2489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG, // file_flags_mask 2499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG, // file_flags 2509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_FILE_OS_NT | MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32, 2519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // file_os 2529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_FILE_TYPE_APP, // file_type 2539244496c6f875ef1f7166d65f218d57ae92cabaajimblandy MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN, // file_subtype 2549244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0, // file_date_hi 2559244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 0 // file_date_lo 2561a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek}; 2571a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek 2581a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarekException::Exception(const Dump &dump, 2591a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek const Context &context, 2601a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek u_int32_t thread_id, 2611a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek u_int32_t exception_code, 2621a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek u_int32_t exception_flags, 2631a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek u_int64_t exception_address) 2641a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek : Stream(dump, MD_EXCEPTION_STREAM) { 2651a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(thread_id); 2661a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(0); // __align 2671a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(exception_code); 2681a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(exception_flags); 2691a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D64(0); // exception_record 2701a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D64(exception_address); 2711a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(0); // number_parameters 2721a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D32(0); // __align 2731a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek for (int i = 0; i < MD_EXCEPTION_MAXIMUM_PARAMETERS; ++i) 2741a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek D64(0); // exception_information 2751a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek context.CiteLocationIn(this); 2761a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek assert(Size() == sizeof(MDRawExceptionStream)); 2771a1890a52aaf8bfbea34a8d918423e6c81f3ea80ted.mielczarek} 2789244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 2799244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump::Dump(u_int64_t flags, 2809244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Endianness endianness, 2819244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t version, 2829244496c6f875ef1f7166d65f218d57ae92cabaajimblandy u_int32_t date_time_stamp) 2836f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarek : test_assembler::Section(endianness), 2849244496c6f875ef1f7166d65f218d57ae92cabaajimblandy file_start_(0), 2859244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream_directory_(*this), 2869244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream_count_(0), 2879244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list_(*this, MD_THREAD_LIST_STREAM), 2889244496c6f875ef1f7166d65f218d57ae92cabaajimblandy module_list_(*this, MD_MODULE_LIST_STREAM), 2899244496c6f875ef1f7166d65f218d57ae92cabaajimblandy memory_list_(*this, MD_MEMORY_LIST_STREAM) 2909244496c6f875ef1f7166d65f218d57ae92cabaajimblandy { 2919244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(MD_HEADER_SIGNATURE); 2929244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(version); 2939244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(stream_count_label_); 2949244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(stream_directory_rva_); 2959244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(0); 2969244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D32(date_time_stamp); 2979244496c6f875ef1f7166d65f218d57ae92cabaajimblandy D64(flags); 2989244496c6f875ef1f7166d65f218d57ae92cabaajimblandy assert(Size() == sizeof(MDRawHeader)); 2999244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3009244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3019244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(SynthMinidump::Section *section) { 3029244496c6f875ef1f7166d65f218d57ae92cabaajimblandy section->Finish(file_start_ + Size()); 3039244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Append(*section); 3049244496c6f875ef1f7166d65f218d57ae92cabaajimblandy return *this; 3059244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3069244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3079244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Stream *stream) { 3089244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Add(static_cast<SynthMinidump::Section *>(stream)); 3099244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream->CiteStreamIn(&stream_directory_); 3109244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream_count_++; 3119244496c6f875ef1f7166d65f218d57ae92cabaajimblandy return *this; 3129244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3139244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3149244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Memory *memory) { 3159244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Add the memory contents themselves to the file. 3169244496c6f875ef1f7166d65f218d57ae92cabaajimblandy Add(static_cast<SynthMinidump::Section *>(memory)); 3179244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3189244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // The memory list is a list of MDMemoryDescriptors, not of actual 3199244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // memory elements. Produce a descriptor, and add that to the list. 3209244496c6f875ef1f7166d65f218d57ae92cabaajimblandy SynthMinidump::Section descriptor(*this); 3219244496c6f875ef1f7166d65f218d57ae92cabaajimblandy memory->CiteMemoryIn(&descriptor); 3229244496c6f875ef1f7166d65f218d57ae92cabaajimblandy memory_list_.Add(&descriptor); 3239244496c6f875ef1f7166d65f218d57ae92cabaajimblandy return *this; 3249244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3259244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3269244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Thread *thread) { 3279244496c6f875ef1f7166d65f218d57ae92cabaajimblandy thread_list_.Add(thread); 3289244496c6f875ef1f7166d65f218d57ae92cabaajimblandy return *this; 3299244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3309244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3319244496c6f875ef1f7166d65f218d57ae92cabaajimblandyDump &Dump::Add(Module *module) { 3329244496c6f875ef1f7166d65f218d57ae92cabaajimblandy module_list_.Add(module); 3339244496c6f875ef1f7166d65f218d57ae92cabaajimblandy return *this; 3349244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3359244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3369244496c6f875ef1f7166d65f218d57ae92cabaajimblandyvoid Dump::Finish() { 3379244496c6f875ef1f7166d65f218d57ae92cabaajimblandy if (!thread_list_.Empty()) Add(&thread_list_); 3389244496c6f875ef1f7166d65f218d57ae92cabaajimblandy if (!module_list_.Empty()) Add(&module_list_); 3399244496c6f875ef1f7166d65f218d57ae92cabaajimblandy if (!memory_list_.Empty()) Add(&memory_list_); 3409244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3419244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // Create the stream directory. We don't use 3429244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // stream_directory_.Finish here, because the stream directory isn't 3439244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // cited using a location descriptor; rather, the Minidump header 3449244496c6f875ef1f7166d65f218d57ae92cabaajimblandy // has the stream count and MDRVA. 3459244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream_count_label_ = stream_count_; 3469244496c6f875ef1f7166d65f218d57ae92cabaajimblandy stream_directory_rva_ = file_start_ + Size(); 3476f598cc435f8c557b33f85802f1571ef745c37b0ted.mielczarek Append(static_cast<test_assembler::Section &>(stream_directory_)); 3489244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} 3499244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3509244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} // namespace SynthMinidump 3519244496c6f875ef1f7166d65f218d57ae92cabaajimblandy 3529244496c6f875ef1f7166d65f218d57ae92cabaajimblandy} // namespace google_breakpad 353