// Copyright 2016 The Crashpad Authors. All rights reserved. // // 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_SNAPSHOT_CAPTURE_MEMORY_H_ #define CRASHPAD_SNAPSHOT_CAPTURE_MEMORY_H_ #include #include #include "snapshot/cpu_context.h" #include "util/numeric/checked_range.h" namespace crashpad { class MemorySnapshot; namespace internal { class CaptureMemory { public: //! \brief An interface to a platform-specific process reader. class Delegate { public: virtual ~Delegate() {} //! \return `true` if the target process is a 64-bit process. virtual bool Is64Bit() const = 0; //! \brief Attempts to read \a num_bytes bytes from the target process //! starting at address \a at into \a into. //! //! \return `true` if the entire region could be read, or `false` with an //! error logged. virtual bool ReadMemory(uint64_t at, uint64_t num_bytes, void* into) const = 0; //! \brief Given a range to be read from the target process, returns a //! vector //! of ranges, representing the readable portions of the original range. //! //! \param[in] range The range being identified. //! //! \return A vector of ranges corresponding to the portion of \a range that //! is readable. virtual std::vector> GetReadableRanges( const CheckedRange& range) const = 0; //! \brief Adds the given range representing a memory snapshot in the target //! process to the result. virtual void AddNewMemorySnapshot( const CheckedRange& range) = 0; }; CaptureMemory() = delete; CaptureMemory(const CaptureMemory&) = delete; CaptureMemory& operator=(const CaptureMemory&) = delete; //! \brief For all registers that appear to be pointer-like in \a context, //! captures a small amount of memory near their pointed to location. //! //! "Pointer-like" in this context means not too close to zero (signed or //! unsigned) so that there's a reasonable chance that the value is a pointer. //! //! \param[in] context The context to inspect. //! \param[in] delegate A Delegate that handles reading from the target //! process and adding new ranges. static void PointedToByContext(const CPUContext& context, Delegate* delegate); //! \brief For all pointer-like values in a memory range of the target //! process, //! captures a small amount of memory near the pointed to location. //! //! \param[in] memory An existing MemorySnapshot of the range to search. The //! base address and size must be pointer-aligned and an integral number //! of //! pointers long. //! \param[in] delegate A Delegate that handles reading from the target //! process and adding new ranges. static void PointedToByMemoryRange(const MemorySnapshot& memory, Delegate* delegate); }; } // namespace internal } // namespace crashpad #endif // CRASHPAD_SNAPSHOT_CAPTURE_MEMORY_H_