// Copyright 2014 The Crashpad Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ #define CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_ #include <stdint.h> #include "compat/non_win/timezoneapi.h" #include "compat/non_win/verrsrc.h" #include "compat/non_win/winnt.h" //! \file //! \brief The magic number for a minidump file, stored in //! MINIDUMP_HEADER::Signature. //! //! A hex dump of a little-endian minidump file will begin with the string //! “MDMP”. #define MINIDUMP_SIGNATURE … //! \brief The version of a minidump file, stored in MINIDUMP_HEADER::Version. #define MINIDUMP_VERSION … //! \brief An offset within a minidump file, relative to the start of its //! MINIDUMP_HEADER. //! //! RVA stands for “relative virtual address”. Within a minidump file, RVAs are //! used as pointers to link structures together. //! //! \sa MINIDUMP_LOCATION_DESCRIPTOR RVA; //! \brief A 64-bit offset within a minidump file, relative to the start of its //! MINIDUMP_HEADER. //! //! RVA stands for “relative virtual address”. Within a minidump file, RVAs are //! used as pointers to link structures together. //! //! \sa MINIDUMP_LOCATION_DESCRIPTOR64 RVA64; //! \brief A pointer to a structure or union within a minidump file. struct __attribute__((packed, aligned(4))) MINIDUMP_LOCATION_DESCRIPTOR { … }; //! \brief A 64-bit pointer to a structure or union within a minidump file. struct __attribute__((packed, aligned(4))) MINIDUMP_LOCATION_DESCRIPTOR64 { … }; //! \brief A pointer to a snapshot of a region of memory contained within a //! minidump file. //! //! \sa MINIDUMP_MEMORY_LIST struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_DESCRIPTOR { … }; //! \brief The top-level structure identifying a minidump file. //! //! This structure contains a pointer to the stream directory, a second-level //! structure which in turn contains pointers to third-level structures //! (“streams”) containing the data within the minidump file. This structure //! also contains the minidump file’s magic numbers, and other bookkeeping data. //! //! This structure must be present at the beginning of a minidump file (at ::RVA //! 0). struct __attribute__((packed, aligned(4))) MINIDUMP_HEADER { … }; //! \brief A pointer to a stream within a minidump file. //! //! Each stream present in a minidump file will have a corresponding //! MINIDUMP_DIRECTORY entry in the stream directory referenced by //! MINIDUMP_HEADER::StreamDirectoryRva. struct __attribute__((packed, aligned(4))) MINIDUMP_DIRECTORY { … }; //! \brief A variable-length UTF-16-encoded string carried within a minidump //! file. //! //! The UTF-16 string is stored as UTF-16LE or UTF-16BE according to the byte //! ordering of the minidump file itself. //! //! \sa crashpad::MinidumpUTF8String struct __attribute__((packed, aligned(4))) MINIDUMP_STRING { … }; //! \brief Minidump stream type values for MINIDUMP_DIRECTORY::StreamType. Each //! stream structure has a corresponding stream type value to identify it. //! //! \sa crashpad::MinidumpStreamType enum MINIDUMP_STREAM_TYPE { … }; //! \brief Information about the CPU (or CPUs) that ran the process that the //! minidump file contains a snapshot of. //! //! This union only appears as MINIDUMP_SYSTEM_INFO::Cpu. Its interpretation is //! controlled by MINIDUMP_SYSTEM_INFO::ProcessorArchitecture. CPU_INFORMATION; //! \brief Information about the system that hosted the process that the //! minidump file contains a snapshot of. struct __attribute__((packed, aligned(4))) MINIDUMP_SYSTEM_INFO { … }; //! \brief Information about a specific thread within the process. //! //! \sa MINIDUMP_THREAD_LIST struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD { … }; //! \brief Information about all threads within the process. struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_LIST { … }; //! \brief Information about an exception that occurred in the process. struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION { … }; //! \brief Information about the exception that triggered a minidump file’s //! generation. struct __attribute__((packed, aligned(4))) MINIDUMP_EXCEPTION_STREAM { … }; //! \brief Information about a specific module loaded within the process at the //! time the snapshot was taken. //! //! A module may be the main executable, a shared library, or a loadable module. //! //! \sa MINIDUMP_MODULE_LIST struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE { … }; //! \brief Information about all modules loaded within the process at the time //! the snapshot was taken. struct __attribute__((packed, aligned(4))) MINIDUMP_MODULE_LIST { … }; //! \brief Information about memory regions within the process. //! //! Typically, a minidump file will not contain a snapshot of a process’ entire //! memory image. For minidump files identified as ::MiniDumpNormal in //! MINIDUMP_HEADER::Flags, memory regions are limited to those referenced by //! MINIDUMP_THREAD::Stack fields, and a small number of others possibly related //! to the exception that triggered the snapshot to be taken. struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_LIST { … }; //! \brief Contains the state of an individual system handle at the time the //! snapshot was taken. This structure is Windows-specific. //! //! \sa MINIDUMP_HANDLE_DESCRIPTOR_2 struct __attribute__((packed, aligned(4))) MINIDUMP_HANDLE_DESCRIPTOR { … }; //! \brief Contains the state of an individual system handle at the time the //! snapshot was taken. This structure is Windows-specific. //! //! \sa MINIDUMP_HANDLE_DESCRIPTOR struct __attribute__((packed, aligned(4))) MINIDUMP_HANDLE_DESCRIPTOR_2 : public MINIDUMP_HANDLE_DESCRIPTOR { … }; //! \brief Represents the header for a handle data stream. //! //! A list of MINIDUMP_HANDLE_DESCRIPTOR or MINIDUMP_HANDLE_DESCRIPTOR_2 //! structures will immediately follow in the stream. struct __attribute((packed, aligned(4))) MINIDUMP_HANDLE_DATA_STREAM { … }; //! \brief Information about a specific module that was recorded as being //! unloaded at the time the snapshot was taken. //! //! An unloaded module may be a shared library or a loadable module. //! //! \sa MINIDUMP_UNLOADED_MODULE_LIST struct __attribute__((packed, aligned(4))) MINIDUMP_UNLOADED_MODULE { … }; //! \brief Information about all modules recorded as unloaded when the snapshot //! was taken. //! //! A list of MINIDUMP_UNLOADED_MODULE structures will immediately follow in the //! stream. struct __attribute__((packed, aligned(4))) MINIDUMP_UNLOADED_MODULE_LIST { … }; //! \brief Information about XSAVE-managed state stored within CPU-specific //! context structures. struct __attribute__((packed, aligned(4))) XSTATE_CONFIG_FEATURE_MSC_INFO { … }; //! \anchor MINIDUMP_MISCx //! \name MINIDUMP_MISC* //! //! \brief Field validity flag values for MINIDUMP_MISC_INFO::Flags1. //! \{ //! \brief MINIDUMP_MISC_INFO::ProcessId is valid. #define MINIDUMP_MISC1_PROCESS_ID … //! \brief The time-related fields in MINIDUMP_MISC_INFO are valid. //! //! The following fields are valid: //! - MINIDUMP_MISC_INFO::ProcessCreateTime //! - MINIDUMP_MISC_INFO::ProcessUserTime //! - MINIDUMP_MISC_INFO::ProcessKernelTime #define MINIDUMP_MISC1_PROCESS_TIMES … //! \brief The CPU-related fields in MINIDUMP_MISC_INFO_2 are valid. //! //! The following fields are valid: //! - MINIDUMP_MISC_INFO_2::ProcessorMaxMhz //! - MINIDUMP_MISC_INFO_2::ProcessorCurrentMhz //! - MINIDUMP_MISC_INFO_2::ProcessorMhzLimit //! - MINIDUMP_MISC_INFO_2::ProcessorMaxIdleState //! - MINIDUMP_MISC_INFO_2::ProcessorCurrentIdleState //! //! \note This macro should likely have been named //! MINIDUMP_MISC2_PROCESSOR_POWER_INFO. #define MINIDUMP_MISC1_PROCESSOR_POWER_INFO … //! \brief MINIDUMP_MISC_INFO_3::ProcessIntegrityLevel is valid. #define MINIDUMP_MISC3_PROCESS_INTEGRITY … //! \brief MINIDUMP_MISC_INFO_3::ProcessExecuteFlags is valid. #define MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS … //! \brief The time zone-related fields in MINIDUMP_MISC_INFO_3 are valid. //! //! The following fields are valid: //! - MINIDUMP_MISC_INFO_3::TimeZoneId //! - MINIDUMP_MISC_INFO_3::TimeZone #define MINIDUMP_MISC3_TIMEZONE … //! \brief MINIDUMP_MISC_INFO_3::ProtectedProcess is valid. #define MINIDUMP_MISC3_PROTECTED_PROCESS … //! \brief The build string-related fields in MINIDUMP_MISC_INFO_4 are valid. //! //! The following fields are valid: //! - MINIDUMP_MISC_INFO_4::BuildString //! - MINIDUMP_MISC_INFO_4::DbgBldStr #define MINIDUMP_MISC4_BUILDSTRING … //! \brief MINIDUMP_MISC_INFO_5::ProcessCookie is valid. #define MINIDUMP_MISC5_PROCESS_COOKIE … //! \} //! \brief Information about the process that the minidump file contains a //! snapshot of, as well as the system that hosted that process. //! //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" //! \sa MINIDUMP_MISC_INFO_2 //! \sa MINIDUMP_MISC_INFO_3 //! \sa MINIDUMP_MISC_INFO_4 //! \sa MINIDUMP_MISC_INFO_5 //! \sa MINIDUMP_MISC_INFO_N struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO { … }; //! \brief Information about the process that the minidump file contains a //! snapshot of, as well as the system that hosted that process. //! //! This structure variant is used on Windows Vista (NT 6.0) and later. //! //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" //! \sa MINIDUMP_MISC_INFO //! \sa MINIDUMP_MISC_INFO_3 //! \sa MINIDUMP_MISC_INFO_4 //! \sa MINIDUMP_MISC_INFO_5 //! \sa MINIDUMP_MISC_INFO_N struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_2 : public MINIDUMP_MISC_INFO { … }; //! \brief Information about the process that the minidump file contains a //! snapshot of, as well as the system that hosted that process. //! //! This structure variant is used on Windows 7 (NT 6.1) and later. //! //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" //! \sa MINIDUMP_MISC_INFO //! \sa MINIDUMP_MISC_INFO_2 //! \sa MINIDUMP_MISC_INFO_4 //! \sa MINIDUMP_MISC_INFO_5 //! \sa MINIDUMP_MISC_INFO_N struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_3 : public MINIDUMP_MISC_INFO_2 { … }; //! \brief Information about the process that the minidump file contains a //! snapshot of, as well as the system that hosted that process. //! //! This structure variant is used on Windows 8 (NT 6.2) and later. //! //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" //! \sa MINIDUMP_MISC_INFO //! \sa MINIDUMP_MISC_INFO_2 //! \sa MINIDUMP_MISC_INFO_3 //! \sa MINIDUMP_MISC_INFO_5 //! \sa MINIDUMP_MISC_INFO_N struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_4 : public MINIDUMP_MISC_INFO_3 { … }; //! \brief Information about the process that the minidump file contains a //! snapshot of, as well as the system that hosted that process. //! //! This structure variant is used on Windows 10 and later. //! //! \sa \ref MINIDUMP_MISCx "MINIDUMP_MISC*" //! \sa MINIDUMP_MISC_INFO //! \sa MINIDUMP_MISC_INFO_2 //! \sa MINIDUMP_MISC_INFO_3 //! \sa MINIDUMP_MISC_INFO_4 //! \sa MINIDUMP_MISC_INFO_N struct __attribute__((packed, aligned(4))) MINIDUMP_MISC_INFO_5 : public MINIDUMP_MISC_INFO_4 { … }; //! \brief The latest known version of the MINIDUMP_MISC_INFO structure. MINIDUMP_MISC_INFO_N; //! \brief Describes a region of memory. struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_INFO { … }; //! \brief Contains a list of memory regions. struct __attribute__((packed, aligned(4))) MINIDUMP_MEMORY_INFO_LIST { … }; //! \brief Contains the name of the thread with the given thread ID. struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_NAME { … }; //! \brief Variable-sized struct which contains a list of MINIDUMP_THREAD_NAME //! structs. struct __attribute__((packed, aligned(4))) MINIDUMP_THREAD_NAME_LIST { … }; //! \brief Minidump file type values for MINIDUMP_HEADER::Flags. These bits //! describe the types of data carried within a minidump file. enum MINIDUMP_TYPE { … }; #endif // CRASHPAD_COMPAT_NON_WIN_DBGHELP_H_