aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/symbol.cpp
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2020-01-15 03:58:41 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2020-01-15 03:58:41 +0300
commita9741c9cadcef7752ec0e1bcc0e1aba580477a5e (patch)
tree08e028e8596739f88987499ca2e30f1b6781a144 /src/symbol.cpp
parentrefactoring (diff)
downloadwinapi-debug-a9741c9cadcef7752ec0e1bcc0e1aba580477a5e.tar.gz
winapi-debug-a9741c9cadcef7752ec0e1bcc0e1aba580477a5e.zip
split symbol.hpp
Diffstat (limited to 'src/symbol.cpp')
-rw-r--r--src/symbol.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/symbol.cpp b/src/symbol.cpp
new file mode 100644
index 0000000..98ec427
--- /dev/null
+++ b/src/symbol.cpp
@@ -0,0 +1,57 @@
+// Copyright (c) 2020 Egor Tensin <Egor.Tensin@gmail.com>
+// This file is part of the "PDB repository" project.
+// For details, see https://github.com/egor-tensin/pdb-repo.
+// Distributed under the MIT License.
+
+#include "pdb/all.hpp"
+
+#include <SafeInt.hpp>
+
+#include <DbgHelp.h>
+#include <Windows.h>
+
+#include <cstddef>
+#include <cstring>
+#include <stdexcept>
+
+namespace pdb {
+namespace {
+
+std::size_t calc_size(const SymbolInfo::Impl& impl) {
+ try {
+ return SafeInt<std::size_t>{impl.SizeOfStruct} + impl.NameLen - 1;
+ } catch (const SafeIntException&) {
+ throw std::runtime_error{"invalid SYMBOL_INFO size"};
+ }
+}
+
+unsigned long cast_line_number(DWORD impl) {
+ unsigned long dest = 0;
+
+ if (!SafeCast(impl, dest))
+ throw std::runtime_error{"invalid line number"};
+
+ return dest;
+}
+
+} // namespace
+
+SymbolInfo::SymbolInfo() : buffer{}, impl{*reinterpret_cast<Impl*>(buffer.data())} {
+ buffer.fill(0);
+ impl.SizeOfStruct = sizeof(Impl);
+ impl.MaxNameLen = MAX_SYM_NAME;
+}
+
+SymbolInfo::SymbolInfo(const Impl& impl) : SymbolInfo{} {
+ if (impl.SizeOfStruct != sizeof(impl))
+ throw std::runtime_error{"invalid SYMBOL_INFO.SizeOfStruct"};
+ const auto impl_size = calc_size(impl);
+ if (impl_size > buffer.size())
+ throw std::runtime_error{"SYMBOL_INFO is too large"};
+ std::memcpy(buffer.data(), &impl, impl_size);
+}
+
+LineInfo::LineInfo(const Impl& impl)
+ : file_path{impl.FileName}, line_number{cast_line_number(impl.LineNumber)} {}
+
+} // namespace pdb