Skip to content

Instantly share code, notes, and snippets.

@kohnakagawa
Last active June 1, 2021 07:30
Show Gist options
  • Save kohnakagawa/4e36f1f3889441c55965de79c995f57b to your computer and use it in GitHub Desktop.
Save kohnakagawa/4e36f1f3889441c55965de79c995f57b to your computer and use it in GitHub Desktop.
diff --git a/src/PE/Binary.cpp b/src/PE/Binary.cpp
index 0884c625..34e881bf 100644
--- a/src/PE/Binary.cpp
+++ b/src/PE/Binary.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,18 +20,33 @@
#include <numeric>
#include <limits>
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
+#include "hash_stream.hpp"
-#include "LIEF/PE/hash.hpp"
#include "LIEF/exception.hpp"
#include "LIEF/utils.hpp"
+#include "LIEF/BinaryStream/VectorStream.hpp"
+#include "LIEF/iostream.hpp"
+
+#include "LIEF/Abstract/Relocation.hpp"
+#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/Binary.hpp"
#include "LIEF/PE/Builder.hpp"
#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/ResourceDirectory.hpp"
#include "LIEF/PE/ResourceData.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+#include "LIEF/PE/Section.hpp"
+#include "LIEF/PE/Relocation.hpp"
+#include "LIEF/PE/RelocationEntry.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
+#include "LIEF/PE/ResourcesManager.hpp"
+#include "LIEF/PE/Symbol.hpp"
+#include "LIEF/PE/LoadConfigurations/LoadConfiguration.hpp"
namespace LIEF {
namespace PE {
@@ -85,7 +100,6 @@ Binary::Binary(void) :
has_rich_header_{false},
has_tls_{false},
has_imports_{false},
- has_signature_{false},
has_exports_{false},
has_resources_{false},
has_exceptions_{false},
@@ -212,10 +226,37 @@ uint64_t Binary::va_to_offset(uint64_t VA) {
return this->rva_to_offset(rva);
}
+uint64_t Binary::imagebase(void) const {
+ return this->optional_header().imagebase();
+}
+
+uint64_t Binary::offset_to_virtual_address(uint64_t offset, uint64_t slide) const {
+ const auto it_section = std::find_if(
+ std::begin(this->sections_), std::end(this->sections_),
+ [offset] (const Section* section)
+ {
+ return (offset >= section->offset() and
+ offset < (section->offset() + section->sizeof_raw_data()));
+ });
+
+ if (it_section == std::end(sections_)) {
+ if (slide > 0) {
+ return slide + offset;
+ }
+ return offset;
+ }
+ const Section* section = *it_section;
+ const uint64_t base_rva = section->virtual_address() - section->offset();
+ if (slide > 0) {
+ return slide + base_rva + offset;
+ }
+
+ return base_rva + offset;
+}
+
uint64_t Binary::rva_to_offset(uint64_t RVA) {
- auto&& it_section = std::find_if(
- std::begin(this->sections_),
- std::end(this->sections_),
+ const auto it_section = std::find_if(
+ std::begin(this->sections_), std::end(this->sections_),
[RVA] (const Section* section)
{
if (section == nullptr) {
@@ -226,10 +267,11 @@ uint64_t Binary::rva_to_offset(uint64_t RVA) {
});
if (it_section == std::end(sections_)) {
- // If not found withint a section,
+ // If not found within a section,
// we assume that rva == offset
- return static_cast<uint32_t>(RVA);
+ return RVA;
}
+ LIEF_TRACE("rva_to_offset(0x{:x}): {}", RVA, (*it_section)->name());
// rva - virtual_address + pointer_to_raw_data
uint32_t section_alignment = this->optional_header().section_alignment();
@@ -333,8 +375,8 @@ bool Binary::has_imports(void) const {
return this->has_imports_;
}
-bool Binary::has_signature(void) const {
- return this->has_signature_;
+bool Binary::has_signatures(void) const {
+ return not this->signatures_.empty();
}
bool Binary::has_exports(void) const {
@@ -346,7 +388,7 @@ bool Binary::has_resources(void) const {
}
bool Binary::has_exceptions(void) const {
- return this->has(DATA_DIRECTORY::EXPORT_TABLE);
+ return this->has(DATA_DIRECTORY::EXCEPTION_TABLE);
//return this->has_exceptions_;
}
@@ -525,7 +567,7 @@ void Binary::remove_section(const std::string& name, bool clear) {
});
if (it_section == std::end(this->sections_)) {
- LOG(ERROR) << "Unable to find section: '" << name << "'" << std::endl;
+ LIEF_ERR("Unable to find section: '{}'", name);
return;
}
@@ -541,7 +583,7 @@ void Binary::remove(const Section& section, bool clear) {
return *s == section;
});
if (it_section == std::end(this->sections_)) {
- LOG(ERROR) << "Unable to find section: '" << section.name() << "'" << std::endl;
+ LIEF_ERR("Unable to find section: '{}'", section.name());
return;
}
@@ -573,8 +615,8 @@ void Binary::remove(const Section& section, bool clear) {
void Binary::make_space_for_new_section(void) {
const uint32_t shift = align(sizeof(pe_section), this->optional_header().file_alignment());
- VLOG(VDEBUG) << "Making space for a new section header";
- VLOG(VDEBUG) << "Shifting all sections by " << std::hex << std::showbase << shift;
+ LIEF_DEBUG("Making space for a new section header");
+ LIEF_DEBUG(" -> Shifting all sections by 0x{:x}", shift);
// Shift offset of the section content by the size of
// a section header aligned on "file alignment"
@@ -621,7 +663,7 @@ Section& Binary::add_section(const Section& section, PE_SECTION_TYPES type) {
return std::max<uint64_t>(s->pointerto_raw_data() + s->sizeof_raw_data(), offset);
}), this->optional_header().file_alignment());
- VLOG(VDEBUG) << "New section offset: 0x" << std::hex << new_section_offset;
+ LIEF_DEBUG("New section offset: 0x{:x}", new_section_offset);
// Compute new section Virtual address
@@ -632,7 +674,7 @@ Section& Binary::add_section(const Section& section, PE_SECTION_TYPES type) {
return std::max<uint64_t>(s->virtual_address() + s->virtual_size(), va);
}), this->optional_header().section_alignment());
- VLOG(VDEBUG) << "New section va: 0x" << std::hex << new_section_va;
+ LIEF_DEBUG("New section VA: 0x{:x}", new_section_va);
new_section->add_type(type);
@@ -821,7 +863,7 @@ uint32_t Binary::predict_function_rva(const std::string& library, const std::str
});
if (it_import == std::end(this->imports_)) {
- LOG(ERROR) << "Unable to find library '" << library << "'";
+ LIEF_ERR("Unable to find library {}", library);
return 0;
}
@@ -837,12 +879,12 @@ uint32_t Binary::predict_function_rva(const std::string& library, const std::str
});
if (nb_functions == 0) {
- LOG(ERROR) << "Unable to find the function '" << function << "' in '" << library + "'.";
+ LIEF_ERR("Unable to find the function '{}' in '{}'", function, library);
return 0;
}
if (nb_functions > 1) {
- LOG(ERROR) << "'" << function << "' is defined " << std::to_string(nb_functions) << " in '" << library << "'.";
+ LIEF_ERR("{} is defined #{:d} times in {}", function, nb_functions, library);
return 0;
}
@@ -997,8 +1039,239 @@ const debug_entries_t& Binary::debug(void) const {
//
/////////////////////
-const Signature& Binary::signature(void) const {
- return this->signature_;
+it_const_signatures Binary::signatures(void) const {
+ return this->signatures_;
+}
+
+std::vector<uint8_t> Binary::authentihash(ALGORITHMS algo) const {
+ static const std::map<ALGORITHMS, hashstream::HASH> HMAP = {
+ {ALGORITHMS::MD5, hashstream::HASH::MD5},
+ {ALGORITHMS::SHA_1, hashstream::HASH::SHA1},
+ {ALGORITHMS::SHA_256, hashstream::HASH::SHA256},
+ {ALGORITHMS::SHA_384, hashstream::HASH::SHA384},
+ {ALGORITHMS::SHA_512, hashstream::HASH::SHA512},
+ };
+ auto it_hash = HMAP.find(algo);
+ if (it_hash == std::end(HMAP)) {
+ LIEF_WARN("Unsupported hash algorithm: {}", to_string(algo));
+ return {};
+ }
+ const size_t sizeof_ptr = this->type_ == PE_TYPE::PE32 ? sizeof(uint32_t) : sizeof(uint64_t);
+ const hashstream::HASH hash_type = it_hash->second;
+ hashstream ios(hash_type);
+ //vector_iostream ios;
+ ios // Hash dos header
+ .write(this->dos_header_.magic())
+ .write(this->dos_header_.used_bytes_in_the_last_page())
+ .write(this->dos_header_.file_size_in_pages())
+ .write(this->dos_header_.numberof_relocation())
+ .write(this->dos_header_.header_size_in_paragraphs())
+ .write(this->dos_header_.minimum_extra_paragraphs())
+ .write(this->dos_header_.maximum_extra_paragraphs())
+ .write(this->dos_header_.initial_relative_ss())
+ .write(this->dos_header_.initial_sp())
+ .write(this->dos_header_.checksum())
+ .write(this->dos_header_.initial_ip())
+ .write(this->dos_header_.initial_relative_cs())
+ .write(this->dos_header_.addressof_relocation_table())
+ .write(this->dos_header_.overlay_number())
+ .write(this->dos_header_.reserved())
+ .write(this->dos_header_.oem_id())
+ .write(this->dos_header_.oem_info())
+ .write(this->dos_header_.reserved2())
+ .write(this->dos_header_.addressof_new_exeheader())
+ .write(this->dos_stub_);
+
+ ios // Hash PE Header
+ .write(this->header_.signature())
+ .write(static_cast<uint16_t>(this->header_.machine()))
+ .write(this->header_.numberof_sections())
+ .write(this->header_.time_date_stamp())
+ .write(this->header_.pointerto_symbol_table())
+ .write(this->header_.numberof_symbols())
+ .write(this->header_.sizeof_optional_header())
+ .write(static_cast<uint16_t>(this->header_.characteristics()));
+
+ ios // Hash OptionalHeader
+ .write(static_cast<uint16_t>(this->optional_header_.magic()))
+ .write(this->optional_header_.major_linker_version())
+ .write(this->optional_header_.minor_linker_version())
+ .write(this->optional_header_.sizeof_code())
+ .write(this->optional_header_.sizeof_initialized_data())
+ .write(this->optional_header_.sizeof_uninitialized_data())
+ .write(this->optional_header_.addressof_entrypoint())
+ .write(this->optional_header_.baseof_code());
+
+ if (this->type_ == PE_TYPE::PE32) {
+ ios.write(this->optional_header_.baseof_data());
+ }
+ ios // Continuation of optional header
+ .write_sized_int(this->optional_header_.imagebase(), sizeof_ptr)
+ .write(this->optional_header_.section_alignment())
+ .write(this->optional_header_.file_alignment())
+ .write(this->optional_header_.major_operating_system_version())
+ .write(this->optional_header_.minor_operating_system_version())
+ .write(this->optional_header_.major_image_version())
+ .write(this->optional_header_.minor_image_version())
+ .write(this->optional_header_.major_subsystem_version())
+ .write(this->optional_header_.minor_subsystem_version())
+ .write(this->optional_header_.win32_version_value())
+ .write(this->optional_header_.sizeof_image())
+ .write(this->optional_header_.sizeof_headers())
+ // this->optional_header_.checksum()) is not a part of the hash
+ .write(static_cast<uint16_t>(this->optional_header_.subsystem()))
+ .write(static_cast<uint16_t>(this->optional_header_.dll_characteristics()))
+ .write_sized_int(this->optional_header_.sizeof_stack_reserve(), sizeof_ptr)
+ .write_sized_int(this->optional_header_.sizeof_stack_commit(), sizeof_ptr)
+ .write_sized_int(this->optional_header_.sizeof_heap_reserve(), sizeof_ptr)
+ .write_sized_int(this->optional_header_.sizeof_heap_commit(), sizeof_ptr)
+ .write(this->optional_header_.loader_flags())
+ .write(this->optional_header_.numberof_rva_and_size());
+
+ for (const DataDirectory* dir : this->data_directories_) {
+ if (dir->type() == DATA_DIRECTORY::CERTIFICATE_TABLE) {
+ continue;
+ }
+ ios
+ .write(dir->RVA())
+ .write(dir->size());
+ }
+
+ for (const Section* sec : this->sections_) {
+ std::array<char, 8> name = {0};
+ const std::string& sec_name = sec->fullname();
+ uint32_t name_length = std::min<uint32_t>(sec_name.size() + 1, sizeof(name));
+ std::copy(sec_name.c_str(), sec_name.c_str() + name_length, std::begin(name));
+ ios
+ .write(name)
+ .write(sec->virtual_size())
+ .write<uint32_t>(sec->virtual_address())
+ .write(sec->sizeof_raw_data())
+ .write(sec->pointerto_raw_data())
+ .write(sec->pointerto_relocation())
+ .write(sec->pointerto_line_numbers())
+ .write(sec->numberof_relocations())
+ .write(sec->numberof_line_numbers())
+ .write(static_cast<uint32_t>(sec->characteristics()));
+ }
+ //LIEF_DEBUG("Section padding at 0x{:x}", ios.tellp());
+ ios.write(this->section_offset_padding_);
+
+ std::vector<Section*> sections = this->sections_;
+
+ // Sort by file offset
+ std::sort(
+ std::begin(sections), std::end(sections),
+ [] (const Section* lhs, const Section* rhs) {
+ return lhs->pointerto_raw_data() < rhs->pointerto_raw_data();
+ });
+
+ uint64_t position = 0;
+ for (const Section* sec : sections) {
+ if (sec->sizeof_raw_data() == 0) {
+ continue;
+ }
+ const std::vector<uint8_t>& pad = sec->padding();
+ const std::vector<uint8_t>& content = sec->content();
+ LIEF_DEBUG("Authentihash: Append section {:<8}: [0x{:04x}, 0x{:04x}] + [0x{:04x}] = [0x{:04x}, 0x{:04x}]",
+ sec->name(),
+ sec->offset(), sec->offset() + content.size(), pad.size(),
+ sec->offset(), sec->offset() + content.size() + pad.size());
+ if (/* overlapping */ sec->offset() < position) {
+ // Trunc the beginning of the overlap
+ if (position <= sec->offset() + content.size()) {
+ const uint64_t start_p = position - sec->offset();
+ const uint64_t size = content.size() - start_p;
+ ios
+ .write(content.data() + start_p, size)
+ .write(pad);
+ } else {
+ LIEF_WARN("Overlapping in the padding area");
+ }
+ } else {
+ ios
+ .write(content)
+ .write(pad);
+ }
+ position = sec->offset() + content.size() + pad.size();
+ }
+ if (this->overlay_.size() > 0) {
+ const DataDirectory& cert_dir = this->data_directory(DATA_DIRECTORY::CERTIFICATE_TABLE);
+ LIEF_DEBUG("Add overlay and omit 0x{:08x} - 0x{:08x}", cert_dir.RVA(), cert_dir.RVA() + cert_dir.size());
+ if (cert_dir.RVA() > 0 and cert_dir.size() > 0 and cert_dir.RVA() >= this->overlay_offset_) {
+ const uint64_t start_cert_offset = cert_dir.RVA() - this->overlay_offset_;
+ const uint64_t end_cert_offset = start_cert_offset + cert_dir.size();
+ if (end_cert_offset <= this->overlay_.size()) {
+ LIEF_DEBUG("Add [0x{:x}, 0x{:x}]", this->overlay_offset_, this->overlay_offset_ + start_cert_offset);
+ LIEF_DEBUG("Add [0x{:x}, 0x{:x}]",
+ this->overlay_offset_ + end_cert_offset,
+ this->overlay_offset_ + this->overlay_.size() - end_cert_offset);
+ ios
+ .write(this->overlay_.data(), start_cert_offset)
+ .write(this->overlay_.data() + end_cert_offset, this->overlay_.size() - end_cert_offset);
+ } else {
+ ios.write(this->overlay());
+ }
+ } else {
+ ios.write(this->overlay());
+ }
+ }
+ // When something gets wrong with the hash:
+ // std::vector<uint8_t> out = ios.raw();
+ // std::ofstream output_file{"/tmp/hash.blob", std::ios::out | std::ios::binary | std::ios::trunc};
+ // if (output_file) {
+ // std::copy(
+ // std::begin(out),
+ // std::end(out),
+ // std::ostreambuf_iterator<char>(output_file));
+ // }
+ // std::vector<uint8_t> hash = hashstream(hash_type).write(out).raw();
+
+ std::vector<uint8_t> hash = ios.raw();
+ LIEF_DEBUG("{}", hex_dump(hash));
+ return hash;
+}
+
+Signature::VERIFICATION_FLAGS Binary::verify_signature(Signature::VERIFICATION_CHECKS checks) const {
+ if (not this->has_signatures()) {
+ return Signature::VERIFICATION_FLAGS::NO_SIGNATURE;
+ }
+
+ Signature::VERIFICATION_FLAGS flags = Signature::VERIFICATION_FLAGS::OK;
+
+ for (size_t i = 0; i < this->signatures_.size(); ++i) {
+ const Signature& sig = this->signatures_[i];
+ flags |= this->verify_signature(sig, checks);
+ if (flags != Signature::VERIFICATION_FLAGS::OK) {
+ LIEF_INFO("Verification failed for signature #{:d} (0b{:b})", i, static_cast<uintptr_t>(flags));
+ break;
+ }
+ }
+ return flags;
+}
+
+Signature::VERIFICATION_FLAGS Binary::verify_signature(const Signature& sig, Signature::VERIFICATION_CHECKS checks) const {
+ Signature::VERIFICATION_FLAGS flags = Signature::VERIFICATION_FLAGS::OK;
+ if (not is_true(checks & Signature::VERIFICATION_CHECKS::HASH_ONLY)) {
+ const Signature::VERIFICATION_FLAGS value = sig.check(checks);
+ if (value != Signature::VERIFICATION_FLAGS::OK) {
+ LIEF_INFO("Bad signature (0b{:b})", static_cast<uintptr_t>(value));
+ flags |= value;
+ }
+ }
+
+ // Check that the authentihash matches Content Info's digest
+ const std::vector<uint8_t>& authhash = this->authentihash(sig.digest_algorithm());
+ const std::vector<uint8_t>& chash = sig.content_info().digest();
+ if (authhash != chash) {
+ LIEF_INFO("Authentihash and Content info's digest does not match:\n {}\n {}",
+ hex_dump(authhash), hex_dump(chash));
+ flags |= Signature::VERIFICATION_FLAGS::BAD_DIGEST;
+ }
+ if (flags != Signature::VERIFICATION_FLAGS::OK) {
+ flags |= Signature::VERIFICATION_FLAGS::BAD_SIGNATURE;
+ }
+return flags;
}
@@ -1093,7 +1366,7 @@ void Binary::hook_function(const std::string& function, uint64_t address) {
}
}
- LOG(WARNING) << "Unable to find library associated with function '" << function << "'";
+ LIEF_WARN("Unable to find library associated with function '{}'", function);
}
@@ -1131,7 +1404,7 @@ void Binary::patch_address(uint64_t address, const std::vector<uint8_t>& patch_v
void Binary::patch_address(uint64_t address, uint64_t patch_value, size_t size, LIEF::Binary::VA_TYPES addr_type) {
if (size > sizeof(patch_value)) {
- LOG(ERROR) << "Invalid size (" << std::to_string(size) << ")";
+ LIEF_ERR("Invalid size (0x{:x})", size);
return;
}
@@ -1306,7 +1579,7 @@ LIEF::Binary::functions_t Binary::exception_functions(void) const {
for (size_t i = 0; i < nb_entries; ++i) {
if (not vs.can_read<pe_exception_entry_x64>()) {
- LOG(ERROR) << "Corrupted entry at " << std::dec << i;
+ LIEF_ERR("Corrupted entry #{:02d}", i);
break;
}
const pe_exception_entry_x64& entry = vs.read<pe_exception_entry_x64>();
@@ -1393,10 +1666,12 @@ std::ostream& Binary::print(std::ostream& os) const {
}
- if (this->has_signature()) {
- os << "Signature" << std::endl;
- os << "=========" << std::endl;
- os << this->signature() << std::endl;
+ if (this->has_signatures()) {
+ os << "Signatures" << std::endl;
+ os << "==========" << std::endl;
+ for (const Signature& sig : this->signatures_) {
+ os << sig << std::endl;
+ }
os << std::endl;
}
diff --git a/src/PE/Builder.cpp b/src/PE/Builder.cpp
index eeb9b906..894f8244 100644
--- a/src/PE/Builder.cpp
+++ b/src/PE/Builder.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,17 +19,26 @@
#include <iterator>
#include <numeric>
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
-#include "utf8.h"
+#include "LIEF/third-party/utfcpp/utf8.h"
#include "LIEF/exception.hpp"
#include "LIEF/PE/Builder.hpp"
-#include "Builder.tcc"
#include "LIEF/PE/ResourceData.hpp"
#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
+#include "LIEF/PE/Import.hpp"
+#include "LIEF/PE/Section.hpp"
+#include "LIEF/PE/ResourceDirectory.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+#include "LIEF/PE/Relocation.hpp"
+#include "LIEF/PE/RelocationEntry.hpp"
+#include "LIEF/PE/Symbol.hpp"
+#include "LIEF/PE/Export.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
-
+#include "Builder.tcc"
namespace LIEF {
namespace PE {
@@ -98,10 +107,10 @@ void Builder::write(const std::string& filename) const {
void Builder::build(void) {
- VLOG(VDEBUG) << "Rebuilding" << std::endl;
+ LIEF_DEBUG("Build process started");
if (this->binary_->has_tls() and this->build_tls_) {
- VLOG(VDEBUG) << "[+] Rebuilding TLS" << std::endl;
+ LIEF_DEBUG("[+] TLS");
if (this->binary_->type() == PE_TYPE::PE32) {
this->build_tls<PE32>();
} else {
@@ -110,12 +119,12 @@ void Builder::build(void) {
}
if (this->binary_->has_relocations() and this->build_relocations_) {
- VLOG(VDEBUG) << "[+] Rebuilding relocations" << std::endl;
+ LIEF_DEBUG("[+] Relocations");
this->build_relocation();
}
if (this->binary_->has_resources() and this->binary_->resources_ != nullptr and this->build_resources_) {
- VLOG(VDEBUG) << "[+] Rebuilding resources" << std::endl;
+ LIEF_DEBUG("[+] Resources");
try {
this->build_resources();
} catch (not_found&) {
@@ -123,7 +132,7 @@ void Builder::build(void) {
}
if (this->binary_->has_imports() and this->build_imports_) {
- VLOG(VDEBUG) << "[+] Rebuilding Import" << std::endl;
+ LIEF_DEBUG("[+] Imports");
if (this->binary_->type() == PE_TYPE::PE32) {
this->build_import_table<PE32>();
} else {
@@ -131,7 +140,7 @@ void Builder::build(void) {
}
}
- VLOG(VDEBUG) << "[+] Rebuilding headers" << std::endl;
+ LIEF_DEBUG("[+] Headers");
*this << this->binary_->dos_header()
<< this->binary_->header()
@@ -141,27 +150,22 @@ void Builder::build(void) {
*this << directory;
}
- DataDirectory last_one;
- last_one.RVA(0);
- last_one.size(0);
-
- *this << last_one;
-
- VLOG(VDEBUG) << "[+] Rebuilding sections" << std::endl;
+ LIEF_DEBUG("[+] Sections");
for (const Section& section : this->binary_->sections()) {
- VLOG(VDEBUG) << "Building section " << section.name();
+ LIEF_DEBUG(" -> {}", section.name());
*this << section;
}
- VLOG(VDEBUG) << "[+] Rebuilding symbols" << std::endl;
+ // LIEF_DEBUG("[+] symbols");
//this->build_symbols();
- VLOG(VDEBUG) << "[+] Rebuilding string table" << std::endl;
+ // LIEF_DEBUG("[+] string table");
//this->build_string_table();
if (this->binary_->overlay().size() > 0 and this->build_overlay_) {
+ LIEF_DEBUG("[+] Overlay");
this->build_overlay();
}
@@ -234,7 +238,6 @@ void Builder::build_relocation(void) {
// Build resources
//
void Builder::build_resources(void) {
- VLOG(VDEBUG) << "Building RSRC" << std::endl;
ResourceNode& node = this->binary_->resources();
//std::cout << ResourcesManager{this->binary_->resources_} << std::endl;
@@ -380,7 +383,6 @@ void Builder::construct_resources(
}
} else {
- //VLOG(VDEBUG) << "Building Data" << std::endl;
ResourceData *rsrc_data = dynamic_cast<ResourceData*>(&node);
pe_resource_data_entry data_header;
@@ -417,7 +419,6 @@ void Builder::build_string_table(void) {
}
void Builder::build_overlay(void) {
- VLOG(VDEBUG) << "Building overlay";
const uint64_t last_section_offset = std::accumulate(
std::begin(this->binary_->sections_),
@@ -426,8 +427,8 @@ void Builder::build_overlay(void) {
return std::max<uint64_t>(section->offset() + section->size(), offset);
});
- VLOG(VDEBUG) << "Overlay offset: 0x" << std::hex << last_section_offset;
- VLOG(VDEBUG) << "Overlay size: " << std::dec << this->binary_->overlay().size();
+ LIEF_DEBUG("Overlay offset: 0x{:x}", last_section_offset);
+ LIEF_DEBUG("Overlay size: 0x{:x}", this->binary_->overlay().size());
const size_t saved_offset = this->ios_.tellp();
this->ios_.seekp(last_section_offset);
@@ -437,37 +438,37 @@ void Builder::build_overlay(void) {
Builder& Builder::operator<<(const DosHeader& dos_header) {
- pe_dos_header dosHeader;
- dosHeader.Magic = static_cast<uint16_t>(dos_header.magic());
- dosHeader.UsedBytesInTheLastPage = static_cast<uint16_t>(dos_header.used_bytes_in_the_last_page());
- dosHeader.FileSizeInPages = static_cast<uint16_t>(dos_header.file_size_in_pages());
- dosHeader.NumberOfRelocationItems = static_cast<uint16_t>(dos_header.numberof_relocation());
- dosHeader.HeaderSizeInParagraphs = static_cast<uint16_t>(dos_header.header_size_in_paragraphs());
- dosHeader.MinimumExtraParagraphs = static_cast<uint16_t>(dos_header.minimum_extra_paragraphs());
- dosHeader.MaximumExtraParagraphs = static_cast<uint16_t>(dos_header.maximum_extra_paragraphs());
- dosHeader.InitialRelativeSS = static_cast<uint16_t>(dos_header.initial_relative_ss());
- dosHeader.InitialSP = static_cast<uint16_t>(dos_header.initial_sp());
- dosHeader.Checksum = static_cast<uint16_t>(dos_header.checksum());
- dosHeader.InitialIP = static_cast<uint16_t>(dos_header.initial_ip());
- dosHeader.InitialRelativeCS = static_cast<uint16_t>(dos_header.initial_relative_cs());
- dosHeader.AddressOfRelocationTable = static_cast<uint16_t>(dos_header.addressof_relocation_table());
- dosHeader.OverlayNumber = static_cast<uint16_t>(dos_header.overlay_number());
- dosHeader.OEMid = static_cast<uint16_t>(dos_header.oem_id());
- dosHeader.OEMinfo = static_cast<uint16_t>(dos_header.oem_info());
- dosHeader.AddressOfNewExeHeader = static_cast<uint16_t>(dos_header.addressof_new_exeheader());
+ pe_dos_header raw_dos_header;
+ raw_dos_header.Magic = static_cast<uint16_t>(dos_header.magic());
+ raw_dos_header.UsedBytesInTheLastPage = static_cast<uint16_t>(dos_header.used_bytes_in_the_last_page());
+ raw_dos_header.FileSizeInPages = static_cast<uint16_t>(dos_header.file_size_in_pages());
+ raw_dos_header.NumberOfRelocationItems = static_cast<uint16_t>(dos_header.numberof_relocation());
+ raw_dos_header.HeaderSizeInParagraphs = static_cast<uint16_t>(dos_header.header_size_in_paragraphs());
+ raw_dos_header.MinimumExtraParagraphs = static_cast<uint16_t>(dos_header.minimum_extra_paragraphs());
+ raw_dos_header.MaximumExtraParagraphs = static_cast<uint16_t>(dos_header.maximum_extra_paragraphs());
+ raw_dos_header.InitialRelativeSS = static_cast<uint16_t>(dos_header.initial_relative_ss());
+ raw_dos_header.InitialSP = static_cast<uint16_t>(dos_header.initial_sp());
+ raw_dos_header.Checksum = static_cast<uint16_t>(dos_header.checksum());
+ raw_dos_header.InitialIP = static_cast<uint16_t>(dos_header.initial_ip());
+ raw_dos_header.InitialRelativeCS = static_cast<uint16_t>(dos_header.initial_relative_cs());
+ raw_dos_header.AddressOfRelocationTable = static_cast<uint16_t>(dos_header.addressof_relocation_table());
+ raw_dos_header.OverlayNumber = static_cast<uint16_t>(dos_header.overlay_number());
+ raw_dos_header.OEMid = static_cast<uint16_t>(dos_header.oem_id());
+ raw_dos_header.OEMinfo = static_cast<uint16_t>(dos_header.oem_info());
+ raw_dos_header.AddressOfNewExeHeader = static_cast<uint16_t>(dos_header.addressof_new_exeheader());
const DosHeader::reserved_t& reserved = dos_header.reserved();
const DosHeader::reserved2_t& reserved2 = dos_header.reserved2();
- std::copy(std::begin(reserved), std::end(reserved), std::begin(dosHeader.Reserved));
- std::copy(std::begin(reserved2), std::end(reserved2), std::begin(dosHeader.Reserved2));
+ std::copy(std::begin(reserved), std::end(reserved), std::begin(raw_dos_header.Reserved));
+ std::copy(std::begin(reserved2), std::end(reserved2), std::begin(raw_dos_header.Reserved2));
this->ios_.seekp(0);
- this->ios_.write(reinterpret_cast<const uint8_t*>(&dosHeader), sizeof(pe_dos_header));
+ this->ios_.write(reinterpret_cast<const uint8_t*>(&raw_dos_header), sizeof(pe_dos_header));
if (this->binary_->dos_stub().size() > 0 and this->build_dos_stub_) {
if (sizeof(pe_dos_header) + this->binary_->dos_stub().size() > dos_header.addressof_new_exeheader()) {
- LOG(WARNING) << "Inconsistent 'addressof_new_exeheader' (0x" << std::hex << dos_header.addressof_new_exeheader();
+ LIEF_WARN("Inconsistent 'addressof_new_exeheader': 0x{:x}", dos_header.addressof_new_exeheader());
}
this->ios_.write(this->binary_->dos_stub());
}
@@ -477,7 +478,6 @@ Builder& Builder::operator<<(const DosHeader& dos_header) {
Builder& Builder::operator<<(const Header& bHeader) {
- VLOG(VDEBUG) << "Building standard Header" << std::endl;
// Standard Header
pe_header header;
header.Machine = static_cast<uint16_t>(bHeader.machine());
@@ -540,20 +540,20 @@ Builder& Builder::operator<<(const Section& section) {
header.NumberOfRelocations = static_cast<uint16_t>(section.numberof_relocations());
header.NumberOfLineNumbers = static_cast<uint16_t>(section.numberof_line_numbers());
header.Characteristics = static_cast<uint32_t>(section.characteristics());
- const char* name = section.name().c_str();
- uint32_t name_length = std::min<uint32_t>(section.name().size(), sizeof(header.Name));
- std::copy(name, name + name_length, std::begin(header.Name));
+ std::array<char, 8> name = {0};
+ const std::string& sec_name = section.fullname();
+ uint32_t name_length = std::min<uint32_t>(sec_name.size() + 1, sizeof(name));
+ std::copy(sec_name.c_str(), sec_name.c_str() + name_length, std::begin(header.Name));
+
this->ios_.write(reinterpret_cast<uint8_t*>(&header), sizeof(pe_section));
size_t pad_length = 0;
if (section.content().size() > section.size()) {
- LOG(WARNING) << section.name()
- << " content size is bigger than section's header size"
- << std::endl;
+ LIEF_WARN("{} content size is bigger than section's header size", section.name());
}
else {
- pad_length = section.size() - section.content().size();
+ pad_length = section.size() - section.content().size();
}
// Pad section content with zeroes
diff --git a/src/PE/Builder.tcc b/src/PE/Builder.tcc
index ca96fd97..65d9db7d 100644
--- a/src/PE/Builder.tcc
+++ b/src/PE/Builder.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -188,7 +188,7 @@ void Builder::build_import_table(void) {
uint32_t offsetIAT = this->binary_->rva_to_offset(import_header->ImportAddressTableRVA) - original_import.pointerto_raw_data();
if (offsetTable > import_content.size() or offsetIAT > import_content.size()) {
//TODO: Better handle
- LOG(ERROR) << "Can't patch" << std::endl;
+ LIEF_ERR("Can't patch");
break;
}
uint__ *lookupTable = reinterpret_cast<uint__*>(import_content.data() + offsetTable);
diff --git a/src/PE/CMakeLists.txt b/src/PE/CMakeLists.txt
index c791ec24..68cb0fa9 100644
--- a/src/PE/CMakeLists.txt
+++ b/src/PE/CMakeLists.txt
@@ -29,13 +29,6 @@ set(LIEF_PE_SRC
"${CMAKE_CURRENT_LIST_DIR}/RelocationEntry.cpp"
"${CMAKE_CURRENT_LIST_DIR}/DataDirectory.cpp"
"${CMAKE_CURRENT_LIST_DIR}/CodeIntegrity.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/AuthenticatedAttributes.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/ContentInfo.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/Signature.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/SignerInfo.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/x509.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/OIDToString.cpp"
- "${CMAKE_CURRENT_LIST_DIR}/signature/SignatureParser.cpp"
"${CMAKE_CURRENT_LIST_DIR}/Builder.tcc"
"${CMAKE_CURRENT_LIST_DIR}/Parser.tcc"
"${CMAKE_CURRENT_LIST_DIR}/resources/ResourceVersion.cpp"
@@ -47,6 +40,8 @@ set(LIEF_PE_SRC
"${CMAKE_CURRENT_LIST_DIR}/resources/ResourceStringFileInfo.cpp"
"${CMAKE_CURRENT_LIST_DIR}/resources/LangCodeItem.cpp"
"${CMAKE_CURRENT_LIST_DIR}/resources/ResourceIcon.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/resources/ResourceStringTable.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/resources/ResourceAccelerator.cpp"
)
set(LIEF_PE_LOAD_CONFIGURATION_SRC
@@ -123,7 +118,7 @@ set(LIEF_PE_INCLUDE_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/ResourceNode.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/ResourcesManager.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/Section.hpp"
- "${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/Structures.hpp" # Do we want to do this since it's autogenerated?
+ #"${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/Structures.hpp" # Do we want to do this since it's autogenerated?
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/Symbol.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/TLS.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/type_traits.hpp"
@@ -144,18 +139,6 @@ set(LIEF_PE_LOAD_CONFIGURATION_INCLUDE
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/LoadConfigurations/LoadConfigurationV7.hpp"
)
-set(LIEF_PE_SIG_INCLUDE_FILES
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/AuthenticatedAttributes.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/ContentInfo.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/OIDToString.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/Signature.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/SignatureParser.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/SignerInfo.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/types.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/x509.hpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/src/PE/signature/pkcs7.h"
-)
-
set(LIEF_PE_RESOURCES_INCLUDE_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/resources/ResourceVersion.hpp"
"${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/resources/ResourceDialog.hpp"
@@ -197,7 +180,6 @@ list(APPEND LIEF_PE_INCLUDE_FILES ${LIEF_PE_HASH_HDR})
source_group("Source Files\\PE" FILES ${LIEF_PE_SRC})
source_group("Source Files\\PE\\Load Configure" FILES ${LIEF_PE_LOAD_CONFIGURATION_SRC})
source_group("Header Files\\PE" FILES ${LIEF_PE_INCLUDE_FILES})
-source_group("Header Files\\PE\\signature" FILES ${LIEF_PE_SIG_INCLUDE_FILES})
source_group("Header Files\\PE\\resources" FILES ${LIEF_PE_RESOURCES_INCLUDE_FILES})
source_group("Header Files\\PE\\Load Configuration" FILES ${LIEF_PE_LOAD_CONFIGURATION_INCLUDE})
source_group("Header Files\\PE\\utils\\Ordinals Lookup Tables" FILES ${LIEF_PE_UTILS_INCLUDE_FILES})
@@ -213,3 +195,5 @@ if (LIEF_PE)
${LIEF_PE_LOAD_CONFIGURATION_INCLUDE}
)
endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/signature/CMakeLists.txt")
diff --git a/src/PE/CodeIntegrity.cpp b/src/PE/CodeIntegrity.cpp
index 1d9ef381..0391d262 100644
--- a/src/PE/CodeIntegrity.cpp
+++ b/src/PE/CodeIntegrity.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/CodeIntegrity.hpp"
diff --git a/src/PE/CodeView.cpp b/src/PE/CodeView.cpp
index b9eaacac..17a01b0f 100644
--- a/src/PE/CodeView.cpp
+++ b/src/PE/CodeView.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/CodeViewPDB.cpp b/src/PE/CodeViewPDB.cpp
index 8f01192a..daa38748 100644
--- a/src/PE/CodeViewPDB.cpp
+++ b/src/PE/CodeViewPDB.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/DataDirectory.cpp b/src/PE/DataDirectory.cpp
index da2b5859..90546d80 100644
--- a/src/PE/DataDirectory.cpp
+++ b/src/PE/DataDirectory.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/exception.hpp"
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/Section.hpp"
#include "LIEF/PE/DataDirectory.hpp"
#include "LIEF/PE/EnumToString.hpp"
diff --git a/src/PE/Debug.cpp b/src/PE/Debug.cpp
index cd03bdde..be1980b3 100644
--- a/src/PE/Debug.cpp
+++ b/src/PE/Debug.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,8 +17,11 @@
#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/Debug.hpp"
+#include "LIEF/PE/CodeView.hpp"
+#include "LIEF/PE/Pogo.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/DosHeader.cpp b/src/PE/DosHeader.cpp
index 156af0ae..a0384302 100644
--- a/src/PE/DosHeader.cpp
+++ b/src/PE/DosHeader.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/PE/DosHeader.hpp"
+#include "LIEF/PE/Structures.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/EnumToString.cpp b/src/PE/EnumToString.cpp
index dac82818..33a08d1d 100644
--- a/src/PE/EnumToString.cpp
+++ b/src/PE/EnumToString.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -380,8 +380,8 @@ const char* to_string(RELOCATIONS_BASE_TYPES e) {
{ RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_THUMB_MOV32, "REL | ARM_MOV32T | THUMB_MOV32 | RISCV_LOW12I" },
{ RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_RISCV_LOW12I, "REL | ARM_MOV32T | THUMB_MOV32 | RISCV_LOW12I" },
{ RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_RISCV_LOW12S, "RISCV_LOW12S" },
- { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_MIPS_JMPADDR16, "MIPS_JMPADDR16 | IA64_DIR64" },
- { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_IA64_IMM64, "MIPS_JMPADDR16 | IA64_DIR64" },
+ { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_MIPS_JMPADDR16, "MIPS_JMPADDR16 | IA64_IMM64" },
+ { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_IA64_IMM64, "MIPS_JMPADDR16 | IA64_IMM64" },
{ RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_DIR64, "DIR64" },
{ RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGH3ADJ, "HIGH3ADJ" },
};
@@ -1104,25 +1104,17 @@ const char* to_string(WIN_VERSION e) {
const char* to_string(GUARD_CF_FLAGS e) {
- CONST_MAP(GUARD_CF_FLAGS, const char*, 7) enumStrings {
- { GUARD_CF_FLAGS::GCF_NONE, "NONE" },
- { GUARD_CF_FLAGS::GCF_INSTRUMENTED, "INSTRUMENTED" },
- { GUARD_CF_FLAGS::GCF_W_INSTRUMENTED, "W_INSTRUMENTED" },
- { GUARD_CF_FLAGS::GCF_FUNCTION_TABLE_PRESENT, "FUNCTION_TABLE_PRESENT" },
- { GUARD_CF_FLAGS::GCF_EXPORT_SUPPRESSION_INFO_PRESENT, "EXPORT_SUPPRESSION_INFO_PRESENT" },
- { GUARD_CF_FLAGS::GCF_ENABLE_EXPORT_SUPPRESSION, "ENABLE_EXPORT_SUPPRESSION" },
- { GUARD_CF_FLAGS::GCF_LONGJUMP_TABLE_PRESENT, "LONGJUMP_TABLE_PRESENT" },
- };
- auto it = enumStrings.find(e);
- return it == enumStrings.end() ? "Out of range" : it->second;
-}
-
-
-const char* to_string(GUARD_RF_FLAGS e) {
- CONST_MAP(GUARD_RF_FLAGS, const char*, 3) enumStrings {
- { GUARD_RF_FLAGS::GRF_INSTRUMENTED, "INSTRUMENTED" },
- { GUARD_RF_FLAGS::GRF_ENABLE, "ENABLE" },
- { GUARD_RF_FLAGS::GRF_STRICT, "STRICT" },
+ CONST_MAP(GUARD_CF_FLAGS, const char*, 10) enumStrings {
+ { GUARD_CF_FLAGS::GCF_NONE, "GCF_NONE" },
+ { GUARD_CF_FLAGS::GCF_INSTRUMENTED, "GCF_INSTRUMENTED" },
+ { GUARD_CF_FLAGS::GCF_W_INSTRUMENTED, "GCF_W_INSTRUMENTED" },
+ { GUARD_CF_FLAGS::GCF_FUNCTION_TABLE_PRESENT, "GCF_FUNCTION_TABLE_PRESENT" },
+ { GUARD_CF_FLAGS::GCF_EXPORT_SUPPRESSION_INFO_PRESENT, "GCF_EXPORT_SUPPRESSION_INFO_PRESENT" },
+ { GUARD_CF_FLAGS::GCF_ENABLE_EXPORT_SUPPRESSION, "GCF_ENABLE_EXPORT_SUPPRESSION" },
+ { GUARD_CF_FLAGS::GCF_LONGJUMP_TABLE_PRESENT, "GCF_LONGJUMP_TABLE_PRESENT" },
+ { GUARD_CF_FLAGS::GRF_INSTRUMENTED, "GRF_INSTRUMENTED" },
+ { GUARD_CF_FLAGS::GRF_ENABLE, "GRF_ENABLE" },
+ { GUARD_CF_FLAGS::GRF_STRICT, "GRF_STRICT" },
};
auto it = enumStrings.find(e);
return it == enumStrings.end() ? "Out of range" : it->second;
@@ -1151,6 +1143,248 @@ const char* to_string(POGO_SIGNATURES e) {
return it == enumStrings.end() ? to_string(POGO_SIGNATURES::POGO_UNKNOWN) : it->second;
}
+const char* to_string(ACCELERATOR_FLAGS e) {
+ CONST_MAP(ACCELERATOR_FLAGS, const char*, 6) enumStrings {
+ { ACCELERATOR_FLAGS::FVIRTKEY, "FVIRTKEY" },
+ { ACCELERATOR_FLAGS::FNOINVERT, "FNOINVERT" },
+ { ACCELERATOR_FLAGS::FSHIFT, "FSHIFT" },
+ { ACCELERATOR_FLAGS::FCONTROL, "FCONTROL" },
+ { ACCELERATOR_FLAGS::FALT, "FALT" },
+ { ACCELERATOR_FLAGS::END, "END" },
+ };
+ auto it = enumStrings.find(e);
+ return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(ACCELERATOR_VK_CODES e) {
+ CONST_MAP(ACCELERATOR_VK_CODES, const char*, 174) enumStrings {
+ { ACCELERATOR_VK_CODES::VK_LBUTTON, "VK_LBUTTON" },
+ { ACCELERATOR_VK_CODES::VK_RBUTTON, "VK_RBUTTON" },
+ { ACCELERATOR_VK_CODES::VK_CANCEL, "VK_CANCEL" },
+ { ACCELERATOR_VK_CODES::VK_MBUTTON, "VK_MBUTTON" },
+ { ACCELERATOR_VK_CODES::VK_XBUTTON1, "VK_XBUTTON1" },
+ { ACCELERATOR_VK_CODES::VK_XBUTTON2, "VK_XBUTTON2" },
+ { ACCELERATOR_VK_CODES::VK_BACK, "VK_BACK" },
+ { ACCELERATOR_VK_CODES::VK_TAB, "VK_TAB" },
+ { ACCELERATOR_VK_CODES::VK_CLEAR, "VK_CLEAR" },
+ { ACCELERATOR_VK_CODES::VK_RETURN, "VK_RETURN" },
+ { ACCELERATOR_VK_CODES::VK_SHIFT, "VK_SHIFT" },
+ { ACCELERATOR_VK_CODES::VK_CONTROL, "VK_CONTROL" },
+ { ACCELERATOR_VK_CODES::VK_MENU, "VK_MENU" },
+ { ACCELERATOR_VK_CODES::VK_PAUSE, "VK_PAUSE" },
+ { ACCELERATOR_VK_CODES::VK_CAPITAL, "VK_CAPITAL" },
+ { ACCELERATOR_VK_CODES::VK_KANA, "VK_KANA" },
+ { ACCELERATOR_VK_CODES::VK_HANGUEL, "VK_HANGUEL" },
+ { ACCELERATOR_VK_CODES::VK_HANGUL, "VK_HANGUL" },
+ { ACCELERATOR_VK_CODES::VK_IME_ON, "VK_IME_ON" },
+ { ACCELERATOR_VK_CODES::VK_JUNJA, "VK_JUNJA" },
+ { ACCELERATOR_VK_CODES::VK_FINAL, "VK_FINAL" },
+ { ACCELERATOR_VK_CODES::VK_HANJA, "VK_HANJA" },
+ { ACCELERATOR_VK_CODES::VK_KANJI, "VK_KANJI" },
+ { ACCELERATOR_VK_CODES::VK_IME_OFF, "VK_IME_OFF" },
+ { ACCELERATOR_VK_CODES::VK_ESCAPE, "VK_ESCAPE" },
+ { ACCELERATOR_VK_CODES::VK_CONVERT, "VK_CONVERT" },
+ { ACCELERATOR_VK_CODES::VK_NONCONVERT, "VK_NONCONVERT" },
+ { ACCELERATOR_VK_CODES::VK_ACCEPT, "VK_ACCEPT" },
+ { ACCELERATOR_VK_CODES::VK_MODECHANGE, "VK_MODECHANGE" },
+ { ACCELERATOR_VK_CODES::VK_SPACE, "VK_SPACE" },
+ { ACCELERATOR_VK_CODES::VK_PRIOR, "VK_PRIOR" },
+ { ACCELERATOR_VK_CODES::VK_NEXT, "VK_NEXT" },
+ { ACCELERATOR_VK_CODES::VK_END, "VK_END" },
+ { ACCELERATOR_VK_CODES::VK_HOME, "VK_HOME" },
+ { ACCELERATOR_VK_CODES::VK_LEFT, "VK_LEFT" },
+ { ACCELERATOR_VK_CODES::VK_UP, "VK_UP" },
+ { ACCELERATOR_VK_CODES::VK_RIGHT, "VK_RIGHT" },
+ { ACCELERATOR_VK_CODES::VK_DOWN, "VK_DOWN" },
+ { ACCELERATOR_VK_CODES::VK_SELECT, "VK_SELECT" },
+ { ACCELERATOR_VK_CODES::VK_PRINT, "VK_PRINT" },
+ { ACCELERATOR_VK_CODES::VK_EXECUTE, "VK_EXECUTE" },
+ { ACCELERATOR_VK_CODES::VK_SNAPSHOT, "VK_SNAPSHOT" },
+ { ACCELERATOR_VK_CODES::VK_INSERT, "VK_INSERT" },
+ { ACCELERATOR_VK_CODES::VK_DELETE, "VK_DELETE" },
+ { ACCELERATOR_VK_CODES::VK_HELP, "VK_HELP" },
+ { ACCELERATOR_VK_CODES::VK_0, "VK_0" },
+ { ACCELERATOR_VK_CODES::VK_1, "VK_1" },
+ { ACCELERATOR_VK_CODES::VK_2, "VK_2" },
+ { ACCELERATOR_VK_CODES::VK_3, "VK_3" },
+ { ACCELERATOR_VK_CODES::VK_4, "VK_4" },
+ { ACCELERATOR_VK_CODES::VK_5, "VK_5" },
+ { ACCELERATOR_VK_CODES::VK_6, "VK_6" },
+ { ACCELERATOR_VK_CODES::VK_7, "VK_7" },
+ { ACCELERATOR_VK_CODES::VK_8, "VK_8" },
+ { ACCELERATOR_VK_CODES::VK_9, "VK_9" },
+ { ACCELERATOR_VK_CODES::VK_A, "VK_A" },
+ { ACCELERATOR_VK_CODES::VK_B, "VK_B" },
+ { ACCELERATOR_VK_CODES::VK_C, "VK_C" },
+ { ACCELERATOR_VK_CODES::VK_D, "VK_D" },
+ { ACCELERATOR_VK_CODES::VK_E, "VK_E" },
+ { ACCELERATOR_VK_CODES::VK_F, "VK_F" },
+ { ACCELERATOR_VK_CODES::VK_G, "VK_G" },
+ { ACCELERATOR_VK_CODES::VK_H, "VK_H" },
+ { ACCELERATOR_VK_CODES::VK_I, "VK_I" },
+ { ACCELERATOR_VK_CODES::VK_J, "VK_J" },
+ { ACCELERATOR_VK_CODES::VK_K, "VK_K" },
+ { ACCELERATOR_VK_CODES::VK_L, "VK_L" },
+ { ACCELERATOR_VK_CODES::VK_M, "VK_M" },
+ { ACCELERATOR_VK_CODES::VK_N, "VK_N" },
+ { ACCELERATOR_VK_CODES::VK_O, "VK_O" },
+ { ACCELERATOR_VK_CODES::VK_P, "VK_P" },
+ { ACCELERATOR_VK_CODES::VK_Q, "VK_Q" },
+ { ACCELERATOR_VK_CODES::VK_R, "VK_R" },
+ { ACCELERATOR_VK_CODES::VK_S, "VK_S" },
+ { ACCELERATOR_VK_CODES::VK_T, "VK_T" },
+ { ACCELERATOR_VK_CODES::VK_U, "VK_U" },
+ { ACCELERATOR_VK_CODES::VK_V, "VK_V" },
+ { ACCELERATOR_VK_CODES::VK_W, "VK_W" },
+ { ACCELERATOR_VK_CODES::VK_X, "VK_X" },
+ { ACCELERATOR_VK_CODES::VK_Y, "VK_Y" },
+ { ACCELERATOR_VK_CODES::VK_Z, "VK_Z" },
+ { ACCELERATOR_VK_CODES::VK_LWIN, "VK_LWIN" },
+ { ACCELERATOR_VK_CODES::VK_RWIN, "VK_RWIN" },
+ { ACCELERATOR_VK_CODES::VK_APPS, "VK_APPS" },
+ { ACCELERATOR_VK_CODES::VK_SLEEP, "VK_SLEEP" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD0, "VK_NUMPAD0" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD1, "VK_NUMPAD1" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD2, "VK_NUMPAD2" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD3, "VK_NUMPAD3" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD4, "VK_NUMPAD4" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD5, "VK_NUMPAD5" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD6, "VK_NUMPAD6" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD7, "VK_NUMPAD7" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD8, "VK_NUMPAD8" },
+ { ACCELERATOR_VK_CODES::VK_NUMPAD9, "VK_NUMPAD9" },
+ { ACCELERATOR_VK_CODES::VK_MULTIPLY, "VK_MULTIPLY" },
+ { ACCELERATOR_VK_CODES::VK_ADD, "VK_ADD" },
+ { ACCELERATOR_VK_CODES::VK_SEPARATOR, "VK_SEPARATOR" },
+ { ACCELERATOR_VK_CODES::VK_SUBTRACT, "VK_SUBTRACT" },
+ { ACCELERATOR_VK_CODES::VK_DECIMAL, "VK_DECIMAL" },
+ { ACCELERATOR_VK_CODES::VK_DIVIDE, "VK_DIVIDE" },
+ { ACCELERATOR_VK_CODES::VK_F1, "VK_F1" },
+ { ACCELERATOR_VK_CODES::VK_F2, "VK_F2" },
+ { ACCELERATOR_VK_CODES::VK_F3, "VK_F3" },
+ { ACCELERATOR_VK_CODES::VK_F4, "VK_F4" },
+ { ACCELERATOR_VK_CODES::VK_F5, "VK_F5" },
+ { ACCELERATOR_VK_CODES::VK_F6, "VK_F6" },
+ { ACCELERATOR_VK_CODES::VK_F7, "VK_F7" },
+ { ACCELERATOR_VK_CODES::VK_F8, "VK_F8" },
+ { ACCELERATOR_VK_CODES::VK_F9, "VK_F9" },
+ { ACCELERATOR_VK_CODES::VK_F10, "VK_F10" },
+ { ACCELERATOR_VK_CODES::VK_F11, "VK_F11" },
+ { ACCELERATOR_VK_CODES::VK_F12, "VK_F12" },
+ { ACCELERATOR_VK_CODES::VK_F13, "VK_F13" },
+ { ACCELERATOR_VK_CODES::VK_F14, "VK_F14" },
+ { ACCELERATOR_VK_CODES::VK_F15, "VK_F15" },
+ { ACCELERATOR_VK_CODES::VK_F16, "VK_F16" },
+ { ACCELERATOR_VK_CODES::VK_F17, "VK_F17" },
+ { ACCELERATOR_VK_CODES::VK_F18, "VK_F18" },
+ { ACCELERATOR_VK_CODES::VK_F19, "VK_F19" },
+ { ACCELERATOR_VK_CODES::VK_F20, "VK_F20" },
+ { ACCELERATOR_VK_CODES::VK_F21, "VK_F21" },
+ { ACCELERATOR_VK_CODES::VK_F22, "VK_F22" },
+ { ACCELERATOR_VK_CODES::VK_F23, "VK_F23" },
+ { ACCELERATOR_VK_CODES::VK_F24, "VK_F24" },
+ { ACCELERATOR_VK_CODES::VK_NUMLOCK, "VK_NUMLOCK" },
+ { ACCELERATOR_VK_CODES::VK_SCROLL, "VK_SCROLL" },
+ { ACCELERATOR_VK_CODES::VK_LSHIFT, "VK_LSHIFT" },
+ { ACCELERATOR_VK_CODES::VK_RSHIFT, "VK_RSHIFT" },
+ { ACCELERATOR_VK_CODES::VK_LCONTROL, "VK_LCONTROL" },
+ { ACCELERATOR_VK_CODES::VK_RCONTROL, "VK_RCONTROL" },
+ { ACCELERATOR_VK_CODES::VK_LMENU, "VK_LMENU" },
+ { ACCELERATOR_VK_CODES::VK_RMENU, "VK_RMENU" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_BACK, "VK_BROWSER_BACK" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_FORWARD, "VK_BROWSER_FORWARD" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_REFRESH, "VK_BROWSER_REFRESH" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_STOP, "VK_BROWSER_STOP" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_SEARCH, "VK_BROWSER_SEARCH" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_FAVORITES, "VK_BROWSER_FAVORITES" },
+ { ACCELERATOR_VK_CODES::VK_BROWSER_HOME, "VK_BROWSER_HOME" },
+ { ACCELERATOR_VK_CODES::VK_VOLUME_MUTE, "VK_VOLUME_MUTE" },
+ { ACCELERATOR_VK_CODES::VK_VOLUME_DOWN, "VK_VOLUME_DOWN" },
+ { ACCELERATOR_VK_CODES::VK_VOLUME_UP, "VK_VOLUME_UP" },
+ { ACCELERATOR_VK_CODES::VK_MEDIA_NEXT_TRACK, "VK_MEDIA_NEXT_TRACK" },
+ { ACCELERATOR_VK_CODES::VK_MEDIA_PREV_TRACK, "VK_MEDIA_PREV_TRACK" },
+ { ACCELERATOR_VK_CODES::VK_MEDIA_STOP, "VK_MEDIA_STOP" },
+ { ACCELERATOR_VK_CODES::VK_MEDIA_PLAY_PAUSE, "VK_MEDIA_PLAY_PAUSE" },
+ { ACCELERATOR_VK_CODES::VK_LAUNCH_MAIL, "VK_LAUNCH_MAIL" },
+ { ACCELERATOR_VK_CODES::VK_LAUNCH_MEDIA_SELECT, "VK_LAUNCH_MEDIA_SELECT" },
+ { ACCELERATOR_VK_CODES::VK_LAUNCH_APP1, "VK_LAUNCH_APP1" },
+ { ACCELERATOR_VK_CODES::VK_LAUNCH_APP2, "VK_LAUNCH_APP2" },
+ { ACCELERATOR_VK_CODES::VK_OEM_1, "VK_OEM_1" },
+ { ACCELERATOR_VK_CODES::VK_OEM_PLUS, "VK_OEM_PLUS" },
+ { ACCELERATOR_VK_CODES::VK_OEM_COMMA, "VK_OEM_COMMA" },
+ { ACCELERATOR_VK_CODES::VK_OEM_MINUS, "VK_OEM_MINUS" },
+ { ACCELERATOR_VK_CODES::VK_OEM_PERIOD, "VK_OEM_PERIOD" },
+ { ACCELERATOR_VK_CODES::VK_OEM_2, "VK_OEM_2" },
+ { ACCELERATOR_VK_CODES::VK_OEM_4, "VK_OEM_4" },
+ { ACCELERATOR_VK_CODES::VK_OEM_5, "VK_OEM_5" },
+ { ACCELERATOR_VK_CODES::VK_OEM_6, "VK_OEM_6" },
+ { ACCELERATOR_VK_CODES::VK_OEM_7, "VK_OEM_7" },
+ { ACCELERATOR_VK_CODES::VK_OEM_8, "VK_OEM_8" },
+ { ACCELERATOR_VK_CODES::VK_OEM_102, "VK_OEM_102" },
+ { ACCELERATOR_VK_CODES::VK_PROCESSKEY, "VK_PROCESSKEY" },
+ { ACCELERATOR_VK_CODES::VK_PACKET, "VK_PACKET" },
+ { ACCELERATOR_VK_CODES::VK_ATTN, "VK_ATTN" },
+ { ACCELERATOR_VK_CODES::VK_CRSEL, "VK_CRSEL" },
+ { ACCELERATOR_VK_CODES::VK_EXSEL, "VK_EXSEL" },
+ { ACCELERATOR_VK_CODES::VK_EREOF, "VK_EREOF" },
+ { ACCELERATOR_VK_CODES::VK_PLAY, "VK_PLAY" },
+ { ACCELERATOR_VK_CODES::VK_ZOOM, "VK_ZOOM" },
+ { ACCELERATOR_VK_CODES::VK_NONAME, "VK_NONAME" },
+ { ACCELERATOR_VK_CODES::VK_PA1, "VK_PA1" },
+ { ACCELERATOR_VK_CODES::VK_OEM_CLEAR, "VK_OEM_CLEAR" },
+ };
+ auto it = enumStrings.find(e);
+ return it != enumStrings.end() ? it->second : "Undefined or reserved";
+}
+
+const char* to_string(ALGORITHMS e) {
+ CONST_MAP(ALGORITHMS, const char*, 20) enumStrings {
+ { ALGORITHMS::UNKNOWN, "UNKNOWN" },
+ { ALGORITHMS::SHA_512, "SHA_512" },
+ { ALGORITHMS::SHA_384, "SHA_384" },
+ { ALGORITHMS::SHA_256, "SHA_256" },
+ { ALGORITHMS::SHA_1, "SHA_1" },
+
+ { ALGORITHMS::MD5, "MD5" },
+ { ALGORITHMS::MD4, "MD4" },
+ { ALGORITHMS::MD2, "MD2" },
+
+ { ALGORITHMS::RSA, "RSA" },
+ { ALGORITHMS::EC, "EC" },
+
+ { ALGORITHMS::MD5_RSA, "MD5_RSA" },
+ { ALGORITHMS::SHA1_DSA, "SHA1_DSA" },
+ { ALGORITHMS::SHA1_RSA, "SHA1_RSA" },
+ { ALGORITHMS::SHA_256_RSA, "SHA_256_RSA" },
+ { ALGORITHMS::SHA_384_RSA, "SHA_384_RSA" },
+ { ALGORITHMS::SHA_512_RSA, "SHA_512_RSA" },
+ { ALGORITHMS::SHA1_ECDSA, "SHA1_ECDSA" },
+ { ALGORITHMS::SHA_256_ECDSA, "SHA_256_ECDSA" },
+ { ALGORITHMS::SHA_384_ECDSA, "SHA_384_ECDSA" },
+ { ALGORITHMS::SHA_512_ECDSA, "SHA_512_ECDSA" },
+ };
+ auto it = enumStrings.find(e);
+ return it == enumStrings.end() ? "UNKNOWN" : it->second;
+}
+
+
+const char* to_string(SIG_ATTRIBUTE_TYPES e) {
+ CONST_MAP(SIG_ATTRIBUTE_TYPES, const char*, 11) enumStrings {
+ { SIG_ATTRIBUTE_TYPES::UNKNOWN, "UNKNOWN" },
+ { SIG_ATTRIBUTE_TYPES::CONTENT_TYPE, "CONTENT_TYPE" },
+ { SIG_ATTRIBUTE_TYPES::GENERIC_TYPE, "GENERIC_TYPE" },
+ { SIG_ATTRIBUTE_TYPES::SPC_SP_OPUS_INFO, "SPC_SP_OPUS_INFO" },
+ { SIG_ATTRIBUTE_TYPES::MS_COUNTER_SIGN, "MS_COUNTER_SIGN" },
+ { SIG_ATTRIBUTE_TYPES::MS_SPC_NESTED_SIGN, "MS_SPC_NESTED_SIGN" },
+ { SIG_ATTRIBUTE_TYPES::MS_SPC_STATEMENT_TYPE, "MS_SPC_STATEMENT_TYPE" },
+ { SIG_ATTRIBUTE_TYPES::PKCS9_AT_SEQUENCE_NUMBER, "PKCS9_AT_SEQUENCE_NUMBER" },
+ { SIG_ATTRIBUTE_TYPES::PKCS9_COUNTER_SIGNATURE, "PKCS9_COUNTER_SIGNATURE" },
+ { SIG_ATTRIBUTE_TYPES::PKCS9_MESSAGE_DIGEST, "PKCS9_MESSAGE_DIGEST" },
+ { SIG_ATTRIBUTE_TYPES::PKCS9_SIGNING_TIME, "PKCS9_SIGNING_TIME" },
+ };
+ auto it = enumStrings.find(e);
+ return it == enumStrings.end() ? "UNKNOWN" : it->second;
+}
} // namespace PE
} // namespace LIEF
diff --git a/src/PE/Export.cpp b/src/PE/Export.cpp
index b601bd32..cb4e6a24 100644
--- a/src/PE/Export.cpp
+++ b/src/PE/Export.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,9 @@
#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/Export.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/ExportEntry.cpp b/src/PE/ExportEntry.cpp
index 8b21f486..8a42b233 100644
--- a/src/PE/ExportEntry.cpp
+++ b/src/PE/ExportEntry.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/Header.cpp b/src/PE/Header.cpp
index 705409b4..c3ed5c5f 100644
--- a/src/PE/Header.cpp
+++ b/src/PE/Header.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/Header.hpp"
+#include "LIEF/PE/Structures.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/Import.cpp b/src/PE/Import.cpp
index db7c3357..f6ff1fa0 100644
--- a/src/PE/Import.cpp
+++ b/src/PE/Import.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/exception.hpp"
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
#include "LIEF/PE/Import.hpp"
namespace LIEF {
diff --git a/src/PE/ImportEntry.cpp b/src/PE/ImportEntry.cpp
index fdb80f21..66eb67a2 100644
--- a/src/PE/ImportEntry.cpp
+++ b/src/PE/ImportEntry.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfiguration.cpp b/src/PE/LoadConfigurations/LoadConfiguration.cpp
index b9028002..8c17b68c 100644
--- a/src/PE/LoadConfigurations/LoadConfiguration.cpp
+++ b/src/PE/LoadConfigurations/LoadConfiguration.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/exception.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/LoadConfigurations.hpp"
#include "LIEF/PE/EnumToString.hpp"
diff --git a/src/PE/LoadConfigurations/LoadConfiguration.tcc b/src/PE/LoadConfigurations/LoadConfiguration.tcc
index ced90c8c..aa45ea67 100644
--- a/src/PE/LoadConfigurations/LoadConfiguration.tcc
+++ b/src/PE/LoadConfigurations/LoadConfiguration.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV0.cpp b/src/PE/LoadConfigurations/LoadConfigurationV0.cpp
index be03284c..d308e108 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV0.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV0.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV0.tcc b/src/PE/LoadConfigurations/LoadConfigurationV0.tcc
index 2b8d4c0e..12c2f19a 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV0.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV0.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV1.cpp b/src/PE/LoadConfigurations/LoadConfigurationV1.cpp
index a2f58aed..26260f39 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV1.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV1.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV1.tcc b/src/PE/LoadConfigurations/LoadConfigurationV1.tcc
index 42482984..d2e7556c 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV1.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV1.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV2.cpp b/src/PE/LoadConfigurations/LoadConfigurationV2.cpp
index 4bce9072..3c4cae97 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV2.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV2.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV2.tcc b/src/PE/LoadConfigurations/LoadConfigurationV2.tcc
index 216ab621..3d923fbc 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV2.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV2.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV3.cpp b/src/PE/LoadConfigurations/LoadConfigurationV3.cpp
index 39cddd8e..cfac428e 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV3.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV3.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV3.tcc b/src/PE/LoadConfigurations/LoadConfigurationV3.tcc
index 986a4261..cdb7449c 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV3.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV3.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV4.cpp b/src/PE/LoadConfigurations/LoadConfigurationV4.cpp
index 60180791..62f119f8 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV4.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV4.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV4.tcc b/src/PE/LoadConfigurations/LoadConfigurationV4.tcc
index cae19710..4c6846d9 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV4.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV4.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV5.cpp b/src/PE/LoadConfigurations/LoadConfigurationV5.cpp
index aea416f1..4885389f 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV5.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV5.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV5.tcc b/src/PE/LoadConfigurations/LoadConfigurationV5.tcc
index 4c71ce5a..344993ab 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV5.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV5.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV6.cpp b/src/PE/LoadConfigurations/LoadConfigurationV6.cpp
index 2694e47a..8d24f530 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV6.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV6.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV6.tcc b/src/PE/LoadConfigurations/LoadConfigurationV6.tcc
index 581213b2..c22e2ff1 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV6.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV6.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV7.cpp b/src/PE/LoadConfigurations/LoadConfigurationV7.cpp
index a821a70b..b05c1565 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV7.cpp
+++ b/src/PE/LoadConfigurations/LoadConfigurationV7.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurationV7.tcc b/src/PE/LoadConfigurations/LoadConfigurationV7.tcc
index 1084e589..a81f7691 100644
--- a/src/PE/LoadConfigurations/LoadConfigurationV7.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurationV7.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/LoadConfigurations/LoadConfigurations.tcc b/src/PE/LoadConfigurations/LoadConfigurations.tcc
index 104c3929..97af171d 100644
--- a/src/PE/LoadConfigurations/LoadConfigurations.tcc
+++ b/src/PE/LoadConfigurations/LoadConfigurations.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/OptionalHeader.cpp b/src/PE/OptionalHeader.cpp
index 0e58f977..c422ca26 100644
--- a/src/PE/OptionalHeader.cpp
+++ b/src/PE/OptionalHeader.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,21 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include <stdexcept>
-#include <iomanip>
-#include <functional>
-#include <algorithm>
#include <numeric>
-#include <iterator>
-#include <string>
+#include <iomanip>
-#include "LIEF/PE/hash.hpp"
#include "LIEF/utils.hpp"
#include "LIEF/exception.hpp"
+#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/OptionalHeader.hpp"
#include "LIEF/PE/EnumToString.hpp"
-#include "LIEF/PE/utils.hpp"
namespace LIEF {
diff --git a/src/PE/Parser.cpp b/src/PE/Parser.cpp
index dab8c1a2..82a855f5 100644
--- a/src/PE/Parser.cpp
+++ b/src/PE/Parser.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,28 +23,39 @@
#include <mbedtls/oid.h>
#include <mbedtls/x509_crt.h>
-#include "LIEF/logging++.hpp"
+#include "filesystem/filesystem.h"
+
+#include "logging.hpp"
#include "LIEF/exception.hpp"
#include "LIEF/BinaryStream/VectorStream.hpp"
-
+#include "LIEF/Abstract/Relocation.hpp"
#include "LIEF/PE/signature/Signature.hpp"
#include "LIEF/PE/signature/SignatureParser.hpp"
#include "LIEF/PE/signature/OIDToString.hpp"
-
-
#include "LIEF/PE/CodeViewPDB.hpp"
-
#include "LIEF/PE/Parser.hpp"
-#include "Parser.tcc"
-
#include "LIEF/PE/utils.hpp"
-
-#include "filesystem/filesystem.h"
+#include "LIEF/PE/Section.hpp"
+#include "LIEF/PE/Binary.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+#include "LIEF/PE/ResourceData.hpp"
+#include "LIEF/PE/ResourceDirectory.hpp"
+#include "LIEF/PE/ResourceNode.hpp"
+#include "LIEF/PE/Export.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
+#include "LIEF/PE/Pogo.hpp"
+#include "LIEF/PE/PogoEntry.hpp"
+#include "LIEF/PE/Relocation.hpp"
+#include "LIEF/PE/RelocationEntry.hpp"
+#include "LIEF/PE/Symbol.hpp"
+#include "LIEF/PE/Import.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
+#include "LIEF/PE/EnumToString.hpp"
#include "signature/pkcs7.h"
-
+#include "Parser.tcc"
// Issue with VS2017
#if defined(IMAGE_FILE_MACHINE_UNKNOWN)
@@ -82,8 +93,13 @@ Parser::Parser(const std::vector<uint8_t>& data, const std::string& name) :
void Parser::init(const std::string& name) {
-
- this->type_ = get_type(this->stream_->content());
+ stream_->setpos(0);
+ auto type = get_type_from_stream(*stream_);
+ if (not type) {
+ LIEF_ERR("Can't determine PE type.");
+ return;
+ }
+ this->type_ = type.value();
this->binary_ = new Binary{};
this->binary_->name(name);
this->binary_->type_ = this->type_;
@@ -104,11 +120,11 @@ void Parser::parse_dos_stub(void) {
}
const uint64_t sizeof_dos_stub = dos_header.addressof_new_exeheader() - sizeof(pe_dos_header);
- VLOG(VDEBUG) << "Size of dos stub: " << std::hex << sizeof_dos_stub;
+ LIEF_DEBUG("DOS stub: @0x{:x}:0x{:x}", sizeof(pe_dos_header), sizeof_dos_stub);
const uint8_t* ptr_to_dos_stub = this->stream_->peek_array<uint8_t>(sizeof(pe_dos_header), sizeof_dos_stub, /* check */false);
if (ptr_to_dos_stub == nullptr) {
- LOG(ERROR) << "Dost stub corrupted!";
+ LIEF_ERR("DOS stub is corrupted!");
} else {
this->binary_->dos_stub_ = {ptr_to_dos_stub, ptr_to_dos_stub + sizeof_dos_stub};
}
@@ -116,23 +132,19 @@ void Parser::parse_dos_stub(void) {
void Parser::parse_rich_header(void) {
- VLOG(VDEBUG) << "Parsing Rich Header";
+ LIEF_DEBUG("Parsing rich header");
const std::vector<uint8_t>& dos_stub = this->binary_->dos_stub();
VectorStream stream{dos_stub};
- auto&& it_rich = std::search(
- std::begin(dos_stub),
- std::end(dos_stub),
- std::begin(Rich_Magic),
- std::end(Rich_Magic));
+ auto it_rich = std::search(std::begin(dos_stub), std::end(dos_stub),
+ std::begin(Rich_Magic), std::end(Rich_Magic));
if (it_rich == std::end(dos_stub)) {
- VLOG(VDEBUG) << "Rich header not found";
+ LIEF_DEBUG("Rich header not found!");
return;
}
-
const uint64_t end_offset_rich_header = std::distance(std::begin(dos_stub), it_rich);
- VLOG(VDEBUG) << "Offset to rich header: " << std::hex << end_offset_rich_header;
+ LIEF_DEBUG("Offset to rich header: 0x{:x}", end_offset_rich_header);
if (not stream.can_read<uint32_t>(end_offset_rich_header + sizeof(Rich_Magic))) {
return;
@@ -140,8 +152,7 @@ void Parser::parse_rich_header(void) {
const uint32_t xor_key = stream.peek<uint32_t>(end_offset_rich_header + sizeof(Rich_Magic));
this->binary_->rich_header().key(xor_key);
- VLOG(VDEBUG) << "XOR Key: " << std::hex << xor_key;
-
+ LIEF_DEBUG("XOR key: 0x{:x}", xor_key);
uint64_t curent_offset = end_offset_rich_header - sizeof(Rich_Magic);
@@ -166,6 +177,10 @@ void Parser::parse_rich_header(void) {
value = stream.peek<uint32_t>(curent_offset) ^ xor_key;
curent_offset -= sizeof(uint32_t);
+ if (value == 0 and count == 0) { // Skip padding entry
+ continue;
+ }
+
if (value == DanS_Magic_number or count == DanS_Magic_number) {
break;
}
@@ -173,16 +188,13 @@ void Parser::parse_rich_header(void) {
uint16_t build_number = value & 0xFFFF;
uint16_t id = (value >> 16) & 0xFFFF;
- VLOG(VDEBUG) << "ID: " << std::hex << id << " "
- << "Build Number: " << std::hex << build_number << " "
- << "Count: " << std::dec << count;
+ LIEF_DEBUG("ID: 0x{:04x}", id);
+ LIEF_DEBUG("Build Number: 0x{:04x}", build_number);
+ LIEF_DEBUG("Count: 0x{:d}", count);
this->binary_->rich_header().add_entry(id, build_number, count);
}
- VLOG(VDEBUG) << this->binary_->rich_header();
-
-
this->binary_->has_rich_header_ = true;
}
@@ -196,8 +208,7 @@ void Parser::parse_rich_header(void) {
// TODO: Check offset etc
void Parser::parse_sections(void) {
- VLOG(VDEBUG) << "[+] Parsing sections";
-
+ LIEF_DEBUG("Parsing sections");
const uint32_t sections_offset =
this->binary_->dos_header().addressof_new_exeheader() +
sizeof(pe_header) +
@@ -208,7 +219,7 @@ void Parser::parse_sections(void) {
const uint32_t numberof_sections = this->binary_->header().numberof_sections();
const pe_section* sections = this->stream_->peek_array<pe_section>(sections_offset, numberof_sections, /* check */false);
if (sections == nullptr) {
- LOG(ERROR) << "Sections corrupted!";
+ LIEF_ERR("Section headers corrupted!");
return;
}
@@ -217,7 +228,9 @@ void Parser::parse_sections(void) {
uint32_t size_to_read = 0;
uint32_t offset = sections[i].PointerToRawData;
- first_section_offset = std::min(first_section_offset, offset);
+ if (offset > 0) {
+ first_section_offset = std::min(first_section_offset, offset);
+ }
if (sections[i].VirtualSize > 0) {
size_to_read = std::min(sections[i].VirtualSize, sections[i].SizeOfRawData); // According to Corkami
@@ -232,23 +245,47 @@ void Parser::parse_sections(void) {
if (size_to_read > Parser::MAX_DATA_SIZE) {
- LOG(WARNING) << "Section '" << section->name() << "' data is too large!";
+ LIEF_WARN("Data of section section '{}' is too large (0x{:x})", section->name(), size_to_read);
} else {
const uint8_t* ptr_to_rawdata = this->stream_->peek_array<uint8_t>(offset, size_to_read, /* check */false);
if (ptr_to_rawdata == nullptr) {
- LOG(ERROR) << "Section #" << std::dec << i << " corrupted!";
+ LIEF_ERR("Section #{:d} ({}) is corrupted", i, section->name());
} else {
section->content_ = {
ptr_to_rawdata,
ptr_to_rawdata + size_to_read
};
}
+ const uint64_t padding_size = section->size() - size_to_read;
+
+ // Treat content between two sections (that is not wrapped in a section) as 'padding'
+ uint64_t hole_size = 0;
+ if (i < numberof_sections - 1) {
+ const pe_section& next_section = sections[i + 1];
+ const uint64_t sec_offset = next_section.PointerToRawData;
+ if (offset + size_to_read + padding_size < sec_offset) {
+ hole_size = sec_offset - (offset + size_to_read + padding_size);
+ }
+ }
+ const uint8_t* ptr_to_padding = this->stream_->peek_array<uint8_t>(offset + size_to_read,
+ padding_size + hole_size,
+ /* check */false);
+ if (ptr_to_padding != nullptr) {
+ section->padding_ = {ptr_to_padding, ptr_to_padding + padding_size + hole_size};
+ }
}
this->binary_->sections_.push_back(section.release());
}
+
const uint32_t last_section_header_offset = sections_offset + numberof_sections * sizeof(pe_section);
+ const size_t padding_size = first_section_offset - last_section_header_offset;
+ const uint8_t* padding_ptr = this->stream_->peek_array<uint8_t>(last_section_header_offset, padding_size,
+ /* check */ false);
+ if (padding_ptr != nullptr) {
+ this->binary_->section_offset_padding_ = {padding_ptr, padding_ptr + padding_size};
+ }
this->binary_->available_sections_space_ = (first_section_offset - last_section_header_offset) / sizeof(pe_section) - 1;
- VLOG(VDEBUG) << "Number of sections that could be added: " << std::dec << this->binary_->available_sections_space_;
+ LIEF_DEBUG("Number of sections that could be added: #{:d}", this->binary_->available_sections_space_);
}
@@ -256,8 +293,7 @@ void Parser::parse_sections(void) {
// parse relocations
//
void Parser::parse_relocations(void) {
- VLOG(VDEBUG) << "[+] Parsing relocations";
-
+ LIEF_DEBUG("== Parsing relocations ==");
const uint32_t offset = this->binary_->rva_to_offset(
this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA());
@@ -276,10 +312,10 @@ void Parser::parse_relocations(void) {
std::unique_ptr<Relocation> relocation{new Relocation{&relocation_headers}};
if (relocation_headers.BlockSize < sizeof(pe_base_relocation_block)) {
- LOG(ERROR) << "Relocation corrupted: BlockSize is too small";
+ LIEF_ERR("Relocation corrupted: BlockSize is too small");
break;
} else if (relocation_headers.BlockSize > this->binary_->optional_header().sizeof_image()) {
- LOG(ERROR) << "Relocation corrupted: BlockSize is out of bound the binary's virtual size";
+ LIEF_ERR("Relocation corrupted: BlockSize is out of bound the binary's virtual size");
break;
}
@@ -311,13 +347,13 @@ void Parser::parse_relocations(void) {
// parse ressources
//
void Parser::parse_resources(void) {
- VLOG(VDEBUG) << "[+] Parsing resources";
+ LIEF_DEBUG("== Parsing resources ==");
const uint32_t resources_rva = this->binary_->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA();
- VLOG(VDEBUG) << "Resources RVA: 0x" << std::hex << resources_rva;
+ LIEF_DEBUG("Resources RVA: 0x{:04x}", resources_rva);
const uint32_t offset = this->binary_->rva_to_offset(resources_rva);
- VLOG(VDEBUG) << "Resources Offset: 0x" << std::hex << offset;
+ LIEF_DEBUG("Resources Offset: 0x{:04x}", offset);
if (not this->stream_->can_read<pe_resource_directory_table>(offset)) {
return;
@@ -411,7 +447,7 @@ ResourceNode* Parser::parse_resource_node(
directory->childs_.push_back(node.release());
} else {
- LOG(WARNING) << "The leaf is corrupted";
+ LIEF_WARN("The leaf is corrupted");
break;
}
} else { // We are on a directory
@@ -420,7 +456,7 @@ ResourceNode* Parser::parse_resource_node(
if (this->stream_->can_read<pe_resource_directory_table>(offset)) {
const pe_resource_directory_table& nextDirectoryTable = this->stream_->peek<pe_resource_directory_table>(offset);
if (this->resource_visited_.count(offset) > 0) {
- LOG(WARNING) << "Infinite loop detected on resources";
+ LIEF_WARN("Infinite loop detected on resources");
break;
}
this->resource_visited_.insert(offset);
@@ -432,7 +468,7 @@ ResourceNode* Parser::parse_resource_node(
directory->childs_.push_back(node.release());
}
} else { // Corrupted
- LOG(WARNING) << "The directory is corrupted";
+ LIEF_WARN("The directory is corrupted");
break;
}
}
@@ -446,7 +482,7 @@ ResourceNode* Parser::parse_resource_node(
// parse string table
//
void Parser::parse_string_table(void) {
- VLOG(VDEBUG) << "[+] Parsing string table";
+ LIEF_DEBUG("== Parsing string table ==");
uint32_t string_table_offset =
this->binary_->header().pointerto_symbol_table() +
this->binary_->header().numberof_symbols() * STRUCT_SIZES::Symbol16Size;
@@ -470,7 +506,7 @@ void Parser::parse_string_table(void) {
// parse Symbols
//
void Parser::parse_symbols(void) {
- VLOG(VDEBUG) << "[+] Parsing symbols";
+ LIEF_DEBUG("== Parsing symbols ==");
uint32_t symbol_table_offset = this->binary_->header().pointerto_symbol_table();
uint32_t nb_symbols = this->binary_->header().numberof_symbols();
uint32_t current_offset = symbol_table_offset;
@@ -486,10 +522,9 @@ void Parser::parse_symbols(void) {
Symbol symbol{&raw_symbol};
const auto stream_max_size = this->stream_->size();
- std::string name;
if ((raw_symbol.Name.Name.Zeroes & 0xffff) != 0) {
std::string shortname{raw_symbol.Name.ShortName, sizeof(raw_symbol.Name.ShortName)};
- name = shortname.c_str();
+ symbol.name_ = shortname.c_str();
} else {
uint64_t offset_name =
this->binary_->header().pointerto_symbol_table() +
@@ -510,14 +545,14 @@ void Parser::parse_symbols(void) {
// * Section Number: > 0
if (symbol.storage_class() == SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_EXTERNAL and
symbol.type() == 0x20 and symbol.section_number() > 0) {
- VLOG(VDEBUG) << "Format1";
+ LIEF_DEBUG("Format1");
}
// Auxiliary Format 2: .bf and .ef Symbols
// * Storage class : FUNCTION
if (symbol.storage_class() == SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_FUNCTION) {
- VLOG(VDEBUG) << "Function";
+ LIEF_DEBUG("Function");
}
// Auxiliary Format 3: Weak Externals
@@ -526,21 +561,21 @@ void Parser::parse_symbols(void) {
// * Value : 0
if (symbol.storage_class() == SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_EXTERNAL and
symbol.value() == 0 and static_cast<SYMBOL_SECTION_NUMBER>(symbol.section_number()) == SYMBOL_SECTION_NUMBER::IMAGE_SYM_UNDEFINED) {
- VLOG(VDEBUG) << "Format 3";
+ LIEF_DEBUG("Format 3");
}
// Auxiliary Format 4: Files
// * Storage class : FILE
// * Name **SHOULD** be: .file
if (symbol.storage_class() == SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_FILE) {
- VLOG(VDEBUG) << "Format 4";
+ LIEF_DEBUG("Format 4");
//std::cout << reinterpret_cast<char*>(
}
// Auxiliary Format 5: Section Definitions
// * Storage class : STATIC
if (symbol.storage_class() == SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_STATIC) {
- VLOG(VDEBUG) << "Format 5";
+ LIEF_DEBUG("Format 5");
}
current_offset += STRUCT_SIZES::Symbol16Size;
@@ -560,7 +595,7 @@ void Parser::parse_symbols(void) {
//
void Parser::parse_debug(void) {
- VLOG(VDEBUG) << "[+] Parsing Debug";
+ LIEF_DEBUG("== Parsing Debug ==");
this->binary_->has_debug_ = true;
@@ -601,7 +636,7 @@ void Parser::parse_debug(void) {
}
void Parser::parse_debug_code_view(Debug& debug_info) {
- VLOG(VDEBUG) << "Parsing Debug Code View";
+ LIEF_DEBUG("Parsing Debug Code View");
//Debug& debug_info = this->binary_->debug();
const uint32_t debug_off = debug_info.pointerto_rawdata();
@@ -632,7 +667,7 @@ void Parser::parse_debug_code_view(Debug& debug_info) {
default:
{
- LOG(WARNING) << to_string(signature) << " is not implemented yet!";
+ LIEF_WARN("{} is not implemented yet!");
}
}
@@ -640,7 +675,7 @@ void Parser::parse_debug_code_view(Debug& debug_info) {
}
void Parser::parse_debug_pogo(Debug& debug_info) {
- VLOG(VDEBUG) << "Parsing Debug POGO";
+ LIEF_DEBUG("== Parsing Debug POGO ==");
const uint32_t debug_size = debug_info.sizeof_data();
const uint32_t debug_off = debug_info.pointerto_rawdata();
@@ -681,7 +716,7 @@ void Parser::parse_debug_pogo(Debug& debug_info) {
default:
{
- LOG(WARNING) << "PGO '" << to_string(signature) << "' is not implemented yet!";
+ LIEF_WARN("PGO: {} is not implemented yet!", to_string(signature));
}
}
}
@@ -690,7 +725,7 @@ void Parser::parse_debug_pogo(Debug& debug_info) {
// Parse Export
//
void Parser::parse_exports(void) {
- VLOG(VDEBUG) << "[+] Parsing exports";
+ LIEF_DEBUG("== Parsing exports ==");
static constexpr uint32_t NB_ENTRIES_LIMIT = 0x1000000;
static constexpr size_t MAX_EXPORT_NAME_SIZE = 300;
@@ -700,6 +735,7 @@ void Parser::parse_exports(void) {
std::pair<uint32_t, uint32_t> range = {exports_rva, exports_rva + exports_size};
if (not this->stream_->can_read<pe_export_directory_table>(exports_offset)) {
+ LIEF_WARN("Can't read export table at 0x{:x}", exports_offset);
return;
}
@@ -709,7 +745,13 @@ void Parser::parse_exports(void) {
Export export_object = &export_directory_table;
uint32_t name_offset = this->binary_->rva_to_offset(export_directory_table.NameRVA);
- export_object.name_ = this->stream_->peek_string_at(name_offset);
+ const std::string name = this->stream_->peek_string_at(name_offset, Parser::MAX_DLL_NAME_SIZE);
+ if (Parser::is_valid_dll_name(name)) {
+ export_object.name_ = std::move(name);
+ LIEF_DEBUG("Export name {}@0x{:x}", export_object.name_, name_offset);
+ } else {
+ LIEF_INFO("DLL name seems corrupted");
+ }
// Parse Ordinal name table
uint32_t ordinal_table_offset = this->binary_->rva_to_offset(export_directory_table.OrdinalTableRVA);
@@ -717,13 +759,14 @@ void Parser::parse_exports(void) {
const uint16_t *ordinal_table = this->stream_->peek_array<uint16_t>(ordinal_table_offset, nbof_name_ptr, /* check */false);
if (nbof_name_ptr > NB_ENTRIES_LIMIT) {
- LOG(ERROR) << "Too many name pointer entries (" << std::dec << nbof_name_ptr << ")";
+ LIEF_ERR("Too many name pointer entries: #{:d} (limit: {:d})",
+ nbof_name_ptr, NB_ENTRIES_LIMIT);
return;
}
// Parse Ordinal name table
if (ordinal_table == nullptr) {
- LOG(ERROR) << "Ordinal table corrupted";
+ LIEF_ERR("Ordinal table corrupted");
return;
}
@@ -733,19 +776,19 @@ void Parser::parse_exports(void) {
const uint32_t nbof_addr_entries = export_directory_table.AddressTableEntries;
if (nbof_addr_entries > NB_ENTRIES_LIMIT) {
- LOG(ERROR) << "Too many address entries (" << std::dec << nbof_addr_entries << ")";
+ LIEF_ERR("Too many name address entries: #{:d}", nbof_addr_entries);
return;
}
const uint32_t *address_table = this->stream_->peek_array<uint32_t>(address_table_offset, nbof_addr_entries, /* check */false);
if (address_table == nullptr) {
- LOG(ERROR) << "Address table corrupted";
+ LIEF_ERR("Address table corrupted");
return;
}
if (nbof_addr_entries < nbof_name_ptr) {
- LOG(ERROR) << "More exported names than addresses";
+ LIEF_ERR("More exported names than addresses");
return;
}
@@ -754,7 +797,7 @@ void Parser::parse_exports(void) {
const uint32_t *name_table = this->stream_->peek_array<uint32_t>(name_table_offset, nbof_name_ptr, /* check */false);
if (name_table == nullptr) {
- LOG(ERROR) << "Name table corrupted!";
+ LIEF_ERR("Name table corrupted!");
return;
}
@@ -796,7 +839,7 @@ void Parser::parse_exports(void) {
for (size_t i = 0; i < nbof_name_ptr; ++i) {
if (ordinal_table[i] >= export_object.entries_.size()) {
- LOG(ERROR) << "Export ordinal is outside the address table";
+ LIEF_ERR("Export ordinal is outside the address table");
break;
}
@@ -851,29 +894,51 @@ void Parser::parse_exports(void) {
}
void Parser::parse_signature(void) {
- VLOG(VDEBUG) << "[+] Parsing signature";
+ LIEF_DEBUG("== Parsing signature ==");
+ static constexpr size_t SIZEOF_HEADER = 8;
/*** /!\ In this data directory, RVA is used as an **OFFSET** /!\ ****/
/*********************************************************************/
const uint32_t signature_offset = this->binary_->data_directory(DATA_DIRECTORY::CERTIFICATE_TABLE).RVA();
const uint32_t signature_size = this->binary_->data_directory(DATA_DIRECTORY::CERTIFICATE_TABLE).size();
- VLOG(VDEBUG) << "Signature Offset: 0x" << std::hex << signature_offset;
- VLOG(VDEBUG) << "Signature Size: 0x" << std::hex << signature_size;
+ const uint64_t end_p = signature_offset + signature_size;
+ LIEF_DEBUG("Signature Offset: 0x{:04x}", signature_offset);
+ LIEF_DEBUG("Signature Size: 0x{:04x}", signature_size);
+
+ this->stream_->setpos(signature_offset);
+ while (this->stream_->pos() < end_p) {
+ const uint64_t current_p = this->stream_->pos();
+ auto length = this->stream_->read<uint32_t>();
+ if (length <= SIZEOF_HEADER) {
+ LIEF_WARN("The signature seems corrupted!");
+ break;
+ }
+ auto revision = this->stream_->read<uint16_t>();
+ auto certificate_type = this->stream_->read<uint16_t>();
+ LIEF_DEBUG("Signature {}r0x{:x} (0x{:x} bytes)", certificate_type, revision, length);
+ const uint8_t* data_ptr = this->stream_->read_array<uint8_t>(length - SIZEOF_HEADER, /* check */false);
+ if (data_ptr == nullptr) {
+ LIEF_INFO("Can't read 0x{:x} bytes", length);
+ break;
+ }
+ std::vector<uint8_t> raw_signature = {data_ptr, data_ptr + length - SIZEOF_HEADER};
+ auto sign = SignatureParser::parse(std::move(raw_signature));
- const uint8_t* signature_ptr = this->stream_->peek_array<uint8_t>(signature_offset, signature_size, /* check */false);
- if (signature_ptr == nullptr) {
- return;
+ if (sign) {
+ this->binary_->signatures_.push_back(std::move(sign.value()));
+ } else {
+ LIEF_INFO("Unable to parse the signature");
+ }
+ this->stream_->align(8);
+ if (this->stream_->pos() <= current_p) {
+ break;
+ }
}
- std::vector<uint8_t> raw_signature = {signature_ptr, signature_ptr + signature_size};
-
- //TODO: Deal with header (+8)
- this->binary_->signature_ = SignatureParser::parse(raw_signature);
- this->binary_->has_signature_ = true;
}
void Parser::parse_overlay(void) {
- VLOG(VDEBUG) << "Parsing Overlay";
+ LIEF_DEBUG("== Parsing Overlay ==");
const uint64_t last_section_offset = std::accumulate(
std::begin(this->binary_->sections_),
std::end(this->binary_->sections_), 0,
@@ -881,12 +946,12 @@ void Parser::parse_overlay(void) {
return std::max<uint64_t>(section->offset() + section->size(), offset);
});
- VLOG(VDEBUG) << "Overlay offset: 0x" << std::hex << last_section_offset;
+ LIEF_DEBUG("Overlay offset: 0x{:x}", last_section_offset);
if (last_section_offset < this->stream_->size()) {
const uint64_t overlay_size = this->stream_->size() - last_section_offset;
- VLOG(VDEBUG) << "Overlay size: " << std::dec << overlay_size;
+ LIEF_DEBUG("Overlay size: 0x{:x}", overlay_size);
const uint8_t* ptr_to_overlay = this->stream_->peek_array<uint8_t>(last_section_offset, overlay_size, /* check */false);
if (ptr_to_overlay != nullptr) {
@@ -894,6 +959,7 @@ void Parser::parse_overlay(void) {
ptr_to_overlay,
ptr_to_overlay + overlay_size
};
+ this->binary_->overlay_offset_ = last_section_offset;
}
} else {
this->binary_->overlay_ = {};
@@ -934,10 +1000,7 @@ bool Parser::is_valid_dll_name(const std::string& name) {
//! @brief Minimum size for a DLL's name
static constexpr unsigned MIN_DLL_NAME_SIZE = 4;
- // According to https://stackoverflow.com/a/265782/87207
- static constexpr unsigned MAX_DLL_NAME_SIZE = 255;
-
- if (name.size() < MIN_DLL_NAME_SIZE or name.size() > MAX_DLL_NAME_SIZE) {
+ if (name.size() < MIN_DLL_NAME_SIZE or name.size() > Parser::MAX_DLL_NAME_SIZE) {
return false;
}
diff --git a/src/PE/Parser.tcc b/src/PE/Parser.tcc
index b731f7be..f24cee1d 100644
--- a/src/PE/Parser.tcc
+++ b/src/PE/Parser.tcc
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
#include "LIEF/PE/LoadConfigurations.hpp"
#include "LoadConfigurations/LoadConfigurations.tcc"
@@ -28,31 +28,31 @@ void Parser::parse(void) {
return;
}
- VLOG(VDEBUG) << "[+] Retreive Dos stub";
+ LIEF_DEBUG("[+] Processing DOS stub & Rich header");
this->parse_dos_stub();
-
this->parse_rich_header();
- VLOG(VDEBUG) << "[+] Decomposing Sections";
+ LIEF_DEBUG("[+] Processing sections");
try {
this->parse_sections();
} catch (const corrupted& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
- VLOG(VDEBUG) << "[+] Decomposing Data directories";
+ LIEF_DEBUG("[+] Processing data directories");
+
try {
this->parse_data_directories<PE_T>();
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
try {
this->parse_symbols();
} catch (const corrupted& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
this->parse_overlay();
@@ -66,7 +66,7 @@ bool Parser::parse_headers(void) {
if (this->stream_->can_read<pe_dos_header>(0)) {
this->binary_->dos_header_ = &this->stream_->peek<pe_dos_header>(0);
} else {
- LOG(FATAL) << "Dos Header corrupted";
+ LIEF_ERR("DOS Header corrupted");
return false;
}
@@ -76,7 +76,7 @@ bool Parser::parse_headers(void) {
if (this->stream_->can_read<pe_header>(pe32_header_off)) {
this->binary_->header_ = &this->stream_->peek<pe_header>(pe32_header_off);
} else {
- LOG(FATAL) << "PE32 Header corrupted";
+ LIEF_ERR("PE32 Header corrupted");
return false;
}
@@ -85,7 +85,7 @@ bool Parser::parse_headers(void) {
if (this->stream_->can_read<pe_optional_header>(optional_header_off)) {
this->binary_->optional_header_ = &this->stream_->peek<pe_optional_header>(optional_header_off);
} else {
- LOG(FATAL) << "Optional header corrupted";
+ LIEF_ERR("Optional header corrupted");
return false;
}
@@ -95,9 +95,6 @@ bool Parser::parse_headers(void) {
template<typename PE_T>
void Parser::parse_data_directories(void) {
using pe_optional_header = typename PE_T::pe_optional_header;
-
- VLOG(VDEBUG) << "[+] Parsing data directories";
-
const uint32_t directories_offset =
this->binary_->dos_header().addressof_new_exeheader() +
sizeof(pe_header) +
@@ -106,25 +103,28 @@ void Parser::parse_data_directories(void) {
const pe_data_directory* data_directory = this->stream_->peek_array<pe_data_directory>(directories_offset, nbof_datadir, /* check */false);
if (data_directory == nullptr) {
- LOG(ERROR) << "Data Directories corrupted!";
+ LIEF_ERR("Data Directories corrupted!");
return;
}
this->binary_->data_directories_.reserve(nbof_datadir);
- for (size_t i = 0; i < nbof_datadir; ++i) {
+ // WARNING: The PE specifications require that the data directory table ends with a null entry (RVA / Size,
+ // set to 0).
+ // Nevertheless it seems that this requirement is not enforced by the PE loader.
+ // The binary bc203f2b6a928f1457e9ca99456747bcb7adbbfff789d1c47e9479aac11598af contains a non-null final
+ // data directory (watermarking?)
+ for (size_t i = 0; i < (nbof_datadir + 1); ++i) {
std::unique_ptr<DataDirectory> directory{new DataDirectory{&data_directory[i], static_cast<DATA_DIRECTORY>(i)}};
-
- VLOG(VDEBUG) << "Processing directory: " << to_string(static_cast<DATA_DIRECTORY>(i));
- VLOG(VDEBUG) << "- RVA: 0x" << std::hex << data_directory[i].RelativeVirtualAddress;
- VLOG(VDEBUG) << "- Size: 0x" << std::hex << data_directory[i].Size;
+ LIEF_DEBUG("Processing directory #{:d} ()", i, to_string(static_cast<DATA_DIRECTORY>(i)));
+ LIEF_DEBUG(" - RVA: 0x{:04x}", data_directory[i].RelativeVirtualAddress);
+ LIEF_DEBUG(" - Size: 0x{:04x}", data_directory[i].Size);
if (directory->RVA() > 0) {
// Data directory is not always associated with section
const uint64_t offset = this->binary_->rva_to_offset(directory->RVA());
try {
directory->section_ = &(this->binary_->section_from_offset(offset));
} catch (const LIEF::not_found&) {
- LOG(WARNING) << "Unable to find the section associated with "
- << to_string(static_cast<DATA_DIRECTORY>(i));
+ LIEF_WARN("Unable to find the section associated with {}", to_string(static_cast<DATA_DIRECTORY>(i)));
}
}
this->binary_->data_directories_.push_back(directory.release());
@@ -133,7 +133,7 @@ void Parser::parse_data_directories(void) {
try {
// Import Table
if (this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA() > 0) {
- VLOG(VDEBUG) << "[+] Decomposing Import Table";
+ LIEF_DEBUG("Processing Import Table");
const uint32_t import_rva = this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA();
const uint64_t offset = this->binary_->rva_to_offset(import_rva);
@@ -141,22 +141,22 @@ void Parser::parse_data_directories(void) {
Section& section = this->binary_->section_from_offset(offset);
section.add_type(PE_SECTION_TYPES::IMPORT);
} catch (const not_found&) {
- LOG(WARNING) << "Unable to find the section associated with Import Table";
+ LIEF_WARN("Unable to find the section associated with Import Table");
}
this->parse_import_table<PE_T>();
}
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
// Exports
if (this->binary_->data_directory(DATA_DIRECTORY::EXPORT_TABLE).RVA() > 0) {
- VLOG(VDEBUG) << "[+] Decomposing Exports";
+ LIEF_DEBUG("[+] Processing Exports");
try {
this->parse_exports();
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -165,14 +165,14 @@ void Parser::parse_data_directories(void) {
try {
this->parse_signature();
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
// TLS
if (this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA() > 0) {
- VLOG(VDEBUG) << "[+] Decomposing TLS";
+ LIEF_DEBUG("[+] Decomposing TLS");
const uint32_t tls_rva = this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA();
const uint64_t offset = this->binary_->rva_to_offset(tls_rva);
@@ -181,9 +181,9 @@ void Parser::parse_data_directories(void) {
section.add_type(PE_SECTION_TYPES::TLS);
this->parse_tls<PE_T>();
} catch (const not_found&) {
- LOG(WARNING) << "Unable to find the section associated with TLS";
+ LIEF_WARN("Unable to find the section associated with TLS");
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -197,9 +197,9 @@ void Parser::parse_data_directories(void) {
section.add_type(PE_SECTION_TYPES::LOAD_CONFIG);
this->parse_load_config<PE_T>();
} catch (const not_found&) {
- LOG(WARNING) << "Unable to find the section associated with Load Config";
+ LIEF_WARN("Unable to find the section associated with Load Config");
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -207,7 +207,7 @@ void Parser::parse_data_directories(void) {
// Relocations
if (this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA() > 0) {
- VLOG(VDEBUG) << "[+] Decomposing relocations";
+ LIEF_DEBUG("[+] Decomposing relocations");
const uint32_t relocation_rva = this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA();
const uint64_t offset = this->binary_->rva_to_offset(relocation_rva);
try {
@@ -215,9 +215,9 @@ void Parser::parse_data_directories(void) {
section.add_type(PE_SECTION_TYPES::RELOCATION);
this->parse_relocations();
} catch (const not_found&) {
- LOG(WARNING) << "Unable to find the section associated with relocations";
+ LIEF_WARN("Unable to find the section associated with relocations");
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -225,7 +225,7 @@ void Parser::parse_data_directories(void) {
// Debug
if (this->binary_->data_directory(DATA_DIRECTORY::DEBUG).RVA() > 0) {
- VLOG(VDEBUG) << "[+] Decomposing debug";
+ LIEF_DEBUG("[+] Decomposing debug");
const uint32_t rva = this->binary_->data_directory(DATA_DIRECTORY::DEBUG).RVA();
const uint64_t offset = this->binary_->rva_to_offset(rva);
try {
@@ -233,9 +233,9 @@ void Parser::parse_data_directories(void) {
section.add_type(PE_SECTION_TYPES::DEBUG);
this->parse_debug();
} catch (const not_found&) {
- LOG(WARNING) << "Unable to find the section associated with debug";
+ LIEF_WARN("Unable to find the section associated with debug");
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -243,7 +243,7 @@ void Parser::parse_data_directories(void) {
// Resources
if (this->binary_->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA() > 0) {
- VLOG(VDEBUG) << "[+] Decomposing resources";
+ LIEF_DEBUG("[+] Decomposing resources");
const uint32_t resources_rva = this->binary_->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA();
const uint64_t offset = this->binary_->rva_to_offset(resources_rva);
try {
@@ -251,9 +251,9 @@ void Parser::parse_data_directories(void) {
section.add_type(PE_SECTION_TYPES::RESOURCE);
this->parse_resources();
} catch (const not_found&) {
- LOG(WARNING) << "Unable to find the section associated with resources";
+ LIEF_WARN("Unable to find the section associated with resources");
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -281,7 +281,7 @@ void Parser::parse_import_table(void) {
import.type_ = this->type_;
if (import.name_RVA_ == 0) {
- LOG(WARNING) << "Name's RVA is null";
+ LIEF_DEBUG("Name's RVA is null");
break;
}
@@ -372,7 +372,7 @@ void Parser::parse_tls(void) {
using pe_tls = typename PE_T::pe_tls;
using uint__ = typename PE_T::uint;
- VLOG(VDEBUG) << "[+] Parsing TLS";
+ LIEF_DEBUG("[+] Parsing TLS");
const uint32_t tls_rva = this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA();
const uint64_t offset = this->binary_->rva_to_offset(tls_rva);
@@ -391,8 +391,6 @@ void Parser::parse_tls(void) {
if (tls_header.RawDataStartVA >= imagebase and tls_header.RawDataEndVA > tls_header.RawDataStartVA) {
- CHECK(tls_header.RawDataStartVA >= imagebase);
- CHECK(tls_header.RawDataEndVA >= imagebase);
const uint64_t start_data_rva = tls_header.RawDataStartVA - imagebase;
const uint64_t stop_data_rva = tls_header.RawDataEndVA - imagebase;
@@ -402,11 +400,11 @@ void Parser::parse_tls(void) {
const size_t size_to_read = end_template_offset - start_template_offset;
if (size_to_read > Parser::MAX_DATA_SIZE) {
- LOG(WARNING) << "TLS's template is too large!";
+ LIEF_DEBUG("TLS's template is too large!");
} else {
const uint8_t* template_ptr = this->stream_->peek_array<uint8_t>(start_template_offset, size_to_read, /* check */false);
if (template_ptr == nullptr) {
- LOG(WARNING) << "TLS's template corrupted";
+ LIEF_WARN("TLS's template corrupted");
} else {
tls.data_template({
template_ptr,
@@ -435,7 +433,7 @@ void Parser::parse_tls(void) {
Section& section = this->binary_->section_from_offset(offset);
tls.section_ = &section;
} catch (const not_found&) {
- LOG(WARNING) << "No section associated with TLS";
+ LIEF_WARN("No section associated with TLS");
}
this->binary_->has_tls_ = true;
@@ -454,7 +452,7 @@ void Parser::parse_load_config(void) {
using load_configuration_v6_t = typename PE_T::load_configuration_v6_t;
using load_configuration_v7_t = typename PE_T::load_configuration_v7_t;
- VLOG(VDEBUG) << "[+] Parsing Load Config";
+ LIEF_DEBUG("[+] Parsing Load Config");
const uint32_t directory_size = this->binary_->data_directory(DATA_DIRECTORY::LOAD_CONFIG_TABLE).size();
@@ -467,8 +465,8 @@ void Parser::parse_load_config(void) {
const uint32_t size_from_header = this->stream_->peek<uint32_t>(offset);
if (directory_size != size_from_header) {
- LOG(WARNING) << "The size of directory '" << to_string(DATA_DIRECTORY::LOAD_CONFIG_TABLE)
- << "' is different from the size in the load configuration header";
+ LIEF_DEBUG("The size of directory '{}' is different from the size in the load configuration header",
+ to_string(DATA_DIRECTORY::LOAD_CONFIG_TABLE));
}
const uint32_t size = std::min<uint32_t>(directory_size, size_from_header);
@@ -480,7 +478,7 @@ void Parser::parse_load_config(void) {
}
}
- VLOG(VDEBUG) << "Version found: " << std::dec << to_string(version_found) << "(Size: 0x" << std::hex << size << ")";
+ LIEF_DEBUG("Version found: {} (size: 0x{:x})", to_string(version_found), size);;
std::unique_ptr<LoadConfiguration> ld_conf;
switch (version_found) {
diff --git a/src/PE/Pogo.cpp b/src/PE/Pogo.cpp
index 6f287699..093a7616 100644
--- a/src/PE/Pogo.cpp
+++ b/src/PE/Pogo.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/Pogo.hpp"
+#include "LIEF/PE/PogoEntry.hpp"
namespace LIEF {
namespace PE {
@@ -35,8 +36,8 @@ Pogo::Pogo(void) :
Pogo::Pogo(POGO_SIGNATURES signature, const std::vector<PogoEntry>& entries) :
- signature_{signature},
- entries_{entries}
+ signature_{signature},
+ entries_{entries}
{}
Pogo* Pogo::clone(void) const {
diff --git a/src/PE/PogoEntry.cpp b/src/PE/PogoEntry.cpp
index 83c96d7e..36bfb811 100644
--- a/src/PE/PogoEntry.cpp
+++ b/src/PE/PogoEntry.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/PE/EnumToString.hpp"
-#include "LIEF/PE/Pogo.hpp"
+#include "LIEF/PE/PogoEntry.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/Relocation.cpp b/src/PE/Relocation.cpp
index 869592f5..6ae6a655 100644
--- a/src/PE/Relocation.cpp
+++ b/src/PE/Relocation.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,9 @@
#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/Relocation.hpp"
+#include "LIEF/PE/RelocationEntry.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/RelocationEntry.cpp b/src/PE/RelocationEntry.cpp
index 0f3be727..466c06e4 100644
--- a/src/PE/RelocationEntry.cpp
+++ b/src/PE/RelocationEntry.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
*/
#include <iomanip>
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
#include "LIEF/PE/hash.hpp"
@@ -111,7 +111,7 @@ uint64_t RelocationEntry::address(void) const {
}
void RelocationEntry::address(uint64_t /*address*/) {
- LOG(WARNING) << "Setting address of a PE relocation is not implemented!";
+ LIEF_WARN("Setting address of a PE relocation is not implemented!");
}
size_t RelocationEntry::size(void) const {
@@ -145,7 +145,7 @@ size_t RelocationEntry::size(void) const {
return 0;
}
void RelocationEntry::size(size_t /*size*/) {
- LOG(WARNING) << "Setting size of a PE relocation is not implemented!";
+ LIEF_WARN("Setting size of a PE relocation is not implemented!");
}
diff --git a/src/PE/ResourceData.cpp b/src/PE/ResourceData.cpp
index 5fde9411..c9d68653 100644
--- a/src/PE/ResourceData.cpp
+++ b/src/PE/ResourceData.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/ResourceDirectory.cpp b/src/PE/ResourceDirectory.cpp
index 6ea02e89..1c34d047 100644
--- a/src/PE/ResourceDirectory.cpp
+++ b/src/PE/ResourceDirectory.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/ResourceDirectory.hpp"
namespace LIEF {
diff --git a/src/PE/ResourceNode.cpp b/src/PE/ResourceNode.cpp
index c3b7b0c9..45ec784b 100644
--- a/src/PE/ResourceNode.cpp
+++ b/src/PE/ResourceNode.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
#include "LIEF/PE/hash.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/utils.hpp"
#include "LIEF/PE/ResourceNode.hpp"
diff --git a/src/PE/ResourcesManager.cpp b/src/PE/ResourcesManager.cpp
index fb16f86d..33b05964 100644
--- a/src/PE/ResourcesManager.cpp
+++ b/src/PE/ResourcesManager.cpp
@@ -1,5 +1,6 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
+ * Copyright 2017 - 2021 K. Nakagawa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,9 +18,7 @@
#include <iomanip>
#include <numeric>
-#include "rang.hpp"
-
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
#include "LIEF/exception.hpp"
#include "LIEF/PE/hash.hpp"
@@ -32,8 +31,11 @@
#include "LIEF/PE/ResourcesManager.hpp"
#include "LIEF/PE/ResourceData.hpp"
+#include "LIEF/PE/ResourceDirectory.hpp"
#include "LIEF/PE/resources/LangCodeItem.hpp"
+#include "LIEF/PE/resources/ResourceStringTable.hpp"
+#include "LIEF/PE/resources/ResourceAccelerator.hpp"
namespace LIEF {
namespace PE {
@@ -57,7 +59,7 @@ RESOURCE_SUBLANGS ResourcesManager::sublang_from_id(size_t id) {
}
RESOURCE_SUBLANGS ResourcesManager::sub_lang(RESOURCE_LANGS lang, size_t index) {
- // From https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).aspx
+ // From https://docs.microsoft.com/en-us/windows/win32/intl/language-identifier-constants-and-strings
static const std::map<std::pair<RESOURCE_LANGS, size_t>, RESOURCE_SUBLANGS> sublangs_map = {
{ {RESOURCE_LANGS::LANG_ARABIC, 0x5}, RESOURCE_SUBLANGS::SUBLANG_ARABIC_ALGERIA },
@@ -351,7 +353,6 @@ std::string ResourcesManager::manifest(void) const {
}
it_childs childs_l2 = childs_l1[0].childs();
-
if (childs_l2.size() < 1) {
throw not_found("Manifest corrupted");
}
@@ -429,11 +430,11 @@ ResourceVersion ResourcesManager::version(void) const {
stream.setpos(0);
// Size of the current "struct"
const uint16_t length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Lenght of the struct: 0x" << std::hex << length;
+ LIEF_DEBUG("Lenght of the struct: 0x{:x}", length);
// Size of the fixed file info struct
const uint16_t value_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Size of the 'FixedFileInfo' struct" << std::hex << value_length;
+ LIEF_DEBUG("Size of the 'FixedFileInfo' struct 0x{:x}", value_length);
// Type of the data in the version resource
// 1: Text data
@@ -441,14 +442,14 @@ ResourceVersion ResourcesManager::version(void) const {
const uint16_t type = stream.read<uint16_t>();
version.type_ = type;
if (type != 0 and type != 1) {
- LOG(WARNING) << "\"type\" of the resource version should be equal to 0 or 1 (" << std::dec << type << ")";
+ LIEF_WARN("\"type\" of the resource version should be equal to 0 or 1 ({:d})", type);
}
// Magic key: VS_VERSION_INFO
std::u16string key = stream.read_u16string();
if (u16tou8(key, true) != "VS_VERSION_INFO") {
- LOG(WARNING) << "\"key\" of the resource version should be equal to 'VS_VERSION_INFO' (" << u16tou8(key) << ")";
+ LIEF_WARN("\"key\" of the resource version should be equal to 'VS_VERSION_INFO' ({})", u16tou8(key));
}
version.key_ = key;
@@ -458,27 +459,27 @@ ResourceVersion ResourcesManager::version(void) const {
if (value_length == sizeof(pe_resource_fixed_file_info)) {
const pe_resource_fixed_file_info* fixed_file_info_header = &stream.peek<pe_resource_fixed_file_info>();
if (fixed_file_info_header->signature != 0xFEEF04BD) {
- LOG(WARNING) << "Bad magic value for the Fixed file info structure";
+ LIEF_WARN("Bad magic value for the Fixed file info structure");
} else {
version.fixed_file_info_ = ResourceFixedFileInfo{fixed_file_info_header};
version.has_fixed_file_info_ = true;
}
} else {
- LOG(WARNING) << "The 'value' member contains an unknown structure";
+ LIEF_WARN("The 'value' member contains an unknown structure");
}
stream.increment_pos(value_length * sizeof(uint8_t));
}
stream.align(sizeof(uint32_t));
if (!stream.can_read<uint16_t>()) {
- VLOG(VDEBUG) << "There is no entry";
+ LIEF_DEBUG("There is no entry");
return version;
}
{ // First entry
- VLOG(VDEBUG) << "Parsing first entry";
+ LIEF_DEBUG("Parsing first entry");
const uint16_t struct_file_info_length = stream.peek<uint16_t>();
- VLOG(VDEBUG) << "Length: " << std::hex << struct_file_info_length;
+ LIEF_DEBUG("Length: 0x{:x}", struct_file_info_length);
const size_t start = stream.pos();
@@ -486,19 +487,19 @@ ResourceVersion ResourcesManager::version(void) const {
stream.increment_pos(sizeof(uint16_t));
const uint16_t struct_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Lenght of the struct: 0x" << std::hex << struct_length;
+ LIEF_DEBUG("Lenght of the struct: 0x{:x}", struct_length);
const uint16_t type = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Type of the struct: " << std::dec << type;
+ LIEF_DEBUG("Type of the struct: {:d}", type);
std::u16string key = stream.read_u16string();
- VLOG(VDEBUG) << "First entry (key) " << u16tou8(key);
+ LIEF_DEBUG("First entry (key) {}", u16tou8(key));
if (u16tou8(key, true) == "StringFileInfo") {
try {
version.string_file_info_ = this->get_string_file_info(stream, type, key, start, struct_file_info_length);
version.has_string_file_info_ = true;
} catch (const LIEF::exception& e) {
- LOG(ERROR) << e.what();
+ LIEF_ERR("{}", e.what());
}
}
@@ -507,7 +508,7 @@ ResourceVersion ResourcesManager::version(void) const {
version.var_file_info_ = this->get_var_file_info(stream, type, key, start, struct_file_info_length);
version.has_var_file_info_ = true;
} catch (const LIEF::exception& e) {
- LOG(ERROR) << e.what();
+ LIEF_ERR("{}", e.what());
}
}
}
@@ -516,9 +517,9 @@ ResourceVersion ResourcesManager::version(void) const {
{ // Second entry
- VLOG(VDEBUG) << "Parsing second entry";
+ LIEF_DEBUG("Parsing second entry");
const uint16_t struct_file_info_length = stream.peek<uint16_t>();
- VLOG(VDEBUG) << "Length: " << std::hex << struct_file_info_length;
+ LIEF_DEBUG("Length: 0x{:x}", struct_file_info_length);
const size_t start = stream.pos();
@@ -526,21 +527,21 @@ ResourceVersion ResourcesManager::version(void) const {
stream.increment_pos(sizeof(uint16_t));
const uint16_t struct_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Lenght of the struct: 0x" << std::hex << struct_length;
+ LIEF_DEBUG("Lenght of the struct: 0x{:x}", struct_length);
const uint16_t type = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Type of the struct: " << std::dec << type;
+ LIEF_DEBUG("Type of the struct: {:d}", type);
std::u16string key = stream.read_u16string();
stream.align(sizeof(uint32_t));
- VLOG(VDEBUG) << "Second entry (key) " << u16tou8(key);
+ LIEF_DEBUG("Second entry (key) {}", u16tou8(key));
if (u16tou8(key, true) == "StringFileInfo") {
try {
version.string_file_info_ = this->get_string_file_info(stream, type, key, start, struct_file_info_length);
version.has_string_file_info_ = true;
} catch (const LIEF::exception& e) {
- LOG(ERROR) << e.what();
+ LIEF_ERR("{}", e.what());
}
}
@@ -549,7 +550,7 @@ ResourceVersion ResourcesManager::version(void) const {
version.var_file_info_ = this->get_var_file_info(stream, type, key, start, struct_file_info_length);
version.has_var_file_info_ = true;
} catch (const LIEF::exception& e) {
- LOG(ERROR) << e.what();
+ LIEF_ERR("{}", e.what());
}
}
}
@@ -560,7 +561,7 @@ ResourceVersion ResourcesManager::version(void) const {
ResourceStringFileInfo ResourcesManager::get_string_file_info(const VectorStream& stream, uint16_t type, std::u16string key, size_t start, size_t struct_length) const {
- VLOG(VDEBUG) << "Getting StringFileInfo object";
+ LIEF_DEBUG("Getting StringFileInfo object");
// String File Info
// ================
@@ -572,7 +573,7 @@ ResourceStringFileInfo ResourcesManager::get_string_file_info(const VectorStream
// Parse 'StringTable' childs
// ==========================
- VLOG(VDEBUG) << "Parsing 'StringTable' struct";
+ LIEF_DEBUG("Parsing 'StringTable' struct");
const size_t end_string_stable = start + struct_length * sizeof(uint8_t);
while (stream.pos() < end_string_stable) {
@@ -585,32 +586,37 @@ ResourceStringFileInfo ResourcesManager::get_string_file_info(const VectorStream
const uint16_t stringtable_value_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Value length: " << std::dec << stringtable_value_length << " (should be 0)";
+ LIEF_DEBUG("Value length: {:d} (should be 0)", stringtable_value_length);
const uint16_t stringtable_type = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Type: " << std::dec << stringtable_type;
+ LIEF_DEBUG("Type: {:d}", stringtable_type);
// 1: Text data
// 0: Binary data
if (type != 0 and type != 1) {
- LOG(WARNING) << "\"type\" of the StringTable should be equal to 0 or 1 (" << std::dec << type << ")";
+ LIEF_WARN("\"type\" of the StringTable should be equal to 0 or 1 ({:d})", type);
}
lang_code_item.type_ = type;
std::u16string key = stream.read_u16string();
lang_code_item.key_ = key;
- VLOG(VDEBUG) << "ID: " << u16tou8(key);
+ LIEF_DEBUG("ID: {}", u16tou8(key));
std::string key_str = u16tou8(key);
if (key.length() != 8) {
- LOG(ERROR) << "Corrupted key (" << u16tou8(key) << key_str << ")";
+ LIEF_ERR("Corrupted key ({} {})", u16tou8(key), key_str);
} else {
- uint64_t lang_id = std::stoul(u16tou8(key.substr(0, 4)), 0, 16);
- uint64_t code_page = std::stoul(u16tou8(key.substr(4, 8)), 0, 16);
- VLOG(VDEBUG) << "Lang ID: " << std::dec << lang_id;
- VLOG(VDEBUG) << "Code page: " << std::hex << code_page;
+ try {
+ uint64_t lang_id = std::stoul(u16tou8(key.substr(0, 4)), 0, 16);
+ uint64_t code_page = std::stoul(u16tou8(key.substr(4, 8)), 0, 16);
+ LIEF_DEBUG("Lang ID: {:d}", lang_id);
+ LIEF_DEBUG("Code page: 0x{:x}", code_page);
+ } catch (const std::invalid_argument& e) {
+ LIEF_WARN("Cannot convert to integer");
+ LIEF_WARN("This PE file has Invalid Lang ID or Code page");
+ }
}
stream.align(sizeof(uint32_t));
@@ -621,24 +627,24 @@ ResourceStringFileInfo ResourcesManager::get_string_file_info(const VectorStream
const size_t string_offset = stream.pos();
const uint16_t string_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Length of the 'string' struct: 0x" << std::hex << string_length;
+ LIEF_DEBUG("Length of the 'string' struct: 0x{:x}", string_length);
const uint16_t string_value_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Size of the 'value' member: 0x" << std::hex << string_value_length;
+ LIEF_DEBUG("Size of the 'value' member: 0x{:x}", string_value_length);
const uint16_t string_type = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Type of the 'string' struct: " << std::dec << string_type;
+ LIEF_DEBUG("Type of the 'string' struct: {:d}", string_type);
std::u16string key = stream.read_u16string();
- VLOG(VDEBUG) << "Key: " << u16tou8(key);
+ LIEF_DEBUG("Key: {}", u16tou8(key));
stream.align(sizeof(uint32_t));
std::u16string value;
if (string_value_length > 0 && stream.pos() < string_offset + string_length) {
value = stream.read_u16string();
- VLOG(VDEBUG) << "Value: " << u16tou8(value);
+ LIEF_DEBUG("Value: {}", u16tou8(value));
} else {
- VLOG(VDEBUG) << "Value: (empty)";
+ LIEF_DEBUG("Value: (empty)");
}
const size_t expected_end = string_offset + string_length;
@@ -657,7 +663,7 @@ ResourceStringFileInfo ResourcesManager::get_string_file_info(const VectorStream
ResourceVarFileInfo ResourcesManager::get_var_file_info(const VectorStream& stream, uint16_t type, std::u16string key, size_t start, size_t struct_length) const {
- VLOG(VDEBUG) << "Getting VarFileInfo object";
+ LIEF_DEBUG("Getting VarFileInfo object");
// Var file info
// =============
ResourceVarFileInfo var_file_info;
@@ -667,33 +673,33 @@ ResourceVarFileInfo ResourcesManager::get_var_file_info(const VectorStream& stre
// Parse 'Var' childs
// ==================
- VLOG(VDEBUG) << "Parsing 'Var' childs";
+ LIEF_DEBUG("Parsing 'Var' childs");
const size_t end_var_file_info = start + struct_length * sizeof(uint8_t);
while (stream.pos() < end_var_file_info) {
const uint16_t var_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Size of the 'Var' struct: 0x" << std::hex << var_length;
+ LIEF_DEBUG("Size of the 'Var' struct: 0x{:d}", var_length);
const uint16_t var_value_length = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Size of the 'Value' member: 0x" << std::hex << var_value_length;
+ LIEF_DEBUG("Size of the 'Value' member: 0x{:x}", var_value_length);
const uint16_t var_type = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Type: " << std::dec << var_type;
+ LIEF_DEBUG("Type: {:d}", var_type);
std::u16string key = stream.read_u16string();
if (u16tou8(key) != "Translation") {
- LOG(WARNING) << "\"key\" of the var key should be equal to 'Translation' (" << u16tou8(key) << ")";
+ LIEF_WARN("\"key\" of the var key should be equal to 'Translation' ({})", u16tou8(key));
}
stream.align(sizeof(uint32_t));
const size_t nb_items = var_value_length / sizeof(uint32_t);
const uint32_t *value_array = stream.read_array<uint32_t>(nb_items, /* check */false);
if (value_array == nullptr) {
- LOG(ERROR) << "Unable to read items";
+ LIEF_ERR("Unable to read items");
return var_file_info;
}
for (size_t i = 0; i < nb_items; ++i) {
- VLOG(VDEBUG) << "item[" << std::dec << i << "] = " << std::hex << value_array[i];
+ LIEF_DEBUG("item[{:02d} = 0x{:x}", i, value_array[i]);
var_file_info.translations_.push_back(value_array[i]);
}
}
@@ -766,20 +772,20 @@ std::vector<ResourceIcon> ResourcesManager::icons(void) const {
for (const ResourceNode& grp_icon_lvl3 : grp_icon_lvl2.childs()) {
const ResourceData* icon_group_node = dynamic_cast<const ResourceData*>(&grp_icon_lvl3);
if (!icon_group_node) {
- LOG(ERROR) << "Group icon node is null";
+ LIEF_WARN("Group icon node is null");
continue;
}
const std::vector<uint8_t>& icon_group_content = icon_group_node->content();
if (icon_group_content.empty()) {
- LOG(ERROR) << "Group icon is empty";
+ LIEF_WARN("Group icon is empty");
continue;
}
const pe_resource_icon_dir* group_icon_header = reinterpret_cast<const pe_resource_icon_dir*>(icon_group_content.data());
- VLOG(VDEBUG) << "Number of icons: " << std::dec << static_cast<uint32_t>(group_icon_header->count);
- VLOG(VDEBUG) << "Type: " << std::dec << static_cast<uint32_t>(group_icon_header->type);
+ LIEF_DEBUG("Number of icons: {:d}", static_cast<uint32_t>(group_icon_header->count));
+ LIEF_DEBUG("Type: {:d}", static_cast<uint32_t>(group_icon_header->type));
// Some checks
if (group_icon_header->type != 1) {
@@ -812,12 +818,12 @@ std::vector<ResourceIcon> ResourcesManager::icons(void) const {
});
if (it_icon_dir == std::end(sub_nodes_icons)) {
- LOG(ERROR) << "Unable to find the icon associated with id: " << std::to_string(id);
+ LIEF_WARN("Unable to find the icon associated with id: {:d}", id);
continue;
}
it_childs icons_childs = it_icon_dir->childs();
if (icons_childs.size() < 1) {
- LOG(ERROR) << "Resources nodes loooks corrupted";
+ LIEF_WARN("Resources nodes loooks corrupted");
continue;
}
const std::vector<uint8_t>& pixels = dynamic_cast<const ResourceData*>(&icons_childs[0])->content();
@@ -955,7 +961,7 @@ void ResourcesManager::change_icon(const ResourceIcon& original, const ResourceI
i * sizeof(pe_resource_icon_group));
if (icon_header->ID == original.id()) {
- VLOG(VDEBUG) << "Group found: " << std::dec << i << "-nth";
+ LIEF_DEBUG("Group found: {:d}-nth", i);
group = icon_header;
icon_header->width = newone.width();
icon_header->height = newone.height();
@@ -991,9 +997,8 @@ void ResourcesManager::change_icon(const ResourceIcon& original, const ResourceI
// Dialogs
// See:
-// * https://msdn.microsoft.com/en-us/library/ms645398.aspx
-// * https://msdn.microsoft.com/en-us/library/ms645389.aspx
-// * https://blogs.msdn.microsoft.com/oldnewthing/20110330-00/?p=11093
+// * https://docs.microsoft.com/en-us/windows/win32/dlgbox/dlgtemplateex
+// * https://docs.microsoft.com/en-us/windows/win32/dlgbox/dlgitemtemplateex
// TODO:
// * Menu as ordinal
// * Windows class as ordinal
@@ -1011,7 +1016,7 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
const ResourceDirectory* dialog = dynamic_cast<const ResourceDirectory*>(&nodes[i]);
if (!dialog) {
- LOG(WARNING) << "Dialog is empty. Skipping";
+ LIEF_WARN("Dialog is empty. Skipping");
continue;
}
it_const_childs langs = dialog->childs();
@@ -1019,7 +1024,7 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
for (size_t j = 0; j < langs.size(); ++j) {
const ResourceData* data_node = dynamic_cast<const ResourceData*>(&langs[j]);
if (!data_node) {
- LOG(WARNING) << "Dialog is empty. Skipping";
+ LIEF_WARN("Dialog is empty. Skipping");
continue;
}
const std::vector<uint8_t>& content = data_node->content();
@@ -1027,14 +1032,14 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
stream.setpos(0);
if (content.size() < std::min(sizeof(pe_dialog_template_ext), sizeof(pe_dialog_template))) {
- LOG(WARNING) << "Dialog is corrupted!";
+ LIEF_WARN("Dialog is corrupted!");
return {};
}
if (content[2] == 0xFF and content[3] == 0xFF) {
if (content.size() < sizeof(pe_dialog_template_ext)) {
- LOG(WARNING) << "Dialog is corrupted!";
+ LIEF_WARN("Dialog is corrupted!");
return {};
}
@@ -1050,20 +1055,20 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
switch(menu_hint) {
case 0x0000:
{
- VLOG(VDEBUG) << "Dialog has not menu";
+ LIEF_DEBUG("Dialog has not menu");
break;
}
case 0xFFFF:
{
const uint16_t menu_ordinal = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Menu uses ordinal number " << std::dec << menu_ordinal;
+ LIEF_DEBUG("Menu uses ordinal number {:d}", menu_ordinal);
break;
}
default:
{
- VLOG(VDEBUG) << "Menu uses unicode string";
+ LIEF_DEBUG("Menu uses unicode string");
std::u16string menu_name = stream.read_u16string();
}
}
@@ -1078,20 +1083,20 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
switch(window_class_hint) {
case 0x0000:
{
- VLOG(VDEBUG) << "Windows class uses predefined dialog box";
+ LIEF_DEBUG("Windows class uses predefined dialog box");
break;
}
case 0xFFFF:
{
const uint16_t windows_class_ordinal = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Windows class uses ordinal number " << std::dec << windows_class_ordinal;
+ LIEF_DEBUG("Windows class uses ordinal number {:d}", windows_class_ordinal);
break;
}
default:
{
- VLOG(VDEBUG) << "Windows class uses unicode string";
+ LIEF_DEBUG("Windows class uses unicode string");
std::u16string window_class_name = stream.read_u16string();
}
}
@@ -1099,7 +1104,7 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
// Title
// =====
stream.align(sizeof(uint16_t));
- VLOG(VDEBUG) << "Title offset: " << std::hex << stream.pos();
+ LIEF_DEBUG("Title offset: 0x{:x}", stream.pos());
new_dialog.title_ = stream.read_u16string();
// 2nd part
@@ -1121,20 +1126,20 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
new_dialog.typeface_ = stream.read_u16string();
}
- VLOG(VDEBUG) << "Offset to the items: 0x" << std::hex << stream.pos();
- VLOG(VDEBUG) << std::endl << std::endl << "####### Items #######" << std::endl;
+ LIEF_DEBUG("Offset to the items: 0x{:x}", stream.pos());
+ LIEF_DEBUG("\n\n####### Items #######\n");
// Items
// =====
for (size_t i = 0; i < header->nbof_items; ++i) {
stream.align(sizeof(uint32_t));
- VLOG(VDEBUG) << "item[" << std::dec << i << "] offset: " << std::hex << stream.pos();
+ LIEF_DEBUG("item[{:02d}] offset: 0x{:x}", i, stream.pos());
ResourceDialogItem dialog_item;
if (new_dialog.is_extended()) {
const pe_dialog_item_template_ext* item_header = &stream.read<pe_dialog_item_template_ext>();
dialog_item = item_header;
- VLOG(VDEBUG) << "Item ID: " << std::dec << item_header->id;
+ LIEF_DEBUG("Item ID: {:d}", item_header->id);
} else {
const pe_dialog_item_template* item_header = &stream.read<pe_dialog_item_template>();
new_dialog.items_.emplace_back(item_header);
@@ -1149,11 +1154,11 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
if (window_class_hint == 0xFFFF) {
stream.increment_pos(sizeof(uint16_t));
const uint16_t windows_class_ordinal = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Windows class uses ordinal number " << std::dec << windows_class_ordinal;
+ LIEF_DEBUG("Windows class uses ordinal number {:d}", windows_class_ordinal);
} else {
- VLOG(VDEBUG) << "Windows class uses unicode string";
+ LIEF_DEBUG("Windows class uses unicode string");
std::u16string window_class_name = stream.read_u16string();
- VLOG(VDEBUG) << "[DEBUG] " << u16tou8(window_class_name);
+ LIEF_DEBUG("{}", u16tou8(window_class_name));
}
// Title
@@ -1163,17 +1168,17 @@ std::vector<ResourceDialog> ResourcesManager::dialogs(void) const {
if (title_hint == 0xFFFF) {
stream.increment_pos(sizeof(uint16_t));
const uint16_t title_ordinal = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Title uses ordinal number " << std::dec << title_ordinal;
+ LIEF_DEBUG("Title uses ordinal number {:d}", title_ordinal);
} else {
std::u16string title_name = stream.read_u16string();
- VLOG(VDEBUG) << "Title uses unicode string: \"" << u16tou8(title_name) << "\"";
+ LIEF_DEBUG("Title uses unicode string: '{}'", u16tou8(title_name));
dialog_item.title_ = title_name;
}
// Extra count
// -----------
const uint16_t extra_count = stream.read<uint16_t>();
- VLOG(VDEBUG) << "Extra count: " << std::hex << extra_count << std::endl;
+ LIEF_DEBUG("Extra count: 0x{:x}", extra_count);
dialog_item.extra_count_ = extra_count;
stream.increment_pos(extra_count * sizeof(uint8_t));
new_dialog.items_.push_back(std::move(dialog_item));
@@ -1191,12 +1196,153 @@ bool ResourcesManager::has_dialogs(void) const {
return this->has_type(RESOURCE_TYPES::DIALOG);
}
+// String table entry
+std::vector<ResourceStringTable> ResourcesManager::string_table(void) const {
+ it_childs nodes = this->resources_->childs();
+ auto&& it_string_table = std::find_if(
+ std::begin(nodes),
+ std::end(nodes),
+ [] (const ResourceNode& node) {
+ return static_cast<RESOURCE_TYPES>(node.id()) == RESOURCE_TYPES::STRING;
+ }
+ );
+
+ if (it_string_table == std::end(nodes)) {
+ throw not_found(std::string("Missing '") + to_string(RESOURCE_TYPES::STRING) + "' entry");
+ }
+
+ std::vector<ResourceStringTable> string_table;
+ for (const ResourceNode& child_l1 : it_string_table->childs()) {
+
+ for (const ResourceNode& child_l2 : child_l1.childs()) {
+ const ResourceData* string_table_node = dynamic_cast<const ResourceData*>(&child_l2);
+ if (!string_table_node) {
+ LIEF_ERR("String table node is null");
+ continue;
+ }
+
+ const std::vector<uint8_t>& content = string_table_node->content();
+ if (content.empty()) {
+ LIEF_ERR("String table content is empty");
+ continue;
+ }
+
+ const auto content_size = content.size();
+ VectorStream stream{content};
+ stream.setpos(0);
+ LIEF_DEBUG("Will parse content whoose size is {}", content_size);
+ while (stream.pos() < content_size) {
+ if (not stream.can_read<int16_t>()) break;
+
+ const auto len = stream.read<uint16_t>();
+ if (len > 0 && ((len * 2) < content_size)) {
+ const auto name = stream.read_u16string(len);
+ string_table.emplace_back(ResourceStringTable(len, name));
+ }
+ }
+ }
+
+ }
+
+ return string_table;
+}
+
+bool ResourcesManager::has_string_table(void) const {
+ return this->has_type(RESOURCE_TYPES::STRING);
+}
+
+std::vector<std::string> ResourcesManager::html(void) const {
+ it_childs nodes = this->resources_->childs();
+ auto&& it_html = std::find_if(
+ std::begin(nodes),
+ std::end(nodes),
+ [] (const ResourceNode& node) {
+ return static_cast<RESOURCE_TYPES>(node.id()) == RESOURCE_TYPES::HTML;
+ }
+ );
+
+ if (it_html == std::end(nodes)) {
+ throw not_found(std::string("Missing '") + to_string(RESOURCE_TYPES::HTML) + "' entry");
+ }
+
+ std::vector<std::string> html;
+ for (const ResourceNode& child_l1 : it_html->childs()) {
+ for (const ResourceNode& child_l2 : child_l1.childs()) {
+ const ResourceData* html_node = dynamic_cast<const ResourceData*>(&child_l2);
+ if (!html_node) {
+ LIEF_ERR("html node is null");
+ continue;
+ }
+
+ const std::vector<uint8_t>& content = html_node->content();
+ if (content.empty()) {
+ LIEF_ERR("html content is empty");
+ continue;
+ }
+
+ html.push_back(std::string{std::begin(content), std::end(content)});
+ }
+ }
+
+ return html;
+}
+
+bool ResourcesManager::has_html(void) const {
+ return this->has_type(RESOURCE_TYPES::HTML);
+}
+
+bool ResourcesManager::has_accelerator(void) const {
+ return this->has_type(RESOURCE_TYPES::ACCELERATOR);
+}
+
+std::vector<ResourceAccelerator> ResourcesManager::accelerator(void) const {
+ it_childs nodes = this->resources_->childs();
+ auto&& it_accelerator = std::find_if(
+ std::begin(nodes),
+ std::end(nodes),
+ [] (const ResourceNode& node) {
+ return static_cast<RESOURCE_TYPES>(node.id()) == RESOURCE_TYPES::ACCELERATOR;
+ }
+ );
+
+ if (it_accelerator == std::end(nodes)) {
+ throw not_found(std::string("Missing '") + to_string(RESOURCE_TYPES::ACCELERATOR) + "' entry");
+ }
+
+ std::vector<ResourceAccelerator> accelerator;
+ for (const ResourceNode& child_l1 : it_accelerator->childs()) {
+ for (const ResourceNode& child_l2 : child_l1.childs()) {
+ const ResourceData* accelerator_node = dynamic_cast<const ResourceData*>(&child_l2);
+ if (!accelerator_node) {
+ LIEF_ERR("Accelerator");
+ continue;
+ }
+
+ const std::vector<uint8_t>& content = accelerator_node->content();
+ if (content.empty()) {
+ LIEF_ERR("Accelerator content is empty");
+ continue;
+ }
+
+ VectorStream stream{content};
+ while (stream.can_read<pe_resource_acceltableentry>()) {
+ accelerator.emplace_back(
+ ResourceAccelerator(&stream.read<const pe_resource_acceltableentry>()));
+ }
+ if ((accelerator.back().flags() & int16_t(ACCELERATOR_FLAGS::END)) != int16_t(ACCELERATOR_FLAGS::END)) {
+ LIEF_ERR("Accelerator resource may be corrupted");
+ }
+ }
+ }
+
+ return accelerator;
+}
+
// Prints
// ======
std::string ResourcesManager::print(uint32_t depth) const {
std::ostringstream oss;
- oss << rang::control::forceColor;
uint32_t current_depth = 0;
this->print_tree(*this->resources_, oss, current_depth, depth);
return oss.str();
@@ -1216,21 +1362,16 @@ void ResourcesManager::print_tree(
output << std::string(2 * (current_depth + 1), ' ');
output << "[";
if (child_node.is_directory()) {
- output << rang::fg::cyan;
output << "Directory";
} else {
- output << rang::fg::yellow;
output << "Data";
}
- output << rang::style::reset;
output << "] ";
if (child_node.has_name()) {
- output << rang::bg::blue;
output << u16tou8(child_node.name());
- output << rang::style::reset;
} else {
output << "ID: " << std::setw(2) << std::setfill('0') << std::dec << child_node.id();
if (current_depth == 0) {
@@ -1320,7 +1461,7 @@ std::ostream& operator<<(std::ostream& os, const ResourcesManager& rsrc) {
try {
os << rsrc.version();
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
os << std::endl;
}
@@ -1333,7 +1474,7 @@ std::ostream& operator<<(std::ostream& os, const ResourcesManager& rsrc) {
os << icons[i] << std::endl;
}
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -1346,7 +1487,7 @@ std::ostream& operator<<(std::ostream& os, const ResourcesManager& rsrc) {
os << dialogs[i] << std::endl;
}
} catch (const exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
diff --git a/src/PE/RichEntry.cpp b/src/PE/RichEntry.cpp
index ec5cd583..c5cc797c 100644
--- a/src/PE/RichEntry.cpp
+++ b/src/PE/RichEntry.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/RichHeader.cpp b/src/PE/RichHeader.cpp
index 14d3199d..158d085d 100644
--- a/src/PE/RichHeader.cpp
+++ b/src/PE/RichHeader.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/Section.cpp b/src/PE/Section.cpp
index a4883cb8..a1164241 100644
--- a/src/PE/Section.cpp
+++ b/src/PE/Section.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,11 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include <stdexcept>
-#include <string.h>
#include <iomanip>
-#include <functional>
-#include <algorithm>
#include <numeric>
#include <iterator>
@@ -26,6 +22,7 @@
#include "LIEF/Abstract/Section.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/Section.hpp"
#include "LIEF/PE/EnumToString.hpp"
@@ -34,36 +31,25 @@ namespace PE {
Section::~Section(void) = default;
-Section::Section(void) :
- LIEF::Section{},
- virtualSize_{0},
- content_{},
- pointerToRelocations_{0},
- pointerToLineNumbers_{0},
- numberOfRelocations_{0},
- numberOfLineNumbers_{0},
- characteristics_{0},
- types_{PE_SECTION_TYPES::UNKNOWN}
-{}
+Section::Section(void) = default;
Section& Section::operator=(const Section&) = default;
Section::Section(const Section&) = default;
Section::Section(const pe_section* header) :
- virtualSize_{header->VirtualSize},
- pointerToRelocations_{header->PointerToRelocations},
- pointerToLineNumbers_{header->PointerToLineNumbers},
- numberOfRelocations_{header->NumberOfRelocations},
- numberOfLineNumbers_{header->NumberOfLineNumbers},
+ virtual_size_{header->VirtualSize},
+ pointer_to_relocations_{header->PointerToRelocations},
+ pointer_to_linenumbers_{header->PointerToLineNumbers},
+ number_of_relocations_{header->NumberOfRelocations},
+ number_of_linenumbers_{header->NumberOfLineNumbers},
characteristics_{header->Characteristics},
types_{PE_SECTION_TYPES::UNKNOWN}
{
- this->name_ = std::string(header->Name, sizeof(header->Name)).c_str();
+ this->name_ = std::string(header->Name, sizeof(header->Name));
this->virtual_address_ = header->VirtualAddress;
this->size_ = header->SizeOfRawData;
this->offset_ = header->PointerToRawData;
-
}
Section::Section(const std::vector<uint8_t>& data, const std::string& name, uint32_t characteristics) :
@@ -83,7 +69,7 @@ Section::Section(const std::string& name) :
uint32_t Section::virtual_size(void) const {
- return this->virtualSize_;
+ return this->virtual_size_;
}
@@ -106,20 +92,20 @@ uint32_t Section::pointerto_raw_data(void) const {
uint32_t Section::pointerto_relocation(void) const {
- return this->pointerToRelocations_;
+ return this->pointer_to_relocations_;
}
uint32_t Section::pointerto_line_numbers(void) const {
- return this->pointerToLineNumbers_;
+ return this->pointer_to_linenumbers_;
}
uint16_t Section::numberof_relocations(void) const {
- return this->numberOfRelocations_;
+ return this->number_of_relocations_;
}
uint16_t Section::numberof_line_numbers(void) const {
- return this->numberOfLineNumbers_;
+ return this->number_of_linenumbers_;
}
uint32_t Section::characteristics(void) const {
@@ -167,7 +153,7 @@ void Section::content(const std::vector<uint8_t>& data) {
void Section::virtual_size(uint32_t virtualSize) {
- this->virtualSize_ = virtualSize;
+ this->virtual_size_ = virtualSize;
}
@@ -177,22 +163,22 @@ void Section::pointerto_raw_data(uint32_t pointerToRawData) {
void Section::pointerto_relocation(uint32_t pointerToRelocation) {
- this->pointerToRelocations_ = pointerToRelocation;
+ this->pointer_to_relocations_ = pointerToRelocation;
}
void Section::pointerto_line_numbers(uint32_t pointerToLineNumbers) {
- this->pointerToLineNumbers_ = pointerToLineNumbers;
+ this->pointer_to_linenumbers_ = pointerToLineNumbers;
}
void Section::numberof_relocations(uint16_t numberOfRelocations) {
- this->numberOfRelocations_ = numberOfRelocations;
+ this->number_of_relocations_ = numberOfRelocations;
}
void Section::numberof_line_numbers(uint16_t numberOfLineNumbers) {
- this->numberOfLineNumbers_ = numberOfLineNumbers;
+ this->number_of_linenumbers_ = numberOfLineNumbers;
}
void Section::sizeof_raw_data(uint32_t sizeOfRawData) {
diff --git a/src/PE/Symbol.cpp b/src/PE/Symbol.cpp
index 18601487..0d0fc3d6 100644
--- a/src/PE/Symbol.cpp
+++ b/src/PE/Symbol.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
#include "LIEF/exception.hpp"
#include "LIEF/PE/Symbol.hpp"
+#include "LIEF/PE/Section.hpp"
#include "LIEF/PE/EnumToString.hpp"
namespace LIEF {
diff --git a/src/PE/TLS.cpp b/src/PE/TLS.cpp
index 222794de..387c2b8a 100644
--- a/src/PE/TLS.cpp
+++ b/src/PE/TLS.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,10 +15,12 @@
*/
#include <iomanip>
-#include "LIEF/PE/hash.hpp"
#include "LIEF/exception.hpp"
+#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/TLS.hpp"
+#include "LIEF/PE/Section.hpp"
namespace LIEF {
namespace PE {
diff --git a/src/PE/hash.cpp b/src/PE/hash.cpp
index d81b7b39..d6a5329a 100644
--- a/src/PE/hash.cpp
+++ b/src/PE/hash.cpp
@@ -1,5 +1,6 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
+ * Copyright 2017 - 2021 K. Nakagawa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -340,7 +341,7 @@ void Hash::visit(const LangCodeItem& resource_lci) {
this->process(resource_lci.type());
this->process(resource_lci.key());
- for (const std::pair<std::u16string, std::u16string>& p : resource_lci.items()) {
+ for (const std::pair<const std::u16string, std::u16string>& p : resource_lci.items()) {
this->process(p.first);
this->process(p.second);
}
@@ -423,18 +424,27 @@ void Hash::visit(const ResourceDialogItem& dialog_item) {
}
}
-void Hash::visit(const Signature& signature) {
+void Hash::visit(const ResourceStringTable& string_table) {
+ this->process(string_table.length());
+ this->process(string_table.name());
+}
+void Hash::visit(const ResourceAccelerator& accelerator) {
+ this->process(accelerator.flags());
+ this->process(accelerator.ansi());
+ this->process(accelerator.id());
+ this->process(accelerator.padding());
+}
+
+void Hash::visit(const Signature& signature) {
this->process(signature.version());
this->process(signature.digest_algorithm());
this->process(signature.content_info());
this->process(std::begin(signature.certificates()), std::end(signature.certificates()));
- this->process(signature.signer_info());
- this->process(signature.original_signature());
+ this->process(std::begin(signature.signers()), std::end(signature.signers()));
}
void Hash::visit(const x509& x509) {
-
this->process(x509.subject());
this->process(x509.issuer());
this->process(x509.valid_to());
@@ -447,19 +457,64 @@ void Hash::visit(const x509& x509) {
void Hash::visit(const SignerInfo& signerinfo) {
this->process(signerinfo.version());
- //this->process(signerinfo.issuer());
+ this->process(signerinfo.serial_number());
+ this->process(signerinfo.issuer());
+ this->process(signerinfo.encryption_algorithm());
this->process(signerinfo.digest_algorithm());
- this->process(signerinfo.authenticated_attributes());
- this->process(signerinfo.signature_algorithm());
this->process(signerinfo.encrypted_digest());
+ this->process(std::begin(signerinfo.authenticated_attributes()), std::end(signerinfo.authenticated_attributes()));
+ this->process(std::begin(signerinfo.unauthenticated_attributes()), std::end(signerinfo.unauthenticated_attributes()));
+}
+
+void Hash::visit(const Attribute& attr) {
+ this->process(attr.type());
+}
+
+void Hash::visit(const ContentInfo& info) {
+ this->process(info.content_type());
+ this->process(info.digest_algorithm());
+ this->process(info.digest());
+ this->process(info.file());
}
-void Hash::visit(const AuthenticatedAttributes& auth) {
- this->process(auth.content_type());
- this->process(auth.message_digest());
- this->process(u16tou8(auth.program_name()));
- this->process(auth.more_info());
+void Hash::visit(const ContentType& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.oid());
+}
+void Hash::visit(const GenericType& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.raw_content());
+ this->process(attr.oid());
+}
+void Hash::visit(const MsSpcNestedSignature& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.sig());
+}
+void Hash::visit(const MsSpcStatementType& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.oid());
+}
+void Hash::visit(const PKCS9AtSequenceNumber& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.number());
+}
+void Hash::visit(const PKCS9CounterSignature& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.signer());
+}
+void Hash::visit(const PKCS9MessageDigest& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.digest());
+}
+void Hash::visit(const PKCS9SigningTime& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.time());
+}
+void Hash::visit(const SpcSpOpusInfo& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->process(attr.program_name());
+ this->process(attr.more_info());
}
void Hash::visit(const CodeIntegrity& code_integrity) {
diff --git a/src/PE/json.cpp b/src/PE/json.cpp
index 49ee0d38..76c46f33 100644
--- a/src/PE/json.cpp
+++ b/src/PE/json.cpp
@@ -1,5 +1,6 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
+ * Copyright 2017 - 2021 K. Nakagawa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,12 +15,15 @@
* limitations under the License.
*/
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
-#include "LIEF/PE/json.hpp"
#include "LIEF/hash.hpp"
+
+#include "LIEF/PE/json.hpp"
#include "LIEF/PE.hpp"
+#include "Object.tcc"
+
namespace LIEF {
namespace PE {
@@ -163,11 +167,25 @@ void JsonVisitor::visit(const Binary& binary) {
}
- // Signature
- if (binary.has_signature()) {
+ // Signatures
+ std::vector<json> sigs;
+ if (binary.has_signatures()) {
+ for (const Signature& sig : binary.signatures()) {
+ JsonVisitor visitor;
+ visitor(sig);
+ sigs.push_back(std::move(visitor.get()));
+ }
+ this->node_["signatures"] = sigs;
+ }
+
+ std::vector<json> symbols;
+ for (const Symbol& symbol : binary.symbols()) {
JsonVisitor visitor;
- visitor(binary.signature());
- this->node_["signature"] = visitor.get();
+ visitor(symbol);
+ symbols.emplace_back(visitor.get());
+ }
+ if (!symbols.empty()) {
+ this->node_["symbols"] = symbols;
}
// Load Configuration
@@ -372,7 +390,7 @@ void JsonVisitor::visit(const Symbol& symbol) {
this->node_["value"] = symbol.value();
this->node_["size"] = symbol.size();
- this->node_["name"] = symbol.name();
+ this->node_["name"] = escape_non_ascii(symbol.name());
this->node_["section_number"] = symbol.section_number();
this->node_["type"] = symbol.type();
@@ -512,7 +530,19 @@ void JsonVisitor::visit(const ResourcesManager& resources_manager) {
try {
this->node_["manifest"] = escape_non_ascii(resources_manager.manifest()) ;
} catch (const LIEF::exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
+ }
+ }
+
+ if (resources_manager.has_html()) {
+ try {
+ std::vector<std::string> escaped_strs;
+ for (const auto& elem : resources_manager.html()) {
+ escaped_strs.emplace_back(escape_non_ascii(elem));
+ }
+ this->node_["html"] = escaped_strs;
+ } catch (const LIEF::exception& e) {
+ LIEF_WARN("{}", e.what());
}
}
@@ -522,7 +552,7 @@ void JsonVisitor::visit(const ResourcesManager& resources_manager) {
version_visitor(resources_manager.version());
this->node_["version"] = version_visitor.get();
} catch (const LIEF::exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -536,7 +566,7 @@ void JsonVisitor::visit(const ResourcesManager& resources_manager) {
}
this->node_["icons"] = icons;
} catch (const LIEF::exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
}
}
@@ -550,7 +580,35 @@ void JsonVisitor::visit(const ResourcesManager& resources_manager) {
}
this->node_["dialogs"] = dialogs;
} catch (const LIEF::exception& e) {
- LOG(WARNING) << e.what();
+ LIEF_WARN("{}", e.what());
+ }
+ }
+
+ if (resources_manager.has_string_table()) {
+ std::vector<json> string_table_json;
+ try {
+ for (const ResourceStringTable& string_table : resources_manager.string_table()) {
+ JsonVisitor string_table_visitor;
+ string_table_visitor(string_table);
+ string_table_json.emplace_back(string_table_visitor.get());
+ }
+ this->node_["string_table"] = string_table_json;
+ } catch (const LIEF::exception& e) {
+ LIEF_WARN("{}", e.what());
+ }
+ }
+
+ if (resources_manager.has_accelerator()) {
+ std::vector<json> accelerator_json;
+ try {
+ for (const ResourceAccelerator& acc : resources_manager.accelerator()) {
+ JsonVisitor accelerator_visitor;
+ accelerator_visitor(acc);
+ accelerator_json.emplace_back(accelerator_visitor.get());
+ }
+ this->node_["accelerator"] = accelerator_json;
+ } catch (const LIEF::exception& e) {
+ LIEF_WARN("{}", e.what());
}
}
}
@@ -693,25 +751,46 @@ void JsonVisitor::visit(const ResourceDialogItem& dialog_item) {
}
+void JsonVisitor::visit(const ResourceStringTable& string_table) {
+ this->node_["length"] = string_table.length();
+ this->node_["name"] = u16tou8(string_table.name());
+}
+
+void JsonVisitor::visit(const ResourceAccelerator& acc) {
+ std::vector<json> flags;
+ for (const ACCELERATOR_FLAGS c : acc.flags_list()) {
+ flags.emplace_back(to_string(c));
+ }
+ this->node_["flags"] = flags;
+ this->node_["ansi"] = acc.ansi_str();
+ this->node_["id"] = acc.id();
+ this->node_["padding"] = acc.padding();
+}
+
void JsonVisitor::visit(const Signature& signature) {
JsonVisitor content_info_visitor;
content_info_visitor(signature.content_info());
- JsonVisitor signer_info_visitor;
- signer_info_visitor(signature.signer_info());
+ std::vector<json> jsigners;
+ for (const SignerInfo& signer : signature.signers()) {
+ JsonVisitor visitor;
+ visitor(signer);
+ jsigners.emplace_back(std::move(visitor.get()));
+ }
std::vector<json> crts;
for (const x509& crt : signature.certificates()) {
JsonVisitor crt_visitor;
crt_visitor(crt);
- crts.emplace_back(crt_visitor.get());
+ crts.emplace_back(std::move(crt_visitor.get()));
}
- this->node_["version"] = signature.version();
- this->node_["content_info"] = content_info_visitor.get();
- this->node_["signer_info"] = signer_info_visitor.get();
- this->node_["certificates"] = crts;
+ this->node_["digest_algorithm"] = to_string(signature.digest_algorithm());
+ this->node_["version"] = signature.version();
+ this->node_["content_info"] = content_info_visitor.get();
+ this->node_["signer_info"] = jsigners;
+ this->node_["certificates"] = crts;
}
void JsonVisitor::visit(const x509& x509) {
@@ -725,27 +804,89 @@ void JsonVisitor::visit(const x509& x509) {
}
void JsonVisitor::visit(const SignerInfo& signerinfo) {
- JsonVisitor authenticated_attributes_visitor;
- authenticated_attributes_visitor(signerinfo.authenticated_attributes());
+ std::vector<json> auth_attrs;
+ for (const Attribute& attr : signerinfo.authenticated_attributes()) {
+ JsonVisitor visitor;
+ visitor(attr);
+ auth_attrs.emplace_back(std::move(visitor.get()));
+ }
- this->node_["version"] = signerinfo.version();
- this->node_["digest_algorithm"] = signerinfo.digest_algorithm();
- this->node_["signature_algorithm"] = signerinfo.signature_algorithm();
- this->node_["authenticated_attributes"] = authenticated_attributes_visitor.get();
- this->node_["issuer"] = std::get<0>(signerinfo.issuer());
+ std::vector<json> unauth_attrs;
+ for (const Attribute& attr : signerinfo.unauthenticated_attributes()) {
+ JsonVisitor visitor;
+ visitor(attr);
+ auth_attrs.emplace_back(std::move(visitor.get()));
+ }
+
+ this->node_["version"] = signerinfo.version();
+ this->node_["digest_algorithm"] = to_string(signerinfo.digest_algorithm());
+ this->node_["encryption_algorithm"] = to_string(signerinfo.encryption_algorithm());
+ this->node_["encrypted_digest"] = signerinfo.encrypted_digest();
+ this->node_["issuer"] = signerinfo.issuer();
+ this->node_["serial_number"] = signerinfo.serial_number();
+ this->node_["authenticated_attributes"] = auth_attrs;
+ this->node_["unauthenticated_attributes"] = unauth_attrs;
}
void JsonVisitor::visit(const ContentInfo& contentinfo) {
this->node_["content_type"] = contentinfo.content_type();
- this->node_["type"] = contentinfo.type();
- this->node_["digest_algorithm"] = contentinfo.digest_algorithm();
+ this->node_["digest_algorithm"] = to_string(contentinfo.digest_algorithm());
+ this->node_["digest"] = contentinfo.digest();
+ this->node_["file"] = contentinfo.file();
+}
+
+void JsonVisitor::visit(const Attribute& auth) {
+ this->node_["type"] = to_string(auth.type());
+}
+
+void JsonVisitor::visit(const ContentType& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["oid"] = attr.oid();
+}
+
+void JsonVisitor::visit(const GenericType& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["oid"] = attr.oid();
+}
+
+void JsonVisitor::visit(const MsSpcNestedSignature& attr) {
+ this->visit(*attr.as<Attribute>());
+ JsonVisitor visitor;
+ visitor(attr.sig());
+ this->node_["signature"] = std::move(visitor.get());
+}
+
+void JsonVisitor::visit(const MsSpcStatementType& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["oid"] = attr.oid();
+}
+
+void JsonVisitor::visit(const PKCS9AtSequenceNumber& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["number"] = attr.number();
+}
+void JsonVisitor::visit(const PKCS9CounterSignature& attr) {
+ this->visit(*attr.as<Attribute>());
+
+ JsonVisitor visitor;
+ visitor(attr.signer());
+ this->node_["signer"] = std::move(visitor.get());
+}
+
+void JsonVisitor::visit(const PKCS9MessageDigest& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["digest"] = attr.digest();
+}
+
+void JsonVisitor::visit(const PKCS9SigningTime& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["time"] = attr.time();
}
-void JsonVisitor::visit(const AuthenticatedAttributes& auth) {
- this->node_["content_type"] = auth.content_type();
- this->node_["program_name"] = u16tou8(auth.program_name());
- this->node_["url"] = auth.more_info();
- this->node_["message_digest"] = auth.message_digest();
+void JsonVisitor::visit(const SpcSpOpusInfo& attr) {
+ this->visit(*attr.as<Attribute>());
+ this->node_["more_info"] = attr.more_info();
+ this->node_["program_name"] = attr.program_name();
}
void JsonVisitor::visit(const CodeIntegrity& code_integrity) {
diff --git a/src/PE/resources/LangCodeItem.cpp b/src/PE/resources/LangCodeItem.cpp
index ec9f7434..70e5d69c 100644
--- a/src/PE/resources/LangCodeItem.cpp
+++ b/src/PE/resources/LangCodeItem.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/utils.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/resources/LangCodeItem.hpp"
+#include "LIEF/PE/ResourcesManager.hpp"
namespace LIEF {
namespace PE {
@@ -78,12 +78,12 @@ RESOURCE_SUBLANGS LangCodeItem::sublang(void) const {
}
-const std::map<std::u16string, std::u16string>& LangCodeItem::items(void) const {
+const LangCodeItem::items_t& LangCodeItem::items(void) const {
return this->items_;
}
-std::map<std::u16string, std::u16string>& LangCodeItem::items(void) {
- return const_cast<std::map<std::u16string, std::u16string>&>(static_cast<const LangCodeItem*>(this)->items());
+LangCodeItem::items_t& LangCodeItem::items(void) {
+ return const_cast<LangCodeItem::items_t&>(static_cast<const LangCodeItem*>(this)->items());
}
@@ -145,7 +145,7 @@ void LangCodeItem::sublang(RESOURCE_SUBLANGS lang) {
}
-void LangCodeItem::items(const std::map<std::u16string, std::u16string>& items) {
+void LangCodeItem::items(const LangCodeItem::items_t& items) {
this->items_ = items;
}
@@ -176,7 +176,7 @@ std::ostream& operator<<(std::ostream& os, const LangCodeItem& item) {
<< " - "
<< std::hex << to_string(item.code_page()) << ")" << std::endl;
os << std::setw(8) << std::setfill(' ') << "Items: " << std::endl;
- for (const std::pair<std::u16string, std::u16string>& p : item.items()) {
+ for (const LangCodeItem::items_t::value_type& p : item.items()) {
os << " " << "'" << u16tou8(p.first) << "': '" << u16tou8(p.second) << "'" << std::endl;
}
return os;
diff --git a/src/PE/resources/ResourceAccelerator.cpp b/src/PE/resources/ResourceAccelerator.cpp
new file mode 100644
index 00000000..745e0596
--- /dev/null
+++ b/src/PE/resources/ResourceAccelerator.cpp
@@ -0,0 +1,105 @@
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
+ * Copyright 2017 - 2021 K. Nakagawa
+ *
+ * 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.
+ */
+
+#include "LIEF/exception.hpp"
+#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+#include "LIEF/PE/resources/ResourceAccelerator.hpp"
+
+namespace LIEF {
+namespace PE {
+
+ResourceAccelerator::ResourceAccelerator(const ResourceAccelerator&) = default;
+ResourceAccelerator& ResourceAccelerator::operator=(const ResourceAccelerator&) = default;
+ResourceAccelerator::~ResourceAccelerator(void) = default;
+
+ResourceAccelerator::ResourceAccelerator(void) :
+ flags_{0},
+ ansi_{0},
+ id_{0},
+ padding_{0} {}
+
+ResourceAccelerator::ResourceAccelerator(const pe_resource_acceltableentry* entry) :
+ flags_{entry->fFlags},
+ ansi_{entry->wAnsi},
+ id_{static_cast<uint16_t>(entry->wId)},
+ padding_{entry->padding} {}
+
+void ResourceAccelerator::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+bool ResourceAccelerator::operator==(const ResourceAccelerator& rhs) const {
+ const auto hash_lhs = Hash::hash(*this);
+ const auto hash_rhs = Hash::hash(rhs);
+ return hash_lhs == hash_rhs;
+}
+
+bool ResourceAccelerator::operator!=(const ResourceAccelerator& rhs) const {
+ return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const ResourceAccelerator& acc) {
+ os << "flags: ";
+ for (const ACCELERATOR_FLAGS c : acc.flags_list()) {
+ os << to_string(c) << " ";
+ }
+ os << std::endl;
+ os << "ansi: " << acc.ansi_str() << std::endl;
+ os << std::hex << "id: " << acc.id() << std::endl;
+ os << std::hex << "padding: " << acc.padding() << std::endl;
+ return os;
+}
+
+std::string ResourceAccelerator::ansi_str(void) const {
+ return to_string(static_cast<ACCELERATOR_VK_CODES>(ansi_));
+}
+
+std::set<ACCELERATOR_FLAGS> ResourceAccelerator::flags_list(void) const {
+ std::set<ACCELERATOR_FLAGS> flags_set;
+
+ const auto flags_tmp = flags_;
+ std::copy_if(
+ std::cbegin(accelerator_array),
+ std::cend(accelerator_array),
+ std::inserter(flags_set, std::begin(flags_set)),
+ [flags_tmp](ACCELERATOR_FLAGS c) {
+ return (static_cast<uint16_t>(flags_tmp) & static_cast<uint16_t>(c)) > 0;
+ }
+ );
+ return flags_set;
+}
+
+int16_t ResourceAccelerator::flags(void) const {
+ return this->flags_;
+}
+
+int16_t ResourceAccelerator::ansi(void) const {
+ return this->ansi_;
+}
+
+uint16_t ResourceAccelerator::id(void) const {
+ return this->id_;
+}
+
+int16_t ResourceAccelerator::padding(void) const {
+ return this->padding_;
+}
+
+}
+}
diff --git a/src/PE/resources/ResourceDialog.cpp b/src/PE/resources/ResourceDialog.cpp
index e3efbf21..1df07cf5 100644
--- a/src/PE/resources/ResourceDialog.cpp
+++ b/src/PE/resources/ResourceDialog.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/utils.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/EnumToString.hpp"
#include "LIEF/PE/resources/ResourceDialog.hpp"
diff --git a/src/PE/resources/ResourceDialogItem.cpp b/src/PE/resources/ResourceDialogItem.cpp
index 6b6da86f..0793df91 100644
--- a/src/PE/resources/ResourceDialogItem.cpp
+++ b/src/PE/resources/ResourceDialogItem.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@
#include "LIEF/PE/hash.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/utils.hpp"
#include "LIEF/PE/EnumToString.hpp"
diff --git a/src/PE/resources/ResourceFixedFileInfo.cpp b/src/PE/resources/ResourceFixedFileInfo.cpp
index 04c06f19..37430d14 100644
--- a/src/PE/resources/ResourceFixedFileInfo.cpp
+++ b/src/PE/resources/ResourceFixedFileInfo.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/resources/ResourceIcon.cpp b/src/PE/resources/ResourceIcon.cpp
index 72e1f529..37963ba7 100644
--- a/src/PE/resources/ResourceIcon.cpp
+++ b/src/PE/resources/ResourceIcon.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/resources/ResourceStringFileInfo.cpp b/src/PE/resources/ResourceStringFileInfo.cpp
index d5add80d..43ed058a 100644
--- a/src/PE/resources/ResourceStringFileInfo.cpp
+++ b/src/PE/resources/ResourceStringFileInfo.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/utils.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/resources/ResourceStringFileInfo.hpp"
diff --git a/src/PE/resources/ResourceStringTable.cpp b/src/PE/resources/ResourceStringTable.cpp
new file mode 100644
index 00000000..e159f765
--- /dev/null
+++ b/src/PE/resources/ResourceStringTable.cpp
@@ -0,0 +1,70 @@
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
+ * Copyright 2017 - 2021 K. Nakagawa
+ *
+ * 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.
+ */
+
+#include "LIEF/utils.hpp"
+
+#include "LIEF/PE/hash.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+#include "LIEF/PE/resources/ResourceStringTable.hpp"
+
+namespace LIEF {
+namespace PE {
+
+ResourceStringTable::ResourceStringTable(const ResourceStringTable&) = default;
+ResourceStringTable& ResourceStringTable::operator=(const ResourceStringTable&) = default;
+ResourceStringTable::~ResourceStringTable(void) = default;
+
+ResourceStringTable::ResourceStringTable(void) :
+ name_{},
+ length_{0}
+{}
+
+ResourceStringTable::ResourceStringTable(int16_t length, const std::u16string& name) :
+ name_{name},
+ length_{length}
+{}
+
+int16_t ResourceStringTable::length(void) const {
+ return this->length_;
+}
+
+const std::u16string& ResourceStringTable::name(void) const {
+ return this->name_;
+}
+
+void ResourceStringTable::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+bool ResourceStringTable::operator==(const ResourceStringTable& rhs) const {
+ return Hash::hash(*this) == Hash::hash(rhs);
+}
+
+bool ResourceStringTable::operator!=(const ResourceStringTable& rhs) const {
+ return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const ResourceStringTable& string_table) {
+ os << std::dec << "Length: " << string_table.length() << std::endl;
+ os << "Name: \"" << u16tou8(string_table.name()) << "\"" << std::endl;
+ return os;
+}
+
+}
+}
diff --git a/src/PE/resources/ResourceVarFileInfo.cpp b/src/PE/resources/ResourceVarFileInfo.cpp
index 60554aad..578d5dbb 100644
--- a/src/PE/resources/ResourceVarFileInfo.cpp
+++ b/src/PE/resources/ResourceVarFileInfo.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,9 +20,9 @@
#include "LIEF/PE/hash.hpp"
#include "LIEF/utils.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/EnumToString.hpp"
+#include "LIEF/PE/ResourcesManager.hpp"
#include "LIEF/PE/resources/ResourceVarFileInfo.hpp"
namespace LIEF {
diff --git a/src/PE/resources/ResourceVersion.cpp b/src/PE/resources/ResourceVersion.cpp
index 3de80cba..e5ccd5f6 100644
--- a/src/PE/resources/ResourceVersion.cpp
+++ b/src/PE/resources/ResourceVersion.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,11 +17,8 @@
#include <iomanip>
#include "LIEF/exception.hpp"
-
#include "LIEF/PE/hash.hpp"
-
#include "LIEF/utils.hpp"
-#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/resources/ResourceVersion.hpp"
diff --git a/src/PE/signature/Attribute.cpp b/src/PE/signature/Attribute.cpp
new file mode 100644
index 00000000..406453f7
--- /dev/null
+++ b/src/PE/signature/Attribute.cpp
@@ -0,0 +1,54 @@
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
+ *
+ * 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.
+ */
+#include <iomanip>
+
+#include "LIEF/utils.hpp"
+#include "LIEF/PE/signature/Attribute.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Attribute::Attribute(void) = default;
+
+Attribute::Attribute(SIG_ATTRIBUTE_TYPES type) :
+ type_{type}
+{}
+
+Attribute::Attribute(const Attribute& other) :
+ Object{other},
+ type_{other.type_}
+{}
+
+Attribute& Attribute::operator=(const Attribute& other) {
+ if (this != &other) {
+ this->type_ = other.type_;
+ }
+ return *this;
+}
+
+Attribute::~Attribute(void) = default;
+
+void Attribute::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::ostream& operator<<(std::ostream& os, const Attribute& attribute) {
+ os << attribute.print();
+ return os;
+}
+
+}
+}
diff --git a/src/PE/signature/AuthenticatedAttributes.cpp b/src/PE/signature/AuthenticatedAttributes.cpp
deleted file mode 100644
index 05e30228..00000000
--- a/src/PE/signature/AuthenticatedAttributes.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
- *
- * 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.
- */
-#include <iomanip>
-
-#include "LIEF/utils.hpp"
-#include "LIEF/PE/utils.hpp"
-#include "LIEF/PE/signature/AuthenticatedAttributes.hpp"
-
-namespace LIEF {
-namespace PE {
-
-AuthenticatedAttributes::AuthenticatedAttributes(void) = default;
-AuthenticatedAttributes::AuthenticatedAttributes(const AuthenticatedAttributes&) = default;
-AuthenticatedAttributes& AuthenticatedAttributes::operator=(const AuthenticatedAttributes&) = default;
-AuthenticatedAttributes::~AuthenticatedAttributes(void) = default;
-
-
-const oid_t& AuthenticatedAttributes::content_type(void) const {
- return this->content_type_;
-}
-
-const std::vector<uint8_t>& AuthenticatedAttributes::message_digest(void) const {
- return this->message_digest_;
-}
-
-const std::u16string& AuthenticatedAttributes::program_name(void) const {
- return this->program_name_;
-}
-
-const std::string& AuthenticatedAttributes::more_info(void) const {
- return this->more_info_;
-}
-
-const std::vector<uint8_t>& AuthenticatedAttributes::raw(void) const {
- return this->raw_;
-}
-
-void AuthenticatedAttributes::accept(Visitor& visitor) const {
- visitor.visit(*this);
-}
-
-std::ostream& operator<<(std::ostream& os, const AuthenticatedAttributes& authenticated_attributes) {
- constexpr uint8_t wsize = 30;
- std::string content_type = authenticated_attributes.content_type();
- if (content_type.empty()) {
- content_type = "N/A";
- }
- std::string program_name = u16tou8(authenticated_attributes.program_name());
- if (program_name.empty()) {
- program_name = "N/A";
- }
- std::string url = authenticated_attributes.more_info();
- if (url.empty()) {
- url = "N/A";
- }
- os << std::hex << std::left;
- os << std::setw(wsize) << std::setfill(' ') << "Content type: " << content_type << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Program name: " << program_name << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "URL : " << url << std::endl;
-
- return os;
-}
-
-}
-}
diff --git a/src/PE/signature/CMakeLists.txt b/src/PE/signature/CMakeLists.txt
new file mode 100644
index 00000000..0a36d201
--- /dev/null
+++ b/src/PE/signature/CMakeLists.txt
@@ -0,0 +1,36 @@
+set(LIEF_PE_SIGNATURE_SRC
+ "${CMAKE_CURRENT_LIST_DIR}/Attribute.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/ContentInfo.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/Signature.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/SignerInfo.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/x509.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/OIDToString.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/SignatureParser.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/RsaInfo.cpp"
+)
+
+
+set(LIEF_PE_SIGNATURE_INCLUDES
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/Attribute.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/ContentInfo.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/OIDToString.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/Signature.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/SignatureParser.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/SignerInfo.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/types.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/x509.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/RsaInfo.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/src/PE/signature/pkcs7.h"
+)
+
+source_group("Header Files\\PE\\signature" FILES ${LIEF_PE_SIGNATURE_SRC})
+source_group("Header Files\\PE\\signature" FILES ${LIEF_PE_SIGNATURE_INCLUDES})
+
+if (LIEF_PE)
+ target_sources(LIB_LIEF PRIVATE
+ ${LIEF_PE_SIGNATURE_SRC}
+ ${LIEF_PE_SIGNATURE_INCLUDES}
+ )
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/attributes/CMakeLists.txt")
diff --git a/src/PE/signature/ContentInfo.cpp b/src/PE/signature/ContentInfo.cpp
index 35fb9399..2c27909e 100644
--- a/src/PE/signature/ContentInfo.cpp
+++ b/src/PE/signature/ContentInfo.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,8 @@
#include "LIEF/PE/signature/OIDToString.hpp"
#include "LIEF/PE/signature/ContentInfo.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+#include "LIEF/utils.hpp"
namespace LIEF {
namespace PE {
@@ -26,27 +28,6 @@ ContentInfo::ContentInfo(const ContentInfo&) = default;
ContentInfo& ContentInfo::operator=(const ContentInfo&) = default;
ContentInfo::~ContentInfo(void) = default;
-const oid_t& ContentInfo::content_type(void) const {
- return this->content_type_;
-}
-
-const oid_t& ContentInfo::type(void) const {
- return this->type_;
-}
-
-
-const oid_t& ContentInfo::digest_algorithm(void) const {
- return this->digest_algorithm_;
-}
-
-
-const std::vector<uint8_t>& ContentInfo::digest(void) const {
- return this->digest_;
-}
-
-const std::vector<uint8_t>& ContentInfo::raw(void) const {
- return this->raw_;
-}
void ContentInfo::accept(Visitor& visitor) const {
visitor.visit(*this);
@@ -54,12 +35,8 @@ void ContentInfo::accept(Visitor& visitor) const {
std::ostream& operator<<(std::ostream& os, const ContentInfo& content_info) {
- constexpr uint8_t wsize = 30;
-
- os << std::hex << std::left;
- os << std::setw(wsize) << std::setfill(' ') << "Content Type: " << oid_to_string(content_info.content_type()) << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Type: " << oid_to_string(content_info.type()) << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Digest Algorithm: " << oid_to_string(content_info.digest_algorithm()) << std::endl;
+ os << "Authentihash: " << hex_dump(content_info.digest())
+ << "(" << to_string(content_info.digest_algorithm()) << ")\n";
return os;
}
diff --git a/src/PE/signature/OIDToString.cpp b/src/PE/signature/OIDToString.cpp
index 9a3749f7..1ae1f4d2 100644
--- a/src/PE/signature/OIDToString.cpp
+++ b/src/PE/signature/OIDToString.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -499,7 +499,7 @@ const char* oid_to_string(const oid_t& oid) {
{ "1.2.840.10040.2.3", "REJECT" },
{ "1.2.840.10040.2.4", "PICKUP_TOKEN" },
{ "1.2.840.10040.3", "ATTRIBUTE" },
- { "1.2.840.10040.3.1", "COUNTERSIGNATURE" },
+ { "1.2.840.10040.3.1", "COUNTER_SIGNATURE" },
{ "1.2.840.10040.3.2", "ATTRIBUTE_CERT" },
{ "1.2.840.10040.4", "ALGORITHM" },
{ "1.2.840.10040.4.1", "DSA" },
@@ -616,7 +616,7 @@ const char* oid_to_string(const oid_t& oid) {
{ "1.2.840.113549.1.9.3", "CONTENT_TYPE" },
{ "1.2.840.113549.1.9.4", "MESSAGE_DIGEST" },
{ "1.2.840.113549.1.9.5", "SIGNING_TIME" },
- { "1.2.840.113549.1.9.6", "COUNTERSIGNATURE" },
+ { "1.2.840.113549.1.9.6", "COUNTER_SIGNATURE" },
{ "1.2.840.113549.1.9.7", "CHALLENGE_PASSWORD" },
{ "1.2.840.113549.1.9.8", "UNSTRUCTURED_ADDRESS" },
{ "1.2.840.113549.1.9.9", "EXTENDED_CERTIFICATE_ATTRIBUTES" },
@@ -976,7 +976,7 @@ const char* oid_to_string(const oid_t& oid) {
{ "1.2.840.113635.100.6.1.1", "APPLE_CERTIFICATE_EXTENSION_APPLE_SIGNING" },
{ "1.2.840.113635.100.6.1.2", "APPLE_CERTIFICATE_EXTENSION_ADC_DEVELOPER_SIGNING" },
{ "1.2.840.113635.100.6.1.3", "APPLE_CERTIFICATE_EXTENSION_ADC_APPLE_SIGNING" },
- { "1.3.6.1.4.1.311.2.1.4", "SPC_INDIRECT_DATA_CONTEXT" },
+ { "1.3.6.1.4.1.311.2.1.4", "SPC_INDIRECT_DATA_CONTENT" },
{ "1.3.6.1.4.1.311.2.1.10", "SPC_AGENCY_INFO" },
{ "1.3.6.1.4.1.311.2.1.11", "SPC_STATEMENT_TYPE" },
{ "1.3.6.1.4.1.311.2.1.12", "SPC_SP_OPUS_INFO" },
@@ -2241,10 +2241,11 @@ const char* oid_to_string(const oid_t& oid) {
{ "2.16.840.1.114404.1.1.2.4.1", "TRUST_WAVE_EV_POLICY" },
{ "1.3.6.1.4.1.40869.1.1.22.3", "TWCA_EV_POLICY" },
{ "2.16.840.1.113733.1.7.23.6", "VERI_SIGN_EV_POLICY" },
- { "2.16.840.1.114171.500.9", "WELLS_FARGO_EV_POLICY" }
+ { "2.16.840.1.114171.500.9", "WELLS_FARGO_EV_POLICY" },
+ { "1.3.6.1.4.1.311.3.3.1", "MS_COUNTER_SIGN" }
};
auto it = oid_to_str.find(oid);
- return it == oid_to_str.end() ? "Out of range" : it->second;
+ return it == oid_to_str.end() ? oid.c_str() : it->second;
}
}
diff --git a/src/PE/signature/RsaInfo.cpp b/src/PE/signature/RsaInfo.cpp
new file mode 100644
index 00000000..d5942097
--- /dev/null
+++ b/src/PE/signature/RsaInfo.cpp
@@ -0,0 +1,145 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+
+#include "LIEF/PE/signature/RsaInfo.hpp"
+
+#include <algorithm>
+#include <fstream>
+
+#include <mbedtls/x509.h>
+#include <mbedtls/asn1.h>
+#include <mbedtls/oid.h>
+#include <mbedtls/rsa.h>
+#include <mbedtls/pk.h>
+
+
+namespace LIEF {
+namespace PE {
+
+RsaInfo::RsaInfo(void) = default;
+
+RsaInfo::RsaInfo(const RsaInfo::rsa_ctx_handle ctx) {
+ const mbedtls_rsa_context* pctx = reinterpret_cast<const mbedtls_rsa_context*>(ctx);
+ mbedtls_rsa_context* local_ctx = new mbedtls_rsa_context{};
+ mbedtls_rsa_init(local_ctx, pctx->padding, pctx->hash_id);
+ mbedtls_rsa_copy(local_ctx, pctx);
+ mbedtls_rsa_complete(local_ctx);
+ this->ctx_ = reinterpret_cast<RsaInfo::rsa_ctx_handle>(local_ctx);
+}
+
+RsaInfo::RsaInfo(const RsaInfo& other)
+{
+ if (other.ctx_ != nullptr) {
+ const mbedtls_rsa_context* octx = reinterpret_cast<const mbedtls_rsa_context*>(other.ctx_);
+ mbedtls_rsa_context* local_ctx = new mbedtls_rsa_context{};
+ mbedtls_rsa_init(local_ctx, octx->padding, octx->hash_id);
+ mbedtls_rsa_copy(local_ctx, octx);
+ mbedtls_rsa_complete(local_ctx);
+ this->ctx_ = reinterpret_cast<RsaInfo::rsa_ctx_handle>(local_ctx);
+ }
+}
+
+
+RsaInfo::RsaInfo(RsaInfo&& other) :
+ ctx_{std::move(other.ctx_)}
+{}
+
+RsaInfo& RsaInfo::operator=(RsaInfo other) {
+ this->swap(other);
+ return *this;
+}
+
+void RsaInfo::swap(RsaInfo& other) {
+ std::swap(this->ctx_, other.ctx_);
+}
+
+RsaInfo::operator bool() const {
+ return this->ctx_ != nullptr;
+}
+
+bool RsaInfo::has_public_key(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ return mbedtls_rsa_check_pubkey(lctx) == 0;
+}
+
+bool RsaInfo::has_private_key(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ return mbedtls_rsa_check_privkey(lctx) == 0;
+}
+
+
+RsaInfo::bignum_wrapper_t RsaInfo::N(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ bignum_wrapper_t N(mbedtls_mpi_bitlen(&lctx->N));
+ mbedtls_mpi_write_binary(&lctx->N, N.data(), N.size());
+ return N;
+}
+
+RsaInfo::bignum_wrapper_t RsaInfo::E(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ bignum_wrapper_t E(mbedtls_mpi_bitlen(&lctx->E));
+ mbedtls_mpi_write_binary(&lctx->E, E.data(), E.size());
+ return E;
+}
+
+RsaInfo::bignum_wrapper_t RsaInfo::D(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ bignum_wrapper_t D(mbedtls_mpi_bitlen(&lctx->D));
+ mbedtls_mpi_write_binary(&lctx->D, D.data(), D.size());
+ return D;
+}
+
+RsaInfo::bignum_wrapper_t RsaInfo::P(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ bignum_wrapper_t P(mbedtls_mpi_bitlen(&lctx->P));
+ mbedtls_mpi_write_binary(&lctx->P, P.data(), P.size());
+ return P;
+}
+
+RsaInfo::bignum_wrapper_t RsaInfo::Q(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ bignum_wrapper_t Q(mbedtls_mpi_bitlen(&lctx->Q));
+ mbedtls_mpi_write_binary(&lctx->Q, Q.data(), Q.size());
+ return Q;
+}
+
+size_t RsaInfo::key_size(void) const {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ return mbedtls_rsa_get_len(lctx) * 8;
+}
+
+
+RsaInfo::~RsaInfo(void) {
+ if (this->ctx_ != nullptr) {
+ mbedtls_rsa_context* lctx = reinterpret_cast<mbedtls_rsa_context*>(this->ctx_);
+ mbedtls_rsa_free(lctx);
+ delete lctx;
+ }
+}
+
+
+std::ostream& operator<<(std::ostream& os, const RsaInfo& info) {
+ if (not info) {
+ os << "<Empty>";
+ } else {
+ // TODO
+ }
+
+ return os;
+}
+
+}
+}
diff --git a/src/PE/signature/Signature.cpp b/src/PE/signature/Signature.cpp
index 726b4c8c..a8783724 100644
--- a/src/PE/signature/Signature.cpp
+++ b/src/PE/signature/Signature.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,68 +14,612 @@
* limitations under the License.
*/
#include <iomanip>
+#include <fstream>
+
+#include "logging.hpp"
+
+#include "LIEF/utils.hpp"
#include "LIEF/PE/signature/Signature.hpp"
#include "LIEF/PE/signature/OIDToString.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+#include "LIEF/PE/signature/Attribute.hpp"
+#include "LIEF/PE/signature/attributes.hpp"
+
+#include <mbedtls/asn1write.h>
+
+#include <mbedtls/sha512.h>
+#include <mbedtls/sha256.h>
+#include <mbedtls/sha1.h>
+
+#include <mbedtls/md2.h>
+#include <mbedtls/md4.h>
+#include <mbedtls/md5.h>
+
+#include "mbedtls/x509_crt.h"
+#include "mbedtls/x509.h"
+
+#include "frozen.hpp"
namespace LIEF {
namespace PE {
-Signature::Signature(void) = default; // TODO
+inline std::string time_to_string(const x509::date_t& date) {
+ return fmt::format("{:d}/{:02d}/{:02d} - {:02d}:{:02d}:{:02d}",
+ date[0], date[1], date[2],
+ date[3], date[4], date[5]);
+}
+
+std::string Signature::flag_to_string(Signature::VERIFICATION_FLAGS flag) {
+ CONST_MAP(VERIFICATION_FLAGS, const char*, 13) enumStrings {
+ { Signature::VERIFICATION_FLAGS::OK, "OK"},
+ { Signature::VERIFICATION_FLAGS::INVALID_SIGNER, "INVALID_SIGNER"},
+ { Signature::VERIFICATION_FLAGS::UNSUPPORTED_ALGORITHM, "UNSUPPORTED_ALGORITHM"},
+ { Signature::VERIFICATION_FLAGS::INCONSISTENT_DIGEST_ALGORITHM, "INCONSISTENT_DIGEST_ALGORITHM"},
+ { Signature::VERIFICATION_FLAGS::CERT_NOT_FOUND, "CERT_NOT_FOUND"},
+ { Signature::VERIFICATION_FLAGS::CORRUPTED_CONTENT_INFO, "CORRUPTED_CONTENT_INFO"},
+ { Signature::VERIFICATION_FLAGS::CORRUPTED_AUTH_DATA, "CORRUPTED_AUTH_DATA"},
+ { Signature::VERIFICATION_FLAGS::MISSING_PKCS9_MESSAGE_DIGEST, "MISSING_PKCS9_MESSAGE_DIGEST"},
+ { Signature::VERIFICATION_FLAGS::BAD_DIGEST, "BAD_DIGEST"},
+ { Signature::VERIFICATION_FLAGS::BAD_SIGNATURE, "BAD_SIGNATURE"},
+ { Signature::VERIFICATION_FLAGS::NO_SIGNATURE, "NO_SIGNATURE"},
+ { Signature::VERIFICATION_FLAGS::CERT_EXPIRED, "CERT_EXPIRED"},
+ { Signature::VERIFICATION_FLAGS::CERT_FUTURE, "CERT_FUTURE"},
+ };
+ auto it = enumStrings.find(flag);
+ return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+Signature::VERIFICATION_FLAGS verify_ts_counter_signature(const SignerInfo& signer,
+ const PKCS9CounterSignature& cs, Signature::VERIFICATION_CHECKS checks) {
+ LIEF_DEBUG("PKCS #9 Counter signature found");
+ Signature::VERIFICATION_FLAGS flags = Signature::VERIFICATION_FLAGS::OK;
+ const SignerInfo& cs_signer = cs.signer();
+ if (cs_signer.cert() == nullptr) {
+ LIEF_WARN("Can't find x509 certificate associated with Counter Signature's signer");
+ return flags | Signature::VERIFICATION_FLAGS::CERT_NOT_FOUND;
+ }
+ const x509& cs_cert = *cs_signer.cert();
+ const SignerInfo::encrypted_digest_t& cs_enc_digest = cs_signer.encrypted_digest();
+
+ std::vector<uint8_t> cs_auth_data = cs_signer.raw_auth_data();
+ // According to the RFC:
+ //
+ // "[...] The Attributes value's tag is SET OF, and the DER encoding of
+ // the SET OF tag, rather than of the IMPLICIT [0] tag [...]"
+ cs_auth_data[0] = /* SET OF */ 0x31;
+ const ALGORITHMS cs_digest_algo = cs_signer.digest_algorithm();
+ const std::vector<uint8_t>& cs_hash = Signature::hash(cs_auth_data, cs_digest_algo);
+ LIEF_DEBUG("Signed data digest: {}", hex_dump(cs_hash));
+ bool check_sig = cs_cert.check_signature(cs_hash, cs_enc_digest, cs_digest_algo);
+
+ if (not check_sig) {
+ LIEF_WARN("Authenticated signature (counter signature) mismatch");
+ //return flags | VERIFICATION_FLAGS::BAD_SIGNATURE;
+ }
+
+
+ /* According to Microsoft documentation:
+ * The Authenticode timestamp SignerInfo structure contains the following authenticated attributes values:
+ * 1. ContentType (1.2.840.113549.1.9.3) is set to PKCS #7 Data (1.2.840.113549.1.7.1).
+ * 2. Signing Time (1.2.840.113549.1.9.5) is set to the UTC time of timestamp generation time.
+ * 3. Message Digest (1.2.840.113549.1.9.4) is set to the hash value of the
+ * SignerInfo structure's encryptedDigest value. The hash algorithm that
+ * is used to calculate the hash value is the same as that specified in the
+ * SignerInfo structure’s digestAlgorithm value of the timestamp.
+ */
+
+ // Verify 1.
+ const auto* content_type_data = reinterpret_cast<const ContentType*>(cs_signer.get_auth_attribute(SIG_ATTRIBUTE_TYPES::CONTENT_TYPE));
+ if (content_type_data == nullptr) {
+ LIEF_WARN("Missing ContentType in authenticated attributes in the counter signature's signer");
+ return flags | Signature::VERIFICATION_FLAGS::INVALID_SIGNER;
+ }
+
+ if (content_type_data->oid() != /* PKCS #7 Data */ "1.2.840.113549.1.7.1") {
+ LIEF_WARN("Bad OID for ContentType in authenticated attributes in the counter signature's signer ({})",
+ content_type_data->oid());
+ return flags | Signature::VERIFICATION_FLAGS::INVALID_SIGNER;
+ }
+
+ // Verify 3.
+ const auto* message_dg = reinterpret_cast<const PKCS9MessageDigest*>(cs_signer.get_auth_attribute(SIG_ATTRIBUTE_TYPES::PKCS9_MESSAGE_DIGEST));
+ if (message_dg == nullptr) {
+ LIEF_WARN("Missing MessageDigest in authenticated attributes in the counter signature's signer");
+ return flags | Signature::VERIFICATION_FLAGS::INVALID_SIGNER;
+ }
+ const std::vector<uint8_t>& dg_value = message_dg->digest();
+ const std::vector<uint8_t> dg_cs_hash = Signature::hash(signer.encrypted_digest(), cs_digest_algo);
+ if (dg_value != dg_cs_hash) {
+ LIEF_WARN("MessageDigest mismatch with Hash(signer ED)");
+ return flags | Signature::VERIFICATION_FLAGS::INVALID_SIGNER;
+ }
+
+ /*
+ * Verify that signing's time is valid within the signer's certificate
+ * validity window.
+ */
+ const auto* signing_time = reinterpret_cast<const PKCS9SigningTime*>(cs_signer.get_auth_attribute(SIG_ATTRIBUTE_TYPES::PKCS9_SIGNING_TIME));
+ if (signing_time != nullptr and not is_true(checks & Signature::VERIFICATION_CHECKS::SKIP_CERT_TIME)) {
+ LIEF_DEBUG("PKCS #9 signing time found");
+ PKCS9SigningTime::time_t time = signing_time->time();
+ if (not x509::check_time(time, cs_cert.valid_to())) {
+ LIEF_WARN("Signing time: {} is above the certificate validity: {}",
+ time_to_string(time), time_to_string(cs_cert.valid_to()));
+ return flags | Signature::VERIFICATION_FLAGS::CERT_EXPIRED;
+ }
+
+ if (not x509::check_time(cs_cert.valid_from(), time)) {
+ LIEF_WARN("Signing time: {} is below the certificate validity: {}",
+ time_to_string(time), time_to_string(cs_cert.valid_to()));
+ return flags | Signature::VERIFICATION_FLAGS::CERT_FUTURE;
+ }
+ }
+ return flags;
+}
+
+
+Signature::Signature(void) = default;
Signature::Signature(const Signature&) = default;
Signature& Signature::operator=(const Signature&) = default;
Signature::~Signature(void) = default;
+
+std::vector<uint8_t> Signature::hash(const std::vector<uint8_t>& input, ALGORITHMS algo) {
+ switch (algo) {
+
+ case ALGORITHMS::SHA_512:
+ {
+ std::vector<uint8_t> out(64);
+ int ret = mbedtls_sha512_ret(input.data(), input.size(), out.data(), /* is384 */ false);
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with SHA-512 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ case ALGORITHMS::SHA_384:
+ {
+ std::vector<uint8_t> out(64);
+ int ret = mbedtls_sha512_ret(input.data(), input.size(), out.data(), /* is384 */ true);
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with SHA-384 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ case ALGORITHMS::SHA_256:
+ {
+ std::vector<uint8_t> out(32);
+ int ret = mbedtls_sha256_ret(input.data(), input.size(), out.data(), /* is224 */ false);
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with SHA-256 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ case ALGORITHMS::SHA_1:
+ {
+ std::vector<uint8_t> out(20);
+ int ret = mbedtls_sha1_ret(input.data(), input.size(), out.data());
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with SHA-1 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ case ALGORITHMS::MD5:
+ {
+ std::vector<uint8_t> out(16);
+ int ret = mbedtls_md5_ret(input.data(), input.size(), out.data());
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with MD5 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ case ALGORITHMS::MD4:
+ {
+ std::vector<uint8_t> out(16);
+ int ret = mbedtls_md4_ret(input.data(), input.size(), out.data());
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with MD4 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ case ALGORITHMS::MD2:
+ {
+ std::vector<uint8_t> out(16);
+ int ret = mbedtls_md2_ret(input.data(), input.size(), out.data());
+ if (ret != 0) {
+ LIEF_ERR("Hashing {} bytes with MD2 failed! (ret: 0x{:x})", input.size(), ret);
+ return {};
+ }
+ return out;
+ }
+
+ default:
+ {
+ LIEF_ERR("Unsupported hash algorithm {}", to_string(algo));
+ }
+ }
+ return {};
+}
+
uint32_t Signature::version(void) const {
return this->version_;
}
-const oid_t& Signature::digest_algorithm(void) const {
- return this->digest_algorithm_;
-}
const ContentInfo& Signature::content_info(void) const {
return this->content_info_;
}
it_const_crt Signature::certificates(void) const {
- return {this->certificates_};
+ return this->certificates_;
+}
+
+it_const_signers_t Signature::signers(void) const {
+ return this->signers_;
}
-const SignerInfo& Signature::signer_info(void) const {
- return this->signer_info_;
+Signature::VERIFICATION_FLAGS Signature::check(VERIFICATION_CHECKS checks) const {
+ // According to the Authenticode documentation,
+ // *SignerInfos contains one SignerInfo structure*
+ const size_t nb_signers = this->signers_.size();
+ VERIFICATION_FLAGS flags = VERIFICATION_FLAGS::OK;
+ if (nb_signers == 0) {
+ LIEF_WARN("No signer associated with the signature");
+ return flags | VERIFICATION_FLAGS::INVALID_SIGNER;
+ }
+
+ if (nb_signers > 1) {
+ LIEF_WARN("More than ONE signer ({:d} signers)", nb_signers);
+ return flags | VERIFICATION_FLAGS::INVALID_SIGNER;
+ }
+ const SignerInfo& signer = this->signers_.back();
+
+ // Check that Signature.digest_algorithm matches:
+ // - SignerInfo.digest_algorithm
+ // - ContentInfo.digest_algorithm
+
+ if (this->digest_algorithm_ == ALGORITHMS::UNKNOWN) {
+ LIEF_WARN("Unsupported digest algorithm");
+ return flags | VERIFICATION_FLAGS::UNSUPPORTED_ALGORITHM;
+ }
+
+ if (this->digest_algorithm_ != this->content_info_.digest_algorithm()) {
+ LIEF_WARN("Digest algorithm is different from ContentInfo");
+ return flags | VERIFICATION_FLAGS::INCONSISTENT_DIGEST_ALGORITHM;
+ }
+
+ if (this->digest_algorithm_ != signer.digest_algorithm()) {
+ LIEF_WARN("Digest algorithm is different from Signer");
+ return flags | VERIFICATION_FLAGS::INCONSISTENT_DIGEST_ALGORITHM;
+ }
+
+ const ALGORITHMS digest_algo = this->content_info().digest_algorithm();
+
+ if (signer.cert() == nullptr) {
+ LIEF_WARN("Can't find certificate whose the issuer is {}", signer.issuer());
+ return flags | VERIFICATION_FLAGS::CERT_NOT_FOUND;
+ }
+ const x509& cert = *signer.cert();
+ const SignerInfo::encrypted_digest_t& enc_digest = signer.encrypted_digest();
+
+ /*
+ * Check the following condition:
+ * "The signing certificate must contain either the extended key usage (EKU)
+ * value for code signing, or the entire certificate chain must contain no
+ * EKUs. The following is the EKU value for code signing"
+ */
+ //TODO(romain)
+
+ /*
+ * Verify certificate validity
+ */
+
+ if (this->content_info_start_ == 0 or this->content_info_end_ == 0) {
+ return flags | VERIFICATION_FLAGS::CORRUPTED_CONTENT_INFO;
+ }
+
+ std::vector<uint8_t> raw_content_info = {
+ std::begin(this->original_raw_signature_) + this->content_info_start_,
+ std::begin(this->original_raw_signature_) + this->content_info_end_
+ };
+
+ const std::vector<uint8_t> content_info_hash = Signature::hash(std::move(raw_content_info), digest_algo);
+
+
+ // Copy authenticated attributes
+ it_const_attributes_t auth_attrs = signer.authenticated_attributes();
+ if (auth_attrs.size() > 0) {
+
+ std::vector<uint8_t> auth_data = signer.raw_auth_data_;
+ // According to the RFC:
+ //
+ // "[...] The Attributes value's tag is SET OF, and the DER encoding of
+ // the SET OF tag, rather than of the IMPLICIT [0] tag [...]"
+ auth_data[0] = /* SET OF */ 0x31;
+
+ const std::vector<uint8_t> auth_attr_hash = Signature::hash(auth_data, digest_algo);
+ LIEF_DEBUG("Authenticated attribute digest: {}", hex_dump(auth_attr_hash));
+ bool check_sig = cert.check_signature(auth_attr_hash, enc_digest, digest_algo);
+
+ if (not check_sig) {
+ LIEF_WARN("Authenticated signature mismatch");
+ return flags | VERIFICATION_FLAGS::BAD_SIGNATURE;
+ }
+
+ // Check that content_info_hash matches pkcs9-message-digest
+ auto it_pkcs9_digest = std::find_if(std::begin(auth_attrs), std::end(auth_attrs),
+ [] (const Attribute& attr) {
+ return attr.type() == SIG_ATTRIBUTE_TYPES::PKCS9_MESSAGE_DIGEST;
+ });
+
+ if (it_pkcs9_digest == std::end(auth_attrs)) {
+ LIEF_WARN("Can't find the authenticated attribute: 'pkcs9-message-digest'");
+ return flags | VERIFICATION_FLAGS::MISSING_PKCS9_MESSAGE_DIGEST;
+ }
+
+ const auto& digest_attr = reinterpret_cast<const PKCS9MessageDigest&>(*it_pkcs9_digest);
+ LIEF_DEBUG("pkcs9-message-digest:\n {}\n {}", hex_dump(digest_attr.digest()), hex_dump(content_info_hash));
+ if (digest_attr.digest() != content_info_hash) {
+ return flags | VERIFICATION_FLAGS::BAD_DIGEST;
+ }
+ } else {
+ /*
+ * If there is no authenticated attributes, then the encrypted digested should match ENC(content_info_hash)
+ */
+ if (not cert.check_signature(content_info_hash, enc_digest, digest_algo)) {
+ return flags | VERIFICATION_FLAGS::BAD_SIGNATURE;
+ }
+ }
+
+ /*
+ * CounterSignature Checks
+ */
+ const auto* counter = reinterpret_cast<const PKCS9CounterSignature*>(signer.get_unauth_attribute(SIG_ATTRIBUTE_TYPES::PKCS9_COUNTER_SIGNATURE));
+ bool has_ms_counter_sig = false;
+ for (const Attribute& attr : signer.unauthenticated_attributes()) {
+ if (attr.type() == SIG_ATTRIBUTE_TYPES::GENERIC_TYPE) {
+ if (reinterpret_cast<const GenericType&>(attr).oid() == /* Ms-CounterSign */ "1.3.6.1.4.1.311.3.3.1") {
+ has_ms_counter_sig = true;
+ break;
+ }
+ }
+ }
+ bool timeless_signature = false;
+ if (counter != nullptr) {
+ VERIFICATION_FLAGS cs_flags = verify_ts_counter_signature(signer, *counter, checks);
+ if (cs_flags == VERIFICATION_FLAGS::OK) {
+ timeless_signature = true;
+ }
+ } else if (not timeless_signature and has_ms_counter_sig) {
+ timeless_signature = true;
+ }
+ bool should_check_cert_time = not timeless_signature or is_true(checks & VERIFICATION_CHECKS::LIFETIME_SIGNING);
+ if (is_true(checks & VERIFICATION_CHECKS::SKIP_CERT_TIME)) {
+ should_check_cert_time = false;
+ }
+ if (should_check_cert_time) {
+ /*
+ * Verify certificate validities
+ */
+ if (x509::time_is_past(cert.valid_to())) {
+ return flags | VERIFICATION_FLAGS::CERT_EXPIRED;
+ }
+
+ if (x509::time_is_future(cert.valid_from())) {
+ return flags | VERIFICATION_FLAGS::CERT_FUTURE;
+ }
+
+ }
+ return flags;
}
-const std::vector<uint8_t>& Signature::original_signature(void) const {
+
+const std::vector<uint8_t>& Signature::raw_der(void) const {
return this->original_raw_signature_;
}
+
+const x509* Signature::find_crt(const std::vector<uint8_t>& serialno) const {
+ auto it_cert = std::find_if(std::begin(this->certificates_), std::end(this->certificates_),
+ [&serialno] (const x509& cert) {
+ return cert.serial_number() == serialno;
+ });
+ if (it_cert == std::end(this->certificates_)) {
+ return nullptr;
+ }
+ return &(*it_cert);
+}
+
+
+const x509* Signature::find_crt_subject(const std::string& subject) const {
+ auto it_cert = std::find_if(std::begin(this->certificates_), std::end(this->certificates_),
+ [&subject] (const x509& cert) {
+ return cert.subject() == subject;
+ });
+ if (it_cert == std::end(this->certificates_)) {
+ return nullptr;
+ }
+ return &(*it_cert);
+}
+
+const x509* Signature::find_crt_subject(const std::string& subject, const std::vector<uint8_t>& serialno) const {
+ auto it_cert = std::find_if(std::begin(this->certificates_), std::end(this->certificates_),
+ [&subject, &serialno] (const x509& cert) {
+ return cert.subject() == subject and cert.serial_number() == serialno;
+ });
+ if (it_cert == std::end(this->certificates_)) {
+ return nullptr;
+ }
+ return &(*it_cert);
+}
+
+const x509* Signature::find_crt_issuer(const std::string& issuer) const {
+ auto it_cert = std::find_if(std::begin(this->certificates_), std::end(this->certificates_),
+ [&issuer] (const x509& cert) {
+ return cert.issuer() == issuer;
+ });
+ if (it_cert == std::end(this->certificates_)) {
+ return nullptr;
+ }
+ return &(*it_cert);
+}
+
+const x509* Signature::find_crt_issuer(const std::string& issuer, const std::vector<uint8_t>& serialno) const {
+ auto it_cert = std::find_if(std::begin(this->certificates_), std::end(this->certificates_),
+ [&issuer, &serialno] (const x509& cert) {
+ return cert.issuer() == issuer and cert.serial_number() == serialno;
+ });
+ if (it_cert == std::end(this->certificates_)) {
+ return nullptr;
+ }
+ return &(*it_cert);
+}
+
void Signature::accept(Visitor& visitor) const {
visitor.visit(*this);
}
-std::ostream& operator<<(std::ostream& os, const Signature& signature) {
- constexpr uint8_t wsize = 30;
- os << std::hex << std::left;
- os << std::setw(wsize) << std::setfill(' ') << "Version: " << signature.version() << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Digest Algorithm: " << oid_to_string(signature.digest_algorithm()) << std::endl;
+inline void print_attr(it_const_attributes_t& attrs, std::ostream& os) {
+ for (const Attribute& attr : attrs) {
+ std::string suffix;
+ switch (attr.type()) {
+ case SIG_ATTRIBUTE_TYPES::CONTENT_TYPE:
+ {
+ const auto& ct = reinterpret_cast<const ContentType&>(attr);
+ suffix = ct.oid() + " (" + oid_to_string(ct.oid()) + ")";
+ break;
+ }
- os << "Content Info" << std::endl;
- os << "============" << std::endl;
- os << signature.content_info() << std::endl << std::endl;
+ case SIG_ATTRIBUTE_TYPES::MS_SPC_STATEMENT_TYPE:
+ {
+ const auto& ct = reinterpret_cast<const MsSpcStatementType&>(attr);
+ suffix = ct.oid() + " (" + oid_to_string(ct.oid()) + ")";
+ break;
+ }
+ case SIG_ATTRIBUTE_TYPES::SPC_SP_OPUS_INFO:
+ {
+ const auto& ct = reinterpret_cast<const SpcSpOpusInfo&>(attr);
+ if (not ct.program_name().empty()) {
+ suffix = ct.program_name();
+ }
+ if (not ct.more_info().empty()) {
+ if (not suffix.empty()) {
+ suffix += " - ";
+ }
+ suffix += ct.more_info();
+ }
+ break;
+ }
+
+ case SIG_ATTRIBUTE_TYPES::PKCS9_MESSAGE_DIGEST:
+ {
+ const auto& ct = reinterpret_cast<const PKCS9MessageDigest&>(attr);
+ suffix = hex_dump(ct.digest()).substr(0, 41) + "...";
+ break;
+ }
+
+ case SIG_ATTRIBUTE_TYPES::MS_SPC_NESTED_SIGN:
+ {
+ const auto& nested_attr = reinterpret_cast<const MsSpcNestedSignature&>(attr);
+ const Signature& ct = nested_attr.sig();
+ auto signers = ct.signers();
+ auto crts = ct.certificates();
+ if (signers.size() > 0) {
+ suffix = signers[0].issuer();
+ } else if (crts.size() > 0) {
+ suffix = crts[0].issuer();
+ }
+ break;
+ }
+
+ case SIG_ATTRIBUTE_TYPES::GENERIC_TYPE:
+ {
+ const auto& ct = reinterpret_cast<const GenericType&>(attr);
+ suffix = ct.oid();
+ break;
+ }
+
+ case SIG_ATTRIBUTE_TYPES::PKCS9_AT_SEQUENCE_NUMBER:
+ {
+ const auto& ct = reinterpret_cast<const PKCS9AtSequenceNumber&>(attr);
+ suffix = std::to_string(ct.number());
+ break;
+ }
+
+ case SIG_ATTRIBUTE_TYPES::PKCS9_COUNTER_SIGNATURE:
+ {
+ const auto& ct = reinterpret_cast<const PKCS9CounterSignature&>(attr);
+ const SignerInfo& signer = ct.signer();
+ suffix = signer.issuer();
+ break;
+ }
+
+ case SIG_ATTRIBUTE_TYPES::PKCS9_SIGNING_TIME:
+ {
+ const auto& ct = reinterpret_cast<const PKCS9SigningTime&>(attr);
+ const PKCS9SigningTime::time_t time = ct.time();
+ suffix = fmt::format("{}/{}/{} - {}:{}:{}",
+ time[0], time[1], time[2], time[3], time[4], time[5]);
+ break;
+ }
+
+ default:
+ {
+ }
+ }
+ os << fmt::format(" {}: {}\n", to_string(attr.type()), suffix);
- os << "Certificates" << std::endl;
- os << "============" << std::endl;
- for (const x509& crt : signature.certificates()) {
- os << crt << std::endl;;
}
- os << std::endl;
+}
- os << "Signer Info" << std::endl;
- os << "===========" << std::endl;
- os << signature.signer_info() << std::endl << std::endl;
+std::ostream& operator<<(std::ostream& os, const Signature& signature) {
+ const ContentInfo& cinfo = signature.content_info();
+ os << fmt::format("Version: {:d}\n", signature.version());
+ os << fmt::format("Digest Algorithm: {}\n", to_string(signature.digest_algorithm()));
+ os << fmt::format("Content Info Digest: {}\n", hex_dump(cinfo.digest()));
+ if (not cinfo.file().empty()) {
+ os << fmt::format("Content Info File: {}\n", cinfo.file());
+ }
+ it_const_crt certs = signature.certificates();
+ os << fmt::format("#{:d} certificate(s):\n", certs.size());
+ for (const x509& crt : certs) {
+ os << fmt::format(" - {}\n", crt.issuer()); // TODO(romain): RSA-2048, ...
+ }
+ it_const_signers_t signers = signature.signers();
+ os << fmt::format("#{:d} signer(s):\n", signers.size());
+ for (const SignerInfo& signer : signers) {
+ os << fmt::format("Issuer: {}\n", signer.issuer());
+ os << fmt::format("Digest: {}\n", to_string(signer.digest_algorithm()));
+ os << fmt::format("Encryption: {}\n", to_string(signer.encryption_algorithm()));
+ os << fmt::format("Encrypted DG: {} ...\n", hex_dump(signer.encrypted_digest()).substr(0, 41));
+ it_const_attributes_t auth_attr = signer.authenticated_attributes();
+ if (auth_attr.size() > 0) {
+ os << fmt::format("#{:d} authenticated attributes:\n", auth_attr.size());
+ print_attr(auth_attr, os);
+ }
+
+ it_const_attributes_t unauth_attr = signer.unauthenticated_attributes();
+ if (unauth_attr.size() > 0) {
+ os << fmt::format("#{:d} un-authenticated attributes:\n", unauth_attr.size());
+ print_attr(unauth_attr, os);
+ }
+
+ }
return os;
}
diff --git a/src/PE/signature/SignatureParser.cpp b/src/PE/signature/SignatureParser.cpp
index 63da0fa9..b9e4b0ac 100644
--- a/src/PE/signature/SignatureParser.cpp
+++ b/src/PE/signature/SignatureParser.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,726 +14,1121 @@
* limitations under the License.
*/
+#include <cstring>
+#include <fstream>
+
#include <mbedtls/platform.h>
#include <mbedtls/oid.h>
#include <mbedtls/x509_crt.h>
-#include "utf8.h"
#include "LIEF/utils.hpp"
-
-#include "LIEF/logging++.hpp"
-
-#include "pkcs7.h"
-
-#include <cstring>
-
#include "LIEF/exception.hpp"
+#include "LIEF/BinaryStream/VectorStream.hpp"
+
#include "LIEF/PE/utils.hpp"
#include "LIEF/PE/signature/SignatureParser.hpp"
#include "LIEF/PE/signature/Signature.hpp"
+
+#include "LIEF/PE/signature/Attribute.hpp"
+#include "LIEF/PE/signature/attributes/ContentType.hpp"
+#include "LIEF/PE/signature/attributes/GenericType.hpp"
+#include "LIEF/PE/signature/attributes/SpcSpOpusInfo.hpp"
+#include "LIEF/PE/signature/attributes/PKCS9CounterSignature.hpp"
+#include "LIEF/PE/signature/attributes/PKCS9MessageDigest.hpp"
+#include "LIEF/PE/signature/attributes/PKCS9AtSequenceNumber.hpp"
+#include "LIEF/PE/signature/attributes/PKCS9SigningTime.hpp"
+#include "LIEF/PE/signature/attributes/MsSpcNestedSignature.hpp"
+#include "LIEF/PE/signature/attributes/MsSpcStatementType.hpp"
+
#include "LIEF/PE/signature/OIDToString.hpp"
+#include "LIEF/third-party/utfcpp/utf8.h"
+#include "logging.hpp"
+#include "pkcs7.h"
+
namespace LIEF {
namespace PE {
+inline uint8_t stream_get_tag(VectorStream& stream) {
+ if (stream.can_read<uint8_t>()) {
+ return stream.peek<uint8_t>();
+ }
+ return 0;
+}
+
SignatureParser::~SignatureParser(void) = default;
SignatureParser::SignatureParser(void) = default;
-SignatureParser::SignatureParser(const std::vector<uint8_t>& data) :
- signature_{},
- p_{nullptr},
- end_{nullptr},
- signature_ptr_{nullptr},
- stream_{std::unique_ptr<VectorStream>(new VectorStream{data})}
-{
-
- const uint8_t* sig = this->stream_->peek_array<uint8_t>(8, this->stream_->size() - 8, /* check */false);
- if (sig != nullptr) {
- this->signature_ptr_ = sig;
- this->end_ = this->signature_ptr_ + this->stream_->size() - 8;
- this->p_ = const_cast<uint8_t*>(this->signature_ptr_);
- try {
- this->parse_signature();
- } catch (const std::exception& e) {
- VLOG(VDEBUG) << e.what();
- }
+SignatureParser::SignatureParser(std::vector<uint8_t> data) :
+ stream_{std::unique_ptr<VectorStream>(new VectorStream{std::move(data)})}
+{}
+
+result<Signature> SignatureParser::parse(const std::string& path) {
+ std::ifstream binary(path, std::ios::in | std::ios::binary);
+ if (not binary) {
+ LIEF_ERR("Can't open {}", path);
+ return make_error_code(lief_errors::file_error);
}
+ binary.unsetf(std::ios::skipws);
+ binary.seekg(0, std::ios::end);
+ const auto size = static_cast<uint64_t>(binary.tellg());
+ binary.seekg(0, std::ios::beg);
+ std::vector<uint8_t> raw_blob(size, 0);
+ binary.read(reinterpret_cast<char*>(raw_blob.data()), size);
+ return SignatureParser::parse(std::move(raw_blob));
}
-
-Signature SignatureParser::parse(const std::vector<uint8_t>& data) {
- SignatureParser parser{data};
- return parser.signature_;
+result<Signature> SignatureParser::parse(std::vector<uint8_t> data, bool skip_header) {
+ if (data.size() < 10) {
+ return make_error_code(lief_errors::read_error);
+ }
+ std::vector<uint8_t> sig_data = skip_header ?
+ std::vector<uint8_t>{std::begin(data) + 8, std::end(data)} :
+ /* else */
+ std::move(data);
+
+ SignatureParser parser{std::move(sig_data)};
+ auto sig = parser.parse_signature();
+ if (not sig) {
+ LIEF_ERR("Error while parsing the signature");
+ return sig.error();
+ }
+ return std::move(sig.value());
}
-size_t SignatureParser::current_offset(void) const {
- return (reinterpret_cast<size_t>(this->p_) - reinterpret_cast<size_t>(this->signature_ptr_));
+size_t SignatureParser::current_offset() const {
+ return this->stream_->pos();
}
-void SignatureParser::parse_header(void) {
- mbedtls_asn1_buf buf;
- int ret = 0;
- size_t tag;
- char oid_str[256] = { 0 };
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
+result<Signature> SignatureParser::parse_signature() {
+ Signature signature;
+ signature.original_raw_signature_ = this->stream_->content();
+ auto tag = this->stream_->asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(*this->stream_), this->stream_->pos());
+ return tag.error();
}
- buf.tag = *this->p_;
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &buf.len, MBEDTLS_ASN1_OID)) != 0) {
- throw corrupted("Error while reading tag");
+ auto oid = this->stream_->asn1_read_oid();
+ if (not oid) {
+ LIEF_INFO("Can't read OID value (pos: {})", this->stream_->pos());
+ return oid.error();
}
+ std::string& oid_str = oid.value();
- buf.p = this->p_;
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &buf);
- VLOG(VDEBUG) << "OID (signedData): " << oid_str;
- this->p_ += buf.len;
-
- if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_SIGNED_DATA, &buf) != 0) {
- throw corrupted("Wrong OID: " + std::string(oid_str) + " (expect PKCS7_SIGNED_DATA)");
+ if (oid_str != /* pkcs7-signedData */ "1.2.840.113549.1.7.2") {
+ LIEF_INFO("Expecting OID pkcs7-signed-data at {:d} but got {}",
+ this->stream_->pos(), oid_to_string(oid_str));
+ return make_error_code(lief_errors::read_error);
}
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signature corrupted");
+ tag = this->stream_->asn1_read_tag(MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(*this->stream_), this->stream_->pos());
+ return tag.error();
+ }
+ tag = this->stream_->asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(*this->stream_), this->stream_->pos());
+ return tag.error();
}
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
+ /*
+ * Defined in https://tools.ietf.org/html/rfc2315
+ * SignedData ::= SEQUENCE {
+ * version Version,
+ * digestAlgorithms DigestAlgorithmIdentifiers,
+ * contentInfo ContentInfo,
+ * certificates
+ * [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
+ * crls
+ * [1] IMPLICIT CertificateRevocationLists OPTIONAL,
+ * signerInfos SignerInfos
+ * }
+ *
+ * Version ::= INTEGER
+ * DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
+ * SignerInfos ::= SET OF SignerInfo
+ *
+ *
+ * SignerInfo ::= SEQUENCE {
+ * version Version,
+ * issuerAndSerialNumber IssuerAndSerialNumber,
+ * digestAlgorithm DigestAlgorithmIdentifier,
+ * authenticatedAttributes
+ * [0] IMPLICIT Attributes OPTIONAL,
+ * digestEncryptionAlgorithm
+ * DigestEncryptionAlgorithmIdentifier,
+ * encryptedDigest EncryptedDigest,
+ * unauthenticatedAttributes
+ * [1] IMPLICIT Attributes OPTIONAL
+ * }
+ *
+ */
+
+ // ==============================================================================
+ // Version
+ //
+ // Version ::= INTEGER
+ // ==============================================================================
+ auto version = this->stream_->asn1_read_int();
+ if (not version) {
+ LIEF_INFO("Can't parse version (pos: {:d})", this->stream_->pos());
+ return tag.error();
+ }
+ const int32_t version_val = version.value();
+ LIEF_DEBUG("pkcs7-signed-data.version: {:d}", version_val);
+ if (version_val != 1) {
+ LIEF_INFO("pkcs7-signed-data.version is not 1 ({:d})", version_val);
+ return make_error_code(lief_errors::not_supported);
+ }
+ signature.version_ = version_val;
+
+ // ==============================================================================
+ // Digest Algorithms
+ //
+ // DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
+ // ==============================================================================
+ tag = this->stream_->asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(*this->stream_), this->stream_->pos());
+ return tag.error();
+ }
+ const uintptr_t end_set = this->stream_->pos() + tag.value();
+ std::vector<oid_t> algorithms;
+ while (this->stream_->pos() < end_set) {
+ const size_t current_p = this->stream_->pos();
+ auto alg = this->stream_->asn1_read_alg();
+ if (not alg) {
+ LIEF_INFO("Can't parse signed data digest algorithm (pos: {:d})", this->stream_->pos());
+ break;
+ }
+ if (this->stream_->pos() == current_p) break;
+ LIEF_DEBUG("pkcs7-signed-data.digest-algorithms: {}", oid_to_string(alg.value()));
+ algorithms.push_back(std::move(alg.value()));
+ }
+ if (algorithms.size() == 0) {
+ LIEF_INFO("pkcs7-signed-data.digest-algorithms no algorithms found");
+ return make_error_code(lief_errors::read_error);
}
+ else if (algorithms.size() > 1) {
+ LIEF_INFO("pkcs7-signed-data.digest-algorithms {:d} algorithms found. Expecting only 1", algorithms.size());
+ return make_error_code(lief_errors::read_error);
+ }
+ else {
+ ALGORITHMS algo = algo_from_oid(algorithms.back());
+ if (algo == ALGORITHMS::UNKNOWN) {
+ LIEF_WARN("LIEF does not handle algorithm {}", algorithms.back());
+ } else {
+ signature.digest_algorithm_ = algo;
+ }
-}
+ }
+ // Content Info
+ // =========================================================
+ tag = this->stream_->asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} can't parse content info (pos: {:d})",
+ stream_get_tag(*this->stream_), this->stream_->pos());
+ return tag.error();
+ }
-int32_t SignatureParser::get_signed_data_version(void) {
- VLOG(VDEBUG) << "Parse signed data - version";
- int ret = 0;
+ /* Content Info */ {
+ std::vector<uint8_t> raw_content_info =
+ {this->stream_->p(), this->stream_->p() + tag.value()};
+ VectorStream content_info_stream{std::move(raw_content_info)};
- int32_t version;
- if ((ret = mbedtls_asn1_get_int(&(this->p_), this->end_, &version)) != 0) {
- throw corrupted("Signature corrupted");
+ range_t range = {0, 0};
+ auto content_info = this->parse_content_info(content_info_stream, range);
+ if (not content_info) {
+ LIEF_INFO("Fail to parse pkcs7-signed-data.content-info");
+ } else {
+ signature.content_info_ = std::move(content_info.value());
+ signature.content_info_start_ = this->stream_->pos() + range.start;
+ signature.content_info_end_ = this->stream_->pos() + range.end;
+ LIEF_DEBUG("ContentInfo range: {:d} -> {:d}",
+ signature.content_info_start_, signature.content_info_end_);
+ }
+ this->stream_->increment_pos(raw_content_info.size());
}
- VLOG(VDEBUG) << "Version: " << std::dec << version;
- LOG_IF(version != 1, WARNING) << "Version should be equal to 1 (" << std::dec << version << ")";
- return version;
-}
+ // X509 Certificates (optional)
+ // =========================================================
+ tag = this->stream_->asn1_read_tag(/* certificates */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC);
+ if (tag) {
+ LIEF_DEBUG("Parse pkcs7-signed-data.certificates offset: {:d}", this->stream_->pos());
+ std::vector<uint8_t> raw_content =
+ {this->stream_->p(), this->stream_->p() + tag.value()};
-std::string SignatureParser::get_signed_data_digest_algorithms(void) {
- VLOG(VDEBUG) << "Parse signed data - digest algorithm";
- int ret = 0;
- size_t tag;
- char oid_str[256] = { 0 };
+ VectorStream certificate_stream{std::move(raw_content)};
+ this->stream_->increment_pos(raw_content.size());
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET)) != 0) {
- throw corrupted("Signature corrupted");
+ auto certificates = this->parse_certificates(certificate_stream);
+ if (not certificates) {
+ LIEF_INFO("Fail to parse pkcs7-signed-data.certificates");
+ } else {
+ // Makes chain
+ std::vector<x509> certs = certificates.value();
+ signature.certificates_ = std::move(certs);
+ }
}
- mbedtls_asn1_buf alg_oid;
-
- if ((ret = mbedtls_asn1_get_alg_null(&(this->p_), this->end_, &alg_oid)) != 0) {
- throw corrupted("Signature corrupted");
+ // CRLS (optional)
+ // =========================================================
+ tag = this->stream_->asn1_read_tag(/* certificates */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC | 1);
+ if (tag) {
+ LIEF_DEBUG("Parse pkcs7-signed-data.crls offset: {:d}", this->stream_->pos());
+ std::vector<uint8_t> raw_content =
+ {this->stream_->p(), this->stream_->p() + tag.value()};
+ // TODO(romain): Process crls certificates
+ this->stream_->increment_pos(raw_content.size());
}
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
+ // SignerInfos
+ // =========================================================
+ tag = this->stream_->asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET);
+ if (tag) {
+ LIEF_DEBUG("Parse pkcs7-signed-data.signer-infos offset: {:d}", this->stream_->pos());
+ std::vector<uint8_t> raw_content =
+ {this->stream_->p(), this->stream_->p() + tag.value()};
+ VectorStream stream{std::move(raw_content)};
+ this->stream_->increment_pos(raw_content.size());
+ auto signer_info = this->parse_signer_infos(stream);
+ if (not signer_info) {
+ LIEF_INFO("Fail to parse pkcs7-signed-data.signer-infos");
+ } else {
+ signature.signers_ = std::move(signer_info.value());
+ }
+ }
- VLOG(VDEBUG) << "digestAlgorithms: " << oid_str;
- return oid_str;
+ // Tied signer info with x509 certificates
+ for (SignerInfo& signer : signature.signers_) {
+ const x509* crt = signature.find_crt_issuer(signer.issuer(), signer.serial_number());
+ if (crt != nullptr) {
+ signer.cert_ = std::unique_ptr<x509>(new x509{*crt});
+ } else {
+ LIEF_INFO("Can't find x509 certificate associated with signer '{}'", signer.issuer());
+ }
+ const auto* cs = reinterpret_cast<const PKCS9CounterSignature*>(signer.get_attribute(SIG_ATTRIBUTE_TYPES::PKCS9_COUNTER_SIGNATURE));
+ if (cs != nullptr) {
+ SignerInfo& cs_signer = const_cast<PKCS9CounterSignature*>(cs)->signer_;
+ const x509* crt = signature.find_crt_issuer(cs_signer.issuer(), cs_signer.serial_number());
+ if (crt != nullptr) {
+ cs_signer.cert_ = std::unique_ptr<x509>(new x509{*crt});
+ } else {
+ LIEF_INFO("Can't find x509 certificate associated with signer '{}'", signer.issuer());
+ }
+ }
+ }
+ return signature;
}
+result<ContentInfo> SignatureParser::parse_content_info(VectorStream& stream, range_t& range) {
+ // ==============================================================================
+ // ContentInfo
+ // ContentInfo ::= SEQUENCE {
+ // contentType ContentType,
+ // content
+ // [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
+ // }
+ // ContentType ::= OBJECT IDENTIFIER
+ // ==============================================================================
+ ContentInfo content_info;
-ContentInfo SignatureParser::parse_content_info(void) {
- VLOG(VDEBUG) << "Parse signed data - content info";
-
- mbedtls_asn1_buf content_type_oid;
- mbedtls_asn1_buf alg_oid;
- int ret = 0;
- size_t tag;
- char oid_str[256] = { 0 };
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
+ // First, process contentType which must match SPC_INDIRECT_DATA_CONTEXT
+ {
+ auto content_type = stream.asn1_read_oid();
+ if (not content_type) {
+ LIEF_INFO("Can't parse content-info.content-type (pos: {:d})", stream.pos());
+ return content_type.error();
+ }
+ const std::string& ctype_str = content_type.value();
+ LIEF_DEBUG("content-info.content-type: {}", oid_to_string(ctype_str));
+ if (ctype_str != /* SPC_INDIRECT_DATA_CONTEXT */ "1.3.6.1.4.1.311.2.1.4") {
+ LIEF_WARN("Expecting OID SPC_INDIRECT_DATA_CONTEXT at {:d} but got {}",
+ stream.pos(), oid_to_string(ctype_str));
+ return make_error_code(lief_errors::read_error);
+ }
+ content_info.content_type_ = ctype_str;
}
- ContentInfo content_info;
- content_info.content_type_ = this->get_content_info_type();
- // content - SpcIndirectDataContent
- // |_ SpcAttributeTypeAndOptionalValue
- // |_ DigestInfo
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- VLOG(VDEBUG) << "Parsing SpcIndirectDataContent (offset: "
- << std::dec << this->current_offset()
- << ")";
+ // ==============================================================================
+ // Then process SpcIndirectDataContent, which has this structure:
+ //
+ // SpcIndirectDataContent ::= SEQUENCE {
+ // data SpcAttributeTypeAndOptionalValue,
+ // messageDigest DigestInfo
+ // }
+ //
+ // SpcAttributeTypeAndOptionalValue ::= SEQUENCE {
+ // type ObjectID, // Should be SPC_PE_IMAGE_DATA
+ // value [0] EXPLICIT ANY OPTIONAL
+ // }
+ //
+ // DigestInfo ::= SEQUENCE {
+ // digestAlgorithm AlgorithmIdentifier,
+ // digest OCTETSTRING
+ // }
+ //
+ // AlgorithmIdentifier ::= SEQUENCE {
+ // algorithm ObjectID,
+ // parameters [0] EXPLICIT ANY OPTIONAL
+ // }
+ // ==============================================================================
+ auto tag = stream.asn1_read_tag(/* [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL */
+ MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
+ return tag.error();
+ }
+ range.end = stream.size();
+
+ tag = stream.asn1_read_tag(/* SpcIndirectDataContent */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
+ return tag.error();
+ }
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signature corrupted");
+ range.start = stream.pos();
+ tag = stream.asn1_read_tag(/* SpcAttributeTypeAndOptionalValue */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
+ return tag.error();
}
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
+ // SpcAttributeTypeAndOptionalValue.type
+ auto spc_attr_type = stream.asn1_read_oid();
+ if (not spc_attr_type) {
+ LIEF_INFO("Can't parse spc-attribute-type-and-optional-value.type (pos: {:d})", stream.pos());
+ return spc_attr_type.error();
+ }
+ const std::string& spc_attr_type_str = spc_attr_type.value();
+ LIEF_DEBUG("spc-attribute-type-and-optional-value.type: {}", oid_to_string(spc_attr_type_str));
+ if (spc_attr_type_str != /* SPC_PE_IMAGE_DATA */ "1.3.6.1.4.1.311.2.1.15") {
+ LIEF_WARN("Expecting OID SPC_PE_IMAGE_DATA at {:d} but got {}",
+ stream.pos(), oid_to_string(spc_attr_type_str));
+ return make_error_code(lief_errors::read_error);
}
- // Save off raw now so that it covers everything else in the ContentInfo
- content_info.raw_ = {this->p_, this->p_ + tag};
- // SpcAttributeTypeAndOptionalValue
- // |_ SPC_PE_IMAGE_DATAOBJ
- // |_ SpcPeImageData
- // ++++++++++++++++++++++++++++++++
- VLOG(VDEBUG) << "Parsing SpcAttributeTypeAndOptionalValue (offset: "
- << std::dec << this->current_offset()
- << ")";
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
- }
+ tag = stream.asn1_read_tag(/* SpcPeImageData ::= SEQUENCE */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- content_type_oid.tag = *this->p_;
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
- throw corrupted("Signature corrupted");
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
+ return tag.error();
}
- content_type_oid.p = this->p_;
- std::memset(oid_str, 0, sizeof(oid_str));
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
- VLOG(VDEBUG) << "SpcAttributeTypeAndOptionalValue->type " << oid_str;
- content_info.type_ = oid_str;
- this->p_ += content_type_oid.len;
+ /* SpcPeImageData */ {
+ const size_t length = tag.value();
+ std::vector<uint8_t> raw = {stream.p(), stream.p() + length};
+ VectorStream spc_data_stream{std::move(raw)};
+ stream.increment_pos(spc_data_stream.size());
- // SpcPeImageData
- // |_ SpcPeImageFlags
- // |_ SpcLink
- // ++++++++++++++
- VLOG(VDEBUG) << "Parsing SpcPeImageData (offset: "
- << std::dec << this->current_offset()
- << ")";
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
+ auto spc_data = this->parse_spc_pe_image_data(spc_data_stream);
+ if (not spc_data) {
+ LIEF_INFO("Can't parse SpcPeImageData");
+ } else {
+ const SpcPeImageData& spc_data_value = spc_data.value();
+ content_info.file_ = spc_data_value.file;
+ content_info.flags_ = spc_data_value.flags;
+ }
}
- // SpcPeImageFlags
- // ^^^^^^^^^^^^^^^
- VLOG(VDEBUG) << "Parsing SpcPeImageFlags (offset: "
- << std::dec << this->current_offset()
- << ")";
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag, MBEDTLS_ASN1_BIT_STRING)) != 0) {
- throw corrupted("Signature corrupted");
- }
- this->p_ += tag; // skip
+ // ================================================
+ // DigestInfo ::= SEQUENCE
+ // ================================================
+ tag = stream.asn1_read_tag(/* DigestInfo */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- // SpcLink
- // ^^^^^^^
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signature corrupted");
+ if (not tag) {
+ LIEF_INFO("Wrong tag 0x{:x} for DigestInfo ::= SEQUENCE (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
+ return tag.error();
}
- this->p_ += tag; // skip
- // DigestInfo
- // ++++++++++
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- throw corrupted("Signature corrupted");
+ auto alg_identifier = stream.asn1_read_alg();
+ if (not alg_identifier) {
+ LIEF_INFO("Can't parse SignedData.contentInfo.messageDigest.digestAlgorithm (pos: {:d})",
+ stream.pos());
+ return alg_identifier.error();
}
- if ((ret = mbedtls_asn1_get_alg_null(&(this->p_), this->end_, &alg_oid)) != 0) {
- throw corrupted("Signature corrupted");
+ LIEF_DEBUG("spc-indirect-data-content.digest-algorithm {}", oid_to_string(alg_identifier.value()));
+ ALGORITHMS algo = algo_from_oid(alg_identifier.value());
+ if (algo == ALGORITHMS::UNKNOWN) {
+ LIEF_WARN("LIEF does not handle {}", alg_identifier.value());
+ } else {
+ content_info.digest_algorithm_ = algo;
}
- std::memset(oid_str, 0, sizeof(oid_str));
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
- VLOG(VDEBUG) << "DigestInfo->digestAlgorithm: " << oid_str;
-
- content_info.digest_algorithm_ = oid_str;
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag, MBEDTLS_ASN1_OCTET_STRING)) != 0) {
- throw corrupted("Signature corrupted");
+ // From the documentation:
+ // The value must match the digestAlgorithm value specified
+ // in SignerInfo and the parent PKCS #7 digestAlgorithms fields.
+ auto digest = stream.asn1_read_octet_string();
+ if (not digest) {
+ LIEF_INFO("Can't parse SignedData.contentInfo.messageDigest.digest (pos: {:d})",
+ stream.pos());
+ return digest.error();
}
- content_info.digest_ = {this->p_, this->p_ + tag};
-
- //TODO: Read hash
- this->p_ += tag;
-
+ content_info.digest_ = std::move(digest.value());
+ LIEF_DEBUG("spc-indirect-data-content.digest: {}", hex_dump(content_info.digest_));
return content_info;
}
+result<SignatureParser::x509_certificates_t> SignatureParser::parse_certificates(VectorStream& stream) {
+ x509_certificates_t certificates;
+ const uint64_t cert_end_p = stream.size();
+ while (stream.pos() < cert_end_p) {
+ auto cert = stream.asn1_read_cert();
+ if (not cert) {
+ LIEF_INFO("Can't parse X509 cert pkcs7-signed-data.certificates (pos: {:d})",
+ stream.pos());
+ return cert.error();
+ //break;
+ }
+ std::unique_ptr<mbedtls_x509_crt> cert_p = std::move(cert.value());
-std::string SignatureParser::get_content_info_type(void) {
- VLOG(VDEBUG) << "Parse signed data - content info - content type";
-
- mbedtls_asn1_buf content_type_oid;
- int ret = 0;
- char oid_str[256] = { 0 };
-
- content_type_oid.tag = *this->p_;
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
- throw corrupted("Signature corrupted");
- }
-
- content_type_oid.p = this->p_;
-
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
-
- if (MBEDTLS_OID_CMP(MBEDTLS_SPC_INDIRECT_DATA_OBJID, &content_type_oid) != 0) {
- throw corrupted(std::string(oid_str) + " is not SPC_INDIRECT_DATA_OBJID");
+ if /* constexpr */(lief_logging_debug) {
+ char buffer[1024];
+ std::memset(buffer, 0, sizeof(buffer));
+ mbedtls_x509_crt_info(buffer, sizeof(buffer), "", cert_p.get());
+ LIEF_DEBUG("\n{}\n", buffer);
+ }
+ certificates.emplace_back(cert_p.release());
}
- VLOG(VDEBUG) << "contentType: " << oid_str << " (" << oid_to_string(oid_str) << ")";
- this->p_ += content_type_oid.len;
-
- return {oid_str};
+ return certificates;
}
-void SignatureParser::parse_certificates(void) {
- VLOG(VDEBUG) << "Parsing Certificates (offset: "
- << std::dec << this->current_offset()
- << ")";
-
- int ret = 0;
- size_t tag;
- char buffer[1024];
+result<SignatureParser::signer_infos_t> SignatureParser::parse_signer_infos(VectorStream& stream) {
+ const uintptr_t end_set = stream.size();
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signature corrupted");
- }
+ signer_infos_t infos;
- uint8_t* cert_end = this->p_ + tag;
- while (this->p_ < cert_end) {
- std::memset(buffer, 0, sizeof(buffer));
+ while (stream.pos() < end_set) {
+ SignerInfo signer;
+ const size_t current_p = stream.pos();
- std::unique_ptr<mbedtls_x509_crt> ca{new mbedtls_x509_crt{}};
- mbedtls_x509_crt_init(ca.get());
- mbedtls_x509_crt_parse_der(ca.get(), this->p_, this->end_ - this->p_);
- if (ca->raw.len <= 0) {
+ auto tag = stream.asn1_read_tag(/* SignerInfo */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} for pkcs7-signed-data.signer-infos SEQUENCE (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
break;
}
- mbedtls_x509_crt_info(buffer, sizeof(buffer), "", ca.get());
- VLOG(VDEBUG) << std::endl << buffer << std::endl;
-
- this->signature_.certificates_.emplace_back(ca.get());
- this->p_ += ca->raw.len;
- ca.release();
- }
-
- // If one of the certificates failed to parse for some reason, skip past
- // the certificate section so that we have a chance of parsing the rest
- // of the signature.
- if (this->p_ < cert_end) {
- this->p_ = cert_end;
- }
-}
+ // =======================================================
+ // version Version
+ // =======================================================
+ auto version = stream.asn1_read_int();
+ if (not version) {
+ LIEF_INFO("Can't parse pkcs7-signed-data.signer-info.version (pos: {:d})", stream.pos());
+ break;
+ }
-AuthenticatedAttributes SignatureParser::get_authenticated_attributes(void) {
- VLOG(VDEBUG) << "Parsing authenticatedAttributes (offset: "
- << std::dec << this->current_offset()
- << ")";
+ int32_t version_val = version.value();
+ LIEF_DEBUG("pkcs7-signed-data.signer-info.version: {}", version_val);
+ if (version_val != 1) {
+ LIEF_DEBUG("pkcs7-signed-data.signer-info.version: Bad version ({:d})", version_val);
+ break;
+ }
+ signer.version_ = version_val;
+
+ // =======================================================
+ // IssuerAndSerialNumber ::= SEQUENCE {
+ // issuer Name,
+ // serialNumber CertificateSerialNumber
+ // }
+ //
+ // For Name see: https://github.com/ARMmbed/mbedtls/blob/9e4d4387f07326fff227a40f76c25e5181b1b1e2/library/x509_crt.c#L1180
+ // =======================================================
+ tag = stream.asn1_read_tag(/* Name */
+ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag: 0x{:x} for \
+ pkcs7-signed-data.signer-infos.issuer-and-serial-number.issuer (pos: {:d})",
+ stream_get_tag(stream), stream.pos());
+ break;
+ }
+ auto issuer = stream.x509_read_names();
+ if (not issuer) {
+ LIEF_INFO("Can't parse pkcs7-signed-data.signer-infos.issuer-and-serial-number.issuer (pos: {:d})",
+ stream.pos());
+ break;
+ }
- int ret = 0;
- size_t tag;
- char oid_str[256] = { 0 };
- mbedtls_asn1_buf content_type_oid;
+ LIEF_DEBUG("pkcs7-signed-data.signer-infos.issuer-and-serial-number.issuer: {} (pos: {:d})",
+ issuer.value(), stream.pos());
+ signer.issuer_ = std::move(issuer.value());
- AuthenticatedAttributes authenticated_attributes;
+ auto sn = stream.x509_read_serial();
+ if (not sn) {
+ LIEF_INFO("Can't parse pkcs7-signed-data.signer-infos.issuer-and-serial-number.serial-number (pos: {:d})",
+ stream.pos());
+ break;
+ }
- uint8_t *p_start = this->p_;
+ LIEF_DEBUG("pkcs7-signed-data.signer-infos.issuer-and-serial-number.serial-number {}",
+ hex_dump(sn.value()));
+ signer.serialno_ = std::move(sn.value());
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Authenticated attributes corrupted");
- }
+ // =======================================================
+ // Digest Encryption Algorithm
+ // =======================================================
+ {
+ auto digest_alg = stream.asn1_read_alg();
- authenticated_attributes.raw_ = {p_start, p_start + (this->p_ - p_start) + tag};
+ if (not digest_alg) {
+ LIEF_INFO("Can't parse pkcs7-signed-data.signer-infos.digest-algorithm (pos: {:d})", stream.pos());
+ break;
+ }
+ LIEF_DEBUG("pkcs7-signed-data.signer-infos.digest-algorithm: {}", oid_to_string(digest_alg.value()));
- uint8_t* p_end = this->p_ + tag;
- while(this->p_ < p_end) {
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Authenticated attributes corrupted");
+ ALGORITHMS dg_algo = algo_from_oid(digest_alg.value());
+ if (dg_algo == ALGORITHMS::UNKNOWN) {
+ LIEF_WARN("LIEF does not handle algorithm {}", digest_alg.value());
+ } else {
+ signer.digest_algorithm_ = dg_algo;
+ }
}
- content_type_oid.tag = *this->p_;
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
- throw corrupted("Authenticated attributes corrupted");
+ // =======================================================
+ // Authenticated Attributes
+ // =======================================================
+ {
+ const uint64_t auth_attr_start = stream.pos();
+ tag = stream.asn1_read_tag(/* authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL */
+ MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED);
+ if (tag) {
+ const uint64_t auth_attr_end = stream.pos() + tag.value();
+ std::vector<uint8_t> raw_authenticated_attributes =
+ {stream.p(), stream.p() + tag.value()};
+ VectorStream auth_stream(std::move(raw_authenticated_attributes));
+ stream.increment_pos(auth_stream.size());
+ auto authenticated_attributes = this->parse_attributes(auth_stream);
+ if (not authenticated_attributes) {
+ LIEF_INFO("Fail to parse pkcs7-signed-data.signer-infos.authenticated-attributes");
+ } else {
+ signer.raw_auth_data_ = {stream.start() + auth_attr_start, stream.start() + auth_attr_end};
+ signer.authenticated_attributes_ = std::move(authenticated_attributes.value());
+ }
+ }
}
- content_type_oid.p = this->p_;
-
- std::memset(oid_str, 0, sizeof(oid_str));
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
- this->p_ += content_type_oid.len;
+ // =======================================================
+ // Digest Encryption Algorithm
+ // =======================================================
+ {
+ auto digest_enc_alg = stream.asn1_read_alg();
+ if (not digest_enc_alg) {
+ LIEF_INFO("Can't parse pkcs7-signed-data.signer-infos.digest-encryption-algorithm (pos: {:d})",
+ stream.pos());
+ return digest_enc_alg.error();
+ }
+ LIEF_DEBUG("pkcs7-signed-data.signer-infos.digest-encryption-algorithm: {}",
+ oid_to_string(digest_enc_alg.value()));
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Authenticated attributes corrupted");
+ ALGORITHMS dg_enc_algo = algo_from_oid(digest_enc_alg.value());
+ if (dg_enc_algo == ALGORITHMS::UNKNOWN) {
+ LIEF_WARN("LIEF does not handle algorithm {}", digest_enc_alg.value());
+ } else {
+ signer.digest_enc_algorithm_ = dg_enc_algo;
+ }
}
- if (std::string(oid_str) == "1.2.840.113549.1.9.3") {
- // contentType
- // |_ OID (PKCS #9 Message Digest)
- // |_ SET -> OID
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- VLOG(VDEBUG) << "Parsing contentType (offset: "
- << std::dec << this->current_offset()
- << ")";
- content_type_oid.tag = *this->p_;
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
- throw corrupted("Authenticated attributes corrupted");
- }
- content_type_oid.p = this->p_;
-
- std::memset(oid_str, 0, sizeof(oid_str));
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
- authenticated_attributes.content_type_ = oid_str;
- this->p_ += content_type_oid.len;
- continue;
-
- } else if (std::string(oid_str) == "1.2.840.113549.1.9.4") {
- // messageDigest (Octet string)
- // |_ OID (PKCS #9 Message Digest)
- // |_ SET -> OCTET STING
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- VLOG(VDEBUG) << "Parsing messageDigest (offset: "
- << std::dec << this->current_offset()
- << ")";
- VLOG(VDEBUG) << oid_str << " (" << oid_to_string(oid_str) << ")"; // 1.2.840.113549.1.9.4
-
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag, MBEDTLS_ASN1_OCTET_STRING)) != 0) {
- throw corrupted("Signature corrupted: Can't read 'ASN1_OCTET_STRING'");
- }
- authenticated_attributes.message_digest_ = {this->p_, this->p_ + tag};
- this->p_ += tag;
- continue;
-
- } else if (std::string(oid_str) == "1.3.6.1.4.1.311.2.1.12") {
- // SpcSpOpusInfo
- // |_ programName (utf16)
- // |_ moreInfo
- // ~~~~~~~~~~~~~~~~~~~~~~
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Authenticated attributes corrupted");
+ // =======================================================
+ // Encrypted Digest
+ // =======================================================
+ {
+ auto enc_digest = stream.asn1_read_octet_string();
+ if (not enc_digest) {
+ LIEF_INFO("Can't parse pkcs7-signed-data.signer-infos.encrypted-digest (pos: {:d})",
+ stream.pos());
+ return enc_digest.error();
}
+ LIEF_DEBUG("pkcs7-signed-data.signer-infos.encrypted-digest: {}", hex_dump(enc_digest.value()).substr(0, 10));
+ signer.encrypted_digest_ = enc_digest.value();
+ }
- if (tag == 0) {
- VLOG(VDEBUG) << "No program name or more info specified ";
- authenticated_attributes.program_name_ = u"";
- authenticated_attributes.more_info_ = "";
- continue;
+ // =======================================================
+ // Unauthenticated Attributes
+ // =======================================================
+ {
+ tag = stream.asn1_read_tag(/* unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL */
+ MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1);
+ if (tag) {
+ std::vector<uint8_t> raw_unauthenticated_attributes =
+ {stream.p(), stream.p() + tag.value()};
+ VectorStream unauth_stream(std::move(raw_unauthenticated_attributes));
+ stream.increment_pos(unauth_stream.size());
+ auto unauthenticated_attributes = this->parse_attributes(unauth_stream);
+ if (not unauthenticated_attributes) {
+ LIEF_INFO("Fail to parse pkcs7-signed-data.signer-infos.unauthenticated-attributes");
+ } else {
+ signer.unauthenticated_attributes_ = std::move(unauthenticated_attributes.value());
+ }
}
+ }
+ infos.push_back(std::move(signer));
- uint8_t *seq_end = this->p_ + tag;
-
- if (*this->p_ == (MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) {
- this->p_ += 1;
- if ((ret = mbedtls_asn1_get_len(&(this->p_), this->end_, &tag)) != 0) {
- VLOG(VDEBUG) << "Unexpected format for SpcSpOpusInfo [0] block ";
- throw corrupted("Authenticated attributes corrupted");
- }
+ if (stream.pos() <= current_p) {
+ break;
+ }
+ }
+ return infos;
+}
- // Two cases to handle here:
- // SpcString ::= CHOICE {
- // unicode [0] IMPLICIT BMPSTRING,
- // ascii [1] IMPLICIT IA5STRING
- // }
-
- if (*this->p_ == (MBEDTLS_ASN1_CONTEXT_SPECIFIC) ||
- *this->p_ == (MBEDTLS_ASN1_CONTEXT_SPECIFIC | 1)) {
- this->p_ += 1;
- if ((ret = mbedtls_asn1_get_len(&(this->p_), this->end_, &tag)) != 0) {
- VLOG(VDEBUG) << "Unexpected format for SpcString block ";
- throw corrupted("Authenticated attributes corrupted");
- }
-
- VLOG(VDEBUG) << "Offset: " << std::dec << this->current_offset();
- VLOG(VDEBUG) << "Size: " << std::dec << tag;
-
- // u8 -> u16 due to endiness
- std::string u8progname{reinterpret_cast<char*>(this->p_), tag};
- std::u16string progname;
- try {
- utf8::unchecked::utf8to16(std::begin(u8progname), std::end(u8progname), std::back_inserter(progname));
- } catch (const utf8::exception&) {
- LOG(WARNING) << "utf8 error when parsing progname";
- }
-
- authenticated_attributes.program_name_ = progname;
- VLOG(VDEBUG) << "ProgName " << u16tou8(progname);
- this->p_ += tag;
- } else {
- VLOG(VDEBUG) << "Unexpected format for SpcString block ";
- throw corrupted("Authenticated attributes corrupted");
- }
-
- if (this->p_ >= seq_end) {
- VLOG(VDEBUG) << "No more info specified ";
- authenticated_attributes.more_info_ = "";
- continue;
- }
+result<SignatureParser::attributes_t> SignatureParser::parse_attributes(VectorStream& stream) {
+ // Attributes ::= SET OF Attribute
+ //
+ // Attribute ::= SEQUENCE
+ // {
+ // type EncodedObjectID,
+ // values AttributeSetValue
+ // }
+ attributes_t attributes;
+ const uint64_t end_pos = stream.size();
+ while (stream.pos() < end_pos) {
+ auto tag = stream.asn1_read_tag(/* Attribute ::= SEQUENCE */
+ MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED);
+ if (not tag) {
+ LIEF_INFO("Can't parse attribute (pos: {:d})", stream.pos());
+ break;
+ }
- } else {
- VLOG(VDEBUG) << "No program name specified ";
- authenticated_attributes.program_name_ = u"";
+ auto oid = stream.asn1_read_oid();
+ if (not oid) {
+ LIEF_INFO("Can't parse attribute.type (pos: {:d})", stream.pos());
+ break;
+ }
+ tag = stream.asn1_read_tag(/* AttributeSetValue */
+ MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED);
+ if (not tag) {
+ LIEF_DEBUG("attribute.values: Unable to get set for {}", oid.value());
+ break;
+ }
+ const size_t value_set_size = tag.value();
+ LIEF_DEBUG("attribute.values: {} ({:d} bytes)", oid_to_string(oid.value()), value_set_size);
+
+ std::vector<uint8_t> raw = {stream.p(), stream.p() + value_set_size};
+ VectorStream value_stream(std::move(raw));
+
+ while (value_stream.pos() < value_stream.size()) {
+ const uint64_t current_p = value_stream.pos();
+ const std::string& oid_str = oid.value();
+
+ if (oid_str == /* contentType */ "1.2.840.113549.1.9.3") {
+ auto res = this->parse_content_type(value_stream);
+ if (not res or res.value() == nullptr) {
+ LIEF_INFO("Can't parse content-type attribute");
+ } else {
+ attributes.push_back(std::move(res.value()));
+ }
}
- // moreInfo
- // ++++++++
- if (*this->p_ == (MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_BOOLEAN)) {
- this->p_ += 1;
- if ((ret = mbedtls_asn1_get_len(&(this->p_), this->end_, &tag)) != 0) {
- VLOG(VDEBUG) << "Unexpected format for SpcSpOpusInfo [1] block ";
- throw corrupted("Authenticated attributes corrupted");
- }
-
- uint8_t p_val = *this->p_;
-
- this->p_ += 1;
- if ((ret = mbedtls_asn1_get_len(&(this->p_), this->end_, &tag)) != 0) {
- VLOG(VDEBUG) << "Unexpected format for SpcLink block ";
- throw corrupted("Authenticated attributes corrupted");
+ else if (oid_str == /* SpcSpOpusInfo */ "1.3.6.1.4.1.311.2.1.12") {
+ auto res = this->parse_spc_sp_opus_info(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse spc-sp-opus-info attribute");
+ } else {
+ SpcSpOpusInfo info = std::move(res.value());
+ attributes.emplace_back(new PE::SpcSpOpusInfo{std::move(info.program_name), std::move(info.more_info)});
+ }
+ }
+ // TODO(romain): Parse the internal DER of Ms-CounterSign
+ // else if (oid_str == /* Ms-CounterSign */ "1.3.6.1.4.1.311.3.3.1") {
+ // auto res = this->parse_ms_counter_sign(value_stream);
+ // if (not res) {
+ // LIEF_INFO("Can't parse ms-counter-sign attribute");
+ // }
+ // }
+
+ else if (oid_str == /* pkcs9-CounterSignature */ "1.2.840.113549.1.9.6") {
+ auto res = this->parse_pkcs9_counter_sign(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse pkcs9-counter-sign attribute");
+ } else {
+ const std::vector<SignerInfo>& signers = res.value();
+ if (signers.size() == 0) {
+ LIEF_INFO("Can't parse signer info associated with the pkcs9-counter-sign");
+ } else if (signers.size() > 1) {
+ LIEF_INFO("More than one signer info associated with the pkcs9-counter-sign");
+ } else {
+ attributes.emplace_back(new PKCS9CounterSignature(std::move(signers.back())));
}
+ }
+ }
- // Three cases to handle here:
- // SpcLink ::= CHOICE {
- // url [0] IMPLICIT IA5STRING,
- // moniker [1] IMPLICIT SpcSerializedObject,
- // file [2] EXPLICIT SpcString
- // }
+ else if (oid_str == /* Ms-SpcNestedSignature */ "1.3.6.1.4.1.311.2.4.1") {
+ auto res = this->parse_ms_spc_nested_signature(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse ms-spc-nested-signature attribute");
+ } else {
+ attributes.emplace_back(new MsSpcNestedSignature(std::move(res.value())));
+ }
+ }
- if (p_val == (MBEDTLS_ASN1_CONTEXT_SPECIFIC)) {
+ else if (oid_str == /* pkcs9-MessageDigest */ "1.2.840.113549.1.9.4") {
+ auto res = this->parse_pkcs9_message_digest(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse pkcs9-message-digest attribute");
+ } else {
+ attributes.emplace_back(new PKCS9MessageDigest(std::move(res.value())));
+ }
+ }
- std::string more_info{reinterpret_cast<char*>(this->p_), tag}; // moreInfo
- authenticated_attributes.more_info_ = more_info;
- VLOG(VDEBUG) << more_info;
- this->p_ += tag;
+ else if (oid_str == /* Ms-SpcStatementType */ "1.3.6.1.4.1.311.2.1.11") {
+ auto res = this->parse_ms_spc_statement_type(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse ms-spc-statement-type attribute");
+ } else {
+ attributes.emplace_back(new MsSpcStatementType(std::move(res.value())));
+ }
+ }
- } else if (p_val == (MBEDTLS_ASN1_CONTEXT_SPECIFIC | 1)) {
- VLOG(VDEBUG) << "Parsing MoreInfo 'moniker' option not currently supported ";
- authenticated_attributes.more_info_ = "";
+ else if (oid_str == /* pkcs9-at-SequenceNumber */ "1.2.840.113549.1.9.25.4") {
+ auto res = this->parse_pkcs9_at_sequence_number(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse ms-spc-statement-type attribute");
+ } else {
+ attributes.emplace_back(new PKCS9AtSequenceNumber(res.value()));
+ }
+ }
- } else if (p_val == (MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2)) {
- VLOG(VDEBUG) << "Parsing MoreInfo 'file' option not currently supported ";
- authenticated_attributes.more_info_ = "";
+ else if (oid_str == /* pkcs9-signing-time */ "1.2.840.113549.1.9.5") {
+ auto res = this->parse_pkcs9_signing_time(value_stream);
+ if (not res) {
+ LIEF_INFO("Can't parse ms-spc-statement-type attribute");
+ } else {
+ attributes.emplace_back(new PKCS9SigningTime(std::move(res.value())));
+ }
+ }
- } else {
- VLOG(VDEBUG) << "Unexpected format for SpcLink block ";
- throw corrupted("Authenticated attributes corrupted");
- }
- continue;
+ else {
+ LIEF_INFO("Unknown OID: {}", oid_str);
+ attributes.emplace_back(new GenericType{oid_str, value_stream.content()});
+ break;
}
- } else {
- VLOG(VDEBUG) << "Skipping OID " << oid_str;
- this->p_ += tag;
- continue;
+ if (current_p >= value_stream.pos()) {
+ LIEF_INFO("End-loop detected!");
+ break;
+ }
}
+ stream.increment_pos(value_set_size);
}
-
- return authenticated_attributes;
+ return attributes;
}
-
-SignerInfo SignatureParser::get_signer_info(void) {
- int ret = 0;
- size_t tag;
- char oid_str[256] = { 0 };
- mbedtls_asn1_buf alg_oid;
-
- SignerInfo signer_info;
- int32_t version;
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signer info corrupted");
+result<std::unique_ptr<Attribute>> SignatureParser::parse_content_type(VectorStream& stream) {
+ /*
+ *
+ * ContentType ::= OBJECT IDENTIFIER
+ * Content type as defined in https://tools.ietf.org/html/rfc2315#section-6.8
+ */
+
+ auto oid = stream.asn1_read_oid();
+ if (not oid) {
+ LIEF_INFO("Can't parse content-type.oid (pos: {:d})", stream.pos());
+ return oid.error();
}
+ const std::string& oid_str = oid.value();
+ LIEF_DEBUG("content-type.oid: {}", oid_to_string(oid_str));
+ LIEF_DEBUG("content-type remaining bytes: {}", stream.size() - stream.pos());
+ return std::unique_ptr<Attribute>{new ContentType{oid_str}};
+}
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signer info corrupted");
+result<SignatureParser::SpcSpOpusInfo> SignatureParser::parse_spc_sp_opus_info(VectorStream& stream) {
+ // SpcSpOpusInfo ::= SEQUENCE {
+ // programName [0] EXPLICIT SpcString OPTIONAL,
+ // moreInfo [1] EXPLICIT SpcLink OPTIONAL
+ // }
+ LIEF_DEBUG("Parse spc-sp-opus-info");
+ SpcSpOpusInfo info;
+ auto tag = stream.asn1_read_tag(/* SpcSpOpusInfo ::= SEQUENCE */
+ MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED);
+ if (not tag) {
+ LIEF_INFO("Wrong tag for spc-sp-opus-info SEQUENCE : 0x{:x} (pos: {:d})",
+ stream_get_tag(stream), this->stream_->pos());
+ return tag.error();
}
- if ((ret = mbedtls_asn1_get_int(&(this->p_), this->end_, &version)) != 0) {
- throw corrupted("Signer info corrupted");
+ tag = stream.asn1_read_tag(/* programName [0] EXPLICIT SpcString OPTIONAL */
+ MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED);
+ if (tag) {
+ std::vector<uint8_t> raw = {stream.p(), stream.p() + tag.value()};
+ VectorStream spc_string_stream(std::move(raw));
+ auto program_name = this->parse_spc_string(spc_string_stream);
+ if (not program_name) {
+ LIEF_INFO("Fail to parse spc-sp-opus-info.program-name");
+ } else {
+ info.program_name = program_name.value();
+ }
+ stream.increment_pos(spc_string_stream.size());
}
+ tag = stream.asn1_read_tag(/* moreInfo [1] EXPLICIT SpcLink OPTIONAL */
+ MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1);
+ if (tag) {
+ std::vector<uint8_t> raw = {stream.p(), stream.p() + tag.value()};
+ VectorStream spc_link_stream(std::move(raw));
+ auto more_info = this->parse_spc_link(spc_link_stream);
+ if (not more_info) {
+ LIEF_INFO("Fail to parse spc-sp-opus-info.more-info");
+ } else {
+ info.more_info = more_info.value();
+ }
+ stream.increment_pos(spc_link_stream.size());
+ }
+ return info;
+}
- VLOG(VDEBUG) << "Version: " << std::dec << version;
- LOG_IF(version != 1, WARNING) << "SignerInfo's version should be equal to 1 (" << std::dec << version << ")";
- signer_info.version_ = version;
-
- // issuerAndSerialNumber
- // ---------------------
- VLOG(VDEBUG) << "Parsing issuerAndSerialNumber (offset: "
- << std::dec << this->current_offset()
- << ")";
+result<void> SignatureParser::parse_ms_counter_sign(VectorStream& stream) {
+ LIEF_DEBUG("Parsing Ms-CounterSign ({} bytes)", stream.size());
+ LIEF_DEBUG("TODO: Ms-CounterSign");
+ stream.increment_pos(stream.size());
+ return {};
+}
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signer info corrupted");
+result<SignatureParser::signer_infos_t> SignatureParser::parse_pkcs9_counter_sign(VectorStream& stream) {
+ //
+ // counterSignature ATTRIBUTE ::= {
+ // WITH SYNTAX SignerInfo
+ // ID pkcs-9-at-counterSignature
+ // }
+ LIEF_DEBUG("Parsing pkcs9-CounterSign ({} bytes)", stream.size());
+ auto counter_sig = this->parse_signer_infos(stream);
+ if (not counter_sig) {
+ LIEF_INFO("Fail to parse pkcs9-counter-signature");
+ return counter_sig.error();
}
+ LIEF_DEBUG("pkcs9-counter-signature remaining bytes: {}", stream.size() - stream.pos());
+ return counter_sig.value();
+}
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag,
- MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
- throw corrupted("Signer info corrupted");
+result<Signature> SignatureParser::parse_ms_spc_nested_signature(VectorStream& stream) {
+ // SET of pkcs7-signed data
+ LIEF_DEBUG("Parsing Ms-SpcNestedSignature ({} bytes)", stream.size());
+ auto sign = SignatureParser::parse(stream.content(), /* skip header */ false);
+ if (not sign) {
+ LIEF_INFO("Ms-SpcNestedSignature finished with errors");
+ return sign.error();
}
+ LIEF_DEBUG("ms-spc-nested-signature remaining bytes: {}", stream.size() - stream.pos());
+ return sign.value();
+}
- // Name
- // ~~~~
- mbedtls_x509_name name;
- char buffer[1024];
-
- uint8_t* p_end = this->p_ + tag;
-
- std::memset(&name, 0, sizeof(name));
- if ((ret = mbedtls_x509_get_name(&(this->p_), p_end, &name)) != 0) {
- throw corrupted("Signer info corrupted");
+result<std::vector<uint8_t>> SignatureParser::parse_pkcs9_message_digest(VectorStream& stream) {
+ auto digest = stream.asn1_read_octet_string();
+ if (not digest) {
+ LIEF_INFO("Can't process OCTET STREAM for attribute.pkcs9-message-digest (pos: {})",
+ stream.pos());
+ return digest.error();
}
+ const std::vector<uint8_t>& raw_digest = digest.value();
+ LIEF_DEBUG("attribute.pkcs9-message-digest {}", hex_dump(raw_digest));
+ LIEF_DEBUG("pkcs9-message-digest remaining bytes: {}", stream.size() - stream.pos());
+ return raw_digest;
+}
- mbedtls_x509_dn_gets(buffer, sizeof(buffer), &name);
-
- std::string issuer_name {buffer};
-
- VLOG(VDEBUG) << "Issuer: " << issuer_name;
-
- mbedtls_x509_name *name_cur;
-
- name_cur = name.next;
- while( name_cur != NULL )
- {
- mbedtls_x509_name *name_prv = name_cur;
- name_cur = name_cur->next;
- mbedtls_free( name_prv );
+result<oid_t> SignatureParser::parse_ms_spc_statement_type(VectorStream& stream) {
+ // SpcStatementType ::= SEQUENCE of OBJECT IDENTIFIER
+ LIEF_DEBUG("Parsing Ms-SpcStatementType ({} bytes)", stream.size());
+ auto tag = stream.asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
+ if (not tag) {
+ LIEF_INFO("Wrong tag for ms-spc-statement-type: 0x{:x} (pos: {:d})",
+ stream_get_tag(stream), this->stream_->pos());
+ return tag.error();
}
- // CertificateSerialNumber (issuer SN)
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- mbedtls_x509_buf serial;
- if ((ret = mbedtls_x509_get_serial(&(this->p_), this->end_, &serial)) != 0) {
- throw corrupted("Signer info corrupted");
+ auto oid = stream.asn1_read_oid();
+ if (not oid) {
+ LIEF_INFO("Can't parse ms-spc-statement-type.oid (pos: {:d})", stream.pos());
+ return oid.error();
}
- std::vector<uint8_t> certificate_sn = {serial.p, serial.p + serial.len};
-
- signer_info.issuer_ = {issuer_name, certificate_sn};
+ const oid_t& oid_str = oid.value();
+ LIEF_DEBUG("ms-spc-statement-type.oid: {}", oid_to_string(oid_str));
+ LIEF_DEBUG("ms-spc-statement-type remaining bytes: {}", stream.size() - stream.pos());
+ return oid_str;
+}
- // digestAlgorithm
- // ---------------
- VLOG(VDEBUG) << "Parsing digestAlgorithm (offset: "
- << std::dec << this->current_offset()
- << ")";
- if ((ret = mbedtls_asn1_get_alg_null(&(this->p_), this->end_, &alg_oid)) != 0) {
- throw corrupted("Signer info corrupted");
+result<int32_t> SignatureParser::parse_pkcs9_at_sequence_number(VectorStream& stream) {
+ LIEF_DEBUG("Parsing pkcs9-at-SequenceNumber ({} bytes)", stream.size());
+ auto value = stream.asn1_read_int();
+ if (not value) {
+ LIEF_INFO("pkcs9-at-sequence-number: Can't parse integer");
+ return value.error();
}
+ LIEF_DEBUG("pkcs9-at-sequence-number.int: {}", value.value());
+ LIEF_DEBUG("pkcs9-at-sequence-number remaining bytes: {}", stream.size() - stream.pos());
+ return value.value();
+}
- std::memset(oid_str, 0, sizeof(oid_str));
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
- VLOG(VDEBUG) << "signerInfo->digestAlgorithm " << oid_str;
-
- signer_info.digest_algorithm_ = oid_str;
- // authenticatedAttributes (IMPLICIT OPTIONAL)
- // |_ contentType
- // |_ messageDigest
- // |_ SpcSpOpusInfo
- // -----------------------
+result<std::string> SignatureParser::parse_spc_string(VectorStream& stream) {
+ // SpcString ::= CHOICE {
+ // unicode [0] IMPLICIT BMPSTRING,
+ // ascii [1] IMPLICIT IA5STRING
+ // }
+ LIEF_DEBUG("Parse SpcString ({} bytes)", stream.size());
+ auto choice = stream.asn1_read_tag(MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0);
+ if (choice) {
+ LIEF_DEBUG("SpcString: Unicode choice");
+ const size_t length = choice.value();
+ LIEF_DEBUG("spc-string.program-name length: {} (pos: {})", length, stream.pos());
+
+ if (not stream.can_read<char16_t>(length / sizeof(char16_t))) {
+ LIEF_INFO("Can't read spc-string.program-name");
+ return make_error_code(lief_errors::read_error);
+ }
+ stream.set_endian_swap(true);
+ std::u16string progname = stream.read_u16string(length / sizeof(char16_t));
+ stream.set_endian_swap(false);
- try {
- signer_info.authenticated_attributes_ = this->get_authenticated_attributes();
- }
- catch (const corrupted& c) {
- LOG(ERROR) << c.what();
+ try {
+ return u16tou8(progname);
+ } catch (const utf8::exception&) {
+ LIEF_INFO("Error while converting utf-8 spc-string.program-name to utf16");
+ return make_error_code(lief_errors::conversion_error);
+ }
}
-
- // digestEncryptionAlgorithm
- // -------------------------
- if ((ret = mbedtls_asn1_get_alg_null(&(this->p_), this->end_, &alg_oid)) != 0) {
- throw corrupted("Signer info corrupted");
+ else if ((choice = stream.asn1_read_tag(MBEDTLS_ASN1_CONTEXT_SPECIFIC | 1))) {
+ LIEF_DEBUG("SpcString: ASCII choice");
+ const size_t length = choice.value();
+ const char* str = stream.read_array<char>(length);
+ if (str == nullptr) {
+ LIEF_INFO("Can't read spc-string.program-name");
+ return make_error_code(lief_errors::read_error);
+ }
+ std::string u8progname{str, str + length};
+ LIEF_DEBUG("spc-string.program-name: {}", u8progname);
+ return u8progname;
}
- std::memset(oid_str, 0, sizeof(oid_str));
- mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
- signer_info.signature_algorithm_ = oid_str;
-
- VLOG(VDEBUG) << "digestEncryptionAlgorithm: " << oid_str;
-
- // encryptedDigest
- // ---------------
- if ((ret = mbedtls_asn1_get_tag(&(this->p_), this->end_, &tag, MBEDTLS_ASN1_OCTET_STRING)) != 0) {
- throw corrupted("Signer info corrupted");
+ else {
+ LIEF_INFO("Can't select choice for SpcString (pos: {})", stream.pos());
+ return make_error_code(lief_errors::read_error);
}
- signer_info.encrypted_digest_ = {this->p_, this->p_ + tag};
- this->p_ += tag;
-
- //TODO:
- // unauthenticatedAttributes
- return signer_info;
-
+ return {};
}
-void SignatureParser::parse_signature(void) {
- this->parse_header();
-
- // Version
- // =======
- int32_t version = this->get_signed_data_version();
- this->signature_.version_ = static_cast<uint32_t>(version);
-
- // Algo (digestAlgorithms)
- // =======================
- try {
- this->signature_.digest_algorithm_ = this->get_signed_data_digest_algorithms();
+result<std::string> SignatureParser::parse_spc_link(VectorStream& stream) {
+ // SpcLink ::= CHOICE {
+ // url [0] IMPLICIT IA5STRING,
+ // moniker [1] IMPLICIT SpcSerializedObject,
+ // file [2] EXPLICIT SpcString
+ // }
+ LIEF_DEBUG("Parse SpcLink ({} bytes)", stream.size());
+ auto choice = stream.asn1_read_tag(/* url */ MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0);
+ if (choice) {
+ const size_t length = choice.value();
+ const char* str = stream.read_array<char>(length);
+ if (str == nullptr) {
+ LIEF_INFO("Can't read spc-link.url");
+ return make_error_code(lief_errors::read_error);
+ }
+ std::string url{str, str + length};
+ LIEF_DEBUG("spc-link.url: {}", url);
+ return url;
}
- catch (const corrupted& c) {
- LOG(ERROR) << c.what();
+ else if ((choice = stream.asn1_read_tag(/* moniker */ MBEDTLS_ASN1_CONTEXT_SPECIFIC | 1))) {
+ LIEF_INFO("Parsing spc-link.moniker is not supported");
+ return make_error_code(lief_errors::not_supported);
}
-
- // contentInfo
- // |_ contentType
- // |_ content (SpcIndirectDataContent)
- // ===================================
- try {
- this->signature_.content_info_ = this->parse_content_info();
+ else if ((choice = stream.asn1_read_tag(/* file */ MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2))) {
+ LIEF_INFO("Parsing spc-link.file is not supported");
+ return make_error_code(lief_errors::not_supported);
}
- catch (const corrupted& c) {
- LOG(ERROR) << c.what();
+ else {
+ LIEF_INFO("Corrupted choice for spc-link (choice: 0x{:x})", stream_get_tag(stream));
+ return make_error_code(lief_errors::corrupted);
}
+ return {};
+}
- // Certificates
- // ============
- try {
- this->parse_certificates();
- }
- catch (const corrupted& c) {
- LOG(ERROR) << c.what();
+
+result<SignatureParser::time_t> SignatureParser::parse_pkcs9_signing_time(VectorStream& stream) {
+ // See: https://tools.ietf.org/html/rfc2985#page-20
+ // UTCTIME :171116220536Z
+ auto tm = stream.x509_read_time();
+ if (not tm) {
+ LIEF_INFO("Can't read pkcs9-signing-time (pos: {})", stream.pos());
+ return tm.error();
}
+ std::unique_ptr<mbedtls_x509_time> time = std::move(tm.value());
+ LIEF_DEBUG("pkcs9-signing-time {}/{}/{}", time->day, time->mon, time->year);
+ return SignatureParser::time_t{time->year, time->mon, time->day, time->hour, time->min, time->sec};
+}
- // signerInfo
- // ==========
- try {
- this->signature_.signer_info_ = this->get_signer_info();
- }
- catch (const corrupted& c) {
- LOG(ERROR) << c.what();
- }
- VLOG(VDEBUG) << "Signature: " << std::endl << this->signature_;
+result<SignatureParser::SpcPeImageData> SignatureParser::parse_spc_pe_image_data(VectorStream& stream) {
+ // SpcPeImageData ::= SEQUENCE {
+ // flags SpcPeImageFlags DEFAULT { includeResources },
+ // file SpcLink
+ // }
+ //
+ // SpcPeImageFlags ::= BIT STRING {
+ // includeResources (0),
+ // includeDebugInfo (1),
+ // includeImportAddressTable (2)
+ // }
+ //
+ // SpcLink ::= CHOICE {
+ // url [0] IMPLICIT IA5STRING,
+ // moniker [1] IMPLICIT SpcSerializedObject,
+ // file [2] EXPLICIT SpcString
+ // }
+ //
+ // SpcString ::= CHOICE {
+ // unicode [0] IMPLICIT BMPSTRING,
+ // ascii [1] IMPLICIT IA5STRING
+ // }
+ //LIEF_DEBUG("Parse SpcPeImageData ({} bytes)", stream.size());
+ //auto tag = stream.asn1_read_tag(MBEDTLS_ASN1_BIT_STRING);
+ //if (not tag) {
+ // LIEF_INFO("Wrong tag for spc-pe-image-data.flags \
+ // Expecting BIT-STRING but got 0x{:x} (off: {:d})", stream.peek<uint8_t>(), stream.pos());
+ // return tag.error();
+ //}
+ //LIEF_DEBUG("Length: {}", tag.value());
+ //uint8_t flag = stream.read<uint8_t>();
+ //LIEF_DEBUG("flag: {:b}", flag);
+
+ //tag = stream.asn1_read_tag(MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC);
+ //if (not tag) {
+ // LIEF_INFO("Wrong tag for spc-pe-image-data.flags \
+ // Expecting BIT-STRING but got 0x{:x} (off: {:d})", stream.peek<uint8_t>(), stream.pos());
+ // return tag.error();
+ //}
+ ////LIEF_INFO("spc-pe-image-data.flags length: {:d}", flags.value().size());
+ //auto file = this->parse_spc_link(stream);
+ //if (not file) {
+ // LIEF_INFO("Can't parse spc-pe-image-data.file (pos: {})", stream.pos());
+ // return file.error();
+ //}
+
+ return {};
}
diff --git a/src/PE/signature/SignerInfo.cpp b/src/PE/signature/SignerInfo.cpp
index 00088357..69501302 100644
--- a/src/PE/signature/SignerInfo.cpp
+++ b/src/PE/signature/SignerInfo.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,80 +18,150 @@
#include <numeric>
#include <sstream>
+#include <spdlog/fmt/fmt.h>
+
+#include "LIEF/PE/signature/x509.hpp"
#include "LIEF/PE/signature/OIDToString.hpp"
#include "LIEF/PE/signature/SignerInfo.hpp"
+#include "LIEF/PE/signature/Attribute.hpp"
+
+#include "LIEF/PE/EnumToString.hpp"
namespace LIEF {
namespace PE {
SignerInfo::SignerInfo(void) = default;
-SignerInfo::SignerInfo(const SignerInfo&) = default;
-SignerInfo& SignerInfo::operator=(const SignerInfo&) = default;
SignerInfo::~SignerInfo(void) = default;
-
-uint32_t SignerInfo::version(void) const {
- return this->version_;
+SignerInfo::SignerInfo(SignerInfo&&) = default;
+SignerInfo& SignerInfo::operator=(SignerInfo&&) = default;
+
+SignerInfo::SignerInfo(const SignerInfo& other) :
+ Object::Object(other),
+ version_{other.version_},
+ issuer_{other.issuer_},
+ serialno_{other.serialno_},
+ digest_algorithm_{other.digest_algorithm_},
+ digest_enc_algorithm_{other.digest_enc_algorithm_},
+ encrypted_digest_{other.encrypted_digest_},
+ raw_auth_data_{other.raw_auth_data_}
+{
+ for (const std::unique_ptr<Attribute>& attr : other.authenticated_attributes_) {
+ this->authenticated_attributes_.push_back(attr->clone());
+ }
+
+ for (const std::unique_ptr<Attribute>& attr : other.unauthenticated_attributes_) {
+ this->unauthenticated_attributes_.push_back(attr->clone());
+ }
+
+ if (other.cert_ != nullptr) {
+ this->cert_ = std::unique_ptr<x509>(new x509{*other.cert_});
+ }
}
+SignerInfo& SignerInfo::operator=(SignerInfo other) {
+ this->swap(other);
+ return *this;
+}
-const issuer_t& SignerInfo::issuer(void) const {
- return this->issuer_;
+void SignerInfo::swap(SignerInfo& other) {
+ std::swap(this->version_, other.version_);
+ std::swap(this->issuer_, other.issuer_);
+ std::swap(this->serialno_, other.serialno_);
+ std::swap(this->digest_algorithm_, other.digest_algorithm_);
+ std::swap(this->digest_enc_algorithm_, other.digest_enc_algorithm_);
+ std::swap(this->encrypted_digest_, other.encrypted_digest_);
+ std::swap(this->raw_auth_data_, other.raw_auth_data_);
+ std::swap(this->authenticated_attributes_, other.authenticated_attributes_);
+ std::swap(this->unauthenticated_attributes_, other.unauthenticated_attributes_);
+ std::swap(this->cert_, other.cert_);
}
-const oid_t& SignerInfo::digest_algorithm(void) const {
+uint32_t SignerInfo::version(void) const {
+ return this->version_;
+}
+
+ALGORITHMS SignerInfo::digest_algorithm(void) const {
return this->digest_algorithm_;
}
+ALGORITHMS SignerInfo::encryption_algorithm(void) const {
+ return this->digest_enc_algorithm_;
+}
-const AuthenticatedAttributes& SignerInfo::authenticated_attributes(void) const {
- return this->authenticated_attributes_;
+const SignerInfo::encrypted_digest_t& SignerInfo::encrypted_digest(void) const {
+ return this->encrypted_digest_;
}
+it_const_attributes_t SignerInfo::authenticated_attributes() const {
+ std::vector<Attribute*> attrs(this->authenticated_attributes_.size(), nullptr);
+ for (size_t i = 0; i < this->authenticated_attributes_.size(); ++i) {
+ attrs[i] = this->authenticated_attributes_[i].get();
+ }
+ return attrs;
+}
-const oid_t& SignerInfo::signature_algorithm(void) const {
- return this->signature_algorithm_;
+it_const_attributes_t SignerInfo::unauthenticated_attributes() const {
+ std::vector<Attribute*> attrs(this->unauthenticated_attributes_.size(), nullptr);
+ for (size_t i = 0; i < this->unauthenticated_attributes_.size(); ++i) {
+ attrs[i] = this->unauthenticated_attributes_[i].get();
+ }
+ return attrs;
}
-const std::vector<uint8_t>& SignerInfo::encrypted_digest(void) const {
- return this->encrypted_digest_;
-}
+const Attribute* SignerInfo::get_attribute(PE::SIG_ATTRIBUTE_TYPES type) const {
+ const Attribute* attr = this->get_auth_attribute(type);
+ if (attr != nullptr) {
+ return attr;
+ }
-void SignerInfo::accept(Visitor& visitor) const {
- visitor.visit(*this);
-}
+ attr = this->get_unauth_attribute(type);
+ if (attr != nullptr) {
+ return attr;
+ }
-std::ostream& operator<<(std::ostream& os, const SignerInfo& signer_info) {
+ // ... not found -> return nullptr
+ return nullptr;
+}
- constexpr uint8_t wsize = 30;
- const issuer_t& issuer = signer_info.issuer();
- std::string issuer_str = std::get<0>(issuer);
-
- const std::vector<uint8_t>& sn = std::get<1>(issuer);;
- std::string sn_str = std::accumulate(
- std::begin(sn),
- std::end(sn),
- std::string(""),
- [] (std::string lhs, uint8_t x) {
- std::stringstream ss;
- ss << std::setw(2) << std::setfill('0') << std::hex << static_cast<uint32_t>(x);
- return lhs.empty() ? ss.str() : lhs + ":" + ss.str();
+const Attribute* SignerInfo::get_auth_attribute(PE::SIG_ATTRIBUTE_TYPES type) const {
+ auto it_auth = std::find_if(std::begin(this->authenticated_attributes_), std::end(this->authenticated_attributes_),
+ [type] (const std::unique_ptr<Attribute>& attr) {
+ return attr->type() == type;
});
+ if (it_auth != std::end(this->authenticated_attributes_)) {
+ return it_auth->get();
+ }
+ return nullptr;
+}
+const Attribute* SignerInfo::get_unauth_attribute(PE::SIG_ATTRIBUTE_TYPES type) const {
+ auto it_uauth = std::find_if(std::begin(this->unauthenticated_attributes_), std::end(this->unauthenticated_attributes_),
+ [type] (const std::unique_ptr<Attribute>& attr) {
+ return attr->type() == type;
+ });
+ if (it_uauth != std::end(this->unauthenticated_attributes_)) {
+ return it_uauth->get();
+ }
+ return nullptr;
+}
- os << std::hex << std::left;
- os << std::setw(wsize) << std::setfill(' ') << "Version: " << signer_info.version() << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Serial Number: " << sn_str << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Issuer DN: " << issuer_str << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Digest Algorithm: " << oid_to_string(signer_info.digest_algorithm()) << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Signature algorithm: " << oid_to_string(signer_info.signature_algorithm()) << std::endl;
+void SignerInfo::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
- os << signer_info.authenticated_attributes() << std::endl;
+std::ostream& operator<<(std::ostream& os, const SignerInfo& signer_info) {
+ os << fmt::format("{}/{} - {} - {:d} auth attr - {:d} unauth attr",
+ to_string(signer_info.digest_algorithm()),
+ to_string(signer_info.encryption_algorithm()),
+ signer_info.issuer(),
+ signer_info.authenticated_attributes().size(),
+ signer_info.unauthenticated_attributes().size());
return os;
}
diff --git a/src/PE/signature/attributes/CMakeLists.txt b/src/PE/signature/attributes/CMakeLists.txt
new file mode 100644
index 00000000..b218104f
--- /dev/null
+++ b/src/PE/signature/attributes/CMakeLists.txt
@@ -0,0 +1,42 @@
+set(LIEF_PE_SIGNATURE_ATTRIBUTES_SRC
+ "${CMAKE_CURRENT_LIST_DIR}/GenericType.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/ContentType.cpp"
+
+ "${CMAKE_CURRENT_LIST_DIR}/SpcSpOpusInfo.cpp"
+
+ "${CMAKE_CURRENT_LIST_DIR}/MsCounterSign.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/MsSpcNestedSignature.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/MsSpcStatementType.cpp"
+
+ "${CMAKE_CURRENT_LIST_DIR}/PKCS9AtSequenceNumber.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/PKCS9CounterSignature.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/PKCS9MessageDigest.cpp"
+ "${CMAKE_CURRENT_LIST_DIR}/PKCS9SigningTime.cpp"
+)
+
+set(LIEF_PE_SIGNATURE_ATTRIBUTES_INCLUDES
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/GenericType.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/ContentType.hpp"
+
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/SpcSpOpusInfo.hpp"
+
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/MsCounterSign.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/MsSpcNestedSignature.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/MsSpcStatementType.hpp"
+
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/PKCS9AtSequenceNumber.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/PKCS9CounterSignature.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/PKCS9MessageDigest.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/signature/attributes/PKCS9SigningTime.hpp"
+)
+
+source_group("Header Files\\PE\\signature\\attributes" FILES ${LIEF_PE_SIGNATURE_ATTRIBUTES_SRC})
+source_group("Header Files\\PE\\signature\\attributes" FILES ${LIEF_PE_SIGNATURE_ATTRIBUTES_INCLUDES})
+
+if (LIEF_PE)
+ target_sources(LIB_LIEF PRIVATE
+ ${LIEF_PE_SIGNATURE_ATTRIBUTES_SRC}
+ ${LIEF_PE_SIGNATURE_ATTRIBUTES_INCLUDES}
+ )
+endif()
+
diff --git a/src/PE/signature/attributes/ContentType.cpp b/src/PE/signature/attributes/ContentType.cpp
new file mode 100644
index 00000000..c0ff3dbb
--- /dev/null
+++ b/src/PE/signature/attributes/ContentType.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/ContentType.hpp"
+#include "LIEF/PE/signature/OIDToString.hpp"
+
+namespace LIEF {
+namespace PE {
+
+ContentType::ContentType() :
+ Attribute(SIG_ATTRIBUTE_TYPES::CONTENT_TYPE)
+{}
+
+ContentType::ContentType(const ContentType&) = default;
+ContentType& ContentType::operator=(const ContentType&) = default;
+
+std::unique_ptr<Attribute> ContentType::clone(void) const {
+ return std::unique_ptr<Attribute>(new ContentType{*this});
+}
+
+ContentType::ContentType(oid_t oid) :
+ Attribute(SIG_ATTRIBUTE_TYPES::CONTENT_TYPE),
+ oid_{std::move(oid)}
+{}
+
+void ContentType::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string ContentType::print() const {
+ return this->oid() + " (" + oid_to_string(this->oid()) + ")";
+}
+
+
+ContentType::~ContentType() = default;
+
+
+}
+}
diff --git a/src/PE/signature/attributes/GenericType.cpp b/src/PE/signature/attributes/GenericType.cpp
new file mode 100644
index 00000000..001d5efc
--- /dev/null
+++ b/src/PE/signature/attributes/GenericType.cpp
@@ -0,0 +1,49 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/GenericType.hpp"
+namespace LIEF {
+namespace PE {
+
+GenericType::GenericType() :
+ Attribute(SIG_ATTRIBUTE_TYPES::GENERIC_TYPE)
+{}
+
+GenericType::GenericType(const GenericType&) = default;
+GenericType& GenericType::operator=(const GenericType&) = default;
+
+std::unique_ptr<Attribute> GenericType::clone(void) const {
+ return std::unique_ptr<Attribute>(new GenericType{*this});
+}
+
+GenericType::GenericType(oid_t oid, std::vector<uint8_t> raw) :
+ Attribute(SIG_ATTRIBUTE_TYPES::GENERIC_TYPE),
+ oid_{std::move(oid)},
+ raw_{std::move(raw)}
+{}
+
+void GenericType::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string GenericType::print() const {
+ return this->oid() + " (" + std::to_string(this->raw_content().size()) + " bytes)";
+}
+
+
+GenericType::~GenericType() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/MsCounterSign.cpp b/src/PE/signature/attributes/MsCounterSign.cpp
new file mode 100644
index 00000000..e69de29b
diff --git a/src/PE/signature/attributes/MsSpcNestedSignature.cpp b/src/PE/signature/attributes/MsSpcNestedSignature.cpp
new file mode 100644
index 00000000..d6e42ad8
--- /dev/null
+++ b/src/PE/signature/attributes/MsSpcNestedSignature.cpp
@@ -0,0 +1,55 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include <sstream>
+
+#include "LIEF/PE/signature/attributes/MsSpcNestedSignature.hpp"
+
+namespace LIEF {
+namespace PE {
+
+MsSpcNestedSignature::MsSpcNestedSignature() :
+ Attribute(SIG_ATTRIBUTE_TYPES::MS_SPC_NESTED_SIGN)
+{}
+
+MsSpcNestedSignature::MsSpcNestedSignature(const MsSpcNestedSignature&) = default;
+MsSpcNestedSignature& MsSpcNestedSignature::operator=(const MsSpcNestedSignature&) = default;
+
+MsSpcNestedSignature::MsSpcNestedSignature(Signature sig) :
+ Attribute(SIG_ATTRIBUTE_TYPES::MS_SPC_NESTED_SIGN),
+ sig_{std::move(sig)}
+{}
+
+std::unique_ptr<Attribute> MsSpcNestedSignature::clone(void) const {
+ return std::unique_ptr<Attribute>(new MsSpcNestedSignature{*this});
+}
+
+
+void MsSpcNestedSignature::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string MsSpcNestedSignature::print() const {
+ std::ostringstream oss;
+ oss << "Nested signature:\n";
+ oss << this->sig();
+ return oss.str();
+}
+
+
+MsSpcNestedSignature::~MsSpcNestedSignature() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/MsSpcStatementType.cpp b/src/PE/signature/attributes/MsSpcStatementType.cpp
new file mode 100644
index 00000000..c91e15af
--- /dev/null
+++ b/src/PE/signature/attributes/MsSpcStatementType.cpp
@@ -0,0 +1,49 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/MsSpcStatementType.hpp"
+#include "LIEF/PE/signature/OIDToString.hpp"
+namespace LIEF {
+namespace PE {
+
+MsSpcStatementType::MsSpcStatementType() :
+ Attribute(SIG_ATTRIBUTE_TYPES::MS_SPC_STATEMENT_TYPE)
+{}
+
+MsSpcStatementType::MsSpcStatementType(const MsSpcStatementType&) = default;
+MsSpcStatementType& MsSpcStatementType::operator=(const MsSpcStatementType&) = default;
+
+std::unique_ptr<Attribute> MsSpcStatementType::clone(void) const {
+ return std::unique_ptr<Attribute>(new MsSpcStatementType{*this});
+}
+
+MsSpcStatementType::MsSpcStatementType(oid_t oid) :
+ Attribute(SIG_ATTRIBUTE_TYPES::MS_SPC_STATEMENT_TYPE),
+ oid_{std::move(oid)}
+{}
+
+void MsSpcStatementType::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string MsSpcStatementType::print() const {
+ return this->oid() + " (" + oid_to_string(this->oid()) + ")";
+}
+
+
+MsSpcStatementType::~MsSpcStatementType() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/PKCS9AtSequenceNumber.cpp b/src/PE/signature/attributes/PKCS9AtSequenceNumber.cpp
new file mode 100644
index 00000000..8ab11209
--- /dev/null
+++ b/src/PE/signature/attributes/PKCS9AtSequenceNumber.cpp
@@ -0,0 +1,49 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/PKCS9AtSequenceNumber.hpp"
+
+namespace LIEF {
+namespace PE {
+
+PKCS9AtSequenceNumber::PKCS9AtSequenceNumber() :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_AT_SEQUENCE_NUMBER)
+{}
+
+PKCS9AtSequenceNumber::PKCS9AtSequenceNumber(const PKCS9AtSequenceNumber&) = default;
+PKCS9AtSequenceNumber& PKCS9AtSequenceNumber::operator=(const PKCS9AtSequenceNumber&) = default;
+
+std::unique_ptr<Attribute> PKCS9AtSequenceNumber::clone(void) const {
+ return std::unique_ptr<Attribute>(new PKCS9AtSequenceNumber{*this});
+}
+
+PKCS9AtSequenceNumber::PKCS9AtSequenceNumber(uint32_t num) :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_AT_SEQUENCE_NUMBER),
+ number_{num}
+{}
+
+void PKCS9AtSequenceNumber::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string PKCS9AtSequenceNumber::print() const {
+ return std::to_string(this->number());
+}
+
+
+PKCS9AtSequenceNumber::~PKCS9AtSequenceNumber() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/PKCS9CounterSignature.cpp b/src/PE/signature/attributes/PKCS9CounterSignature.cpp
new file mode 100644
index 00000000..39adae89
--- /dev/null
+++ b/src/PE/signature/attributes/PKCS9CounterSignature.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/PKCS9CounterSignature.hpp"
+#include <sstream>
+namespace LIEF {
+namespace PE {
+
+PKCS9CounterSignature::PKCS9CounterSignature() :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_COUNTER_SIGNATURE)
+{}
+
+PKCS9CounterSignature::PKCS9CounterSignature(const PKCS9CounterSignature&) = default;
+PKCS9CounterSignature& PKCS9CounterSignature::operator=(const PKCS9CounterSignature&) = default;
+
+PKCS9CounterSignature::PKCS9CounterSignature(SignerInfo signer) :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_COUNTER_SIGNATURE),
+ signer_{std::move(signer)}
+{}
+
+std::unique_ptr<Attribute> PKCS9CounterSignature::clone(void) const {
+ return std::unique_ptr<Attribute>(new PKCS9CounterSignature{*this});
+}
+
+void PKCS9CounterSignature::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string PKCS9CounterSignature::print() const {
+ std::ostringstream oss;
+ oss << this->signer() << "\n";
+ return oss.str();
+}
+
+
+PKCS9CounterSignature::~PKCS9CounterSignature() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/PKCS9MessageDigest.cpp b/src/PE/signature/attributes/PKCS9MessageDigest.cpp
new file mode 100644
index 00000000..5575ca73
--- /dev/null
+++ b/src/PE/signature/attributes/PKCS9MessageDigest.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/PKCS9MessageDigest.hpp"
+#include "LIEF/utils.hpp"
+
+namespace LIEF {
+namespace PE {
+
+PKCS9MessageDigest::PKCS9MessageDigest() :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_MESSAGE_DIGEST)
+{}
+
+PKCS9MessageDigest::PKCS9MessageDigest(const PKCS9MessageDigest&) = default;
+PKCS9MessageDigest& PKCS9MessageDigest::operator=(const PKCS9MessageDigest&) = default;
+
+PKCS9MessageDigest::PKCS9MessageDigest(std::vector<uint8_t> digest) :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_MESSAGE_DIGEST),
+ digest_{std::move(digest)}
+{}
+
+std::unique_ptr<Attribute> PKCS9MessageDigest::clone(void) const {
+ return std::unique_ptr<Attribute>(new PKCS9MessageDigest{*this});
+}
+
+
+void PKCS9MessageDigest::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string PKCS9MessageDigest::print() const {
+ return hex_dump(this->digest());
+}
+
+
+PKCS9MessageDigest::~PKCS9MessageDigest() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/PKCS9SigningTime.cpp b/src/PE/signature/attributes/PKCS9SigningTime.cpp
new file mode 100644
index 00000000..7515f532
--- /dev/null
+++ b/src/PE/signature/attributes/PKCS9SigningTime.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include <spdlog/fmt/fmt.h>
+#include "LIEF/PE/signature/attributes/PKCS9SigningTime.hpp"
+namespace LIEF {
+namespace PE {
+
+PKCS9SigningTime::PKCS9SigningTime() :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_SIGNING_TIME)
+{}
+
+PKCS9SigningTime::PKCS9SigningTime(const PKCS9SigningTime&) = default;
+PKCS9SigningTime& PKCS9SigningTime::operator=(const PKCS9SigningTime&) = default;
+
+std::unique_ptr<Attribute> PKCS9SigningTime::clone(void) const {
+ return std::unique_ptr<Attribute>(new PKCS9SigningTime{*this});
+}
+
+PKCS9SigningTime::PKCS9SigningTime(time_t time) :
+ Attribute(SIG_ATTRIBUTE_TYPES::PKCS9_SIGNING_TIME),
+ time_{std::move(time)}
+{}
+
+void PKCS9SigningTime::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string PKCS9SigningTime::print() const {
+ const time_t& time = this->time();
+ return fmt::format("{}/{}/{} - {}:{}:{}",
+ time[0], time[1], time[2], time[3], time[4], time[5]);
+}
+
+
+PKCS9SigningTime::~PKCS9SigningTime() = default;
+
+}
+}
diff --git a/src/PE/signature/attributes/SpcSpOpusInfo.cpp b/src/PE/signature/attributes/SpcSpOpusInfo.cpp
new file mode 100644
index 00000000..e708f22b
--- /dev/null
+++ b/src/PE/signature/attributes/SpcSpOpusInfo.cpp
@@ -0,0 +1,59 @@
+/* Copyright 2021 R. Thomas
+ * Copyright 2021 Quarkslab
+ *
+ * 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.
+ */
+#include "LIEF/PE/signature/attributes/SpcSpOpusInfo.hpp"
+namespace LIEF {
+namespace PE {
+
+SpcSpOpusInfo::SpcSpOpusInfo() :
+ Attribute(SIG_ATTRIBUTE_TYPES::SPC_SP_OPUS_INFO)
+{}
+
+SpcSpOpusInfo::SpcSpOpusInfo(const SpcSpOpusInfo&) = default;
+SpcSpOpusInfo& SpcSpOpusInfo::operator=(const SpcSpOpusInfo&) = default;
+
+std::unique_ptr<Attribute> SpcSpOpusInfo::clone(void) const {
+ return std::unique_ptr<Attribute>(new SpcSpOpusInfo{*this});
+}
+
+SpcSpOpusInfo::SpcSpOpusInfo(std::string program_name, std::string more_info) :
+ Attribute(SIG_ATTRIBUTE_TYPES::SPC_SP_OPUS_INFO),
+ program_name_{std::move(program_name)},
+ more_info_{std::move(more_info)}
+{}
+
+void SpcSpOpusInfo::accept(Visitor& visitor) const {
+ visitor.visit(*this);
+}
+
+std::string SpcSpOpusInfo::print() const {
+ std::string out;
+ if (not this->program_name().empty()) {
+ out = this->program_name();
+ }
+ if (not this->more_info().empty()) {
+ if (not out.empty()) {
+ out += " - ";
+ }
+ out += this->more_info();
+ }
+ return out;
+}
+
+
+SpcSpOpusInfo::~SpcSpOpusInfo() = default;
+
+}
+}
diff --git a/src/PE/signature/pkcs7.h b/src/PE/signature/pkcs7.h
index 8efe94c8..1bc89df7 100644
--- a/src/PE/signature/pkcs7.h
+++ b/src/PE/signature/pkcs7.h
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/src/PE/signature/x509.cpp b/src/PE/signature/x509.cpp
index bf530527..7449e3aa 100644
--- a/src/PE/signature/x509.cpp
+++ b/src/PE/signature/x509.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,22 +17,242 @@
#include <iomanip>
#include <numeric>
#include <sstream>
+#include <map>
+#include <fstream>
#include "mbedtls/x509_crt.h"
#include "mbedtls/asn1.h"
-#include <mbedtls/oid.h>
+#include "mbedtls/oid.h"
+#include "mbedtls/error.h"
+
+#include "logging.hpp"
#include "LIEF/PE/signature/OIDToString.hpp"
#include "LIEF/PE/signature/x509.hpp"
+#include "LIEF/PE/signature/RsaInfo.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+#include "LIEF/utils.hpp"
+
+namespace {
+ // Copy this function from mbedtls sinc it is not exported
+ inline int x509_get_current_time( mbedtls_x509_time *now )
+ {
+ struct tm *lt, tm_buf;
+ mbedtls_time_t tt;
+ int ret = 0;
+
+ tt = mbedtls_time( NULL );
+ lt = mbedtls_platform_gmtime_r( &tt, &tm_buf );
+
+ if( lt == NULL )
+ ret = -1;
+ else
+ {
+ now->year = lt->tm_year + 1900;
+ now->mon = lt->tm_mon + 1;
+ now->day = lt->tm_mday;
+ now->hour = lt->tm_hour;
+ now->min = lt->tm_min;
+ now->sec = lt->tm_sec;
+ }
+
+ return( ret );
+ }
+}
+
namespace LIEF {
namespace PE {
-x509::x509(void) :
- x509_cert_{nullptr}
-{}
+static const std::map<uint32_t, x509::VERIFICATION_FLAGS> MBEDTLS_ERR_TO_LIEF = {
+ { MBEDTLS_X509_BADCERT_EXPIRED, x509::VERIFICATION_FLAGS::BADCERT_EXPIRED},
+ { MBEDTLS_X509_BADCERT_REVOKED, x509::VERIFICATION_FLAGS::BADCERT_REVOKED},
+ { MBEDTLS_X509_BADCERT_CN_MISMATCH, x509::VERIFICATION_FLAGS::BADCERT_CN_MISMATCH},
+ { MBEDTLS_X509_BADCERT_NOT_TRUSTED, x509::VERIFICATION_FLAGS::BADCERT_NOT_TRUSTED},
+ { MBEDTLS_X509_BADCRL_NOT_TRUSTED, x509::VERIFICATION_FLAGS::BADCRL_NOT_TRUSTED},
+ { MBEDTLS_X509_BADCRL_EXPIRED, x509::VERIFICATION_FLAGS::BADCRL_EXPIRED},
+ { MBEDTLS_X509_BADCERT_MISSING, x509::VERIFICATION_FLAGS::BADCERT_MISSING},
+ { MBEDTLS_X509_BADCERT_SKIP_VERIFY, x509::VERIFICATION_FLAGS::BADCERT_SKIP_VERIFY},
+ { MBEDTLS_X509_BADCERT_OTHER, x509::VERIFICATION_FLAGS::BADCERT_OTHER},
+ { MBEDTLS_X509_BADCERT_FUTURE, x509::VERIFICATION_FLAGS::BADCERT_FUTURE},
+ { MBEDTLS_X509_BADCRL_FUTURE, x509::VERIFICATION_FLAGS::BADCRL_FUTURE},
+ { MBEDTLS_X509_BADCERT_KEY_USAGE, x509::VERIFICATION_FLAGS::BADCERT_KEY_USAGE},
+ { MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, x509::VERIFICATION_FLAGS::BADCERT_EXT_KEY_USAGE},
+ { MBEDTLS_X509_BADCERT_NS_CERT_TYPE, x509::VERIFICATION_FLAGS::BADCERT_NS_CERT_TYPE},
+ { MBEDTLS_X509_BADCERT_BAD_MD, x509::VERIFICATION_FLAGS::BADCERT_BAD_MD},
+ { MBEDTLS_X509_BADCERT_BAD_PK, x509::VERIFICATION_FLAGS::BADCERT_BAD_PK},
+ { MBEDTLS_X509_BADCERT_BAD_KEY, x509::VERIFICATION_FLAGS::BADCERT_BAD_KEY},
+ { MBEDTLS_X509_BADCRL_BAD_MD, x509::VERIFICATION_FLAGS::BADCRL_BAD_MD},
+ { MBEDTLS_X509_BADCRL_BAD_PK, x509::VERIFICATION_FLAGS::BADCRL_BAD_PK},
+ { MBEDTLS_X509_BADCRL_BAD_KEY, x509::VERIFICATION_FLAGS::BADCRL_BAD_KEY},
+};
+
+inline x509::VERIFICATION_FLAGS from_mbedtls_err(uint32_t err) {
+ x509::VERIFICATION_FLAGS flags = x509::VERIFICATION_FLAGS::OK;
+ for (const auto& p : MBEDTLS_ERR_TO_LIEF) {
+ if ((err & p.first) == p.first) {
+ flags |= p.second;
+ }
+ }
+ return flags;
+}
+
+inline x509::date_t from_mbedtls(const mbedtls_x509_time& time) {
+ return {
+ time.year,
+ time.mon,
+ time.day,
+ time.hour,
+ time.min,
+ time.sec
+ };
+}
+
+x509::certificates_t x509::parse(const std::string& path) {
+
+ std::ifstream cert_fs(path);
+ if (not cert_fs) {
+ LIEF_WARN("Can't open {}", path);
+ return {};
+ }
+ cert_fs.unsetf(std::ios::skipws);
+ cert_fs.seekg(0, std::ios::end);
+ const size_t size = cert_fs.tellg();
+ cert_fs.seekg(0, std::ios::beg);
+
+ std::vector<uint8_t> raw(size + 1, 0);
+ cert_fs.read(reinterpret_cast<char*>(raw.data()), raw.size());
+ return x509::parse(std::move(raw));
+}
+
+x509::certificates_t x509::parse(const std::vector<uint8_t>& content) {
+ std::unique_ptr<mbedtls_x509_crt> ca{new mbedtls_x509_crt{}};
+ mbedtls_x509_crt_init(ca.get());
+ //LIEF_INFO("{}", reinterpret_cast<const char*>(content.data()));
+ int ret = mbedtls_x509_crt_parse(ca.get(), content.data(), content.size());
+ if (ret != 0) {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret, const_cast<char*>(strerr.data()), strerr.size());
+ LIEF_WARN("Fail to parse certificate blob: '{}'", strerr);
+ return {};
+ }
+ std::vector<x509> crts;
+
+ mbedtls_x509_crt* prev = nullptr;
+ mbedtls_x509_crt* current = ca.release();
+ while (current != nullptr and current != prev) {
+ mbedtls_x509_crt* next = current->next;
+ current->next = nullptr;
+ crts.emplace_back(current);
+ prev = current;
+ current = next;
+ }
+ return crts;
+}
+bool x509::check_time(const date_t& before, const date_t& after) {
+ // Implementation taken
+ // from https://github.com/ARMmbed/mbedtls/blob/1c54b5410fd48d6bcada97e30cac417c5c7eea67/library/x509.c#L926-L962
+ if (before[0] > after[0]) {
+ LIEF_DEBUG("{} > {}", before[0], after[0]);
+ return false;
+ }
+
+ if (
+ before[0] == after[0] and
+ before[1] > after[1]
+ )
+ {
+ LIEF_DEBUG("{} > {}", before[1], after[1]);
+ return false;
+ }
+
+ if (
+ before[0] == after[0] and
+ before[1] == after[1] and
+ before[2] > after[2]
+ )
+ {
+ LIEF_DEBUG("{} > {}", before[2], after[2]);
+ return false;
+ }
+
+ if (
+ before[0] == after[0] and
+ before[1] == after[1] and
+ before[2] == after[2] and
+ before[3] > after[3]
+ )
+ {
+ LIEF_DEBUG("{} > {}", before[3], after[3]);
+ return false;
+ }
+
+ if (
+ before[0] == after[0] and
+ before[1] == after[1] and
+ before[2] == after[2] and
+ before[3] == after[3] and
+ before[4] > after[4]
+ )
+ {
+ LIEF_DEBUG("{} > {}", before[4], after[4]);
+ return false;
+ }
+
+ if (
+ before[0] == after[0] and
+ before[1] == after[1] and
+ before[2] == after[2] and
+ before[3] == after[3] and
+ before[4] == after[4] and
+ before[5] > after[5]
+ )
+ {
+ LIEF_DEBUG("{} > {}", before[5], after[5]);
+ return false;
+ }
+
+ if (
+ before[0] == after[0] and
+ before[1] == after[1] and
+ before[2] == after[2] and
+ before[3] == after[3] and
+ before[4] == after[4] and
+ before[5] == after[5] and
+ before[6] > after[6]
+ )
+ {
+ LIEF_DEBUG("{} > {}", before[6], after[6]);
+ return false;
+ }
+
+ return true;
+}
+
+bool x509::time_is_past(const date_t& to) {
+ mbedtls_x509_time now;
+
+ if (x509_get_current_time(&now) != 0) {
+ return true;
+ }
+ // check_time(): true if now < to else false
+ return not check_time(from_mbedtls(now), to);
+}
+
+bool x509::time_is_future(const date_t& from) {
+ mbedtls_x509_time now;
+
+ if (x509_get_current_time(&now) != 0) {
+ return true;
+ }
+ return check_time(from_mbedtls(now), from);
+}
+
+x509::x509() = default;
+
x509::x509(mbedtls_x509_crt* ca) :
x509_cert_{ca}
{}
@@ -45,7 +265,6 @@ x509::x509(const x509& other) :
mbedtls_x509_crt_parse_der(crt, other.x509_cert_->raw.p, other.x509_cert_->raw.len);
this->x509_cert_ = crt;
-
}
x509& x509::operator=(x509 other) {
@@ -74,44 +293,312 @@ oid_t x509::signature_algorithm(void) const {
}
x509::date_t x509::valid_from(void) const {
- return {{
- this->x509_cert_->valid_from.year,
- this->x509_cert_->valid_from.mon,
- this->x509_cert_->valid_from.day,
- this->x509_cert_->valid_from.hour,
- this->x509_cert_->valid_from.min,
- this->x509_cert_->valid_from.sec
- }};
+ return from_mbedtls(this->x509_cert_->valid_from);
}
x509::date_t x509::valid_to(void) const {
- return {{
- this->x509_cert_->valid_to.year,
- this->x509_cert_->valid_to.mon,
- this->x509_cert_->valid_to.day,
- this->x509_cert_->valid_to.hour,
- this->x509_cert_->valid_to.min,
- this->x509_cert_->valid_to.sec
- }};
+ return from_mbedtls(this->x509_cert_->valid_to);
}
std::string x509::issuer(void) const {
char buffer[1024];
mbedtls_x509_dn_gets(buffer, sizeof(buffer), &this->x509_cert_->issuer);
- return {buffer};
+ return buffer;
}
std::string x509::subject(void) const {
char buffer[1024];
mbedtls_x509_dn_gets(buffer, sizeof(buffer), &this->x509_cert_->subject);
- return {buffer};
+ return buffer;
}
std::vector<uint8_t> x509::raw(void) const {
return {this->x509_cert_->raw.p, this->x509_cert_->raw.p + this->x509_cert_->raw.len};
}
+
+x509::KEY_TYPES x509::key_type() const {
+ static const std::map<mbedtls_pk_type_t, x509::KEY_TYPES> mtype2asi = {
+ {MBEDTLS_PK_NONE, KEY_TYPES::NONE },
+ {MBEDTLS_PK_RSA, KEY_TYPES::RSA },
+ {MBEDTLS_PK_ECKEY, KEY_TYPES::ECKEY },
+ {MBEDTLS_PK_ECKEY_DH, KEY_TYPES::ECKEY_DH },
+ {MBEDTLS_PK_ECDSA, KEY_TYPES::ECDSA },
+ {MBEDTLS_PK_RSA_ALT, KEY_TYPES::RSA_ALT },
+ {MBEDTLS_PK_RSASSA_PSS, KEY_TYPES::RSASSA_PSS },
+ };
+
+ mbedtls_pk_context* ctx = &(this->x509_cert_->pk);
+ mbedtls_pk_type_t type = mbedtls_pk_get_type(ctx);
+
+ auto&& it_key = mtype2asi.find(type);
+ if (it_key != std::end(mtype2asi)) {
+ return it_key->second;
+ }
+ return KEY_TYPES::NONE;
+}
+
+
+std::unique_ptr<RsaInfo> x509::rsa_info(void) const {
+ if (this->key_type() == KEY_TYPES::RSA) {
+ mbedtls_rsa_context* rsa_ctx = mbedtls_pk_rsa(this->x509_cert_->pk);
+ return std::unique_ptr<RsaInfo>{new RsaInfo{rsa_ctx}};
+ }
+ return nullptr;
+}
+
+bool x509::check_signature(const std::vector<uint8_t>& hash, const std::vector<uint8_t>& signature, ALGORITHMS algo) const {
+ static const std::map<ALGORITHMS, mbedtls_md_type_t> LIEF2MBED_MD = {
+ {ALGORITHMS::MD2, MBEDTLS_MD_MD2},
+ {ALGORITHMS::MD4, MBEDTLS_MD_MD4},
+ {ALGORITHMS::MD5, MBEDTLS_MD_MD5},
+
+ {ALGORITHMS::SHA_1, MBEDTLS_MD_SHA1},
+ {ALGORITHMS::SHA_256, MBEDTLS_MD_SHA256},
+ {ALGORITHMS::SHA_384, MBEDTLS_MD_SHA384},
+ {ALGORITHMS::SHA_512, MBEDTLS_MD_SHA512},
+ };
+
+ auto it_md = LIEF2MBED_MD.find(algo);
+ if (it_md == std::end(LIEF2MBED_MD)) {
+ LIEF_ERR("Can't find algorithm {}", to_string(algo));
+ return false;
+ }
+ mbedtls_pk_context& ctx = this->x509_cert_->pk;
+ int ret = mbedtls_pk_verify(&ctx,
+ /* MD_HASH_ALGO */ it_md->second,
+ /* Input Hash */ hash.data(), hash.size(),
+ /* Signature provided */ signature.data(), signature.size());
+
+ /* If the verification failed with mbedtls_pk_verify it
+ * does not necessity means that the signatures don't match.
+ *
+ * For RSA public-key scheme, mbedtls encodes the hash with rsa_rsassa_pkcs1_v15_encode() so that it expands
+ * the hash value with encoded data. On some samples, this encoding failed.
+ *
+ * In the approach below, we manually decrypt and unpad the output of the DEC(signature)
+ * as defined in the RFC #2313
+ */
+ if (ret != 0) {
+ if (mbedtls_pk_get_type(&ctx) == MBEDTLS_PK_RSA) {
+ auto* ctx_rsa = reinterpret_cast<mbedtls_rsa_context*>(ctx.pk_ctx);
+ if ((ctx_rsa->len * 8) < 100 or (ctx_rsa->len * 8) > 2048 * 10) {
+ LIEF_INFO("RSA Key length is not valid ({} bits)", ctx_rsa->len * 8);
+ return false;
+ }
+ std::vector<uint8_t> decrypted(ctx_rsa->len);
+
+ int ret_rsa_public = mbedtls_rsa_public(ctx_rsa, signature.data(), decrypted.data());
+ if (ret_rsa_public != 0) {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret_rsa_public, const_cast<char*>(strerr.data()), strerr.size());
+ LIEF_INFO("RSA public key operation failed: '{}'", strerr);
+ return false;
+ }
+
+ // Check padding header
+ if (decrypted[0] != 0x00 and decrypted[1] != 0x01 and decrypted[2] != 0xff) {
+ return false;
+ }
+
+ std::vector<uint8_t> unpadded;
+ for (size_t i = 2; i < decrypted.size(); ++i) {
+ if (decrypted[i] == 0) {
+ unpadded = std::vector<uint8_t>(std::begin(decrypted) + i + 1, std::end(decrypted));
+ break;
+ }
+ if (decrypted[i] != 0xFF) {
+ return false;
+ }
+ }
+ if (unpadded == hash) {
+ return true;
+ }
+ }
+ if (ret != 0) {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret, const_cast<char*>(strerr.data()), strerr.size());
+ LIEF_INFO("decrypt() failed with error: '{}'", strerr);
+ return false;
+ }
+ return true;
+ }
+ return true;
+}
+
+
+x509::VERIFICATION_FLAGS x509::is_trusted_by(const std::vector<x509>& ca) const {
+ std::vector<x509> ca_list = ca; // Explicit copy since we will modify mbedtls_x509_crt->next
+ for (size_t i = 0; i < ca_list.size() - 1; ++i) {
+ ca_list[i].x509_cert_->next = ca_list[i + 1].x509_cert_;
+ }
+
+ VERIFICATION_FLAGS result = VERIFICATION_FLAGS::OK;
+ uint32_t flags = 0;
+ mbedtls_x509_crt_profile profile = {
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_MD5) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
+ 0xFFFFFFF, /* Any PK alg */
+ 0xFFFFFFF, /* Any curve */
+ 1 /* Min RSA key */,
+ };
+
+ int ret = mbedtls_x509_crt_verify_with_profile(
+ /* crt */ this->x509_cert_,
+ /* Trusted CA */ ca_list.front().x509_cert_,
+ /* CA's CRLs */ nullptr,
+ /* profile */ &profile,
+ /* Common Name */ nullptr,
+ /* Verification */ &flags,
+ /* verification function */ nullptr,
+ /* verification params */ nullptr);
+
+ if (ret != 0) {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret, const_cast<char*>(strerr.data()), strerr.size());
+ std::string out(1024, 0);
+ mbedtls_x509_crt_verify_info(const_cast<char*>(out.data()), out.size(), "", flags);
+ LIEF_WARN("X509 verify failed with: {} (0x{:x})\n{}", strerr, ret, out);
+ result = from_mbedtls_err(flags);
+ }
+
+ // Clear the chain since ~x509() will delete each object
+ for (size_t i = 0; i < ca_list.size(); ++i) {
+ ca_list[i].x509_cert_->next = nullptr;
+ }
+ return result;
+}
+
+x509::VERIFICATION_FLAGS x509::verify(const x509& ca) const {
+ uint32_t flags = 0;
+ VERIFICATION_FLAGS result = VERIFICATION_FLAGS::OK;
+ mbedtls_x509_crt_profile profile = {
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA1) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA224) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA256) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA384) |
+ MBEDTLS_X509_ID_FLAG(MBEDTLS_MD_SHA512),
+ 0xFFFFFFF, /* Any PK alg */
+ 0xFFFFFFF, /* Any curve */
+ 1 /* Min RSA key */,
+ };
+
+ int ret = mbedtls_x509_crt_verify_with_profile(
+ /* crt */ ca.x509_cert_,
+ /* Trusted CA */ this->x509_cert_,
+ /* CA's CRLs */ nullptr,
+ /* profile */ &profile,
+ /* Common Name */ nullptr,
+ /* Verification */ &flags,
+ /* verification function */ nullptr,
+ /* verification params */ nullptr);
+
+ if (ret != 0) {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret, const_cast<char*>(strerr.data()), strerr.size());
+ std::string out(1024, 0);
+ mbedtls_x509_crt_verify_info(const_cast<char*>(out.data()), out.size(), "", flags);
+ LIEF_WARN("X509 verify failed with: {} (0x{:x})\n{}", strerr, ret, out);
+ result = from_mbedtls_err(flags);
+ }
+ return result;
+}
+
+std::vector<oid_t> x509::ext_key_usage() const {
+ if ((this->x509_cert_->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE) == 0) {
+ return {};
+ }
+ mbedtls_asn1_sequence* current = &this->x509_cert_->ext_key_usage;
+ std::vector<oid_t> oids;
+ while (current != nullptr) {
+ char oid_str[256] = {0};
+ int ret = mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &current->buf);
+ if (ret != MBEDTLS_ERR_OID_BUF_TOO_SMALL) {
+ LIEF_DEBUG("OID: {}", oid_str);
+ oids.push_back(oid_str);
+ } else {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret, const_cast<char*>(strerr.data()), strerr.size());
+ LIEF_WARN("{}", strerr);
+ }
+ if (current->next == current) {
+ break;
+ }
+ current = current->next;
+ }
+ return oids;
+}
+
+std::vector<oid_t> x509::certificate_policies() const {
+ if ((this->x509_cert_->ext_types & MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES) == 0) {
+ return {};
+ }
+
+ mbedtls_x509_sequence& policies = this->x509_cert_->certificate_policies;
+ mbedtls_asn1_sequence* current = &policies;
+ std::vector<oid_t> oids;
+ while (current != nullptr) {
+ char oid_str[256] = {0};
+ int ret = mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &current->buf);
+ if (ret != MBEDTLS_ERR_OID_BUF_TOO_SMALL) {
+ oids.push_back(oid_str);
+ } else {
+ std::string strerr(1024, 0);
+ mbedtls_strerror(ret, const_cast<char*>(strerr.data()), strerr.size());
+ LIEF_WARN("{}", strerr);
+ }
+ if (current->next == current) {
+ break;
+ }
+ current = current->next;
+ }
+ return oids;
+}
+
+bool x509::is_ca() const {
+ if ((this->x509_cert_->ext_types & MBEDTLS_X509_EXT_BASIC_CONSTRAINTS) == 0) {
+ return true;
+ }
+ return this->x509_cert_->ca_istrue;
+}
+
+std::vector<x509::KEY_USAGE> x509::key_usage() const {
+ static const std::map<uint32_t, KEY_USAGE> MBEDTLS_MAP = {
+ {MBEDTLS_X509_KU_DIGITAL_SIGNATURE, KEY_USAGE::DIGITAL_SIGNATURE},
+ {MBEDTLS_X509_KU_NON_REPUDIATION, KEY_USAGE::NON_REPUDIATION},
+ {MBEDTLS_X509_KU_KEY_ENCIPHERMENT, KEY_USAGE::KEY_ENCIPHERMENT},
+ {MBEDTLS_X509_KU_DATA_ENCIPHERMENT, KEY_USAGE::DATA_ENCIPHERMENT},
+ {MBEDTLS_X509_KU_KEY_AGREEMENT, KEY_USAGE::KEY_AGREEMENT},
+ {MBEDTLS_X509_KU_KEY_CERT_SIGN, KEY_USAGE::KEY_CERT_SIGN},
+ {MBEDTLS_X509_KU_CRL_SIGN, KEY_USAGE::CRL_SIGN},
+ {MBEDTLS_X509_KU_ENCIPHER_ONLY, KEY_USAGE::ENCIPHER_ONLY},
+ {MBEDTLS_X509_KU_DECIPHER_ONLY, KEY_USAGE::DECIPHER_ONLY},
+ };
+
+ if ((this->x509_cert_->ext_types & MBEDTLS_X509_EXT_KEY_USAGE) == 0) {
+ return {};
+ }
+
+ const uint32_t ku = this->x509_cert_->key_usage;
+ std::vector<KEY_USAGE> usages;
+ for (const auto& p : MBEDTLS_MAP) {
+ if ((ku & p.first) > 0) {
+ usages.push_back(p.second);
+ }
+ }
+ return usages;
+}
+
+std::vector<uint8_t> x509::signature() const {
+ mbedtls_x509_buf sig = this->x509_cert_->sig;
+ return {sig.p, sig.p + sig.len};
+}
+
void x509::accept(Visitor& visitor) const {
visitor.visit(*this);
}
@@ -122,56 +609,14 @@ x509::~x509(void) {
}
std::ostream& operator<<(std::ostream& os, const x509& x509_cert) {
-
- constexpr uint8_t wsize = 30;
- const std::vector<uint8_t>& sn = x509_cert.serial_number();
- std::string sn_str = std::accumulate(
- std::begin(sn),
- std::end(sn),
- std::string(""),
- [] (std::string lhs, uint8_t x) {
- std::stringstream ss;
- ss << std::setw(2) << std::setfill('0') << std::hex << static_cast<uint32_t>(x);
- return lhs.empty() ? ss.str() : lhs + ":" + ss.str();
- });
-
- const x509::date_t& valid_from = x509_cert.valid_from();
- const x509::date_t& valid_to = x509_cert.valid_to();
-
- //// 2018-01-11 20:39:31
- std::string valid_from_str =
- std::to_string(valid_from[0]) + "-" +
- std::to_string(valid_from[1]) + "-" +
- std::to_string(valid_from[2]) + " " +
- std::to_string(valid_from[3]) + ":" +
- std::to_string(valid_from[4]) + ":" +
- std::to_string(valid_from[5]);
-
-
- std::string valid_to_str =
- std::to_string(valid_to[0]) + "-" +
- std::to_string(valid_to[1]) + "-" +
- std::to_string(valid_to[2]) + " " +
- std::to_string(valid_to[3]) + ":" +
- std::to_string(valid_to[4]) + ":" +
- std::to_string(valid_to[5]);
-
-
- os << std::hex << std::left;
- os << std::setw(wsize) << std::setfill(' ') << "Version: " << x509_cert.version() << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Serial Number: " << sn_str << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Signature Algorithm: " << oid_to_string(x509_cert.signature_algorithm()) << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Valid from: " << valid_from_str << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Valid to: " << valid_to_str << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Issuer: " << x509_cert.issuer() << std::endl;
- os << std::setw(wsize) << std::setfill(' ') << "Subject: " << x509_cert.subject() << std::endl;
-
-
- //os << std::endl << std::endl;
- //std::vector<char> buffer(2048, 0);
- //mbedtls_x509_crt_info(buffer.data(), buffer.size(), "", x509_cert.x509_cert_);
- //std::string foo(buffer.data());
- //os << foo;
+ std::vector<char> buffer(2048, 0);
+ int ret = mbedtls_x509_crt_info(buffer.data(), buffer.size(), "", x509_cert.x509_cert_);
+ if (ret < 0) {
+ os << "Can't print certificate information\n";
+ return os;
+ }
+ std::string crt_str(buffer.data());
+ os << crt_str;
return os;
}
diff --git a/src/PE/utils.cpp b/src/PE/utils.cpp
index 041550fe..0a360060 100644
--- a/src/PE/utils.cpp
+++ b/src/PE/utils.cpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,31 +17,45 @@
#include <fstream>
#include <iterator>
#include <exception>
-#include <string.h>
+#include <string>
#include <numeric>
#include <iomanip>
#include <sstream>
#include <string>
-#include "LIEF/logging++.hpp"
+#include "logging.hpp"
#include "mbedtls/md5.h"
#include "LIEF/exception.hpp"
#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/Structures.hpp"
#include "LIEF/PE/Binary.hpp"
#include "LIEF/PE/Import.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
+#include "LIEF/BinaryStream/VectorStream.hpp"
+#include "LIEF/utils.hpp"
#include "utils/ordinals_lookup_tables/libraries_table.hpp"
+#include "utils/ordinals_lookup_tables_std/libraries_table.hpp"
+
+#include "hash_stream.hpp"
namespace LIEF {
namespace PE {
+inline std::string to_lower(std::string str) {
+ std::string lower = str;
+ std::transform(std::begin(str), std::end(str),
+ std::begin(lower), ::tolower);
+ return lower;
+}
+
bool is_pe(const std::string& file) {
std::ifstream binary(file, std::ios::in | std::ios::binary);
if (not binary) {
- LOG(ERROR) << "Unable to open the file!";
+ LIEF_ERR("Unable to open the file!");
return false;
}
@@ -53,7 +67,7 @@ bool is_pe(const std::string& file) {
if (file_size < sizeof(pe_dos_header)) {
- LOG(ERROR) << "File too small";
+ LIEF_ERR("File too small");
return false;
}
@@ -99,6 +113,19 @@ bool is_pe(const std::vector<uint8_t>& raw) {
}
+result<PE_TYPE> get_type_from_stream(BinaryStream& stream) {
+ const uint64_t cpos = stream.pos();
+ stream.setpos(0);
+ const pe_dos_header& dos_hdr = stream.read<pe_dos_header>();
+ stream.setpos(dos_hdr.AddressOfNewExeHeader + sizeof(pe_header));
+ const pe32_optional_header& opt_hdr = stream.read<pe32_optional_header>();
+ const auto type = static_cast<PE_TYPE>(opt_hdr.Magic);
+ stream.setpos(cpos);
+ if (type == PE_TYPE::PE32 or type == PE_TYPE::PE32_PLUS) {
+ return type;
+ }
+ return make_error_code(lief_errors::read_error);
+}
PE_TYPE get_type(const std::string& file) {
if (not is_pe(file)) {
@@ -151,21 +178,65 @@ PE_TYPE get_type(const std::vector<uint8_t>& raw) {
}
-std::string get_imphash(const Binary& binary) {
- uint8_t md5_buffer[16];
+std::string get_imphash_std(const Binary& binary) {
+ static const std::set<std::string> ALLOWED_EXT = {"dll", "ocx", "sys"};
+ std::vector<uint8_t> md5_buffer(16);
+ if (not binary.has_imports()) {
+ return "";
+ }
+ std::string lstr;
+ bool first_entry = true;
+ hashstream hs(hashstream::HASH::MD5);
+ for (const Import& imp : binary.imports()) {
+ std::string libname = imp.name();
+
+ Import resolved = resolve_ordinals(imp, /* strict */ false, /* use_std */ true);
+ size_t ext_idx = resolved.name().find_last_of(".");
+ std::string name = resolved.name();
+ std::string ext;
+ if (ext_idx != std::string::npos) {
+ ext = to_lower(resolved.name().substr(ext_idx + 1));
+ }
+ if (ALLOWED_EXT.find(ext) != std::end(ALLOWED_EXT)) {
+ name = name.substr(0, ext_idx);
+ }
+
+ std::string entries_string;
+ for (const ImportEntry& e : resolved.entries()) {
+ std::string funcname;
+ if (e.is_ordinal()) {
+ funcname = "ord" + std::to_string(e.ordinal());
+ } else {
+ funcname = e.name();
+ }
+
+ if (not entries_string.empty()) {
+ entries_string += ",";
+ }
+ entries_string += name + "." + funcname;
+ }
+ if (not first_entry) {
+ lstr += ",";
+ } else {
+ first_entry = false;
+ }
+ lstr += to_lower(entries_string);
+
+ // use write(uint8_t*, size_t) instead of write(const std::string&) to avoid null char
+ hs.write(reinterpret_cast<const uint8_t*>(lstr.data()), lstr.size());
+ lstr.clear();
+ }
+
+ return hex_dump(hs.raw(), "");
+}
+
+
+std::string get_imphash_lief(const Binary& binary) {
+ std::vector<uint8_t> md5_buffer(16);
if (not binary.has_imports()) {
return std::to_string(0);
}
- auto to_lower = [] (const std::string& str) {
- std::string lower = str;
- std::transform(
- std::begin(str),
- std::end(str),
- std::begin(lower),
- ::tolower);
- return lower;
- };
it_const_imports imports = binary.imports();
std::string import_list;
@@ -197,24 +268,26 @@ std::string get_imphash(const Binary& binary) {
mbedtls_md5(
reinterpret_cast<const uint8_t*>(import_list.data()),
import_list.size(),
- md5_buffer);
-
- std::string output_hex = std::accumulate(
- std::begin(md5_buffer),
- std::end(md5_buffer),
- std::string{},
- [] (const std::string& a, uint8_t b) {
- std::stringstream ss;
- ss << std::hex;
- ss << std::setw(2) << std::setfill('0') << static_cast<uint32_t>(b);
- return a + ss.str();
- });
-
- return output_hex;
+ md5_buffer.data());
+ return hex_dump(md5_buffer, "");
}
+std::string get_imphash(const Binary& binary, IMPHASH_MODE mode) {
+ switch (mode) {
+ case IMPHASH_MODE::LIEF:
+ {
+ return get_imphash_lief(binary);
+ }
+ case IMPHASH_MODE::PEFILE:
+ {
+ return get_imphash_std(binary);
+ }
+ }
+ return "";
+}
-Import resolve_ordinals(const Import& import, bool strict) {
+Import resolve_ordinals(const Import& import, bool strict, bool use_std) {
+ using ordinal_resolver_t = const char*(*)(uint32_t);
it_const_import_entries entries = import.entries();
@@ -224,45 +297,87 @@ Import resolve_ordinals(const Import& import, bool strict) {
[] (const ImportEntry& entry) {
return not entry.is_ordinal();
})) {
- VLOG(VDEBUG) << "All imports use name. No ordinal!";
+ LIEF_DEBUG("All imports use name. No ordinal!");
return import;
}
- std::string name = import.name();
- std::transform(
- std::begin(name),
- std::end(name),
- std::begin(name),
- ::tolower);
+ std::string name = to_lower(import.name());
- auto&& it_library_lookup = ordinals_library_tables.find(name);
- if (it_library_lookup == std::end(ordinals_library_tables)) {
+ ordinal_resolver_t ordinal_resolver = nullptr;
+ if (use_std) {
+ auto it = imphashstd::ordinals_library_tables.find(name);
+ if (it != std::end(imphashstd::ordinals_library_tables)) {
+ ordinal_resolver = it->second;
+ }
+ } else {
+ auto it = ordinals_library_tables.find(name);
+ if (it != std::end(ordinals_library_tables)) {
+ ordinal_resolver = it->second;
+ }
+ }
+
+ if (ordinal_resolver == nullptr) {
std::string msg = "Ordinal lookup table for '" + name + "' not implemented";
if (strict) {
throw not_found(msg);
}
- VLOG(VDEBUG) << msg;
+ LIEF_DEBUG("{}", msg);
return import;
}
+
Import resolved_import = import;
for (ImportEntry& entry : resolved_import.entries()) {
if (entry.is_ordinal()) {
- VLOG(VDEBUG) << "Dealing with: " << entry;
- auto&& it_entry = it_library_lookup->second.find(static_cast<uint32_t>(entry.ordinal()));
- if (it_entry == std::end(it_library_lookup->second)) {
+ LIEF_DEBUG("Dealing with: {}", entry);
+ const char* entry_name = ordinal_resolver(static_cast<uint32_t>(entry.ordinal()));
+ if (entry_name == nullptr) {
if (strict) {
throw not_found("Unable to resolve ordinal: " + std::to_string(entry.ordinal()));
}
- VLOG(VDEBUG) << "Unable to resolve ordinal:" << std::hex << entry.ordinal();
+ LIEF_DEBUG("Unable to resolve ordinal: #{:d}", entry.ordinal());
continue;
}
entry.data(0);
- entry.name(it_entry->second);
+ entry.name(entry_name);
}
}
return resolved_import;
}
+ALGORITHMS algo_from_oid(const std::string& oid) {
+ static const std::unordered_map<std::string, ALGORITHMS> OID_MAP = {
+ { "2.16.840.1.101.3.4.2.3", ALGORITHMS::SHA_512 },
+ { "2.16.840.1.101.3.4.2.2", ALGORITHMS::SHA_384 },
+ { "2.16.840.1.101.3.4.2.1", ALGORITHMS::SHA_256 },
+ { "1.3.14.3.2.26", ALGORITHMS::SHA_1 },
+
+ { "1.2.840.113549.2.5", ALGORITHMS::MD5 },
+ { "1.2.840.113549.2.4", ALGORITHMS::MD4 },
+ { "1.2.840.113549.2.2", ALGORITHMS::MD2 },
+
+ { "1.2.840.113549.1.1.1", ALGORITHMS::RSA },
+ { "1.2.840.10045.2.1", ALGORITHMS::EC },
+
+ { "1.2.840.113549.1.1.4", ALGORITHMS::MD5_RSA },
+ { "1.2.840.10040.4.3", ALGORITHMS::SHA1_DSA },
+ { "1.2.840.113549.1.1.5", ALGORITHMS::SHA1_RSA },
+ { "1.2.840.113549.1.1.11", ALGORITHMS::SHA_256_RSA },
+ { "1.2.840.113549.1.1.12", ALGORITHMS::SHA_384_RSA },
+ { "1.2.840.113549.1.1.13", ALGORITHMS::SHA_512_RSA },
+ { "1.2.840.10045.4.1", ALGORITHMS::SHA1_ECDSA },
+ { "1.2.840.10045.4.3.2", ALGORITHMS::SHA_256_ECDSA },
+ { "1.2.840.10045.4.3.3", ALGORITHMS::SHA_384_ECDSA },
+ { "1.2.840.10045.4.3.4", ALGORITHMS::SHA_512_ECDSA },
+ };
+
+
+ const auto& it = OID_MAP.find(oid.c_str());
+ if (it == std::end(OID_MAP)) {
+ return ALGORITHMS::UNKNOWN;
+ }
+ return it->second;
+}
+
}
}
diff --git a/src/PE/utils/ordinals_lookup_tables/advapi32_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/advapi32_dll_lookup.hpp
index 79102949..3e0eb127 100644
--- a/src/PE/utils/ordinals_lookup_tables/advapi32_dll_lookup.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/advapi32_dll_lookup.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,688 +16,690 @@
#ifndef LIEF_PE_ADVAPI32_DLL_LOOKUP_H_
#define LIEF_PE_ADVAPI32_DLL_LOOKUP_H_
-#include <map>
namespace LIEF {
namespace PE {
-static const std::map<uint32_t, const char*> advapi32_dll_lookup {
- { 0x0002, "A_SHAFinal" },
- { 0x0003, "A_SHAInit" },
- { 0x0004, "A_SHAUpdate" },
- { 0x0005, "AbortSystemShutdownA" },
- { 0x0006, "AbortSystemShutdownW" },
- { 0x0007, "AccessCheck" },
- { 0x0008, "AccessCheckAndAuditAlarmA" },
- { 0x0009, "AccessCheckAndAuditAlarmW" },
- { 0x000a, "AccessCheckByType" },
- { 0x000b, "AccessCheckByTypeAndAuditAlarmA" },
- { 0x000c, "AccessCheckByTypeAndAuditAlarmW" },
- { 0x000d, "AccessCheckByTypeResultList" },
- { 0x000e, "AccessCheckByTypeResultListAndAuditAlarmA" },
- { 0x000f, "AccessCheckByTypeResultListAndAuditAlarmByHandleA" },
- { 0x0010, "AccessCheckByTypeResultListAndAuditAlarmByHandleW" },
- { 0x0011, "AccessCheckByTypeResultListAndAuditAlarmW" },
- { 0x0012, "AddAccessAllowedAce" },
- { 0x0013, "AddAccessAllowedAceEx" },
- { 0x0014, "AddAccessAllowedObjectAce" },
- { 0x0015, "AddAccessDeniedAce" },
- { 0x0016, "AddAccessDeniedAceEx" },
- { 0x0017, "AddAccessDeniedObjectAce" },
- { 0x0018, "AddAce" },
- { 0x0019, "AddAuditAccessAce" },
- { 0x001a, "AddAuditAccessAceEx" },
- { 0x001b, "AddAuditAccessObjectAce" },
- { 0x001c, "AddUsersToEncryptedFile" },
- { 0x001d, "AdjustTokenGroups" },
- { 0x001e, "AdjustTokenPrivileges" },
- { 0x001f, "AllocateAndInitializeSid" },
- { 0x0020, "AllocateLocallyUniqueId" },
- { 0x0021, "AreAllAccessesGranted" },
- { 0x0022, "AreAnyAccessesGranted" },
- { 0x0023, "BackupEventLogA" },
- { 0x0024, "BackupEventLogW" },
- { 0x0025, "BuildExplicitAccessWithNameA" },
- { 0x0026, "BuildExplicitAccessWithNameW" },
- { 0x0027, "BuildImpersonateExplicitAccessWithNameA" },
- { 0x0028, "BuildImpersonateExplicitAccessWithNameW" },
- { 0x0029, "BuildImpersonateTrusteeA" },
- { 0x002a, "BuildImpersonateTrusteeW" },
- { 0x002b, "BuildSecurityDescriptorA" },
- { 0x002c, "BuildSecurityDescriptorW" },
- { 0x002d, "BuildTrusteeWithNameA" },
- { 0x002e, "BuildTrusteeWithNameW" },
- { 0x002f, "BuildTrusteeWithObjectsAndNameA" },
- { 0x0030, "BuildTrusteeWithObjectsAndNameW" },
- { 0x0031, "BuildTrusteeWithObjectsAndSidA" },
- { 0x0032, "BuildTrusteeWithObjectsAndSidW" },
- { 0x0033, "BuildTrusteeWithSidA" },
- { 0x0034, "BuildTrusteeWithSidW" },
- { 0x0035, "CancelOverlappedAccess" },
- { 0x0036, "ChangeServiceConfig2A" },
- { 0x0037, "ChangeServiceConfig2W" },
- { 0x0038, "ChangeServiceConfigA" },
- { 0x0039, "ChangeServiceConfigW" },
- { 0x003a, "CheckTokenMembership" },
- { 0x003b, "ClearEventLogA" },
- { 0x003c, "ClearEventLogW" },
- { 0x003d, "CloseCodeAuthzLevel" },
- { 0x003e, "CloseEncryptedFileRaw" },
- { 0x003f, "CloseEventLog" },
- { 0x0040, "CloseServiceHandle" },
- { 0x0041, "CloseTrace" },
- { 0x0042, "CommandLineFromMsiDescriptor" },
- { 0x0043, "ComputeAccessTokenFromCodeAuthzLevel" },
- { 0x0044, "ControlService" },
- { 0x0045, "ControlTraceA" },
- { 0x0046, "ControlTraceW" },
- { 0x0047, "ConvertAccessToSecurityDescriptorA" },
- { 0x0048, "ConvertAccessToSecurityDescriptorW" },
- { 0x0049, "ConvertSDToStringSDRootDomainA" },
- { 0x004a, "ConvertSDToStringSDRootDomainW" },
- { 0x004b, "ConvertSecurityDescriptorToAccessA" },
- { 0x004c, "ConvertSecurityDescriptorToAccessNamedA" },
- { 0x004d, "ConvertSecurityDescriptorToAccessNamedW" },
- { 0x004e, "ConvertSecurityDescriptorToAccessW" },
- { 0x004f, "ConvertSecurityDescriptorToStringSecurityDescriptorA" },
- { 0x0050, "ConvertSecurityDescriptorToStringSecurityDescriptorW" },
- { 0x0051, "ConvertSidToStringSidA" },
- { 0x0052, "ConvertSidToStringSidW" },
- { 0x0053, "ConvertStringSDToSDDomainA" },
- { 0x0054, "ConvertStringSDToSDDomainW" },
- { 0x0055, "ConvertStringSDToSDRootDomainA" },
- { 0x0056, "ConvertStringSDToSDRootDomainW" },
- { 0x0057, "ConvertStringSecurityDescriptorToSecurityDescriptorA" },
- { 0x0058, "ConvertStringSecurityDescriptorToSecurityDescriptorW" },
- { 0x0059, "ConvertStringSidToSidA" },
- { 0x005a, "ConvertStringSidToSidW" },
- { 0x005b, "ConvertToAutoInheritPrivateObjectSecurity" },
- { 0x005c, "CopySid" },
- { 0x005d, "CreateCodeAuthzLevel" },
- { 0x005e, "CreatePrivateObjectSecurity" },
- { 0x005f, "CreatePrivateObjectSecurityEx" },
- { 0x0060, "CreatePrivateObjectSecurityWithMultipleInheritance" },
- { 0x0061, "CreateProcessAsUserA" },
- { 0x0062, "CreateProcessAsUserSecure" },
- { 0x0063, "CreateProcessAsUserW" },
- { 0x0064, "CreateProcessWithLogonW" },
- { 0x0065, "CreateRestrictedToken" },
- { 0x0066, "CreateServiceA" },
- { 0x0067, "CreateServiceW" },
- { 0x0068, "CreateTraceInstanceId" },
- { 0x0069, "CreateWellKnownSid" },
- { 0x006a, "CredDeleteA" },
- { 0x006b, "CredDeleteW" },
- { 0x006c, "CredEnumerateA" },
- { 0x006d, "CredEnumerateW" },
- { 0x006e, "CredFree" },
- { 0x006f, "CredGetSessionTypes" },
- { 0x0070, "CredGetTargetInfoA" },
- { 0x0071, "CredGetTargetInfoW" },
- { 0x0072, "CredIsMarshaledCredentialA" },
- { 0x0073, "CredIsMarshaledCredentialW" },
- { 0x0074, "CredMarshalCredentialA" },
- { 0x0075, "CredMarshalCredentialW" },
- { 0x0076, "CredProfileLoaded" },
- { 0x0077, "CredReadA" },
- { 0x0078, "CredReadDomainCredentialsA" },
- { 0x0079, "CredReadDomainCredentialsW" },
- { 0x007a, "CredReadW" },
- { 0x007b, "CredRenameA" },
- { 0x007c, "CredRenameW" },
- { 0x007d, "CredUnmarshalCredentialA" },
- { 0x007e, "CredUnmarshalCredentialW" },
- { 0x007f, "CredWriteA" },
- { 0x0080, "CredWriteDomainCredentialsA" },
- { 0x0081, "CredWriteDomainCredentialsW" },
- { 0x0082, "CredWriteW" },
- { 0x0083, "CredpConvertCredential" },
- { 0x0084, "CredpConvertTargetInfo" },
- { 0x0085, "CredpDecodeCredential" },
- { 0x0086, "CredpEncodeCredential" },
- { 0x0087, "CryptAcquireContextA" },
- { 0x0088, "CryptAcquireContextW" },
- { 0x0089, "CryptContextAddRef" },
- { 0x008a, "CryptCreateHash" },
- { 0x008b, "CryptDecrypt" },
- { 0x008c, "CryptDeriveKey" },
- { 0x008d, "CryptDestroyHash" },
- { 0x008e, "CryptDestroyKey" },
- { 0x008f, "CryptDuplicateHash" },
- { 0x0090, "CryptDuplicateKey" },
- { 0x0091, "CryptEncrypt" },
- { 0x0092, "CryptEnumProviderTypesA" },
- { 0x0093, "CryptEnumProviderTypesW" },
- { 0x0094, "CryptEnumProvidersA" },
- { 0x0095, "CryptEnumProvidersW" },
- { 0x0096, "CryptExportKey" },
- { 0x0097, "CryptGenKey" },
- { 0x0098, "CryptGenRandom" },
- { 0x0099, "CryptGetDefaultProviderA" },
- { 0x009a, "CryptGetDefaultProviderW" },
- { 0x009b, "CryptGetHashParam" },
- { 0x009c, "CryptGetKeyParam" },
- { 0x009d, "CryptGetProvParam" },
- { 0x009e, "CryptGetUserKey" },
- { 0x009f, "CryptHashData" },
- { 0x00a0, "CryptHashSessionKey" },
- { 0x00a1, "CryptImportKey" },
- { 0x00a2, "CryptReleaseContext" },
- { 0x00a3, "CryptSetHashParam" },
- { 0x00a4, "CryptSetKeyParam" },
- { 0x00a5, "CryptSetProvParam" },
- { 0x00a6, "CryptSetProviderA" },
- { 0x00a7, "CryptSetProviderExA" },
- { 0x00a8, "CryptSetProviderExW" },
- { 0x00a9, "CryptSetProviderW" },
- { 0x00aa, "CryptSignHashA" },
- { 0x00ab, "CryptSignHashW" },
- { 0x00ac, "CryptVerifySignatureA" },
- { 0x00ad, "CryptVerifySignatureW" },
- { 0x00ae, "DecryptFileA" },
- { 0x00af, "DecryptFileW" },
- { 0x00b0, "DeleteAce" },
- { 0x00b1, "DeleteService" },
- { 0x00b2, "DeregisterEventSource" },
- { 0x00b3, "DestroyPrivateObjectSecurity" },
- { 0x00b4, "DuplicateEncryptionInfoFile" },
- { 0x00b5, "DuplicateToken" },
- { 0x00b6, "DuplicateTokenEx" },
- { 0x00b7, "ElfBackupEventLogFileA" },
- { 0x00b8, "ElfBackupEventLogFileW" },
- { 0x00b9, "ElfChangeNotify" },
- { 0x00ba, "ElfClearEventLogFileA" },
- { 0x00bb, "ElfClearEventLogFileW" },
- { 0x00bc, "ElfCloseEventLog" },
- { 0x00bd, "ElfDeregisterEventSource" },
- { 0x00be, "ElfFlushEventLog" },
- { 0x00bf, "ElfNumberOfRecords" },
- { 0x00c0, "ElfOldestRecord" },
- { 0x00c1, "ElfOpenBackupEventLogA" },
- { 0x00c2, "ElfOpenBackupEventLogW" },
- { 0x00c3, "ElfOpenEventLogA" },
- { 0x00c4, "ElfOpenEventLogW" },
- { 0x00c5, "ElfReadEventLogA" },
- { 0x00c6, "ElfReadEventLogW" },
- { 0x00c7, "ElfRegisterEventSourceA" },
- { 0x00c8, "ElfRegisterEventSourceW" },
- { 0x00c9, "ElfReportEventA" },
- { 0x00ca, "ElfReportEventW" },
- { 0x00cb, "EnableTrace" },
- { 0x00cc, "EncryptFileA" },
- { 0x00cd, "EncryptFileW" },
- { 0x00ce, "EncryptedFileKeyInfo" },
- { 0x00cf, "EncryptionDisable" },
- { 0x00d0, "EnumDependentServicesA" },
- { 0x00d1, "EnumDependentServicesW" },
- { 0x00d2, "EnumServiceGroupW" },
- { 0x00d3, "EnumServicesStatusA" },
- { 0x00d4, "EnumServicesStatusExA" },
- { 0x00d5, "EnumServicesStatusExW" },
- { 0x00d6, "EnumServicesStatusW" },
- { 0x00d7, "EnumerateTraceGuids" },
- { 0x00d8, "EqualDomainSid" },
- { 0x00d9, "EqualPrefixSid" },
- { 0x00da, "EqualSid" },
- { 0x00db, "FileEncryptionStatusA" },
- { 0x00dc, "FileEncryptionStatusW" },
- { 0x00dd, "FindFirstFreeAce" },
- { 0x00de, "FlushTraceA" },
- { 0x00df, "FlushTraceW" },
- { 0x00e0, "FreeEncryptedFileKeyInfo" },
- { 0x00e1, "FreeEncryptionCertificateHashList" },
- { 0x00e2, "FreeInheritedFromArray" },
- { 0x00e3, "FreeSid" },
- { 0x00e4, "GetAccessPermissionsForObjectA" },
- { 0x00e5, "GetAccessPermissionsForObjectW" },
- { 0x00e6, "GetAce" },
- { 0x00e7, "GetAclInformation" },
- { 0x00e8, "GetAuditedPermissionsFromAclA" },
- { 0x00e9, "GetAuditedPermissionsFromAclW" },
- { 0x00ea, "GetCurrentHwProfileA" },
- { 0x00eb, "GetCurrentHwProfileW" },
- { 0x00ec, "GetEffectiveRightsFromAclA" },
- { 0x00ed, "GetEffectiveRightsFromAclW" },
- { 0x00ee, "GetEventLogInformation" },
- { 0x00ef, "GetExplicitEntriesFromAclA" },
- { 0x00f0, "GetExplicitEntriesFromAclW" },
- { 0x00f1, "GetFileSecurityA" },
- { 0x00f2, "GetFileSecurityW" },
- { 0x00f3, "GetInformationCodeAuthzLevelW" },
- { 0x00f4, "GetInformationCodeAuthzPolicyW" },
- { 0x00f5, "GetInheritanceSourceA" },
- { 0x00f6, "GetInheritanceSourceW" },
- { 0x00f7, "GetKernelObjectSecurity" },
- { 0x00f8, "GetLengthSid" },
- { 0x00f9, "GetLocalManagedApplicationData" },
- { 0x00fa, "GetLocalManagedApplications" },
- { 0x00fb, "GetManagedApplicationCategories" },
- { 0x00fc, "GetManagedApplications" },
- { 0x00fd, "GetMultipleTrusteeA" },
- { 0x00fe, "GetMultipleTrusteeOperationA" },
- { 0x00ff, "GetMultipleTrusteeOperationW" },
- { 0x0100, "GetMultipleTrusteeW" },
- { 0x0101, "GetNamedSecurityInfoA" },
- { 0x0102, "GetNamedSecurityInfoExA" },
- { 0x0103, "GetNamedSecurityInfoExW" },
- { 0x0104, "GetNamedSecurityInfoW" },
- { 0x0105, "GetNumberOfEventLogRecords" },
- { 0x0106, "GetOldestEventLogRecord" },
- { 0x0107, "GetOverlappedAccessResults" },
- { 0x0108, "GetPrivateObjectSecurity" },
- { 0x0109, "GetSecurityDescriptorControl" },
- { 0x010a, "GetSecurityDescriptorDacl" },
- { 0x010b, "GetSecurityDescriptorGroup" },
- { 0x010c, "GetSecurityDescriptorLength" },
- { 0x010d, "GetSecurityDescriptorOwner" },
- { 0x010e, "GetSecurityDescriptorRMControl" },
- { 0x010f, "GetSecurityDescriptorSacl" },
- { 0x0110, "GetSecurityInfo" },
- { 0x0111, "GetSecurityInfoExA" },
- { 0x0112, "GetSecurityInfoExW" },
- { 0x0113, "GetServiceDisplayNameA" },
- { 0x0114, "GetServiceDisplayNameW" },
- { 0x0115, "GetServiceKeyNameA" },
- { 0x0116, "GetServiceKeyNameW" },
- { 0x0117, "GetSidIdentifierAuthority" },
- { 0x0118, "GetSidLengthRequired" },
- { 0x0119, "GetSidSubAuthority" },
- { 0x011a, "GetSidSubAuthorityCount" },
- { 0x011b, "GetTokenInformation" },
- { 0x011c, "GetTraceEnableFlags" },
- { 0x011d, "GetTraceEnableLevel" },
- { 0x011e, "GetTraceLoggerHandle" },
- { 0x011f, "GetTrusteeFormA" },
- { 0x0120, "GetTrusteeFormW" },
- { 0x0121, "GetTrusteeNameA" },
- { 0x0122, "GetTrusteeNameW" },
- { 0x0123, "GetTrusteeTypeA" },
- { 0x0124, "GetTrusteeTypeW" },
- { 0x0125, "GetUserNameA" },
- { 0x0126, "GetUserNameW" },
- { 0x0127, "GetWindowsAccountDomainSid" },
- { 0x0001, "I_ScGetCurrentGroupStateW" },
- { 0x0128, "I_ScIsSecurityProcess" },
- { 0x0129, "I_ScPnPGetServiceName" },
- { 0x012a, "I_ScSendTSMessage" },
- { 0x012b, "I_ScSetServiceBitsA" },
- { 0x012c, "I_ScSetServiceBitsW" },
- { 0x012d, "IdentifyCodeAuthzLevelW" },
- { 0x012e, "ImpersonateAnonymousToken" },
- { 0x012f, "ImpersonateLoggedOnUser" },
- { 0x0130, "ImpersonateNamedPipeClient" },
- { 0x0131, "ImpersonateSelf" },
- { 0x0132, "InitializeAcl" },
- { 0x0133, "InitializeSecurityDescriptor" },
- { 0x0134, "InitializeSid" },
- { 0x0135, "InitiateSystemShutdownA" },
- { 0x0136, "InitiateSystemShutdownExA" },
- { 0x0137, "InitiateSystemShutdownExW" },
- { 0x0138, "InitiateSystemShutdownW" },
- { 0x0139, "InstallApplication" },
- { 0x013a, "IsTextUnicode" },
- { 0x013b, "IsTokenRestricted" },
- { 0x013c, "IsTokenUntrusted" },
- { 0x013d, "IsValidAcl" },
- { 0x013e, "IsValidSecurityDescriptor" },
- { 0x013f, "IsValidSid" },
- { 0x0140, "IsWellKnownSid" },
- { 0x0141, "LockServiceDatabase" },
- { 0x0142, "LogonUserA" },
- { 0x0143, "LogonUserExA" },
- { 0x0144, "LogonUserExW" },
- { 0x0145, "LogonUserW" },
- { 0x0146, "LookupAccountNameA" },
- { 0x0147, "LookupAccountNameW" },
- { 0x0148, "LookupAccountSidA" },
- { 0x0149, "LookupAccountSidW" },
- { 0x014a, "LookupPrivilegeDisplayNameA" },
- { 0x014b, "LookupPrivilegeDisplayNameW" },
- { 0x014c, "LookupPrivilegeNameA" },
- { 0x014d, "LookupPrivilegeNameW" },
- { 0x014e, "LookupPrivilegeValueA" },
- { 0x014f, "LookupPrivilegeValueW" },
- { 0x0150, "LookupSecurityDescriptorPartsA" },
- { 0x0151, "LookupSecurityDescriptorPartsW" },
- { 0x0152, "LsaAddAccountRights" },
- { 0x0153, "LsaAddPrivilegesToAccount" },
- { 0x0154, "LsaClearAuditLog" },
- { 0x0155, "LsaClose" },
- { 0x0156, "LsaCreateAccount" },
- { 0x0157, "LsaCreateSecret" },
- { 0x0158, "LsaCreateTrustedDomain" },
- { 0x0159, "LsaCreateTrustedDomainEx" },
- { 0x015a, "LsaDelete" },
- { 0x015b, "LsaDeleteTrustedDomain" },
- { 0x015c, "LsaEnumerateAccountRights" },
- { 0x015d, "LsaEnumerateAccounts" },
- { 0x015e, "LsaEnumerateAccountsWithUserRight" },
- { 0x015f, "LsaEnumeratePrivileges" },
- { 0x0160, "LsaEnumeratePrivilegesOfAccount" },
- { 0x0161, "LsaEnumerateTrustedDomains" },
- { 0x0162, "LsaEnumerateTrustedDomainsEx" },
- { 0x0163, "LsaFreeMemory" },
- { 0x0164, "LsaGetQuotasForAccount" },
- { 0x0165, "LsaGetRemoteUserName" },
- { 0x0166, "LsaGetSystemAccessAccount" },
- { 0x0167, "LsaGetUserName" },
- { 0x0168, "LsaICLookupNames" },
- { 0x0169, "LsaICLookupNamesWithCreds" },
- { 0x016a, "LsaICLookupSids" },
- { 0x016b, "LsaICLookupSidsWithCreds" },
- { 0x016d, "LsaLookupNames" },
- { 0x016c, "LsaLookupNames2" },
- { 0x016e, "LsaLookupPrivilegeDisplayName" },
- { 0x016f, "LsaLookupPrivilegeName" },
- { 0x0170, "LsaLookupPrivilegeValue" },
- { 0x0171, "LsaLookupSids" },
- { 0x0172, "LsaNtStatusToWinError" },
- { 0x0173, "LsaOpenAccount" },
- { 0x0174, "LsaOpenPolicy" },
- { 0x0175, "LsaOpenPolicySce" },
- { 0x0176, "LsaOpenSecret" },
- { 0x0177, "LsaOpenTrustedDomain" },
- { 0x0178, "LsaOpenTrustedDomainByName" },
- { 0x0179, "LsaQueryDomainInformationPolicy" },
- { 0x017a, "LsaQueryForestTrustInformation" },
- { 0x017b, "LsaQueryInfoTrustedDomain" },
- { 0x017c, "LsaQueryInformationPolicy" },
- { 0x017d, "LsaQuerySecret" },
- { 0x017e, "LsaQuerySecurityObject" },
- { 0x017f, "LsaQueryTrustedDomainInfo" },
- { 0x0180, "LsaQueryTrustedDomainInfoByName" },
- { 0x0181, "LsaRemoveAccountRights" },
- { 0x0182, "LsaRemovePrivilegesFromAccount" },
- { 0x0183, "LsaRetrievePrivateData" },
- { 0x0184, "LsaSetDomainInformationPolicy" },
- { 0x0185, "LsaSetForestTrustInformation" },
- { 0x0186, "LsaSetInformationPolicy" },
- { 0x0187, "LsaSetInformationTrustedDomain" },
- { 0x0188, "LsaSetQuotasForAccount" },
- { 0x0189, "LsaSetSecret" },
- { 0x018a, "LsaSetSecurityObject" },
- { 0x018b, "LsaSetSystemAccessAccount" },
- { 0x018c, "LsaSetTrustedDomainInfoByName" },
- { 0x018d, "LsaSetTrustedDomainInformation" },
- { 0x018e, "LsaStorePrivateData" },
- { 0x018f, "MD4Final" },
- { 0x0190, "MD4Init" },
- { 0x0191, "MD4Update" },
- { 0x0192, "MD5Final" },
- { 0x0193, "MD5Init" },
- { 0x0194, "MD5Update" },
- { 0x0196, "MSChapSrvChangePassword" },
- { 0x0195, "MSChapSrvChangePassword2" },
- { 0x0198, "MakeAbsoluteSD" },
- { 0x0197, "MakeAbsoluteSD2" },
- { 0x0199, "MakeSelfRelativeSD" },
- { 0x019a, "MapGenericMask" },
- { 0x019b, "NotifyBootConfigStatus" },
- { 0x019c, "NotifyChangeEventLog" },
- { 0x019d, "ObjectCloseAuditAlarmA" },
- { 0x019e, "ObjectCloseAuditAlarmW" },
- { 0x019f, "ObjectDeleteAuditAlarmA" },
- { 0x01a0, "ObjectDeleteAuditAlarmW" },
- { 0x01a1, "ObjectOpenAuditAlarmA" },
- { 0x01a2, "ObjectOpenAuditAlarmW" },
- { 0x01a3, "ObjectPrivilegeAuditAlarmA" },
- { 0x01a4, "ObjectPrivilegeAuditAlarmW" },
- { 0x01a5, "OpenBackupEventLogA" },
- { 0x01a6, "OpenBackupEventLogW" },
- { 0x01a7, "OpenEncryptedFileRawA" },
- { 0x01a8, "OpenEncryptedFileRawW" },
- { 0x01a9, "OpenEventLogA" },
- { 0x01aa, "OpenEventLogW" },
- { 0x01ab, "OpenProcessToken" },
- { 0x01ac, "OpenSCManagerA" },
- { 0x01ad, "OpenSCManagerW" },
- { 0x01ae, "OpenServiceA" },
- { 0x01af, "OpenServiceW" },
- { 0x01b0, "OpenThreadToken" },
- { 0x01b1, "OpenTraceA" },
- { 0x01b2, "OpenTraceW" },
- { 0x01b3, "PrivilegeCheck" },
- { 0x01b4, "PrivilegedServiceAuditAlarmA" },
- { 0x01b5, "PrivilegedServiceAuditAlarmW" },
- { 0x01b6, "ProcessIdleTasks" },
- { 0x01b7, "ProcessTrace" },
- { 0x01b8, "QueryAllTracesA" },
- { 0x01b9, "QueryAllTracesW" },
- { 0x01ba, "QueryRecoveryAgentsOnEncryptedFile" },
- { 0x01bb, "QueryServiceConfig2A" },
- { 0x01bc, "QueryServiceConfig2W" },
- { 0x01bd, "QueryServiceConfigA" },
- { 0x01be, "QueryServiceConfigW" },
- { 0x01bf, "QueryServiceLockStatusA" },
- { 0x01c0, "QueryServiceLockStatusW" },
- { 0x01c1, "QueryServiceObjectSecurity" },
- { 0x01c2, "QueryServiceStatus" },
- { 0x01c3, "QueryServiceStatusEx" },
- { 0x01c4, "QueryTraceA" },
- { 0x01c5, "QueryTraceW" },
- { 0x01c6, "QueryUsersOnEncryptedFile" },
- { 0x01c7, "QueryWindows31FilesMigration" },
- { 0x01c8, "ReadEncryptedFileRaw" },
- { 0x01c9, "ReadEventLogA" },
- { 0x01ca, "ReadEventLogW" },
- { 0x01cb, "RegCloseKey" },
- { 0x01cc, "RegConnectRegistryA" },
- { 0x01cd, "RegConnectRegistryW" },
- { 0x01ce, "RegCreateKeyA" },
- { 0x01cf, "RegCreateKeyExA" },
- { 0x01d0, "RegCreateKeyExW" },
- { 0x01d1, "RegCreateKeyW" },
- { 0x01d2, "RegDeleteKeyA" },
- { 0x01d3, "RegDeleteKeyW" },
- { 0x01d4, "RegDeleteValueA" },
- { 0x01d5, "RegDeleteValueW" },
- { 0x01d6, "RegDisablePredefinedCache" },
- { 0x01d7, "RegEnumKeyA" },
- { 0x01d8, "RegEnumKeyExA" },
- { 0x01d9, "RegEnumKeyExW" },
- { 0x01da, "RegEnumKeyW" },
- { 0x01db, "RegEnumValueA" },
- { 0x01dc, "RegEnumValueW" },
- { 0x01dd, "RegFlushKey" },
- { 0x01de, "RegGetKeySecurity" },
- { 0x01df, "RegLoadKeyA" },
- { 0x01e0, "RegLoadKeyW" },
- { 0x01e1, "RegNotifyChangeKeyValue" },
- { 0x01e2, "RegOpenCurrentUser" },
- { 0x01e3, "RegOpenKeyA" },
- { 0x01e4, "RegOpenKeyExA" },
- { 0x01e5, "RegOpenKeyExW" },
- { 0x01e6, "RegOpenKeyW" },
- { 0x01e7, "RegOpenUserClassesRoot" },
- { 0x01e8, "RegOverridePredefKey" },
- { 0x01e9, "RegQueryInfoKeyA" },
- { 0x01ea, "RegQueryInfoKeyW" },
- { 0x01eb, "RegQueryMultipleValuesA" },
- { 0x01ec, "RegQueryMultipleValuesW" },
- { 0x01ed, "RegQueryValueA" },
- { 0x01ee, "RegQueryValueExA" },
- { 0x01ef, "RegQueryValueExW" },
- { 0x01f0, "RegQueryValueW" },
- { 0x01f1, "RegReplaceKeyA" },
- { 0x01f2, "RegReplaceKeyW" },
- { 0x01f3, "RegRestoreKeyA" },
- { 0x01f4, "RegRestoreKeyW" },
- { 0x01f5, "RegSaveKeyA" },
- { 0x01f6, "RegSaveKeyExA" },
- { 0x01f7, "RegSaveKeyExW" },
- { 0x01f8, "RegSaveKeyW" },
- { 0x01f9, "RegSetKeySecurity" },
- { 0x01fa, "RegSetValueA" },
- { 0x01fb, "RegSetValueExA" },
- { 0x01fc, "RegSetValueExW" },
- { 0x01fd, "RegSetValueW" },
- { 0x01fe, "RegUnLoadKeyA" },
- { 0x01ff, "RegUnLoadKeyW" },
- { 0x0200, "RegisterEventSourceA" },
- { 0x0201, "RegisterEventSourceW" },
- { 0x0202, "RegisterIdleTask" },
- { 0x0203, "RegisterServiceCtrlHandlerA" },
- { 0x0204, "RegisterServiceCtrlHandlerExA" },
- { 0x0205, "RegisterServiceCtrlHandlerExW" },
- { 0x0206, "RegisterServiceCtrlHandlerW" },
- { 0x0207, "RegisterTraceGuidsA" },
- { 0x0208, "RegisterTraceGuidsW" },
- { 0x0209, "RemoveTraceCallback" },
- { 0x020a, "RemoveUsersFromEncryptedFile" },
- { 0x020b, "ReportEventA" },
- { 0x020c, "ReportEventW" },
- { 0x020d, "RevertToSelf" },
- { 0x020e, "SaferCloseLevel" },
- { 0x020f, "SaferComputeTokenFromLevel" },
- { 0x0210, "SaferCreateLevel" },
- { 0x0211, "SaferGetLevelInformation" },
- { 0x0212, "SaferGetPolicyInformation" },
- { 0x0213, "SaferIdentifyLevel" },
- { 0x0214, "SaferRecordEventLogEntry" },
- { 0x0215, "SaferSetLevelInformation" },
- { 0x0216, "SaferSetPolicyInformation" },
- { 0x0217, "SaferiChangeRegistryScope" },
- { 0x0218, "SaferiCompareTokenLevels" },
- { 0x0219, "SaferiIsExecutableFileType" },
- { 0x021a, "SaferiPopulateDefaultsInRegistry" },
- { 0x021b, "SaferiRecordEventLogEntry" },
- { 0x021c, "SaferiReplaceProcessThreadTokens" },
- { 0x021d, "SaferiSearchMatchingHashRules" },
- { 0x021e, "SetAclInformation" },
- { 0x021f, "SetEntriesInAccessListA" },
- { 0x0220, "SetEntriesInAccessListW" },
- { 0x0221, "SetEntriesInAclA" },
- { 0x0222, "SetEntriesInAclW" },
- { 0x0223, "SetEntriesInAuditListA" },
- { 0x0224, "SetEntriesInAuditListW" },
- { 0x0225, "SetFileSecurityA" },
- { 0x0226, "SetFileSecurityW" },
- { 0x0227, "SetInformationCodeAuthzLevelW" },
- { 0x0228, "SetInformationCodeAuthzPolicyW" },
- { 0x0229, "SetKernelObjectSecurity" },
- { 0x022a, "SetNamedSecurityInfoA" },
- { 0x022b, "SetNamedSecurityInfoExA" },
- { 0x022c, "SetNamedSecurityInfoExW" },
- { 0x022d, "SetNamedSecurityInfoW" },
- { 0x022e, "SetPrivateObjectSecurity" },
- { 0x022f, "SetPrivateObjectSecurityEx" },
- { 0x0230, "SetSecurityDescriptorControl" },
- { 0x0231, "SetSecurityDescriptorDacl" },
- { 0x0232, "SetSecurityDescriptorGroup" },
- { 0x0233, "SetSecurityDescriptorOwner" },
- { 0x0234, "SetSecurityDescriptorRMControl" },
- { 0x0235, "SetSecurityDescriptorSacl" },
- { 0x0236, "SetSecurityInfo" },
- { 0x0237, "SetSecurityInfoExA" },
- { 0x0238, "SetSecurityInfoExW" },
- { 0x0239, "SetServiceBits" },
- { 0x023a, "SetServiceObjectSecurity" },
- { 0x023b, "SetServiceStatus" },
- { 0x023c, "SetThreadToken" },
- { 0x023d, "SetTokenInformation" },
- { 0x023e, "SetTraceCallback" },
- { 0x023f, "SetUserFileEncryptionKey" },
- { 0x0240, "StartServiceA" },
- { 0x0241, "StartServiceCtrlDispatcherA" },
- { 0x0242, "StartServiceCtrlDispatcherW" },
- { 0x0243, "StartServiceW" },
- { 0x0244, "StartTraceA" },
- { 0x0245, "StartTraceW" },
- { 0x0246, "StopTraceA" },
- { 0x0247, "StopTraceW" },
- { 0x0248, "SynchronizeWindows31FilesAndWindowsNTRegistry" },
- { 0x0249, "SystemFunction001" },
- { 0x024a, "SystemFunction002" },
- { 0x024b, "SystemFunction003" },
- { 0x024c, "SystemFunction004" },
- { 0x024d, "SystemFunction005" },
- { 0x024e, "SystemFunction006" },
- { 0x024f, "SystemFunction007" },
- { 0x0250, "SystemFunction008" },
- { 0x0251, "SystemFunction009" },
- { 0x0252, "SystemFunction010" },
- { 0x0253, "SystemFunction011" },
- { 0x0254, "SystemFunction012" },
- { 0x0255, "SystemFunction013" },
- { 0x0256, "SystemFunction014" },
- { 0x0257, "SystemFunction015" },
- { 0x0258, "SystemFunction016" },
- { 0x0259, "SystemFunction017" },
- { 0x025a, "SystemFunction018" },
- { 0x025b, "SystemFunction019" },
- { 0x025c, "SystemFunction020" },
- { 0x025d, "SystemFunction021" },
- { 0x025e, "SystemFunction022" },
- { 0x025f, "SystemFunction023" },
- { 0x0260, "SystemFunction024" },
- { 0x0261, "SystemFunction025" },
- { 0x0262, "SystemFunction026" },
- { 0x0263, "SystemFunction027" },
- { 0x0264, "SystemFunction028" },
- { 0x0265, "SystemFunction029" },
- { 0x0266, "SystemFunction030" },
- { 0x0267, "SystemFunction031" },
- { 0x0268, "SystemFunction032" },
- { 0x0269, "SystemFunction033" },
- { 0x026a, "SystemFunction034" },
- { 0x026b, "SystemFunction035" },
- { 0x026c, "SystemFunction036" },
- { 0x026d, "SystemFunction040" },
- { 0x026e, "SystemFunction041" },
- { 0x026f, "TraceEvent" },
- { 0x0270, "TraceEventInstance" },
- { 0x0271, "TraceMessage" },
- { 0x0272, "TraceMessageVa" },
- { 0x0273, "TreeResetNamedSecurityInfoA" },
- { 0x0274, "TreeResetNamedSecurityInfoW" },
- { 0x0275, "TrusteeAccessToObjectA" },
- { 0x0276, "TrusteeAccessToObjectW" },
- { 0x0277, "UninstallApplication" },
- { 0x0278, "UnlockServiceDatabase" },
- { 0x0279, "UnregisterIdleTask" },
- { 0x027a, "UnregisterTraceGuids" },
- { 0x027b, "UpdateTraceA" },
- { 0x027c, "UpdateTraceW" },
- { 0x027d, "WdmWmiServiceMain" },
- { 0x027e, "WmiCloseBlock" },
- { 0x027f, "WmiCloseTraceWithCursor" },
- { 0x0280, "WmiConvertTimestamp" },
- { 0x0281, "WmiDevInstToInstanceNameA" },
- { 0x0282, "WmiDevInstToInstanceNameW" },
- { 0x0283, "WmiEnumerateGuids" },
- { 0x0284, "WmiExecuteMethodA" },
- { 0x0285, "WmiExecuteMethodW" },
- { 0x0286, "WmiFileHandleToInstanceNameA" },
- { 0x0287, "WmiFileHandleToInstanceNameW" },
- { 0x0288, "WmiFreeBuffer" },
- { 0x0289, "WmiGetFirstTraceOffset" },
- { 0x028a, "WmiGetNextEvent" },
- { 0x028b, "WmiGetTraceHeader" },
- { 0x028c, "WmiMofEnumerateResourcesA" },
- { 0x028d, "WmiMofEnumerateResourcesW" },
- { 0x028e, "WmiNotificationRegistrationA" },
- { 0x028f, "WmiNotificationRegistrationW" },
- { 0x0290, "WmiOpenBlock" },
- { 0x0291, "WmiOpenTraceWithCursor" },
- { 0x0292, "WmiParseTraceEvent" },
- { 0x0293, "WmiQueryAllDataA" },
- { 0x0294, "WmiQueryAllDataMultipleA" },
- { 0x0295, "WmiQueryAllDataMultipleW" },
- { 0x0296, "WmiQueryAllDataW" },
- { 0x0297, "WmiQueryGuidInformation" },
- { 0x0298, "WmiQuerySingleInstanceA" },
- { 0x0299, "WmiQuerySingleInstanceMultipleA" },
- { 0x029a, "WmiQuerySingleInstanceMultipleW" },
- { 0x029b, "WmiQuerySingleInstanceW" },
- { 0x029c, "WmiReceiveNotificationsA" },
- { 0x029d, "WmiReceiveNotificationsW" },
- { 0x029e, "WmiSetSingleInstanceA" },
- { 0x029f, "WmiSetSingleInstanceW" },
- { 0x02a0, "WmiSetSingleItemA" },
- { 0x02a1, "WmiSetSingleItemW" },
- { 0x02a2, "Wow64Win32ApiEntry" },
- { 0x02a3, "WriteEncryptedFileRaw" },
-};
+const char* advapi32_dll_lookup(uint32_t i) {
+ switch(i) {
+ case 0x0002: return "A_SHAFinal";
+ case 0x0003: return "A_SHAInit";
+ case 0x0004: return "A_SHAUpdate";
+ case 0x0005: return "AbortSystemShutdownA";
+ case 0x0006: return "AbortSystemShutdownW";
+ case 0x0007: return "AccessCheck";
+ case 0x0008: return "AccessCheckAndAuditAlarmA";
+ case 0x0009: return "AccessCheckAndAuditAlarmW";
+ case 0x000a: return "AccessCheckByType";
+ case 0x000b: return "AccessCheckByTypeAndAuditAlarmA";
+ case 0x000c: return "AccessCheckByTypeAndAuditAlarmW";
+ case 0x000d: return "AccessCheckByTypeResultList";
+ case 0x000e: return "AccessCheckByTypeResultListAndAuditAlarmA";
+ case 0x000f: return "AccessCheckByTypeResultListAndAuditAlarmByHandleA";
+ case 0x0010: return "AccessCheckByTypeResultListAndAuditAlarmByHandleW";
+ case 0x0011: return "AccessCheckByTypeResultListAndAuditAlarmW";
+ case 0x0012: return "AddAccessAllowedAce";
+ case 0x0013: return "AddAccessAllowedAceEx";
+ case 0x0014: return "AddAccessAllowedObjectAce";
+ case 0x0015: return "AddAccessDeniedAce";
+ case 0x0016: return "AddAccessDeniedAceEx";
+ case 0x0017: return "AddAccessDeniedObjectAce";
+ case 0x0018: return "AddAce";
+ case 0x0019: return "AddAuditAccessAce";
+ case 0x001a: return "AddAuditAccessAceEx";
+ case 0x001b: return "AddAuditAccessObjectAce";
+ case 0x001c: return "AddUsersToEncryptedFile";
+ case 0x001d: return "AdjustTokenGroups";
+ case 0x001e: return "AdjustTokenPrivileges";
+ case 0x001f: return "AllocateAndInitializeSid";
+ case 0x0020: return "AllocateLocallyUniqueId";
+ case 0x0021: return "AreAllAccessesGranted";
+ case 0x0022: return "AreAnyAccessesGranted";
+ case 0x0023: return "BackupEventLogA";
+ case 0x0024: return "BackupEventLogW";
+ case 0x0025: return "BuildExplicitAccessWithNameA";
+ case 0x0026: return "BuildExplicitAccessWithNameW";
+ case 0x0027: return "BuildImpersonateExplicitAccessWithNameA";
+ case 0x0028: return "BuildImpersonateExplicitAccessWithNameW";
+ case 0x0029: return "BuildImpersonateTrusteeA";
+ case 0x002a: return "BuildImpersonateTrusteeW";
+ case 0x002b: return "BuildSecurityDescriptorA";
+ case 0x002c: return "BuildSecurityDescriptorW";
+ case 0x002d: return "BuildTrusteeWithNameA";
+ case 0x002e: return "BuildTrusteeWithNameW";
+ case 0x002f: return "BuildTrusteeWithObjectsAndNameA";
+ case 0x0030: return "BuildTrusteeWithObjectsAndNameW";
+ case 0x0031: return "BuildTrusteeWithObjectsAndSidA";
+ case 0x0032: return "BuildTrusteeWithObjectsAndSidW";
+ case 0x0033: return "BuildTrusteeWithSidA";
+ case 0x0034: return "BuildTrusteeWithSidW";
+ case 0x0035: return "CancelOverlappedAccess";
+ case 0x0036: return "ChangeServiceConfig2A";
+ case 0x0037: return "ChangeServiceConfig2W";
+ case 0x0038: return "ChangeServiceConfigA";
+ case 0x0039: return "ChangeServiceConfigW";
+ case 0x003a: return "CheckTokenMembership";
+ case 0x003b: return "ClearEventLogA";
+ case 0x003c: return "ClearEventLogW";
+ case 0x003d: return "CloseCodeAuthzLevel";
+ case 0x003e: return "CloseEncryptedFileRaw";
+ case 0x003f: return "CloseEventLog";
+ case 0x0040: return "CloseServiceHandle";
+ case 0x0041: return "CloseTrace";
+ case 0x0042: return "CommandLineFromMsiDescriptor";
+ case 0x0043: return "ComputeAccessTokenFromCodeAuthzLevel";
+ case 0x0044: return "ControlService";
+ case 0x0045: return "ControlTraceA";
+ case 0x0046: return "ControlTraceW";
+ case 0x0047: return "ConvertAccessToSecurityDescriptorA";
+ case 0x0048: return "ConvertAccessToSecurityDescriptorW";
+ case 0x0049: return "ConvertSDToStringSDRootDomainA";
+ case 0x004a: return "ConvertSDToStringSDRootDomainW";
+ case 0x004b: return "ConvertSecurityDescriptorToAccessA";
+ case 0x004c: return "ConvertSecurityDescriptorToAccessNamedA";
+ case 0x004d: return "ConvertSecurityDescriptorToAccessNamedW";
+ case 0x004e: return "ConvertSecurityDescriptorToAccessW";
+ case 0x004f: return "ConvertSecurityDescriptorToStringSecurityDescriptorA";
+ case 0x0050: return "ConvertSecurityDescriptorToStringSecurityDescriptorW";
+ case 0x0051: return "ConvertSidToStringSidA";
+ case 0x0052: return "ConvertSidToStringSidW";
+ case 0x0053: return "ConvertStringSDToSDDomainA";
+ case 0x0054: return "ConvertStringSDToSDDomainW";
+ case 0x0055: return "ConvertStringSDToSDRootDomainA";
+ case 0x0056: return "ConvertStringSDToSDRootDomainW";
+ case 0x0057: return "ConvertStringSecurityDescriptorToSecurityDescriptorA";
+ case 0x0058: return "ConvertStringSecurityDescriptorToSecurityDescriptorW";
+ case 0x0059: return "ConvertStringSidToSidA";
+ case 0x005a: return "ConvertStringSidToSidW";
+ case 0x005b: return "ConvertToAutoInheritPrivateObjectSecurity";
+ case 0x005c: return "CopySid";
+ case 0x005d: return "CreateCodeAuthzLevel";
+ case 0x005e: return "CreatePrivateObjectSecurity";
+ case 0x005f: return "CreatePrivateObjectSecurityEx";
+ case 0x0060: return "CreatePrivateObjectSecurityWithMultipleInheritance";
+ case 0x0061: return "CreateProcessAsUserA";
+ case 0x0062: return "CreateProcessAsUserSecure";
+ case 0x0063: return "CreateProcessAsUserW";
+ case 0x0064: return "CreateProcessWithLogonW";
+ case 0x0065: return "CreateRestrictedToken";
+ case 0x0066: return "CreateServiceA";
+ case 0x0067: return "CreateServiceW";
+ case 0x0068: return "CreateTraceInstanceId";
+ case 0x0069: return "CreateWellKnownSid";
+ case 0x006a: return "CredDeleteA";
+ case 0x006b: return "CredDeleteW";
+ case 0x006c: return "CredEnumerateA";
+ case 0x006d: return "CredEnumerateW";
+ case 0x006e: return "CredFree";
+ case 0x006f: return "CredGetSessionTypes";
+ case 0x0070: return "CredGetTargetInfoA";
+ case 0x0071: return "CredGetTargetInfoW";
+ case 0x0072: return "CredIsMarshaledCredentialA";
+ case 0x0073: return "CredIsMarshaledCredentialW";
+ case 0x0074: return "CredMarshalCredentialA";
+ case 0x0075: return "CredMarshalCredentialW";
+ case 0x0076: return "CredProfileLoaded";
+ case 0x0077: return "CredReadA";
+ case 0x0078: return "CredReadDomainCredentialsA";
+ case 0x0079: return "CredReadDomainCredentialsW";
+ case 0x007a: return "CredReadW";
+ case 0x007b: return "CredRenameA";
+ case 0x007c: return "CredRenameW";
+ case 0x007d: return "CredUnmarshalCredentialA";
+ case 0x007e: return "CredUnmarshalCredentialW";
+ case 0x007f: return "CredWriteA";
+ case 0x0080: return "CredWriteDomainCredentialsA";
+ case 0x0081: return "CredWriteDomainCredentialsW";
+ case 0x0082: return "CredWriteW";
+ case 0x0083: return "CredpConvertCredential";
+ case 0x0084: return "CredpConvertTargetInfo";
+ case 0x0085: return "CredpDecodeCredential";
+ case 0x0086: return "CredpEncodeCredential";
+ case 0x0087: return "CryptAcquireContextA";
+ case 0x0088: return "CryptAcquireContextW";
+ case 0x0089: return "CryptContextAddRef";
+ case 0x008a: return "CryptCreateHash";
+ case 0x008b: return "CryptDecrypt";
+ case 0x008c: return "CryptDeriveKey";
+ case 0x008d: return "CryptDestroyHash";
+ case 0x008e: return "CryptDestroyKey";
+ case 0x008f: return "CryptDuplicateHash";
+ case 0x0090: return "CryptDuplicateKey";
+ case 0x0091: return "CryptEncrypt";
+ case 0x0092: return "CryptEnumProviderTypesA";
+ case 0x0093: return "CryptEnumProviderTypesW";
+ case 0x0094: return "CryptEnumProvidersA";
+ case 0x0095: return "CryptEnumProvidersW";
+ case 0x0096: return "CryptExportKey";
+ case 0x0097: return "CryptGenKey";
+ case 0x0098: return "CryptGenRandom";
+ case 0x0099: return "CryptGetDefaultProviderA";
+ case 0x009a: return "CryptGetDefaultProviderW";
+ case 0x009b: return "CryptGetHashParam";
+ case 0x009c: return "CryptGetKeyParam";
+ case 0x009d: return "CryptGetProvParam";
+ case 0x009e: return "CryptGetUserKey";
+ case 0x009f: return "CryptHashData";
+ case 0x00a0: return "CryptHashSessionKey";
+ case 0x00a1: return "CryptImportKey";
+ case 0x00a2: return "CryptReleaseContext";
+ case 0x00a3: return "CryptSetHashParam";
+ case 0x00a4: return "CryptSetKeyParam";
+ case 0x00a5: return "CryptSetProvParam";
+ case 0x00a6: return "CryptSetProviderA";
+ case 0x00a7: return "CryptSetProviderExA";
+ case 0x00a8: return "CryptSetProviderExW";
+ case 0x00a9: return "CryptSetProviderW";
+ case 0x00aa: return "CryptSignHashA";
+ case 0x00ab: return "CryptSignHashW";
+ case 0x00ac: return "CryptVerifySignatureA";
+ case 0x00ad: return "CryptVerifySignatureW";
+ case 0x00ae: return "DecryptFileA";
+ case 0x00af: return "DecryptFileW";
+ case 0x00b0: return "DeleteAce";
+ case 0x00b1: return "DeleteService";
+ case 0x00b2: return "DeregisterEventSource";
+ case 0x00b3: return "DestroyPrivateObjectSecurity";
+ case 0x00b4: return "DuplicateEncryptionInfoFile";
+ case 0x00b5: return "DuplicateToken";
+ case 0x00b6: return "DuplicateTokenEx";
+ case 0x00b7: return "ElfBackupEventLogFileA";
+ case 0x00b8: return "ElfBackupEventLogFileW";
+ case 0x00b9: return "ElfChangeNotify";
+ case 0x00ba: return "ElfClearEventLogFileA";
+ case 0x00bb: return "ElfClearEventLogFileW";
+ case 0x00bc: return "ElfCloseEventLog";
+ case 0x00bd: return "ElfDeregisterEventSource";
+ case 0x00be: return "ElfFlushEventLog";
+ case 0x00bf: return "ElfNumberOfRecords";
+ case 0x00c0: return "ElfOldestRecord";
+ case 0x00c1: return "ElfOpenBackupEventLogA";
+ case 0x00c2: return "ElfOpenBackupEventLogW";
+ case 0x00c3: return "ElfOpenEventLogA";
+ case 0x00c4: return "ElfOpenEventLogW";
+ case 0x00c5: return "ElfReadEventLogA";
+ case 0x00c6: return "ElfReadEventLogW";
+ case 0x00c7: return "ElfRegisterEventSourceA";
+ case 0x00c8: return "ElfRegisterEventSourceW";
+ case 0x00c9: return "ElfReportEventA";
+ case 0x00ca: return "ElfReportEventW";
+ case 0x00cb: return "EnableTrace";
+ case 0x00cc: return "EncryptFileA";
+ case 0x00cd: return "EncryptFileW";
+ case 0x00ce: return "EncryptedFileKeyInfo";
+ case 0x00cf: return "EncryptionDisable";
+ case 0x00d0: return "EnumDependentServicesA";
+ case 0x00d1: return "EnumDependentServicesW";
+ case 0x00d2: return "EnumServiceGroupW";
+ case 0x00d3: return "EnumServicesStatusA";
+ case 0x00d4: return "EnumServicesStatusExA";
+ case 0x00d5: return "EnumServicesStatusExW";
+ case 0x00d6: return "EnumServicesStatusW";
+ case 0x00d7: return "EnumerateTraceGuids";
+ case 0x00d8: return "EqualDomainSid";
+ case 0x00d9: return "EqualPrefixSid";
+ case 0x00da: return "EqualSid";
+ case 0x00db: return "FileEncryptionStatusA";
+ case 0x00dc: return "FileEncryptionStatusW";
+ case 0x00dd: return "FindFirstFreeAce";
+ case 0x00de: return "FlushTraceA";
+ case 0x00df: return "FlushTraceW";
+ case 0x00e0: return "FreeEncryptedFileKeyInfo";
+ case 0x00e1: return "FreeEncryptionCertificateHashList";
+ case 0x00e2: return "FreeInheritedFromArray";
+ case 0x00e3: return "FreeSid";
+ case 0x00e4: return "GetAccessPermissionsForObjectA";
+ case 0x00e5: return "GetAccessPermissionsForObjectW";
+ case 0x00e6: return "GetAce";
+ case 0x00e7: return "GetAclInformation";
+ case 0x00e8: return "GetAuditedPermissionsFromAclA";
+ case 0x00e9: return "GetAuditedPermissionsFromAclW";
+ case 0x00ea: return "GetCurrentHwProfileA";
+ case 0x00eb: return "GetCurrentHwProfileW";
+ case 0x00ec: return "GetEffectiveRightsFromAclA";
+ case 0x00ed: return "GetEffectiveRightsFromAclW";
+ case 0x00ee: return "GetEventLogInformation";
+ case 0x00ef: return "GetExplicitEntriesFromAclA";
+ case 0x00f0: return "GetExplicitEntriesFromAclW";
+ case 0x00f1: return "GetFileSecurityA";
+ case 0x00f2: return "GetFileSecurityW";
+ case 0x00f3: return "GetInformationCodeAuthzLevelW";
+ case 0x00f4: return "GetInformationCodeAuthzPolicyW";
+ case 0x00f5: return "GetInheritanceSourceA";
+ case 0x00f6: return "GetInheritanceSourceW";
+ case 0x00f7: return "GetKernelObjectSecurity";
+ case 0x00f8: return "GetLengthSid";
+ case 0x00f9: return "GetLocalManagedApplicationData";
+ case 0x00fa: return "GetLocalManagedApplications";
+ case 0x00fb: return "GetManagedApplicationCategories";
+ case 0x00fc: return "GetManagedApplications";
+ case 0x00fd: return "GetMultipleTrusteeA";
+ case 0x00fe: return "GetMultipleTrusteeOperationA";
+ case 0x00ff: return "GetMultipleTrusteeOperationW";
+ case 0x0100: return "GetMultipleTrusteeW";
+ case 0x0101: return "GetNamedSecurityInfoA";
+ case 0x0102: return "GetNamedSecurityInfoExA";
+ case 0x0103: return "GetNamedSecurityInfoExW";
+ case 0x0104: return "GetNamedSecurityInfoW";
+ case 0x0105: return "GetNumberOfEventLogRecords";
+ case 0x0106: return "GetOldestEventLogRecord";
+ case 0x0107: return "GetOverlappedAccessResults";
+ case 0x0108: return "GetPrivateObjectSecurity";
+ case 0x0109: return "GetSecurityDescriptorControl";
+ case 0x010a: return "GetSecurityDescriptorDacl";
+ case 0x010b: return "GetSecurityDescriptorGroup";
+ case 0x010c: return "GetSecurityDescriptorLength";
+ case 0x010d: return "GetSecurityDescriptorOwner";
+ case 0x010e: return "GetSecurityDescriptorRMControl";
+ case 0x010f: return "GetSecurityDescriptorSacl";
+ case 0x0110: return "GetSecurityInfo";
+ case 0x0111: return "GetSecurityInfoExA";
+ case 0x0112: return "GetSecurityInfoExW";
+ case 0x0113: return "GetServiceDisplayNameA";
+ case 0x0114: return "GetServiceDisplayNameW";
+ case 0x0115: return "GetServiceKeyNameA";
+ case 0x0116: return "GetServiceKeyNameW";
+ case 0x0117: return "GetSidIdentifierAuthority";
+ case 0x0118: return "GetSidLengthRequired";
+ case 0x0119: return "GetSidSubAuthority";
+ case 0x011a: return "GetSidSubAuthorityCount";
+ case 0x011b: return "GetTokenInformation";
+ case 0x011c: return "GetTraceEnableFlags";
+ case 0x011d: return "GetTraceEnableLevel";
+ case 0x011e: return "GetTraceLoggerHandle";
+ case 0x011f: return "GetTrusteeFormA";
+ case 0x0120: return "GetTrusteeFormW";
+ case 0x0121: return "GetTrusteeNameA";
+ case 0x0122: return "GetTrusteeNameW";
+ case 0x0123: return "GetTrusteeTypeA";
+ case 0x0124: return "GetTrusteeTypeW";
+ case 0x0125: return "GetUserNameA";
+ case 0x0126: return "GetUserNameW";
+ case 0x0127: return "GetWindowsAccountDomainSid";
+ case 0x0001: return "I_ScGetCurrentGroupStateW";
+ case 0x0128: return "I_ScIsSecurityProcess";
+ case 0x0129: return "I_ScPnPGetServiceName";
+ case 0x012a: return "I_ScSendTSMessage";
+ case 0x012b: return "I_ScSetServiceBitsA";
+ case 0x012c: return "I_ScSetServiceBitsW";
+ case 0x012d: return "IdentifyCodeAuthzLevelW";
+ case 0x012e: return "ImpersonateAnonymousToken";
+ case 0x012f: return "ImpersonateLoggedOnUser";
+ case 0x0130: return "ImpersonateNamedPipeClient";
+ case 0x0131: return "ImpersonateSelf";
+ case 0x0132: return "InitializeAcl";
+ case 0x0133: return "InitializeSecurityDescriptor";
+ case 0x0134: return "InitializeSid";
+ case 0x0135: return "InitiateSystemShutdownA";
+ case 0x0136: return "InitiateSystemShutdownExA";
+ case 0x0137: return "InitiateSystemShutdownExW";
+ case 0x0138: return "InitiateSystemShutdownW";
+ case 0x0139: return "InstallApplication";
+ case 0x013a: return "IsTextUnicode";
+ case 0x013b: return "IsTokenRestricted";
+ case 0x013c: return "IsTokenUntrusted";
+ case 0x013d: return "IsValidAcl";
+ case 0x013e: return "IsValidSecurityDescriptor";
+ case 0x013f: return "IsValidSid";
+ case 0x0140: return "IsWellKnownSid";
+ case 0x0141: return "LockServiceDatabase";
+ case 0x0142: return "LogonUserA";
+ case 0x0143: return "LogonUserExA";
+ case 0x0144: return "LogonUserExW";
+ case 0x0145: return "LogonUserW";
+ case 0x0146: return "LookupAccountNameA";
+ case 0x0147: return "LookupAccountNameW";
+ case 0x0148: return "LookupAccountSidA";
+ case 0x0149: return "LookupAccountSidW";
+ case 0x014a: return "LookupPrivilegeDisplayNameA";
+ case 0x014b: return "LookupPrivilegeDisplayNameW";
+ case 0x014c: return "LookupPrivilegeNameA";
+ case 0x014d: return "LookupPrivilegeNameW";
+ case 0x014e: return "LookupPrivilegeValueA";
+ case 0x014f: return "LookupPrivilegeValueW";
+ case 0x0150: return "LookupSecurityDescriptorPartsA";
+ case 0x0151: return "LookupSecurityDescriptorPartsW";
+ case 0x0152: return "LsaAddAccountRights";
+ case 0x0153: return "LsaAddPrivilegesToAccount";
+ case 0x0154: return "LsaClearAuditLog";
+ case 0x0155: return "LsaClose";
+ case 0x0156: return "LsaCreateAccount";
+ case 0x0157: return "LsaCreateSecret";
+ case 0x0158: return "LsaCreateTrustedDomain";
+ case 0x0159: return "LsaCreateTrustedDomainEx";
+ case 0x015a: return "LsaDelete";
+ case 0x015b: return "LsaDeleteTrustedDomain";
+ case 0x015c: return "LsaEnumerateAccountRights";
+ case 0x015d: return "LsaEnumerateAccounts";
+ case 0x015e: return "LsaEnumerateAccountsWithUserRight";
+ case 0x015f: return "LsaEnumeratePrivileges";
+ case 0x0160: return "LsaEnumeratePrivilegesOfAccount";
+ case 0x0161: return "LsaEnumerateTrustedDomains";
+ case 0x0162: return "LsaEnumerateTrustedDomainsEx";
+ case 0x0163: return "LsaFreeMemory";
+ case 0x0164: return "LsaGetQuotasForAccount";
+ case 0x0165: return "LsaGetRemoteUserName";
+ case 0x0166: return "LsaGetSystemAccessAccount";
+ case 0x0167: return "LsaGetUserName";
+ case 0x0168: return "LsaICLookupNames";
+ case 0x0169: return "LsaICLookupNamesWithCreds";
+ case 0x016a: return "LsaICLookupSids";
+ case 0x016b: return "LsaICLookupSidsWithCreds";
+ case 0x016d: return "LsaLookupNames";
+ case 0x016c: return "LsaLookupNames2";
+ case 0x016e: return "LsaLookupPrivilegeDisplayName";
+ case 0x016f: return "LsaLookupPrivilegeName";
+ case 0x0170: return "LsaLookupPrivilegeValue";
+ case 0x0171: return "LsaLookupSids";
+ case 0x0172: return "LsaNtStatusToWinError";
+ case 0x0173: return "LsaOpenAccount";
+ case 0x0174: return "LsaOpenPolicy";
+ case 0x0175: return "LsaOpenPolicySce";
+ case 0x0176: return "LsaOpenSecret";
+ case 0x0177: return "LsaOpenTrustedDomain";
+ case 0x0178: return "LsaOpenTrustedDomainByName";
+ case 0x0179: return "LsaQueryDomainInformationPolicy";
+ case 0x017a: return "LsaQueryForestTrustInformation";
+ case 0x017b: return "LsaQueryInfoTrustedDomain";
+ case 0x017c: return "LsaQueryInformationPolicy";
+ case 0x017d: return "LsaQuerySecret";
+ case 0x017e: return "LsaQuerySecurityObject";
+ case 0x017f: return "LsaQueryTrustedDomainInfo";
+ case 0x0180: return "LsaQueryTrustedDomainInfoByName";
+ case 0x0181: return "LsaRemoveAccountRights";
+ case 0x0182: return "LsaRemovePrivilegesFromAccount";
+ case 0x0183: return "LsaRetrievePrivateData";
+ case 0x0184: return "LsaSetDomainInformationPolicy";
+ case 0x0185: return "LsaSetForestTrustInformation";
+ case 0x0186: return "LsaSetInformationPolicy";
+ case 0x0187: return "LsaSetInformationTrustedDomain";
+ case 0x0188: return "LsaSetQuotasForAccount";
+ case 0x0189: return "LsaSetSecret";
+ case 0x018a: return "LsaSetSecurityObject";
+ case 0x018b: return "LsaSetSystemAccessAccount";
+ case 0x018c: return "LsaSetTrustedDomainInfoByName";
+ case 0x018d: return "LsaSetTrustedDomainInformation";
+ case 0x018e: return "LsaStorePrivateData";
+ case 0x018f: return "MD4Final";
+ case 0x0190: return "MD4Init";
+ case 0x0191: return "MD4Update";
+ case 0x0192: return "MD5Final";
+ case 0x0193: return "MD5Init";
+ case 0x0194: return "MD5Update";
+ case 0x0196: return "MSChapSrvChangePassword";
+ case 0x0195: return "MSChapSrvChangePassword2";
+ case 0x0198: return "MakeAbsoluteSD";
+ case 0x0197: return "MakeAbsoluteSD2";
+ case 0x0199: return "MakeSelfRelativeSD";
+ case 0x019a: return "MapGenericMask";
+ case 0x019b: return "NotifyBootConfigStatus";
+ case 0x019c: return "NotifyChangeEventLog";
+ case 0x019d: return "ObjectCloseAuditAlarmA";
+ case 0x019e: return "ObjectCloseAuditAlarmW";
+ case 0x019f: return "ObjectDeleteAuditAlarmA";
+ case 0x01a0: return "ObjectDeleteAuditAlarmW";
+ case 0x01a1: return "ObjectOpenAuditAlarmA";
+ case 0x01a2: return "ObjectOpenAuditAlarmW";
+ case 0x01a3: return "ObjectPrivilegeAuditAlarmA";
+ case 0x01a4: return "ObjectPrivilegeAuditAlarmW";
+ case 0x01a5: return "OpenBackupEventLogA";
+ case 0x01a6: return "OpenBackupEventLogW";
+ case 0x01a7: return "OpenEncryptedFileRawA";
+ case 0x01a8: return "OpenEncryptedFileRawW";
+ case 0x01a9: return "OpenEventLogA";
+ case 0x01aa: return "OpenEventLogW";
+ case 0x01ab: return "OpenProcessToken";
+ case 0x01ac: return "OpenSCManagerA";
+ case 0x01ad: return "OpenSCManagerW";
+ case 0x01ae: return "OpenServiceA";
+ case 0x01af: return "OpenServiceW";
+ case 0x01b0: return "OpenThreadToken";
+ case 0x01b1: return "OpenTraceA";
+ case 0x01b2: return "OpenTraceW";
+ case 0x01b3: return "PrivilegeCheck";
+ case 0x01b4: return "PrivilegedServiceAuditAlarmA";
+ case 0x01b5: return "PrivilegedServiceAuditAlarmW";
+ case 0x01b6: return "ProcessIdleTasks";
+ case 0x01b7: return "ProcessTrace";
+ case 0x01b8: return "QueryAllTracesA";
+ case 0x01b9: return "QueryAllTracesW";
+ case 0x01ba: return "QueryRecoveryAgentsOnEncryptedFile";
+ case 0x01bb: return "QueryServiceConfig2A";
+ case 0x01bc: return "QueryServiceConfig2W";
+ case 0x01bd: return "QueryServiceConfigA";
+ case 0x01be: return "QueryServiceConfigW";
+ case 0x01bf: return "QueryServiceLockStatusA";
+ case 0x01c0: return "QueryServiceLockStatusW";
+ case 0x01c1: return "QueryServiceObjectSecurity";
+ case 0x01c2: return "QueryServiceStatus";
+ case 0x01c3: return "QueryServiceStatusEx";
+ case 0x01c4: return "QueryTraceA";
+ case 0x01c5: return "QueryTraceW";
+ case 0x01c6: return "QueryUsersOnEncryptedFile";
+ case 0x01c7: return "QueryWindows31FilesMigration";
+ case 0x01c8: return "ReadEncryptedFileRaw";
+ case 0x01c9: return "ReadEventLogA";
+ case 0x01ca: return "ReadEventLogW";
+ case 0x01cb: return "RegCloseKey";
+ case 0x01cc: return "RegConnectRegistryA";
+ case 0x01cd: return "RegConnectRegistryW";
+ case 0x01ce: return "RegCreateKeyA";
+ case 0x01cf: return "RegCreateKeyExA";
+ case 0x01d0: return "RegCreateKeyExW";
+ case 0x01d1: return "RegCreateKeyW";
+ case 0x01d2: return "RegDeleteKeyA";
+ case 0x01d3: return "RegDeleteKeyW";
+ case 0x01d4: return "RegDeleteValueA";
+ case 0x01d5: return "RegDeleteValueW";
+ case 0x01d6: return "RegDisablePredefinedCache";
+ case 0x01d7: return "RegEnumKeyA";
+ case 0x01d8: return "RegEnumKeyExA";
+ case 0x01d9: return "RegEnumKeyExW";
+ case 0x01da: return "RegEnumKeyW";
+ case 0x01db: return "RegEnumValueA";
+ case 0x01dc: return "RegEnumValueW";
+ case 0x01dd: return "RegFlushKey";
+ case 0x01de: return "RegGetKeySecurity";
+ case 0x01df: return "RegLoadKeyA";
+ case 0x01e0: return "RegLoadKeyW";
+ case 0x01e1: return "RegNotifyChangeKeyValue";
+ case 0x01e2: return "RegOpenCurrentUser";
+ case 0x01e3: return "RegOpenKeyA";
+ case 0x01e4: return "RegOpenKeyExA";
+ case 0x01e5: return "RegOpenKeyExW";
+ case 0x01e6: return "RegOpenKeyW";
+ case 0x01e7: return "RegOpenUserClassesRoot";
+ case 0x01e8: return "RegOverridePredefKey";
+ case 0x01e9: return "RegQueryInfoKeyA";
+ case 0x01ea: return "RegQueryInfoKeyW";
+ case 0x01eb: return "RegQueryMultipleValuesA";
+ case 0x01ec: return "RegQueryMultipleValuesW";
+ case 0x01ed: return "RegQueryValueA";
+ case 0x01ee: return "RegQueryValueExA";
+ case 0x01ef: return "RegQueryValueExW";
+ case 0x01f0: return "RegQueryValueW";
+ case 0x01f1: return "RegReplaceKeyA";
+ case 0x01f2: return "RegReplaceKeyW";
+ case 0x01f3: return "RegRestoreKeyA";
+ case 0x01f4: return "RegRestoreKeyW";
+ case 0x01f5: return "RegSaveKeyA";
+ case 0x01f6: return "RegSaveKeyExA";
+ case 0x01f7: return "RegSaveKeyExW";
+ case 0x01f8: return "RegSaveKeyW";
+ case 0x01f9: return "RegSetKeySecurity";
+ case 0x01fa: return "RegSetValueA";
+ case 0x01fb: return "RegSetValueExA";
+ case 0x01fc: return "RegSetValueExW";
+ case 0x01fd: return "RegSetValueW";
+ case 0x01fe: return "RegUnLoadKeyA";
+ case 0x01ff: return "RegUnLoadKeyW";
+ case 0x0200: return "RegisterEventSourceA";
+ case 0x0201: return "RegisterEventSourceW";
+ case 0x0202: return "RegisterIdleTask";
+ case 0x0203: return "RegisterServiceCtrlHandlerA";
+ case 0x0204: return "RegisterServiceCtrlHandlerExA";
+ case 0x0205: return "RegisterServiceCtrlHandlerExW";
+ case 0x0206: return "RegisterServiceCtrlHandlerW";
+ case 0x0207: return "RegisterTraceGuidsA";
+ case 0x0208: return "RegisterTraceGuidsW";
+ case 0x0209: return "RemoveTraceCallback";
+ case 0x020a: return "RemoveUsersFromEncryptedFile";
+ case 0x020b: return "ReportEventA";
+ case 0x020c: return "ReportEventW";
+ case 0x020d: return "RevertToSelf";
+ case 0x020e: return "SaferCloseLevel";
+ case 0x020f: return "SaferComputeTokenFromLevel";
+ case 0x0210: return "SaferCreateLevel";
+ case 0x0211: return "SaferGetLevelInformation";
+ case 0x0212: return "SaferGetPolicyInformation";
+ case 0x0213: return "SaferIdentifyLevel";
+ case 0x0214: return "SaferRecordEventLogEntry";
+ case 0x0215: return "SaferSetLevelInformation";
+ case 0x0216: return "SaferSetPolicyInformation";
+ case 0x0217: return "SaferiChangeRegistryScope";
+ case 0x0218: return "SaferiCompareTokenLevels";
+ case 0x0219: return "SaferiIsExecutableFileType";
+ case 0x021a: return "SaferiPopulateDefaultsInRegistry";
+ case 0x021b: return "SaferiRecordEventLogEntry";
+ case 0x021c: return "SaferiReplaceProcessThreadTokens";
+ case 0x021d: return "SaferiSearchMatchingHashRules";
+ case 0x021e: return "SetAclInformation";
+ case 0x021f: return "SetEntriesInAccessListA";
+ case 0x0220: return "SetEntriesInAccessListW";
+ case 0x0221: return "SetEntriesInAclA";
+ case 0x0222: return "SetEntriesInAclW";
+ case 0x0223: return "SetEntriesInAuditListA";
+ case 0x0224: return "SetEntriesInAuditListW";
+ case 0x0225: return "SetFileSecurityA";
+ case 0x0226: return "SetFileSecurityW";
+ case 0x0227: return "SetInformationCodeAuthzLevelW";
+ case 0x0228: return "SetInformationCodeAuthzPolicyW";
+ case 0x0229: return "SetKernelObjectSecurity";
+ case 0x022a: return "SetNamedSecurityInfoA";
+ case 0x022b: return "SetNamedSecurityInfoExA";
+ case 0x022c: return "SetNamedSecurityInfoExW";
+ case 0x022d: return "SetNamedSecurityInfoW";
+ case 0x022e: return "SetPrivateObjectSecurity";
+ case 0x022f: return "SetPrivateObjectSecurityEx";
+ case 0x0230: return "SetSecurityDescriptorControl";
+ case 0x0231: return "SetSecurityDescriptorDacl";
+ case 0x0232: return "SetSecurityDescriptorGroup";
+ case 0x0233: return "SetSecurityDescriptorOwner";
+ case 0x0234: return "SetSecurityDescriptorRMControl";
+ case 0x0235: return "SetSecurityDescriptorSacl";
+ case 0x0236: return "SetSecurityInfo";
+ case 0x0237: return "SetSecurityInfoExA";
+ case 0x0238: return "SetSecurityInfoExW";
+ case 0x0239: return "SetServiceBits";
+ case 0x023a: return "SetServiceObjectSecurity";
+ case 0x023b: return "SetServiceStatus";
+ case 0x023c: return "SetThreadToken";
+ case 0x023d: return "SetTokenInformation";
+ case 0x023e: return "SetTraceCallback";
+ case 0x023f: return "SetUserFileEncryptionKey";
+ case 0x0240: return "StartServiceA";
+ case 0x0241: return "StartServiceCtrlDispatcherA";
+ case 0x0242: return "StartServiceCtrlDispatcherW";
+ case 0x0243: return "StartServiceW";
+ case 0x0244: return "StartTraceA";
+ case 0x0245: return "StartTraceW";
+ case 0x0246: return "StopTraceA";
+ case 0x0247: return "StopTraceW";
+ case 0x0248: return "SynchronizeWindows31FilesAndWindowsNTRegistry";
+ case 0x0249: return "SystemFunction001";
+ case 0x024a: return "SystemFunction002";
+ case 0x024b: return "SystemFunction003";
+ case 0x024c: return "SystemFunction004";
+ case 0x024d: return "SystemFunction005";
+ case 0x024e: return "SystemFunction006";
+ case 0x024f: return "SystemFunction007";
+ case 0x0250: return "SystemFunction008";
+ case 0x0251: return "SystemFunction009";
+ case 0x0252: return "SystemFunction010";
+ case 0x0253: return "SystemFunction011";
+ case 0x0254: return "SystemFunction012";
+ case 0x0255: return "SystemFunction013";
+ case 0x0256: return "SystemFunction014";
+ case 0x0257: return "SystemFunction015";
+ case 0x0258: return "SystemFunction016";
+ case 0x0259: return "SystemFunction017";
+ case 0x025a: return "SystemFunction018";
+ case 0x025b: return "SystemFunction019";
+ case 0x025c: return "SystemFunction020";
+ case 0x025d: return "SystemFunction021";
+ case 0x025e: return "SystemFunction022";
+ case 0x025f: return "SystemFunction023";
+ case 0x0260: return "SystemFunction024";
+ case 0x0261: return "SystemFunction025";
+ case 0x0262: return "SystemFunction026";
+ case 0x0263: return "SystemFunction027";
+ case 0x0264: return "SystemFunction028";
+ case 0x0265: return "SystemFunction029";
+ case 0x0266: return "SystemFunction030";
+ case 0x0267: return "SystemFunction031";
+ case 0x0268: return "SystemFunction032";
+ case 0x0269: return "SystemFunction033";
+ case 0x026a: return "SystemFunction034";
+ case 0x026b: return "SystemFunction035";
+ case 0x026c: return "SystemFunction036";
+ case 0x026d: return "SystemFunction040";
+ case 0x026e: return "SystemFunction041";
+ case 0x026f: return "TraceEvent";
+ case 0x0270: return "TraceEventInstance";
+ case 0x0271: return "TraceMessage";
+ case 0x0272: return "TraceMessageVa";
+ case 0x0273: return "TreeResetNamedSecurityInfoA";
+ case 0x0274: return "TreeResetNamedSecurityInfoW";
+ case 0x0275: return "TrusteeAccessToObjectA";
+ case 0x0276: return "TrusteeAccessToObjectW";
+ case 0x0277: return "UninstallApplication";
+ case 0x0278: return "UnlockServiceDatabase";
+ case 0x0279: return "UnregisterIdleTask";
+ case 0x027a: return "UnregisterTraceGuids";
+ case 0x027b: return "UpdateTraceA";
+ case 0x027c: return "UpdateTraceW";
+ case 0x027d: return "WdmWmiServiceMain";
+ case 0x027e: return "WmiCloseBlock";
+ case 0x027f: return "WmiCloseTraceWithCursor";
+ case 0x0280: return "WmiConvertTimestamp";
+ case 0x0281: return "WmiDevInstToInstanceNameA";
+ case 0x0282: return "WmiDevInstToInstanceNameW";
+ case 0x0283: return "WmiEnumerateGuids";
+ case 0x0284: return "WmiExecuteMethodA";
+ case 0x0285: return "WmiExecuteMethodW";
+ case 0x0286: return "WmiFileHandleToInstanceNameA";
+ case 0x0287: return "WmiFileHandleToInstanceNameW";
+ case 0x0288: return "WmiFreeBuffer";
+ case 0x0289: return "WmiGetFirstTraceOffset";
+ case 0x028a: return "WmiGetNextEvent";
+ case 0x028b: return "WmiGetTraceHeader";
+ case 0x028c: return "WmiMofEnumerateResourcesA";
+ case 0x028d: return "WmiMofEnumerateResourcesW";
+ case 0x028e: return "WmiNotificationRegistrationA";
+ case 0x028f: return "WmiNotificationRegistrationW";
+ case 0x0290: return "WmiOpenBlock";
+ case 0x0291: return "WmiOpenTraceWithCursor";
+ case 0x0292: return "WmiParseTraceEvent";
+ case 0x0293: return "WmiQueryAllDataA";
+ case 0x0294: return "WmiQueryAllDataMultipleA";
+ case 0x0295: return "WmiQueryAllDataMultipleW";
+ case 0x0296: return "WmiQueryAllDataW";
+ case 0x0297: return "WmiQueryGuidInformation";
+ case 0x0298: return "WmiQuerySingleInstanceA";
+ case 0x0299: return "WmiQuerySingleInstanceMultipleA";
+ case 0x029a: return "WmiQuerySingleInstanceMultipleW";
+ case 0x029b: return "WmiQuerySingleInstanceW";
+ case 0x029c: return "WmiReceiveNotificationsA";
+ case 0x029d: return "WmiReceiveNotificationsW";
+ case 0x029e: return "WmiSetSingleInstanceA";
+ case 0x029f: return "WmiSetSingleInstanceW";
+ case 0x02a0: return "WmiSetSingleItemA";
+ case 0x02a1: return "WmiSetSingleItemW";
+ case 0x02a2: return "Wow64Win32ApiEntry";
+ case 0x02a3: return "WriteEncryptedFileRaw";
+ }
+ return nullptr;
+}
}
diff --git a/src/PE/utils/ordinals_lookup_tables/comctl32_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/comctl32_dll_lookup.hpp
index 0c14ba4c..db601e3c 100644
--- a/src/PE/utils/ordinals_lookup_tables/comctl32_dll_lookup.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/comctl32_dll_lookup.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,161 +16,163 @@
#ifndef LIEF_PE_COMCTL32_DLL_LOOKUP_H_
#define LIEF_PE_COMCTL32_DLL_LOOKUP_H_
-#include <map>
namespace LIEF {
namespace PE {
-static const std::map<uint32_t, const char*> comctl32_dll_lookup {
- { 0x0191, "AddMRUStringW" },
- { 0x00cf, "AttachScrollBars" },
- { 0x00d2, "CCEnableScrollBar" },
- { 0x00d1, "CCGetScrollInfo" },
- { 0x00d0, "CCSetScrollInfo" },
- { 0x0190, "CreateMRUListW" },
- { 0x0008, "CreateMappedBitmap" },
- { 0x000c, "CreatePropertySheetPage" },
- { 0x0013, "CreatePropertySheetPageA" },
- { 0x0014, "CreatePropertySheetPageW" },
- { 0x0015, "CreateStatusWindow" },
- { 0x0006, "CreateStatusWindowA" },
- { 0x0016, "CreateStatusWindowW" },
- { 0x0007, "CreateToolbar" },
- { 0x0017, "CreateToolbarEx" },
- { 0x0010, "CreateUpDownControl" },
- { 0x014b, "DPA_Clone" },
- { 0x0148, "DPA_Create" },
- { 0x0154, "DPA_CreateEx" },
- { 0x0151, "DPA_DeleteAllPtrs" },
- { 0x0150, "DPA_DeletePtr" },
- { 0x0149, "DPA_Destroy" },
- { 0x0182, "DPA_DestroyCallback" },
- { 0x0181, "DPA_EnumCallback" },
- { 0x014c, "DPA_GetPtr" },
- { 0x014d, "DPA_GetPtrIndex" },
- { 0x015b, "DPA_GetSize" },
- { 0x014a, "DPA_Grow" },
- { 0x014e, "DPA_InsertPtr" },
- { 0x0009, "DPA_LoadStream" },
- { 0x000b, "DPA_Merge" },
- { 0x000a, "DPA_SaveStream" },
- { 0x0153, "DPA_Search" },
- { 0x014f, "DPA_SetPtr" },
- { 0x0152, "DPA_Sort" },
- { 0x0157, "DSA_Clone" },
- { 0x0140, "DSA_Create" },
- { 0x0147, "DSA_DeleteAllItems" },
- { 0x0146, "DSA_DeleteItem" },
- { 0x0141, "DSA_Destroy" },
- { 0x0184, "DSA_DestroyCallback" },
- { 0x0183, "DSA_EnumCallback" },
- { 0x0142, "DSA_GetItem" },
- { 0x0143, "DSA_GetItemPtr" },
- { 0x015c, "DSA_GetSize" },
- { 0x0144, "DSA_InsertItem" },
- { 0x0145, "DSA_SetItem" },
- { 0x015a, "DSA_Sort" },
- { 0x019d, "DefSubclassProc" },
- { 0x0018, "DestroyPropertySheetPage" },
- { 0x00ce, "DetachScrollBars" },
- { 0x0019, "DllGetVersion" },
- { 0x001a, "DllInstall" },
- { 0x000f, "DrawInsert" },
- { 0x00c9, "DrawScrollBar" },
- { 0x001b, "DrawShadowText" },
- { 0x00c8, "DrawSizeBox" },
- { 0x001c, "DrawStatusText" },
- { 0x0005, "DrawStatusTextA" },
- { 0x001d, "DrawStatusTextW" },
- { 0x0193, "EnumMRUListW" },
- { 0x001e, "FlatSB_EnableScrollBar" },
- { 0x001f, "FlatSB_GetScrollInfo" },
- { 0x0020, "FlatSB_GetScrollPos" },
- { 0x0021, "FlatSB_GetScrollProp" },
- { 0x0022, "FlatSB_GetScrollPropPtr" },
- { 0x0023, "FlatSB_GetScrollRange" },
- { 0x0024, "FlatSB_SetScrollInfo" },
- { 0x0025, "FlatSB_SetScrollPos" },
- { 0x0026, "FlatSB_SetScrollProp" },
- { 0x0027, "FlatSB_SetScrollRange" },
- { 0x0028, "FlatSB_ShowScrollBar" },
- { 0x0098, "FreeMRUList" },
- { 0x0004, "GetEffectiveClientRect" },
- { 0x0029, "GetMUILanguage" },
- { 0x019b, "GetWindowSubclass" },
- { 0x002a, "HIMAGELIST_QueryInterface" },
- { 0x00cd, "HandleScrollCmd" },
- { 0x002b, "ImageList_Add" },
- { 0x002c, "ImageList_AddIcon" },
- { 0x002d, "ImageList_AddMasked" },
- { 0x002e, "ImageList_BeginDrag" },
- { 0x002f, "ImageList_CoCreateInstance" },
- { 0x0030, "ImageList_Copy" },
- { 0x0031, "ImageList_Create" },
- { 0x0032, "ImageList_Destroy" },
- { 0x0033, "ImageList_DestroyShared" },
- { 0x0034, "ImageList_DragEnter" },
- { 0x0035, "ImageList_DragLeave" },
- { 0x0036, "ImageList_DragMove" },
- { 0x0037, "ImageList_DragShowNolock" },
- { 0x0038, "ImageList_Draw" },
- { 0x0039, "ImageList_DrawEx" },
- { 0x003a, "ImageList_DrawIndirect" },
- { 0x003b, "ImageList_Duplicate" },
- { 0x003c, "ImageList_EndDrag" },
- { 0x003d, "ImageList_GetBkColor" },
- { 0x003e, "ImageList_GetDragImage" },
- { 0x003f, "ImageList_GetFlags" },
- { 0x0040, "ImageList_GetIcon" },
- { 0x0041, "ImageList_GetIconSize" },
- { 0x0042, "ImageList_GetImageCount" },
- { 0x0043, "ImageList_GetImageInfo" },
- { 0x0044, "ImageList_GetImageRect" },
- { 0x0045, "ImageList_LoadImage" },
- { 0x0046, "ImageList_LoadImageA" },
- { 0x004b, "ImageList_LoadImageW" },
- { 0x004c, "ImageList_Merge" },
- { 0x004d, "ImageList_Read" },
- { 0x004e, "ImageList_ReadEx" },
- { 0x004f, "ImageList_Remove" },
- { 0x0050, "ImageList_Replace" },
- { 0x0051, "ImageList_ReplaceIcon" },
- { 0x0052, "ImageList_Resize" },
- { 0x0053, "ImageList_SetBkColor" },
- { 0x0054, "ImageList_SetDragCursorImage" },
- { 0x0055, "ImageList_SetFilter" },
- { 0x0056, "ImageList_SetFlags" },
- { 0x0057, "ImageList_SetIconSize" },
- { 0x0058, "ImageList_SetImageCount" },
- { 0x0059, "ImageList_SetOverlayImage" },
- { 0x005a, "ImageList_Write" },
- { 0x005b, "ImageList_WriteEx" },
- { 0x0011, "InitCommonControls" },
- { 0x005c, "InitCommonControlsEx" },
- { 0x005d, "InitMUILanguage" },
- { 0x005e, "InitializeFlatSB" },
- { 0x000e, "LBItemFromPt" },
- { 0x017c, "LoadIconMetric" },
- { 0x017d, "LoadIconWithScaleDown" },
- { 0x000d, "MakeDragList" },
- { 0x0002, "MenuHelp" },
- { 0x005f, "PropertySheet" },
- { 0x0060, "PropertySheetA" },
- { 0x0061, "PropertySheetW" },
- { 0x018a, "QuerySystemGestureStatus" },
- { 0x0062, "RegisterClassNameW" },
- { 0x019c, "RemoveWindowSubclass" },
- { 0x00cc, "ScrollBar_Menu" },
- { 0x00cb, "ScrollBar_MouseMove" },
- { 0x019a, "SetWindowSubclass" },
- { 0x0003, "ShowHideMenuCtl" },
- { 0x00ca, "SizeBoxHwnd" },
- { 0x00ec, "Str_SetPtrW" },
- { 0x0158, "TaskDialog" },
- { 0x0159, "TaskDialogIndirect" },
- { 0x0063, "UninitializeFlatSB" },
- { 0x0064, "_TrackMouseEvent" },
-};
+const char* comctl32_dll_lookup(uint32_t i) {
+ switch(i) {
+ case 0x0191: return "AddMRUStringW";
+ case 0x00cf: return "AttachScrollBars";
+ case 0x00d2: return "CCEnableScrollBar";
+ case 0x00d1: return "CCGetScrollInfo";
+ case 0x00d0: return "CCSetScrollInfo";
+ case 0x0190: return "CreateMRUListW";
+ case 0x0008: return "CreateMappedBitmap";
+ case 0x000c: return "CreatePropertySheetPage";
+ case 0x0013: return "CreatePropertySheetPageA";
+ case 0x0014: return "CreatePropertySheetPageW";
+ case 0x0015: return "CreateStatusWindow";
+ case 0x0006: return "CreateStatusWindowA";
+ case 0x0016: return "CreateStatusWindowW";
+ case 0x0007: return "CreateToolbar";
+ case 0x0017: return "CreateToolbarEx";
+ case 0x0010: return "CreateUpDownControl";
+ case 0x014b: return "DPA_Clone";
+ case 0x0148: return "DPA_Create";
+ case 0x0154: return "DPA_CreateEx";
+ case 0x0151: return "DPA_DeleteAllPtrs";
+ case 0x0150: return "DPA_DeletePtr";
+ case 0x0149: return "DPA_Destroy";
+ case 0x0182: return "DPA_DestroyCallback";
+ case 0x0181: return "DPA_EnumCallback";
+ case 0x014c: return "DPA_GetPtr";
+ case 0x014d: return "DPA_GetPtrIndex";
+ case 0x015b: return "DPA_GetSize";
+ case 0x014a: return "DPA_Grow";
+ case 0x014e: return "DPA_InsertPtr";
+ case 0x0009: return "DPA_LoadStream";
+ case 0x000b: return "DPA_Merge";
+ case 0x000a: return "DPA_SaveStream";
+ case 0x0153: return "DPA_Search";
+ case 0x014f: return "DPA_SetPtr";
+ case 0x0152: return "DPA_Sort";
+ case 0x0157: return "DSA_Clone";
+ case 0x0140: return "DSA_Create";
+ case 0x0147: return "DSA_DeleteAllItems";
+ case 0x0146: return "DSA_DeleteItem";
+ case 0x0141: return "DSA_Destroy";
+ case 0x0184: return "DSA_DestroyCallback";
+ case 0x0183: return "DSA_EnumCallback";
+ case 0x0142: return "DSA_GetItem";
+ case 0x0143: return "DSA_GetItemPtr";
+ case 0x015c: return "DSA_GetSize";
+ case 0x0144: return "DSA_InsertItem";
+ case 0x0145: return "DSA_SetItem";
+ case 0x015a: return "DSA_Sort";
+ case 0x019d: return "DefSubclassProc";
+ case 0x0018: return "DestroyPropertySheetPage";
+ case 0x00ce: return "DetachScrollBars";
+ case 0x0019: return "DllGetVersion";
+ case 0x001a: return "DllInstall";
+ case 0x000f: return "DrawInsert";
+ case 0x00c9: return "DrawScrollBar";
+ case 0x001b: return "DrawShadowText";
+ case 0x00c8: return "DrawSizeBox";
+ case 0x001c: return "DrawStatusText";
+ case 0x0005: return "DrawStatusTextA";
+ case 0x001d: return "DrawStatusTextW";
+ case 0x0193: return "EnumMRUListW";
+ case 0x001e: return "FlatSB_EnableScrollBar";
+ case 0x001f: return "FlatSB_GetScrollInfo";
+ case 0x0020: return "FlatSB_GetScrollPos";
+ case 0x0021: return "FlatSB_GetScrollProp";
+ case 0x0022: return "FlatSB_GetScrollPropPtr";
+ case 0x0023: return "FlatSB_GetScrollRange";
+ case 0x0024: return "FlatSB_SetScrollInfo";
+ case 0x0025: return "FlatSB_SetScrollPos";
+ case 0x0026: return "FlatSB_SetScrollProp";
+ case 0x0027: return "FlatSB_SetScrollRange";
+ case 0x0028: return "FlatSB_ShowScrollBar";
+ case 0x0098: return "FreeMRUList";
+ case 0x0004: return "GetEffectiveClientRect";
+ case 0x0029: return "GetMUILanguage";
+ case 0x019b: return "GetWindowSubclass";
+ case 0x002a: return "HIMAGELIST_QueryInterface";
+ case 0x00cd: return "HandleScrollCmd";
+ case 0x002b: return "ImageList_Add";
+ case 0x002c: return "ImageList_AddIcon";
+ case 0x002d: return "ImageList_AddMasked";
+ case 0x002e: return "ImageList_BeginDrag";
+ case 0x002f: return "ImageList_CoCreateInstance";
+ case 0x0030: return "ImageList_Copy";
+ case 0x0031: return "ImageList_Create";
+ case 0x0032: return "ImageList_Destroy";
+ case 0x0033: return "ImageList_DestroyShared";
+ case 0x0034: return "ImageList_DragEnter";
+ case 0x0035: return "ImageList_DragLeave";
+ case 0x0036: return "ImageList_DragMove";
+ case 0x0037: return "ImageList_DragShowNolock";
+ case 0x0038: return "ImageList_Draw";
+ case 0x0039: return "ImageList_DrawEx";
+ case 0x003a: return "ImageList_DrawIndirect";
+ case 0x003b: return "ImageList_Duplicate";
+ case 0x003c: return "ImageList_EndDrag";
+ case 0x003d: return "ImageList_GetBkColor";
+ case 0x003e: return "ImageList_GetDragImage";
+ case 0x003f: return "ImageList_GetFlags";
+ case 0x0040: return "ImageList_GetIcon";
+ case 0x0041: return "ImageList_GetIconSize";
+ case 0x0042: return "ImageList_GetImageCount";
+ case 0x0043: return "ImageList_GetImageInfo";
+ case 0x0044: return "ImageList_GetImageRect";
+ case 0x0045: return "ImageList_LoadImage";
+ case 0x0046: return "ImageList_LoadImageA";
+ case 0x004b: return "ImageList_LoadImageW";
+ case 0x004c: return "ImageList_Merge";
+ case 0x004d: return "ImageList_Read";
+ case 0x004e: return "ImageList_ReadEx";
+ case 0x004f: return "ImageList_Remove";
+ case 0x0050: return "ImageList_Replace";
+ case 0x0051: return "ImageList_ReplaceIcon";
+ case 0x0052: return "ImageList_Resize";
+ case 0x0053: return "ImageList_SetBkColor";
+ case 0x0054: return "ImageList_SetDragCursorImage";
+ case 0x0055: return "ImageList_SetFilter";
+ case 0x0056: return "ImageList_SetFlags";
+ case 0x0057: return "ImageList_SetIconSize";
+ case 0x0058: return "ImageList_SetImageCount";
+ case 0x0059: return "ImageList_SetOverlayImage";
+ case 0x005a: return "ImageList_Write";
+ case 0x005b: return "ImageList_WriteEx";
+ case 0x0011: return "InitCommonControls";
+ case 0x005c: return "InitCommonControlsEx";
+ case 0x005d: return "InitMUILanguage";
+ case 0x005e: return "InitializeFlatSB";
+ case 0x000e: return "LBItemFromPt";
+ case 0x017c: return "LoadIconMetric";
+ case 0x017d: return "LoadIconWithScaleDown";
+ case 0x000d: return "MakeDragList";
+ case 0x0002: return "MenuHelp";
+ case 0x005f: return "PropertySheet";
+ case 0x0060: return "PropertySheetA";
+ case 0x0061: return "PropertySheetW";
+ case 0x018a: return "QuerySystemGestureStatus";
+ case 0x0062: return "RegisterClassNameW";
+ case 0x019c: return "RemoveWindowSubclass";
+ case 0x00cc: return "ScrollBar_Menu";
+ case 0x00cb: return "ScrollBar_MouseMove";
+ case 0x019a: return "SetWindowSubclass";
+ case 0x0003: return "ShowHideMenuCtl";
+ case 0x00ca: return "SizeBoxHwnd";
+ case 0x00ec: return "Str_SetPtrW";
+ case 0x0158: return "TaskDialog";
+ case 0x0159: return "TaskDialogIndirect";
+ case 0x0063: return "UninitializeFlatSB";
+ case 0x0064: return "_TrackMouseEvent";
+ }
+ return nullptr;
+}
}
diff --git a/src/PE/utils/ordinals_lookup_tables/gdi32_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/gdi32_dll_lookup.hpp
index 0d0a159b..9424dcaf 100644
--- a/src/PE/utils/ordinals_lookup_tables/gdi32_dll_lookup.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/gdi32_dll_lookup.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,622 +16,624 @@
#ifndef LIEF_PE_GDI32_DLL_LOOKUP_H_
#define LIEF_PE_GDI32_DLL_LOOKUP_H_
-#include <map>
namespace LIEF {
namespace PE {
-static const std::map<uint32_t, const char*> gdi32_dll_lookup {
- { 0x0001, "AbortDoc" },
- { 0x0002, "AbortPath" },
- { 0x0003, "AddFontMemResourceEx" },
- { 0x0004, "AddFontResourceA" },
- { 0x0005, "AddFontResourceExA" },
- { 0x0006, "AddFontResourceExW" },
- { 0x0007, "AddFontResourceTracking" },
- { 0x0008, "AddFontResourceW" },
- { 0x0009, "AngleArc" },
- { 0x000a, "AnimatePalette" },
- { 0x000b, "AnyLinkedFonts" },
- { 0x000c, "Arc" },
- { 0x000d, "ArcTo" },
- { 0x000e, "BRUSHOBJ_hGetColorTransform" },
- { 0x000f, "BRUSHOBJ_pvAllocRbrush" },
- { 0x0010, "BRUSHOBJ_pvGetRbrush" },
- { 0x0011, "BRUSHOBJ_ulGetBrushColor" },
- { 0x0012, "BeginPath" },
- { 0x0013, "BitBlt" },
- { 0x0014, "CLIPOBJ_bEnum" },
- { 0x0015, "CLIPOBJ_cEnumStart" },
- { 0x0016, "CLIPOBJ_ppoGetPath" },
- { 0x0017, "CancelDC" },
- { 0x0018, "CheckColorsInGamut" },
- { 0x0019, "ChoosePixelFormat" },
- { 0x001a, "Chord" },
- { 0x001b, "ClearBitmapAttributes" },
- { 0x001c, "ClearBrushAttributes" },
- { 0x001d, "CloseEnhMetaFile" },
- { 0x001e, "CloseFigure" },
- { 0x001f, "CloseMetaFile" },
- { 0x0020, "ColorCorrectPalette" },
- { 0x0021, "ColorMatchToTarget" },
- { 0x0022, "CombineRgn" },
- { 0x0023, "CombineTransform" },
- { 0x0024, "CopyEnhMetaFileA" },
- { 0x0025, "CopyEnhMetaFileW" },
- { 0x0026, "CopyMetaFileA" },
- { 0x0027, "CopyMetaFileW" },
- { 0x0028, "CreateBitmap" },
- { 0x0029, "CreateBitmapIndirect" },
- { 0x002a, "CreateBrushIndirect" },
- { 0x002b, "CreateColorSpaceA" },
- { 0x002c, "CreateColorSpaceW" },
- { 0x002d, "CreateCompatibleBitmap" },
- { 0x002e, "CreateCompatibleDC" },
- { 0x002f, "CreateDCA" },
- { 0x0030, "CreateDCW" },
- { 0x0031, "CreateDIBPatternBrush" },
- { 0x0032, "CreateDIBPatternBrushPt" },
- { 0x0033, "CreateDIBSection" },
- { 0x0034, "CreateDIBitmap" },
- { 0x0035, "CreateDiscardableBitmap" },
- { 0x0036, "CreateEllipticRgn" },
- { 0x0037, "CreateEllipticRgnIndirect" },
- { 0x0038, "CreateEnhMetaFileA" },
- { 0x0039, "CreateEnhMetaFileW" },
- { 0x003a, "CreateFontA" },
- { 0x003b, "CreateFontIndirectA" },
- { 0x003c, "CreateFontIndirectExA" },
- { 0x003d, "CreateFontIndirectExW" },
- { 0x003e, "CreateFontIndirectW" },
- { 0x003f, "CreateFontW" },
- { 0x0040, "CreateHalftonePalette" },
- { 0x0041, "CreateHatchBrush" },
- { 0x0042, "CreateICA" },
- { 0x0043, "CreateICW" },
- { 0x0044, "CreateMetaFileA" },
- { 0x0045, "CreateMetaFileW" },
- { 0x0046, "CreatePalette" },
- { 0x0047, "CreatePatternBrush" },
- { 0x0048, "CreatePen" },
- { 0x0049, "CreatePenIndirect" },
- { 0x004a, "CreatePolyPolygonRgn" },
- { 0x004b, "CreatePolygonRgn" },
- { 0x004c, "CreateRectRgn" },
- { 0x004d, "CreateRectRgnIndirect" },
- { 0x004e, "CreateRoundRectRgn" },
- { 0x004f, "CreateScalableFontResourceA" },
- { 0x0050, "CreateScalableFontResourceW" },
- { 0x0051, "CreateSolidBrush" },
- { 0x0052, "DPtoLP" },
- { 0x0053, "DdEntry0" },
- { 0x005e, "DdEntry1" },
- { 0x0054, "DdEntry10" },
- { 0x0055, "DdEntry11" },
- { 0x0056, "DdEntry12" },
- { 0x0057, "DdEntry13" },
- { 0x0058, "DdEntry14" },
- { 0x0059, "DdEntry15" },
- { 0x005a, "DdEntry16" },
- { 0x005b, "DdEntry17" },
- { 0x005c, "DdEntry18" },
- { 0x005d, "DdEntry19" },
- { 0x0069, "DdEntry2" },
- { 0x005f, "DdEntry20" },
- { 0x0060, "DdEntry21" },
- { 0x0061, "DdEntry22" },
- { 0x0062, "DdEntry23" },
- { 0x0063, "DdEntry24" },
- { 0x0064, "DdEntry25" },
- { 0x0065, "DdEntry26" },
- { 0x0066, "DdEntry27" },
- { 0x0067, "DdEntry28" },
- { 0x0068, "DdEntry29" },
- { 0x0074, "DdEntry3" },
- { 0x006a, "DdEntry30" },
- { 0x006b, "DdEntry31" },
- { 0x006c, "DdEntry32" },
- { 0x006d, "DdEntry33" },
- { 0x006e, "DdEntry34" },
- { 0x006f, "DdEntry35" },
- { 0x0070, "DdEntry36" },
- { 0x0071, "DdEntry37" },
- { 0x0072, "DdEntry38" },
- { 0x0073, "DdEntry39" },
- { 0x007f, "DdEntry4" },
- { 0x0075, "DdEntry40" },
- { 0x0076, "DdEntry41" },
- { 0x0077, "DdEntry42" },
- { 0x0078, "DdEntry43" },
- { 0x0079, "DdEntry44" },
- { 0x007a, "DdEntry45" },
- { 0x007b, "DdEntry46" },
- { 0x007c, "DdEntry47" },
- { 0x007d, "DdEntry48" },
- { 0x007e, "DdEntry49" },
- { 0x0087, "DdEntry5" },
- { 0x0080, "DdEntry50" },
- { 0x0081, "DdEntry51" },
- { 0x0082, "DdEntry52" },
- { 0x0083, "DdEntry53" },
- { 0x0084, "DdEntry54" },
- { 0x0085, "DdEntry55" },
- { 0x0086, "DdEntry56" },
- { 0x0088, "DdEntry6" },
- { 0x0089, "DdEntry7" },
- { 0x008a, "DdEntry8" },
- { 0x008b, "DdEntry9" },
- { 0x008c, "DeleteColorSpace" },
- { 0x008d, "DeleteDC" },
- { 0x008e, "DeleteEnhMetaFile" },
- { 0x008f, "DeleteMetaFile" },
- { 0x0090, "DeleteObject" },
- { 0x0091, "DescribePixelFormat" },
- { 0x0092, "DeviceCapabilitiesExA" },
- { 0x0093, "DeviceCapabilitiesExW" },
- { 0x0094, "DrawEscape" },
- { 0x0095, "Ellipse" },
- { 0x0096, "EnableEUDC" },
- { 0x0097, "EndDoc" },
- { 0x0098, "EndFormPage" },
- { 0x0099, "EndPage" },
- { 0x009a, "EndPath" },
- { 0x009b, "EngAcquireSemaphore" },
- { 0x009c, "EngAlphaBlend" },
- { 0x009d, "EngAssociateSurface" },
- { 0x009e, "EngBitBlt" },
- { 0x009f, "EngCheckAbort" },
- { 0x00a0, "EngComputeGlyphSet" },
- { 0x00a1, "EngCopyBits" },
- { 0x00a2, "EngCreateBitmap" },
- { 0x00a3, "EngCreateClip" },
- { 0x00a4, "EngCreateDeviceBitmap" },
- { 0x00a5, "EngCreateDeviceSurface" },
- { 0x00a6, "EngCreatePalette" },
- { 0x00a7, "EngCreateSemaphore" },
- { 0x00a8, "EngDeleteClip" },
- { 0x00a9, "EngDeletePalette" },
- { 0x00aa, "EngDeletePath" },
- { 0x00ab, "EngDeleteSemaphore" },
- { 0x00ac, "EngDeleteSurface" },
- { 0x00ad, "EngEraseSurface" },
- { 0x00ae, "EngFillPath" },
- { 0x00af, "EngFindResource" },
- { 0x00b0, "EngFreeModule" },
- { 0x00b1, "EngGetCurrentCodePage" },
- { 0x00b2, "EngGetDriverName" },
- { 0x00b3, "EngGetPrinterDataFileName" },
- { 0x00b4, "EngGradientFill" },
- { 0x00b5, "EngLineTo" },
- { 0x00b6, "EngLoadModule" },
- { 0x00b7, "EngLockSurface" },
- { 0x00b8, "EngMarkBandingSurface" },
- { 0x00b9, "EngMultiByteToUnicodeN" },
- { 0x00ba, "EngMultiByteToWideChar" },
- { 0x00bb, "EngPaint" },
- { 0x00bc, "EngPlgBlt" },
- { 0x00bd, "EngQueryEMFInfo" },
- { 0x00be, "EngQueryLocalTime" },
- { 0x00bf, "EngReleaseSemaphore" },
- { 0x00c0, "EngStretchBlt" },
- { 0x00c1, "EngStretchBltROP" },
- { 0x00c2, "EngStrokeAndFillPath" },
- { 0x00c3, "EngStrokePath" },
- { 0x00c4, "EngTextOut" },
- { 0x00c5, "EngTransparentBlt" },
- { 0x00c6, "EngUnicodeToMultiByteN" },
- { 0x00c7, "EngUnlockSurface" },
- { 0x00c8, "EngWideCharToMultiByte" },
- { 0x00c9, "EnumEnhMetaFile" },
- { 0x00ca, "EnumFontFamiliesA" },
- { 0x00cb, "EnumFontFamiliesExA" },
- { 0x00cc, "EnumFontFamiliesExW" },
- { 0x00cd, "EnumFontFamiliesW" },
- { 0x00ce, "EnumFontsA" },
- { 0x00cf, "EnumFontsW" },
- { 0x00d0, "EnumICMProfilesA" },
- { 0x00d1, "EnumICMProfilesW" },
- { 0x00d2, "EnumMetaFile" },
- { 0x00d3, "EnumObjects" },
- { 0x00d4, "EqualRgn" },
- { 0x00d5, "Escape" },
- { 0x00d6, "EudcLoadLinkW" },
- { 0x00d7, "EudcUnloadLinkW" },
- { 0x00d8, "ExcludeClipRect" },
- { 0x00d9, "ExtCreatePen" },
- { 0x00da, "ExtCreateRegion" },
- { 0x00db, "ExtEscape" },
- { 0x00dc, "ExtFloodFill" },
- { 0x00dd, "ExtSelectClipRgn" },
- { 0x00de, "ExtTextOutA" },
- { 0x00df, "ExtTextOutW" },
- { 0x00e0, "FONTOBJ_cGetAllGlyphHandles" },
- { 0x00e1, "FONTOBJ_cGetGlyphs" },
- { 0x00e2, "FONTOBJ_pQueryGlyphAttrs" },
- { 0x00e3, "FONTOBJ_pfdg" },
- { 0x00e4, "FONTOBJ_pifi" },
- { 0x00e5, "FONTOBJ_pvTrueTypeFontFile" },
- { 0x00e6, "FONTOBJ_pxoGetXform" },
- { 0x00e7, "FONTOBJ_vGetInfo" },
- { 0x00e8, "FillPath" },
- { 0x00e9, "FillRgn" },
- { 0x00ea, "FixBrushOrgEx" },
- { 0x00eb, "FlattenPath" },
- { 0x00ec, "FloodFill" },
- { 0x00ed, "FontIsLinked" },
- { 0x00ee, "FrameRgn" },
- { 0x00ef, "GdiAddFontResourceW" },
- { 0x00f0, "GdiAddGlsBounds" },
- { 0x00f1, "GdiAddGlsRecord" },
- { 0x00f2, "GdiAlphaBlend" },
- { 0x00f3, "GdiArtificialDecrementDriver" },
- { 0x00f4, "GdiCleanCacheDC" },
- { 0x00f5, "GdiComment" },
- { 0x00f6, "GdiConsoleTextOut" },
- { 0x00f7, "GdiConvertAndCheckDC" },
- { 0x00f8, "GdiConvertBitmap" },
- { 0x00f9, "GdiConvertBitmapV5" },
- { 0x00fa, "GdiConvertBrush" },
- { 0x00fb, "GdiConvertDC" },
- { 0x00fc, "GdiConvertEnhMetaFile" },
- { 0x00fd, "GdiConvertFont" },
- { 0x00fe, "GdiConvertMetaFilePict" },
- { 0x00ff, "GdiConvertPalette" },
- { 0x0100, "GdiConvertRegion" },
- { 0x0101, "GdiConvertToDevmodeW" },
- { 0x0102, "GdiCreateLocalEnhMetaFile" },
- { 0x0103, "GdiCreateLocalMetaFilePict" },
- { 0x0104, "GdiDeleteLocalDC" },
- { 0x0105, "GdiDeleteSpoolFileHandle" },
- { 0x0106, "GdiDescribePixelFormat" },
- { 0x0107, "GdiDllInitialize" },
- { 0x0108, "GdiDrawStream" },
- { 0x0109, "GdiEndDocEMF" },
- { 0x010a, "GdiEndPageEMF" },
- { 0x0112, "GdiEntry1" },
- { 0x010b, "GdiEntry10" },
- { 0x010c, "GdiEntry11" },
- { 0x010d, "GdiEntry12" },
- { 0x010e, "GdiEntry13" },
- { 0x010f, "GdiEntry14" },
- { 0x0110, "GdiEntry15" },
- { 0x0111, "GdiEntry16" },
- { 0x0113, "GdiEntry2" },
- { 0x0114, "GdiEntry3" },
- { 0x0115, "GdiEntry4" },
- { 0x0116, "GdiEntry5" },
- { 0x0117, "GdiEntry6" },
- { 0x0118, "GdiEntry7" },
- { 0x0119, "GdiEntry8" },
- { 0x011a, "GdiEntry9" },
- { 0x011b, "GdiFixUpHandle" },
- { 0x011c, "GdiFlush" },
- { 0x011d, "GdiFullscreenControl" },
- { 0x011e, "GdiGetBatchLimit" },
- { 0x011f, "GdiGetCharDimensions" },
- { 0x0120, "GdiGetCodePage" },
- { 0x0121, "GdiGetDC" },
- { 0x0122, "GdiGetDevmodeForPage" },
- { 0x0123, "GdiGetLocalBrush" },
- { 0x0124, "GdiGetLocalDC" },
- { 0x0125, "GdiGetLocalFont" },
- { 0x0126, "GdiGetPageCount" },
- { 0x0127, "GdiGetPageHandle" },
- { 0x0128, "GdiGetSpoolFileHandle" },
- { 0x0129, "GdiGetSpoolMessage" },
- { 0x012a, "GdiGradientFill" },
- { 0x012b, "GdiInitSpool" },
- { 0x012c, "GdiInitializeLanguagePack" },
- { 0x012d, "GdiIsMetaFileDC" },
- { 0x012e, "GdiIsMetaPrintDC" },
- { 0x012f, "GdiIsPlayMetafileDC" },
- { 0x0130, "GdiPlayDCScript" },
- { 0x0131, "GdiPlayEMF" },
- { 0x0132, "GdiPlayJournal" },
- { 0x0133, "GdiPlayPageEMF" },
- { 0x0134, "GdiPlayPrivatePageEMF" },
- { 0x0135, "GdiPlayScript" },
- { 0x0136, "GdiPrinterThunk" },
- { 0x0137, "GdiProcessSetup" },
- { 0x0138, "GdiQueryFonts" },
- { 0x0139, "GdiQueryTable" },
- { 0x013a, "GdiRealizationInfo" },
- { 0x013b, "GdiReleaseDC" },
- { 0x013c, "GdiReleaseLocalDC" },
- { 0x013d, "GdiResetDCEMF" },
- { 0x013e, "GdiSetAttrs" },
- { 0x013f, "GdiSetBatchLimit" },
- { 0x0140, "GdiSetLastError" },
- { 0x0141, "GdiSetPixelFormat" },
- { 0x0142, "GdiSetServerAttr" },
- { 0x0143, "GdiStartDocEMF" },
- { 0x0144, "GdiStartPageEMF" },
- { 0x0145, "GdiSwapBuffers" },
- { 0x0146, "GdiTransparentBlt" },
- { 0x0147, "GdiValidateHandle" },
- { 0x0148, "GetArcDirection" },
- { 0x0149, "GetAspectRatioFilterEx" },
- { 0x014a, "GetBitmapAttributes" },
- { 0x014b, "GetBitmapBits" },
- { 0x014c, "GetBitmapDimensionEx" },
- { 0x014d, "GetBkColor" },
- { 0x014e, "GetBkMode" },
- { 0x014f, "GetBoundsRect" },
- { 0x0150, "GetBrushAttributes" },
- { 0x0151, "GetBrushOrgEx" },
- { 0x0152, "GetCharABCWidthsA" },
- { 0x0153, "GetCharABCWidthsFloatA" },
- { 0x0154, "GetCharABCWidthsFloatW" },
- { 0x0155, "GetCharABCWidthsI" },
- { 0x0156, "GetCharABCWidthsW" },
- { 0x0157, "GetCharWidth32A" },
- { 0x0158, "GetCharWidth32W" },
- { 0x0159, "GetCharWidthA" },
- { 0x015a, "GetCharWidthFloatA" },
- { 0x015b, "GetCharWidthFloatW" },
- { 0x015c, "GetCharWidthI" },
- { 0x015d, "GetCharWidthInfo" },
- { 0x015e, "GetCharWidthW" },
- { 0x015f, "GetCharacterPlacementA" },
- { 0x0160, "GetCharacterPlacementW" },
- { 0x0161, "GetClipBox" },
- { 0x0162, "GetClipRgn" },
- { 0x0163, "GetColorAdjustment" },
- { 0x0164, "GetColorSpace" },
- { 0x0165, "GetCurrentObject" },
- { 0x0166, "GetCurrentPositionEx" },
- { 0x0167, "GetDCBrushColor" },
- { 0x0168, "GetDCOrgEx" },
- { 0x0169, "GetDCPenColor" },
- { 0x016a, "GetDIBColorTable" },
- { 0x016b, "GetDIBits" },
- { 0x016c, "GetDeviceCaps" },
- { 0x016d, "GetDeviceGammaRamp" },
- { 0x016e, "GetETM" },
- { 0x016f, "GetEUDCTimeStamp" },
- { 0x0170, "GetEUDCTimeStampExW" },
- { 0x0171, "GetEnhMetaFileA" },
- { 0x0172, "GetEnhMetaFileBits" },
- { 0x0173, "GetEnhMetaFileDescriptionA" },
- { 0x0174, "GetEnhMetaFileDescriptionW" },
- { 0x0175, "GetEnhMetaFileHeader" },
- { 0x0176, "GetEnhMetaFilePaletteEntries" },
- { 0x0177, "GetEnhMetaFilePixelFormat" },
- { 0x0178, "GetEnhMetaFileW" },
- { 0x0179, "GetFontAssocStatus" },
- { 0x017a, "GetFontData" },
- { 0x017b, "GetFontLanguageInfo" },
- { 0x017c, "GetFontResourceInfoW" },
- { 0x017d, "GetFontUnicodeRanges" },
- { 0x017e, "GetGlyphIndicesA" },
- { 0x017f, "GetGlyphIndicesW" },
- { 0x0180, "GetGlyphOutline" },
- { 0x0181, "GetGlyphOutlineA" },
- { 0x0182, "GetGlyphOutlineW" },
- { 0x0183, "GetGlyphOutlineWow" },
- { 0x0184, "GetGraphicsMode" },
- { 0x0185, "GetHFONT" },
- { 0x0186, "GetICMProfileA" },
- { 0x0187, "GetICMProfileW" },
- { 0x0188, "GetKerningPairs" },
- { 0x0189, "GetKerningPairsA" },
- { 0x018a, "GetKerningPairsW" },
- { 0x018b, "GetLayout" },
- { 0x018c, "GetLogColorSpaceA" },
- { 0x018d, "GetLogColorSpaceW" },
- { 0x018e, "GetMapMode" },
- { 0x018f, "GetMetaFileA" },
- { 0x0190, "GetMetaFileBitsEx" },
- { 0x0191, "GetMetaFileW" },
- { 0x0192, "GetMetaRgn" },
- { 0x0193, "GetMiterLimit" },
- { 0x0194, "GetNearestColor" },
- { 0x0195, "GetNearestPaletteIndex" },
- { 0x0196, "GetObjectA" },
- { 0x0197, "GetObjectType" },
- { 0x0198, "GetObjectW" },
- { 0x0199, "GetOutlineTextMetricsA" },
- { 0x019a, "GetOutlineTextMetricsW" },
- { 0x019b, "GetPaletteEntries" },
- { 0x019c, "GetPath" },
- { 0x019d, "GetPixel" },
- { 0x019e, "GetPixelFormat" },
- { 0x019f, "GetPolyFillMode" },
- { 0x01a0, "GetROP2" },
- { 0x01a1, "GetRandomRgn" },
- { 0x01a2, "GetRasterizerCaps" },
- { 0x01a3, "GetRegionData" },
- { 0x01a4, "GetRelAbs" },
- { 0x01a5, "GetRgnBox" },
- { 0x01a6, "GetStockObject" },
- { 0x01a7, "GetStretchBltMode" },
- { 0x01a8, "GetStringBitmapA" },
- { 0x01a9, "GetStringBitmapW" },
- { 0x01aa, "GetSystemPaletteEntries" },
- { 0x01ab, "GetSystemPaletteUse" },
- { 0x01ac, "GetTextAlign" },
- { 0x01ad, "GetTextCharacterExtra" },
- { 0x01ae, "GetTextCharset" },
- { 0x01af, "GetTextCharsetInfo" },
- { 0x01b0, "GetTextColor" },
- { 0x01b1, "GetTextExtentExPointA" },
- { 0x01b2, "GetTextExtentExPointI" },
- { 0x01b3, "GetTextExtentExPointW" },
- { 0x01b4, "GetTextExtentExPointWPri" },
- { 0x01b5, "GetTextExtentPoint32A" },
- { 0x01b6, "GetTextExtentPoint32W" },
- { 0x01b7, "GetTextExtentPointA" },
- { 0x01b8, "GetTextExtentPointI" },
- { 0x01b9, "GetTextExtentPointW" },
- { 0x01ba, "GetTextFaceA" },
- { 0x01bb, "GetTextFaceAliasW" },
- { 0x01bc, "GetTextFaceW" },
- { 0x01bd, "GetTextMetricsA" },
- { 0x01be, "GetTextMetricsW" },
- { 0x01bf, "GetTransform" },
- { 0x01c0, "GetViewportExtEx" },
- { 0x01c1, "GetViewportOrgEx" },
- { 0x01c2, "GetWinMetaFileBits" },
- { 0x01c3, "GetWindowExtEx" },
- { 0x01c4, "GetWindowOrgEx" },
- { 0x01c5, "GetWorldTransform" },
- { 0x01c6, "HT_Get8BPPFormatPalette" },
- { 0x01c7, "HT_Get8BPPMaskPalette" },
- { 0x01c8, "IntersectClipRect" },
- { 0x01c9, "InvertRgn" },
- { 0x01ca, "IsValidEnhMetaRecord" },
- { 0x01cb, "IsValidEnhMetaRecordOffExt" },
- { 0x01cc, "LPtoDP" },
- { 0x01cd, "LineDDA" },
- { 0x01ce, "LineTo" },
- { 0x01cf, "MaskBlt" },
- { 0x01d0, "MirrorRgn" },
- { 0x01d1, "ModifyWorldTransform" },
- { 0x01d2, "MoveToEx" },
- { 0x01d3, "NamedEscape" },
- { 0x01d4, "OffsetClipRgn" },
- { 0x01d5, "OffsetRgn" },
- { 0x01d6, "OffsetViewportOrgEx" },
- { 0x01d7, "OffsetWindowOrgEx" },
- { 0x01d8, "PATHOBJ_bEnum" },
- { 0x01d9, "PATHOBJ_bEnumClipLines" },
- { 0x01da, "PATHOBJ_vEnumStart" },
- { 0x01db, "PATHOBJ_vEnumStartClipLines" },
- { 0x01dc, "PATHOBJ_vGetBounds" },
- { 0x01dd, "PaintRgn" },
- { 0x01de, "PatBlt" },
- { 0x01df, "PathToRegion" },
- { 0x01e0, "Pie" },
- { 0x01e1, "PlayEnhMetaFile" },
- { 0x01e2, "PlayEnhMetaFileRecord" },
- { 0x01e3, "PlayMetaFile" },
- { 0x01e4, "PlayMetaFileRecord" },
- { 0x01e5, "PlgBlt" },
- { 0x01e6, "PolyBezier" },
- { 0x01e7, "PolyBezierTo" },
- { 0x01e8, "PolyDraw" },
- { 0x01e9, "PolyPatBlt" },
- { 0x01ea, "PolyPolygon" },
- { 0x01eb, "PolyPolyline" },
- { 0x01ec, "PolyTextOutA" },
- { 0x01ed, "PolyTextOutW" },
- { 0x01ee, "Polygon" },
- { 0x01ef, "Polyline" },
- { 0x01f0, "PolylineTo" },
- { 0x01f1, "PtInRegion" },
- { 0x01f2, "PtVisible" },
- { 0x01f3, "QueryFontAssocStatus" },
- { 0x01f4, "RealizePalette" },
- { 0x01f5, "RectInRegion" },
- { 0x01f6, "RectVisible" },
- { 0x01f7, "Rectangle" },
- { 0x01f8, "RemoveFontMemResourceEx" },
- { 0x01f9, "RemoveFontResourceA" },
- { 0x01fa, "RemoveFontResourceExA" },
- { 0x01fb, "RemoveFontResourceExW" },
- { 0x01fc, "RemoveFontResourceTracking" },
- { 0x01fd, "RemoveFontResourceW" },
- { 0x01fe, "ResetDCA" },
- { 0x01ff, "ResetDCW" },
- { 0x0200, "ResizePalette" },
- { 0x0201, "RestoreDC" },
- { 0x0202, "RoundRect" },
- { 0x0203, "STROBJ_bEnum" },
- { 0x0204, "STROBJ_bEnumPositionsOnly" },
- { 0x0205, "STROBJ_bGetAdvanceWidths" },
- { 0x0206, "STROBJ_dwGetCodePage" },
- { 0x0207, "STROBJ_vEnumStart" },
- { 0x0208, "SaveDC" },
- { 0x0209, "ScaleViewportExtEx" },
- { 0x020a, "ScaleWindowExtEx" },
- { 0x020b, "SelectBrushLocal" },
- { 0x020c, "SelectClipPath" },
- { 0x020d, "SelectClipRgn" },
- { 0x020e, "SelectFontLocal" },
- { 0x020f, "SelectObject" },
- { 0x0210, "SelectPalette" },
- { 0x0211, "SetAbortProc" },
- { 0x0212, "SetArcDirection" },
- { 0x0213, "SetBitmapAttributes" },
- { 0x0214, "SetBitmapBits" },
- { 0x0215, "SetBitmapDimensionEx" },
- { 0x0216, "SetBkColor" },
- { 0x0217, "SetBkMode" },
- { 0x0218, "SetBoundsRect" },
- { 0x0219, "SetBrushAttributes" },
- { 0x021a, "SetBrushOrgEx" },
- { 0x021b, "SetColorAdjustment" },
- { 0x021c, "SetColorSpace" },
- { 0x021d, "SetDCBrushColor" },
- { 0x021e, "SetDCPenColor" },
- { 0x021f, "SetDIBColorTable" },
- { 0x0220, "SetDIBits" },
- { 0x0221, "SetDIBitsToDevice" },
- { 0x0222, "SetDeviceGammaRamp" },
- { 0x0223, "SetEnhMetaFileBits" },
- { 0x0224, "SetFontEnumeration" },
- { 0x0225, "SetGraphicsMode" },
- { 0x0226, "SetICMMode" },
- { 0x0227, "SetICMProfileA" },
- { 0x0228, "SetICMProfileW" },
- { 0x0229, "SetLayout" },
- { 0x022a, "SetLayoutWidth" },
- { 0x022b, "SetMagicColors" },
- { 0x022c, "SetMapMode" },
- { 0x022d, "SetMapperFlags" },
- { 0x022e, "SetMetaFileBitsEx" },
- { 0x022f, "SetMetaRgn" },
- { 0x0230, "SetMiterLimit" },
- { 0x0231, "SetPaletteEntries" },
- { 0x0232, "SetPixel" },
- { 0x0233, "SetPixelFormat" },
- { 0x0234, "SetPixelV" },
- { 0x0235, "SetPolyFillMode" },
- { 0x0236, "SetROP2" },
- { 0x0237, "SetRectRgn" },
- { 0x0238, "SetRelAbs" },
- { 0x0239, "SetStretchBltMode" },
- { 0x023a, "SetSystemPaletteUse" },
- { 0x023b, "SetTextAlign" },
- { 0x023c, "SetTextCharacterExtra" },
- { 0x023d, "SetTextColor" },
- { 0x023e, "SetTextJustification" },
- { 0x023f, "SetViewportExtEx" },
- { 0x0240, "SetViewportOrgEx" },
- { 0x0241, "SetVirtualResolution" },
- { 0x0242, "SetWinMetaFileBits" },
- { 0x0243, "SetWindowExtEx" },
- { 0x0244, "SetWindowOrgEx" },
- { 0x0245, "SetWorldTransform" },
- { 0x0246, "StartDocA" },
- { 0x0247, "StartDocW" },
- { 0x0248, "StartFormPage" },
- { 0x0249, "StartPage" },
- { 0x024a, "StretchBlt" },
- { 0x024b, "StretchDIBits" },
- { 0x024c, "StrokeAndFillPath" },
- { 0x024d, "StrokePath" },
- { 0x024e, "SwapBuffers" },
- { 0x024f, "TextOutA" },
- { 0x0250, "TextOutW" },
- { 0x0251, "TranslateCharsetInfo" },
- { 0x0252, "UnloadNetworkFonts" },
- { 0x0253, "UnrealizeObject" },
- { 0x0254, "UpdateColors" },
- { 0x0255, "UpdateICMRegKeyA" },
- { 0x0256, "UpdateICMRegKeyW" },
- { 0x0257, "WidenPath" },
- { 0x0258, "XFORMOBJ_bApplyXform" },
- { 0x0259, "XFORMOBJ_iGetXform" },
- { 0x025a, "XLATEOBJ_cGetPalette" },
- { 0x025b, "XLATEOBJ_hGetColorTransform" },
- { 0x025c, "XLATEOBJ_iXlate" },
- { 0x025d, "XLATEOBJ_piVector" },
- { 0x025e, "bInitSystemAndFontsDirectoriesW" },
- { 0x025f, "bMakePathNameW" },
- { 0x0260, "cGetTTFFromFOT" },
- { 0x0261, "gdiPlaySpoolStream" },
-};
+const char* gdi32_dll_lookup(uint32_t i) {
+ switch(i) {
+ case 0x0001: return "AbortDoc";
+ case 0x0002: return "AbortPath";
+ case 0x0003: return "AddFontMemResourceEx";
+ case 0x0004: return "AddFontResourceA";
+ case 0x0005: return "AddFontResourceExA";
+ case 0x0006: return "AddFontResourceExW";
+ case 0x0007: return "AddFontResourceTracking";
+ case 0x0008: return "AddFontResourceW";
+ case 0x0009: return "AngleArc";
+ case 0x000a: return "AnimatePalette";
+ case 0x000b: return "AnyLinkedFonts";
+ case 0x000c: return "Arc";
+ case 0x000d: return "ArcTo";
+ case 0x000e: return "BRUSHOBJ_hGetColorTransform";
+ case 0x000f: return "BRUSHOBJ_pvAllocRbrush";
+ case 0x0010: return "BRUSHOBJ_pvGetRbrush";
+ case 0x0011: return "BRUSHOBJ_ulGetBrushColor";
+ case 0x0012: return "BeginPath";
+ case 0x0013: return "BitBlt";
+ case 0x0014: return "CLIPOBJ_bEnum";
+ case 0x0015: return "CLIPOBJ_cEnumStart";
+ case 0x0016: return "CLIPOBJ_ppoGetPath";
+ case 0x0017: return "CancelDC";
+ case 0x0018: return "CheckColorsInGamut";
+ case 0x0019: return "ChoosePixelFormat";
+ case 0x001a: return "Chord";
+ case 0x001b: return "ClearBitmapAttributes";
+ case 0x001c: return "ClearBrushAttributes";
+ case 0x001d: return "CloseEnhMetaFile";
+ case 0x001e: return "CloseFigure";
+ case 0x001f: return "CloseMetaFile";
+ case 0x0020: return "ColorCorrectPalette";
+ case 0x0021: return "ColorMatchToTarget";
+ case 0x0022: return "CombineRgn";
+ case 0x0023: return "CombineTransform";
+ case 0x0024: return "CopyEnhMetaFileA";
+ case 0x0025: return "CopyEnhMetaFileW";
+ case 0x0026: return "CopyMetaFileA";
+ case 0x0027: return "CopyMetaFileW";
+ case 0x0028: return "CreateBitmap";
+ case 0x0029: return "CreateBitmapIndirect";
+ case 0x002a: return "CreateBrushIndirect";
+ case 0x002b: return "CreateColorSpaceA";
+ case 0x002c: return "CreateColorSpaceW";
+ case 0x002d: return "CreateCompatibleBitmap";
+ case 0x002e: return "CreateCompatibleDC";
+ case 0x002f: return "CreateDCA";
+ case 0x0030: return "CreateDCW";
+ case 0x0031: return "CreateDIBPatternBrush";
+ case 0x0032: return "CreateDIBPatternBrushPt";
+ case 0x0033: return "CreateDIBSection";
+ case 0x0034: return "CreateDIBitmap";
+ case 0x0035: return "CreateDiscardableBitmap";
+ case 0x0036: return "CreateEllipticRgn";
+ case 0x0037: return "CreateEllipticRgnIndirect";
+ case 0x0038: return "CreateEnhMetaFileA";
+ case 0x0039: return "CreateEnhMetaFileW";
+ case 0x003a: return "CreateFontA";
+ case 0x003b: return "CreateFontIndirectA";
+ case 0x003c: return "CreateFontIndirectExA";
+ case 0x003d: return "CreateFontIndirectExW";
+ case 0x003e: return "CreateFontIndirectW";
+ case 0x003f: return "CreateFontW";
+ case 0x0040: return "CreateHalftonePalette";
+ case 0x0041: return "CreateHatchBrush";
+ case 0x0042: return "CreateICA";
+ case 0x0043: return "CreateICW";
+ case 0x0044: return "CreateMetaFileA";
+ case 0x0045: return "CreateMetaFileW";
+ case 0x0046: return "CreatePalette";
+ case 0x0047: return "CreatePatternBrush";
+ case 0x0048: return "CreatePen";
+ case 0x0049: return "CreatePenIndirect";
+ case 0x004a: return "CreatePolyPolygonRgn";
+ case 0x004b: return "CreatePolygonRgn";
+ case 0x004c: return "CreateRectRgn";
+ case 0x004d: return "CreateRectRgnIndirect";
+ case 0x004e: return "CreateRoundRectRgn";
+ case 0x004f: return "CreateScalableFontResourceA";
+ case 0x0050: return "CreateScalableFontResourceW";
+ case 0x0051: return "CreateSolidBrush";
+ case 0x0052: return "DPtoLP";
+ case 0x0053: return "DdEntry0";
+ case 0x005e: return "DdEntry1";
+ case 0x0054: return "DdEntry10";
+ case 0x0055: return "DdEntry11";
+ case 0x0056: return "DdEntry12";
+ case 0x0057: return "DdEntry13";
+ case 0x0058: return "DdEntry14";
+ case 0x0059: return "DdEntry15";
+ case 0x005a: return "DdEntry16";
+ case 0x005b: return "DdEntry17";
+ case 0x005c: return "DdEntry18";
+ case 0x005d: return "DdEntry19";
+ case 0x0069: return "DdEntry2";
+ case 0x005f: return "DdEntry20";
+ case 0x0060: return "DdEntry21";
+ case 0x0061: return "DdEntry22";
+ case 0x0062: return "DdEntry23";
+ case 0x0063: return "DdEntry24";
+ case 0x0064: return "DdEntry25";
+ case 0x0065: return "DdEntry26";
+ case 0x0066: return "DdEntry27";
+ case 0x0067: return "DdEntry28";
+ case 0x0068: return "DdEntry29";
+ case 0x0074: return "DdEntry3";
+ case 0x006a: return "DdEntry30";
+ case 0x006b: return "DdEntry31";
+ case 0x006c: return "DdEntry32";
+ case 0x006d: return "DdEntry33";
+ case 0x006e: return "DdEntry34";
+ case 0x006f: return "DdEntry35";
+ case 0x0070: return "DdEntry36";
+ case 0x0071: return "DdEntry37";
+ case 0x0072: return "DdEntry38";
+ case 0x0073: return "DdEntry39";
+ case 0x007f: return "DdEntry4";
+ case 0x0075: return "DdEntry40";
+ case 0x0076: return "DdEntry41";
+ case 0x0077: return "DdEntry42";
+ case 0x0078: return "DdEntry43";
+ case 0x0079: return "DdEntry44";
+ case 0x007a: return "DdEntry45";
+ case 0x007b: return "DdEntry46";
+ case 0x007c: return "DdEntry47";
+ case 0x007d: return "DdEntry48";
+ case 0x007e: return "DdEntry49";
+ case 0x0087: return "DdEntry5";
+ case 0x0080: return "DdEntry50";
+ case 0x0081: return "DdEntry51";
+ case 0x0082: return "DdEntry52";
+ case 0x0083: return "DdEntry53";
+ case 0x0084: return "DdEntry54";
+ case 0x0085: return "DdEntry55";
+ case 0x0086: return "DdEntry56";
+ case 0x0088: return "DdEntry6";
+ case 0x0089: return "DdEntry7";
+ case 0x008a: return "DdEntry8";
+ case 0x008b: return "DdEntry9";
+ case 0x008c: return "DeleteColorSpace";
+ case 0x008d: return "DeleteDC";
+ case 0x008e: return "DeleteEnhMetaFile";
+ case 0x008f: return "DeleteMetaFile";
+ case 0x0090: return "DeleteObject";
+ case 0x0091: return "DescribePixelFormat";
+ case 0x0092: return "DeviceCapabilitiesExA";
+ case 0x0093: return "DeviceCapabilitiesExW";
+ case 0x0094: return "DrawEscape";
+ case 0x0095: return "Ellipse";
+ case 0x0096: return "EnableEUDC";
+ case 0x0097: return "EndDoc";
+ case 0x0098: return "EndFormPage";
+ case 0x0099: return "EndPage";
+ case 0x009a: return "EndPath";
+ case 0x009b: return "EngAcquireSemaphore";
+ case 0x009c: return "EngAlphaBlend";
+ case 0x009d: return "EngAssociateSurface";
+ case 0x009e: return "EngBitBlt";
+ case 0x009f: return "EngCheckAbort";
+ case 0x00a0: return "EngComputeGlyphSet";
+ case 0x00a1: return "EngCopyBits";
+ case 0x00a2: return "EngCreateBitmap";
+ case 0x00a3: return "EngCreateClip";
+ case 0x00a4: return "EngCreateDeviceBitmap";
+ case 0x00a5: return "EngCreateDeviceSurface";
+ case 0x00a6: return "EngCreatePalette";
+ case 0x00a7: return "EngCreateSemaphore";
+ case 0x00a8: return "EngDeleteClip";
+ case 0x00a9: return "EngDeletePalette";
+ case 0x00aa: return "EngDeletePath";
+ case 0x00ab: return "EngDeleteSemaphore";
+ case 0x00ac: return "EngDeleteSurface";
+ case 0x00ad: return "EngEraseSurface";
+ case 0x00ae: return "EngFillPath";
+ case 0x00af: return "EngFindResource";
+ case 0x00b0: return "EngFreeModule";
+ case 0x00b1: return "EngGetCurrentCodePage";
+ case 0x00b2: return "EngGetDriverName";
+ case 0x00b3: return "EngGetPrinterDataFileName";
+ case 0x00b4: return "EngGradientFill";
+ case 0x00b5: return "EngLineTo";
+ case 0x00b6: return "EngLoadModule";
+ case 0x00b7: return "EngLockSurface";
+ case 0x00b8: return "EngMarkBandingSurface";
+ case 0x00b9: return "EngMultiByteToUnicodeN";
+ case 0x00ba: return "EngMultiByteToWideChar";
+ case 0x00bb: return "EngPaint";
+ case 0x00bc: return "EngPlgBlt";
+ case 0x00bd: return "EngQueryEMFInfo";
+ case 0x00be: return "EngQueryLocalTime";
+ case 0x00bf: return "EngReleaseSemaphore";
+ case 0x00c0: return "EngStretchBlt";
+ case 0x00c1: return "EngStretchBltROP";
+ case 0x00c2: return "EngStrokeAndFillPath";
+ case 0x00c3: return "EngStrokePath";
+ case 0x00c4: return "EngTextOut";
+ case 0x00c5: return "EngTransparentBlt";
+ case 0x00c6: return "EngUnicodeToMultiByteN";
+ case 0x00c7: return "EngUnlockSurface";
+ case 0x00c8: return "EngWideCharToMultiByte";
+ case 0x00c9: return "EnumEnhMetaFile";
+ case 0x00ca: return "EnumFontFamiliesA";
+ case 0x00cb: return "EnumFontFamiliesExA";
+ case 0x00cc: return "EnumFontFamiliesExW";
+ case 0x00cd: return "EnumFontFamiliesW";
+ case 0x00ce: return "EnumFontsA";
+ case 0x00cf: return "EnumFontsW";
+ case 0x00d0: return "EnumICMProfilesA";
+ case 0x00d1: return "EnumICMProfilesW";
+ case 0x00d2: return "EnumMetaFile";
+ case 0x00d3: return "EnumObjects";
+ case 0x00d4: return "EqualRgn";
+ case 0x00d5: return "Escape";
+ case 0x00d6: return "EudcLoadLinkW";
+ case 0x00d7: return "EudcUnloadLinkW";
+ case 0x00d8: return "ExcludeClipRect";
+ case 0x00d9: return "ExtCreatePen";
+ case 0x00da: return "ExtCreateRegion";
+ case 0x00db: return "ExtEscape";
+ case 0x00dc: return "ExtFloodFill";
+ case 0x00dd: return "ExtSelectClipRgn";
+ case 0x00de: return "ExtTextOutA";
+ case 0x00df: return "ExtTextOutW";
+ case 0x00e0: return "FONTOBJ_cGetAllGlyphHandles";
+ case 0x00e1: return "FONTOBJ_cGetGlyphs";
+ case 0x00e2: return "FONTOBJ_pQueryGlyphAttrs";
+ case 0x00e3: return "FONTOBJ_pfdg";
+ case 0x00e4: return "FONTOBJ_pifi";
+ case 0x00e5: return "FONTOBJ_pvTrueTypeFontFile";
+ case 0x00e6: return "FONTOBJ_pxoGetXform";
+ case 0x00e7: return "FONTOBJ_vGetInfo";
+ case 0x00e8: return "FillPath";
+ case 0x00e9: return "FillRgn";
+ case 0x00ea: return "FixBrushOrgEx";
+ case 0x00eb: return "FlattenPath";
+ case 0x00ec: return "FloodFill";
+ case 0x00ed: return "FontIsLinked";
+ case 0x00ee: return "FrameRgn";
+ case 0x00ef: return "GdiAddFontResourceW";
+ case 0x00f0: return "GdiAddGlsBounds";
+ case 0x00f1: return "GdiAddGlsRecord";
+ case 0x00f2: return "GdiAlphaBlend";
+ case 0x00f3: return "GdiArtificialDecrementDriver";
+ case 0x00f4: return "GdiCleanCacheDC";
+ case 0x00f5: return "GdiComment";
+ case 0x00f6: return "GdiConsoleTextOut";
+ case 0x00f7: return "GdiConvertAndCheckDC";
+ case 0x00f8: return "GdiConvertBitmap";
+ case 0x00f9: return "GdiConvertBitmapV5";
+ case 0x00fa: return "GdiConvertBrush";
+ case 0x00fb: return "GdiConvertDC";
+ case 0x00fc: return "GdiConvertEnhMetaFile";
+ case 0x00fd: return "GdiConvertFont";
+ case 0x00fe: return "GdiConvertMetaFilePict";
+ case 0x00ff: return "GdiConvertPalette";
+ case 0x0100: return "GdiConvertRegion";
+ case 0x0101: return "GdiConvertToDevmodeW";
+ case 0x0102: return "GdiCreateLocalEnhMetaFile";
+ case 0x0103: return "GdiCreateLocalMetaFilePict";
+ case 0x0104: return "GdiDeleteLocalDC";
+ case 0x0105: return "GdiDeleteSpoolFileHandle";
+ case 0x0106: return "GdiDescribePixelFormat";
+ case 0x0107: return "GdiDllInitialize";
+ case 0x0108: return "GdiDrawStream";
+ case 0x0109: return "GdiEndDocEMF";
+ case 0x010a: return "GdiEndPageEMF";
+ case 0x0112: return "GdiEntry1";
+ case 0x010b: return "GdiEntry10";
+ case 0x010c: return "GdiEntry11";
+ case 0x010d: return "GdiEntry12";
+ case 0x010e: return "GdiEntry13";
+ case 0x010f: return "GdiEntry14";
+ case 0x0110: return "GdiEntry15";
+ case 0x0111: return "GdiEntry16";
+ case 0x0113: return "GdiEntry2";
+ case 0x0114: return "GdiEntry3";
+ case 0x0115: return "GdiEntry4";
+ case 0x0116: return "GdiEntry5";
+ case 0x0117: return "GdiEntry6";
+ case 0x0118: return "GdiEntry7";
+ case 0x0119: return "GdiEntry8";
+ case 0x011a: return "GdiEntry9";
+ case 0x011b: return "GdiFixUpHandle";
+ case 0x011c: return "GdiFlush";
+ case 0x011d: return "GdiFullscreenControl";
+ case 0x011e: return "GdiGetBatchLimit";
+ case 0x011f: return "GdiGetCharDimensions";
+ case 0x0120: return "GdiGetCodePage";
+ case 0x0121: return "GdiGetDC";
+ case 0x0122: return "GdiGetDevmodeForPage";
+ case 0x0123: return "GdiGetLocalBrush";
+ case 0x0124: return "GdiGetLocalDC";
+ case 0x0125: return "GdiGetLocalFont";
+ case 0x0126: return "GdiGetPageCount";
+ case 0x0127: return "GdiGetPageHandle";
+ case 0x0128: return "GdiGetSpoolFileHandle";
+ case 0x0129: return "GdiGetSpoolMessage";
+ case 0x012a: return "GdiGradientFill";
+ case 0x012b: return "GdiInitSpool";
+ case 0x012c: return "GdiInitializeLanguagePack";
+ case 0x012d: return "GdiIsMetaFileDC";
+ case 0x012e: return "GdiIsMetaPrintDC";
+ case 0x012f: return "GdiIsPlayMetafileDC";
+ case 0x0130: return "GdiPlayDCScript";
+ case 0x0131: return "GdiPlayEMF";
+ case 0x0132: return "GdiPlayJournal";
+ case 0x0133: return "GdiPlayPageEMF";
+ case 0x0134: return "GdiPlayPrivatePageEMF";
+ case 0x0135: return "GdiPlayScript";
+ case 0x0136: return "GdiPrinterThunk";
+ case 0x0137: return "GdiProcessSetup";
+ case 0x0138: return "GdiQueryFonts";
+ case 0x0139: return "GdiQueryTable";
+ case 0x013a: return "GdiRealizationInfo";
+ case 0x013b: return "GdiReleaseDC";
+ case 0x013c: return "GdiReleaseLocalDC";
+ case 0x013d: return "GdiResetDCEMF";
+ case 0x013e: return "GdiSetAttrs";
+ case 0x013f: return "GdiSetBatchLimit";
+ case 0x0140: return "GdiSetLastError";
+ case 0x0141: return "GdiSetPixelFormat";
+ case 0x0142: return "GdiSetServerAttr";
+ case 0x0143: return "GdiStartDocEMF";
+ case 0x0144: return "GdiStartPageEMF";
+ case 0x0145: return "GdiSwapBuffers";
+ case 0x0146: return "GdiTransparentBlt";
+ case 0x0147: return "GdiValidateHandle";
+ case 0x0148: return "GetArcDirection";
+ case 0x0149: return "GetAspectRatioFilterEx";
+ case 0x014a: return "GetBitmapAttributes";
+ case 0x014b: return "GetBitmapBits";
+ case 0x014c: return "GetBitmapDimensionEx";
+ case 0x014d: return "GetBkColor";
+ case 0x014e: return "GetBkMode";
+ case 0x014f: return "GetBoundsRect";
+ case 0x0150: return "GetBrushAttributes";
+ case 0x0151: return "GetBrushOrgEx";
+ case 0x0152: return "GetCharABCWidthsA";
+ case 0x0153: return "GetCharABCWidthsFloatA";
+ case 0x0154: return "GetCharABCWidthsFloatW";
+ case 0x0155: return "GetCharABCWidthsI";
+ case 0x0156: return "GetCharABCWidthsW";
+ case 0x0157: return "GetCharWidth32A";
+ case 0x0158: return "GetCharWidth32W";
+ case 0x0159: return "GetCharWidthA";
+ case 0x015a: return "GetCharWidthFloatA";
+ case 0x015b: return "GetCharWidthFloatW";
+ case 0x015c: return "GetCharWidthI";
+ case 0x015d: return "GetCharWidthInfo";
+ case 0x015e: return "GetCharWidthW";
+ case 0x015f: return "GetCharacterPlacementA";
+ case 0x0160: return "GetCharacterPlacementW";
+ case 0x0161: return "GetClipBox";
+ case 0x0162: return "GetClipRgn";
+ case 0x0163: return "GetColorAdjustment";
+ case 0x0164: return "GetColorSpace";
+ case 0x0165: return "GetCurrentObject";
+ case 0x0166: return "GetCurrentPositionEx";
+ case 0x0167: return "GetDCBrushColor";
+ case 0x0168: return "GetDCOrgEx";
+ case 0x0169: return "GetDCPenColor";
+ case 0x016a: return "GetDIBColorTable";
+ case 0x016b: return "GetDIBits";
+ case 0x016c: return "GetDeviceCaps";
+ case 0x016d: return "GetDeviceGammaRamp";
+ case 0x016e: return "GetETM";
+ case 0x016f: return "GetEUDCTimeStamp";
+ case 0x0170: return "GetEUDCTimeStampExW";
+ case 0x0171: return "GetEnhMetaFileA";
+ case 0x0172: return "GetEnhMetaFileBits";
+ case 0x0173: return "GetEnhMetaFileDescriptionA";
+ case 0x0174: return "GetEnhMetaFileDescriptionW";
+ case 0x0175: return "GetEnhMetaFileHeader";
+ case 0x0176: return "GetEnhMetaFilePaletteEntries";
+ case 0x0177: return "GetEnhMetaFilePixelFormat";
+ case 0x0178: return "GetEnhMetaFileW";
+ case 0x0179: return "GetFontAssocStatus";
+ case 0x017a: return "GetFontData";
+ case 0x017b: return "GetFontLanguageInfo";
+ case 0x017c: return "GetFontResourceInfoW";
+ case 0x017d: return "GetFontUnicodeRanges";
+ case 0x017e: return "GetGlyphIndicesA";
+ case 0x017f: return "GetGlyphIndicesW";
+ case 0x0180: return "GetGlyphOutline";
+ case 0x0181: return "GetGlyphOutlineA";
+ case 0x0182: return "GetGlyphOutlineW";
+ case 0x0183: return "GetGlyphOutlineWow";
+ case 0x0184: return "GetGraphicsMode";
+ case 0x0185: return "GetHFONT";
+ case 0x0186: return "GetICMProfileA";
+ case 0x0187: return "GetICMProfileW";
+ case 0x0188: return "GetKerningPairs";
+ case 0x0189: return "GetKerningPairsA";
+ case 0x018a: return "GetKerningPairsW";
+ case 0x018b: return "GetLayout";
+ case 0x018c: return "GetLogColorSpaceA";
+ case 0x018d: return "GetLogColorSpaceW";
+ case 0x018e: return "GetMapMode";
+ case 0x018f: return "GetMetaFileA";
+ case 0x0190: return "GetMetaFileBitsEx";
+ case 0x0191: return "GetMetaFileW";
+ case 0x0192: return "GetMetaRgn";
+ case 0x0193: return "GetMiterLimit";
+ case 0x0194: return "GetNearestColor";
+ case 0x0195: return "GetNearestPaletteIndex";
+ case 0x0196: return "GetObjectA";
+ case 0x0197: return "GetObjectType";
+ case 0x0198: return "GetObjectW";
+ case 0x0199: return "GetOutlineTextMetricsA";
+ case 0x019a: return "GetOutlineTextMetricsW";
+ case 0x019b: return "GetPaletteEntries";
+ case 0x019c: return "GetPath";
+ case 0x019d: return "GetPixel";
+ case 0x019e: return "GetPixelFormat";
+ case 0x019f: return "GetPolyFillMode";
+ case 0x01a0: return "GetROP2";
+ case 0x01a1: return "GetRandomRgn";
+ case 0x01a2: return "GetRasterizerCaps";
+ case 0x01a3: return "GetRegionData";
+ case 0x01a4: return "GetRelAbs";
+ case 0x01a5: return "GetRgnBox";
+ case 0x01a6: return "GetStockObject";
+ case 0x01a7: return "GetStretchBltMode";
+ case 0x01a8: return "GetStringBitmapA";
+ case 0x01a9: return "GetStringBitmapW";
+ case 0x01aa: return "GetSystemPaletteEntries";
+ case 0x01ab: return "GetSystemPaletteUse";
+ case 0x01ac: return "GetTextAlign";
+ case 0x01ad: return "GetTextCharacterExtra";
+ case 0x01ae: return "GetTextCharset";
+ case 0x01af: return "GetTextCharsetInfo";
+ case 0x01b0: return "GetTextColor";
+ case 0x01b1: return "GetTextExtentExPointA";
+ case 0x01b2: return "GetTextExtentExPointI";
+ case 0x01b3: return "GetTextExtentExPointW";
+ case 0x01b4: return "GetTextExtentExPointWPri";
+ case 0x01b5: return "GetTextExtentPoint32A";
+ case 0x01b6: return "GetTextExtentPoint32W";
+ case 0x01b7: return "GetTextExtentPointA";
+ case 0x01b8: return "GetTextExtentPointI";
+ case 0x01b9: return "GetTextExtentPointW";
+ case 0x01ba: return "GetTextFaceA";
+ case 0x01bb: return "GetTextFaceAliasW";
+ case 0x01bc: return "GetTextFaceW";
+ case 0x01bd: return "GetTextMetricsA";
+ case 0x01be: return "GetTextMetricsW";
+ case 0x01bf: return "GetTransform";
+ case 0x01c0: return "GetViewportExtEx";
+ case 0x01c1: return "GetViewportOrgEx";
+ case 0x01c2: return "GetWinMetaFileBits";
+ case 0x01c3: return "GetWindowExtEx";
+ case 0x01c4: return "GetWindowOrgEx";
+ case 0x01c5: return "GetWorldTransform";
+ case 0x01c6: return "HT_Get8BPPFormatPalette";
+ case 0x01c7: return "HT_Get8BPPMaskPalette";
+ case 0x01c8: return "IntersectClipRect";
+ case 0x01c9: return "InvertRgn";
+ case 0x01ca: return "IsValidEnhMetaRecord";
+ case 0x01cb: return "IsValidEnhMetaRecordOffExt";
+ case 0x01cc: return "LPtoDP";
+ case 0x01cd: return "LineDDA";
+ case 0x01ce: return "LineTo";
+ case 0x01cf: return "MaskBlt";
+ case 0x01d0: return "MirrorRgn";
+ case 0x01d1: return "ModifyWorldTransform";
+ case 0x01d2: return "MoveToEx";
+ case 0x01d3: return "NamedEscape";
+ case 0x01d4: return "OffsetClipRgn";
+ case 0x01d5: return "OffsetRgn";
+ case 0x01d6: return "OffsetViewportOrgEx";
+ case 0x01d7: return "OffsetWindowOrgEx";
+ case 0x01d8: return "PATHOBJ_bEnum";
+ case 0x01d9: return "PATHOBJ_bEnumClipLines";
+ case 0x01da: return "PATHOBJ_vEnumStart";
+ case 0x01db: return "PATHOBJ_vEnumStartClipLines";
+ case 0x01dc: return "PATHOBJ_vGetBounds";
+ case 0x01dd: return "PaintRgn";
+ case 0x01de: return "PatBlt";
+ case 0x01df: return "PathToRegion";
+ case 0x01e0: return "Pie";
+ case 0x01e1: return "PlayEnhMetaFile";
+ case 0x01e2: return "PlayEnhMetaFileRecord";
+ case 0x01e3: return "PlayMetaFile";
+ case 0x01e4: return "PlayMetaFileRecord";
+ case 0x01e5: return "PlgBlt";
+ case 0x01e6: return "PolyBezier";
+ case 0x01e7: return "PolyBezierTo";
+ case 0x01e8: return "PolyDraw";
+ case 0x01e9: return "PolyPatBlt";
+ case 0x01ea: return "PolyPolygon";
+ case 0x01eb: return "PolyPolyline";
+ case 0x01ec: return "PolyTextOutA";
+ case 0x01ed: return "PolyTextOutW";
+ case 0x01ee: return "Polygon";
+ case 0x01ef: return "Polyline";
+ case 0x01f0: return "PolylineTo";
+ case 0x01f1: return "PtInRegion";
+ case 0x01f2: return "PtVisible";
+ case 0x01f3: return "QueryFontAssocStatus";
+ case 0x01f4: return "RealizePalette";
+ case 0x01f5: return "RectInRegion";
+ case 0x01f6: return "RectVisible";
+ case 0x01f7: return "Rectangle";
+ case 0x01f8: return "RemoveFontMemResourceEx";
+ case 0x01f9: return "RemoveFontResourceA";
+ case 0x01fa: return "RemoveFontResourceExA";
+ case 0x01fb: return "RemoveFontResourceExW";
+ case 0x01fc: return "RemoveFontResourceTracking";
+ case 0x01fd: return "RemoveFontResourceW";
+ case 0x01fe: return "ResetDCA";
+ case 0x01ff: return "ResetDCW";
+ case 0x0200: return "ResizePalette";
+ case 0x0201: return "RestoreDC";
+ case 0x0202: return "RoundRect";
+ case 0x0203: return "STROBJ_bEnum";
+ case 0x0204: return "STROBJ_bEnumPositionsOnly";
+ case 0x0205: return "STROBJ_bGetAdvanceWidths";
+ case 0x0206: return "STROBJ_dwGetCodePage";
+ case 0x0207: return "STROBJ_vEnumStart";
+ case 0x0208: return "SaveDC";
+ case 0x0209: return "ScaleViewportExtEx";
+ case 0x020a: return "ScaleWindowExtEx";
+ case 0x020b: return "SelectBrushLocal";
+ case 0x020c: return "SelectClipPath";
+ case 0x020d: return "SelectClipRgn";
+ case 0x020e: return "SelectFontLocal";
+ case 0x020f: return "SelectObject";
+ case 0x0210: return "SelectPalette";
+ case 0x0211: return "SetAbortProc";
+ case 0x0212: return "SetArcDirection";
+ case 0x0213: return "SetBitmapAttributes";
+ case 0x0214: return "SetBitmapBits";
+ case 0x0215: return "SetBitmapDimensionEx";
+ case 0x0216: return "SetBkColor";
+ case 0x0217: return "SetBkMode";
+ case 0x0218: return "SetBoundsRect";
+ case 0x0219: return "SetBrushAttributes";
+ case 0x021a: return "SetBrushOrgEx";
+ case 0x021b: return "SetColorAdjustment";
+ case 0x021c: return "SetColorSpace";
+ case 0x021d: return "SetDCBrushColor";
+ case 0x021e: return "SetDCPenColor";
+ case 0x021f: return "SetDIBColorTable";
+ case 0x0220: return "SetDIBits";
+ case 0x0221: return "SetDIBitsToDevice";
+ case 0x0222: return "SetDeviceGammaRamp";
+ case 0x0223: return "SetEnhMetaFileBits";
+ case 0x0224: return "SetFontEnumeration";
+ case 0x0225: return "SetGraphicsMode";
+ case 0x0226: return "SetICMMode";
+ case 0x0227: return "SetICMProfileA";
+ case 0x0228: return "SetICMProfileW";
+ case 0x0229: return "SetLayout";
+ case 0x022a: return "SetLayoutWidth";
+ case 0x022b: return "SetMagicColors";
+ case 0x022c: return "SetMapMode";
+ case 0x022d: return "SetMapperFlags";
+ case 0x022e: return "SetMetaFileBitsEx";
+ case 0x022f: return "SetMetaRgn";
+ case 0x0230: return "SetMiterLimit";
+ case 0x0231: return "SetPaletteEntries";
+ case 0x0232: return "SetPixel";
+ case 0x0233: return "SetPixelFormat";
+ case 0x0234: return "SetPixelV";
+ case 0x0235: return "SetPolyFillMode";
+ case 0x0236: return "SetROP2";
+ case 0x0237: return "SetRectRgn";
+ case 0x0238: return "SetRelAbs";
+ case 0x0239: return "SetStretchBltMode";
+ case 0x023a: return "SetSystemPaletteUse";
+ case 0x023b: return "SetTextAlign";
+ case 0x023c: return "SetTextCharacterExtra";
+ case 0x023d: return "SetTextColor";
+ case 0x023e: return "SetTextJustification";
+ case 0x023f: return "SetViewportExtEx";
+ case 0x0240: return "SetViewportOrgEx";
+ case 0x0241: return "SetVirtualResolution";
+ case 0x0242: return "SetWinMetaFileBits";
+ case 0x0243: return "SetWindowExtEx";
+ case 0x0244: return "SetWindowOrgEx";
+ case 0x0245: return "SetWorldTransform";
+ case 0x0246: return "StartDocA";
+ case 0x0247: return "StartDocW";
+ case 0x0248: return "StartFormPage";
+ case 0x0249: return "StartPage";
+ case 0x024a: return "StretchBlt";
+ case 0x024b: return "StretchDIBits";
+ case 0x024c: return "StrokeAndFillPath";
+ case 0x024d: return "StrokePath";
+ case 0x024e: return "SwapBuffers";
+ case 0x024f: return "TextOutA";
+ case 0x0250: return "TextOutW";
+ case 0x0251: return "TranslateCharsetInfo";
+ case 0x0252: return "UnloadNetworkFonts";
+ case 0x0253: return "UnrealizeObject";
+ case 0x0254: return "UpdateColors";
+ case 0x0255: return "UpdateICMRegKeyA";
+ case 0x0256: return "UpdateICMRegKeyW";
+ case 0x0257: return "WidenPath";
+ case 0x0258: return "XFORMOBJ_bApplyXform";
+ case 0x0259: return "XFORMOBJ_iGetXform";
+ case 0x025a: return "XLATEOBJ_cGetPalette";
+ case 0x025b: return "XLATEOBJ_hGetColorTransform";
+ case 0x025c: return "XLATEOBJ_iXlate";
+ case 0x025d: return "XLATEOBJ_piVector";
+ case 0x025e: return "bInitSystemAndFontsDirectoriesW";
+ case 0x025f: return "bMakePathNameW";
+ case 0x0260: return "cGetTTFFromFOT";
+ case 0x0261: return "gdiPlaySpoolStream";
+ }
+ return nullptr;
+}
}
diff --git a/src/PE/utils/ordinals_lookup_tables/kernel32_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/kernel32_dll_lookup.hpp
index 7533e25c..67d21b1a 100644
--- a/src/PE/utils/ordinals_lookup_tables/kernel32_dll_lookup.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/kernel32_dll_lookup.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,962 +16,964 @@
#ifndef LIEF_PE_KERNEL32_DLL_LOOKUP_H_
#define LIEF_PE_KERNEL32_DLL_LOOKUP_H_
-#include <map>
namespace LIEF {
namespace PE {
-static const std::map<uint32_t, const char*> kernel32_dll_lookup {
- { 0x0001, "ActivateActCtx" },
- { 0x0002, "AddAtomA" },
- { 0x0003, "AddAtomW" },
- { 0x0004, "AddConsoleAliasA" },
- { 0x0005, "AddConsoleAliasW" },
- { 0x0006, "AddLocalAlternateComputerNameA" },
- { 0x0007, "AddLocalAlternateComputerNameW" },
- { 0x0008, "AddRefActCtx" },
- { 0x0009, "AddVectoredExceptionHandler" },
- { 0x000a, "AllocConsole" },
- { 0x000b, "AllocateUserPhysicalPages" },
- { 0x000c, "AreFileApisANSI" },
- { 0x000d, "AssignProcessToJobObject" },
- { 0x000e, "AttachConsole" },
- { 0x000f, "BackupRead" },
- { 0x0010, "BackupSeek" },
- { 0x0011, "BackupWrite" },
- { 0x0012, "BaseCheckAppcompatCache" },
- { 0x0013, "BaseCleanupAppcompatCache" },
- { 0x0014, "BaseCleanupAppcompatCacheSupport" },
- { 0x0015, "BaseDumpAppcompatCache" },
- { 0x0016, "BaseFlushAppcompatCache" },
- { 0x0017, "BaseInitAppcompatCache" },
- { 0x0018, "BaseInitAppcompatCacheSupport" },
- { 0x0019, "BaseProcessInitPostImport" },
- { 0x001a, "BaseQueryModuleData" },
- { 0x001b, "BaseUpdateAppcompatCache" },
- { 0x001c, "BasepCheckWinSaferRestrictions" },
- { 0x001d, "Beep" },
- { 0x001e, "BeginUpdateResourceA" },
- { 0x001f, "BeginUpdateResourceW" },
- { 0x0020, "BindIoCompletionCallback" },
- { 0x0021, "BuildCommDCBA" },
- { 0x0022, "BuildCommDCBAndTimeoutsA" },
- { 0x0023, "BuildCommDCBAndTimeoutsW" },
- { 0x0024, "BuildCommDCBW" },
- { 0x0025, "CallNamedPipeA" },
- { 0x0026, "CallNamedPipeW" },
- { 0x0027, "CancelDeviceWakeupRequest" },
- { 0x0028, "CancelIo" },
- { 0x0029, "CancelTimerQueueTimer" },
- { 0x002a, "CancelWaitableTimer" },
- { 0x002b, "ChangeTimerQueueTimer" },
- { 0x002c, "CheckNameLegalDOS8Dot3A" },
- { 0x002d, "CheckNameLegalDOS8Dot3W" },
- { 0x002e, "CheckRemoteDebuggerPresent" },
- { 0x002f, "ClearCommBreak" },
- { 0x0030, "ClearCommError" },
- { 0x0031, "CloseConsoleHandle" },
- { 0x0032, "CloseHandle" },
- { 0x0033, "CloseProfileUserMapping" },
- { 0x0034, "CmdBatNotification" },
- { 0x0035, "CommConfigDialogA" },
- { 0x0036, "CommConfigDialogW" },
- { 0x0037, "CompareFileTime" },
- { 0x0038, "CompareStringA" },
- { 0x0039, "CompareStringW" },
- { 0x003a, "ConnectNamedPipe" },
- { 0x003b, "ConsoleMenuControl" },
- { 0x003c, "ContinueDebugEvent" },
- { 0x003d, "ConvertDefaultLocale" },
- { 0x003e, "ConvertFiberToThread" },
- { 0x003f, "ConvertThreadToFiber" },
- { 0x0040, "CopyFileA" },
- { 0x0041, "CopyFileExA" },
- { 0x0042, "CopyFileExW" },
- { 0x0043, "CopyFileW" },
- { 0x0044, "CopyLZFile" },
- { 0x0045, "CreateActCtxA" },
- { 0x0046, "CreateActCtxW" },
- { 0x0047, "CreateConsoleScreenBuffer" },
- { 0x0048, "CreateDirectoryA" },
- { 0x0049, "CreateDirectoryExA" },
- { 0x004a, "CreateDirectoryExW" },
- { 0x004b, "CreateDirectoryW" },
- { 0x004c, "CreateEventA" },
- { 0x004d, "CreateEventW" },
- { 0x004e, "CreateFiber" },
- { 0x004f, "CreateFiberEx" },
- { 0x0050, "CreateFileA" },
- { 0x0051, "CreateFileMappingA" },
- { 0x0052, "CreateFileMappingW" },
- { 0x0053, "CreateFileW" },
- { 0x0054, "CreateHardLinkA" },
- { 0x0055, "CreateHardLinkW" },
- { 0x0056, "CreateIoCompletionPort" },
- { 0x0057, "CreateJobObjectA" },
- { 0x0058, "CreateJobObjectW" },
- { 0x0059, "CreateJobSet" },
- { 0x005a, "CreateMailslotA" },
- { 0x005b, "CreateMailslotW" },
- { 0x005c, "CreateMemoryResourceNotification" },
- { 0x005d, "CreateMutexA" },
- { 0x005e, "CreateMutexW" },
- { 0x005f, "CreateNamedPipeA" },
- { 0x0060, "CreateNamedPipeW" },
- { 0x0061, "CreateNlsSecurityDescriptor" },
- { 0x0062, "CreatePipe" },
- { 0x0063, "CreateProcessA" },
- { 0x0064, "CreateProcessInternalA" },
- { 0x0065, "CreateProcessInternalW" },
- { 0x0066, "CreateProcessInternalWSecure" },
- { 0x0067, "CreateProcessW" },
- { 0x0068, "CreateRemoteThread" },
- { 0x0069, "CreateSemaphoreA" },
- { 0x006a, "CreateSemaphoreW" },
- { 0x006b, "CreateSocketHandle" },
- { 0x006c, "CreateTapePartition" },
- { 0x006d, "CreateThread" },
- { 0x006e, "CreateTimerQueue" },
- { 0x006f, "CreateTimerQueueTimer" },
- { 0x0070, "CreateToolhelp32Snapshot" },
- { 0x0071, "CreateVirtualBuffer" },
- { 0x0072, "CreateWaitableTimerA" },
- { 0x0073, "CreateWaitableTimerW" },
- { 0x0074, "DeactivateActCtx" },
- { 0x0075, "DebugActiveProcess" },
- { 0x0076, "DebugActiveProcessStop" },
- { 0x0077, "DebugBreak" },
- { 0x0078, "DebugBreakProcess" },
- { 0x0079, "DebugSetProcessKillOnExit" },
- { 0x007a, "DecodePointer" },
- { 0x007b, "DecodeSystemPointer" },
- { 0x007c, "DefineDosDeviceA" },
- { 0x007d, "DefineDosDeviceW" },
- { 0x007e, "DelayLoadFailureHook" },
- { 0x007f, "DeleteAtom" },
- { 0x0080, "DeleteCriticalSection" },
- { 0x0081, "DeleteFiber" },
- { 0x0082, "DeleteFileA" },
- { 0x0083, "DeleteFileW" },
- { 0x0084, "DeleteTimerQueue" },
- { 0x0085, "DeleteTimerQueueEx" },
- { 0x0086, "DeleteTimerQueueTimer" },
- { 0x0087, "DeleteVolumeMountPointA" },
- { 0x0088, "DeleteVolumeMountPointW" },
- { 0x0089, "DeviceIoControl" },
- { 0x008a, "DisableThreadLibraryCalls" },
- { 0x008b, "DisconnectNamedPipe" },
- { 0x008c, "DnsHostnameToComputerNameA" },
- { 0x008d, "DnsHostnameToComputerNameW" },
- { 0x008e, "DosDateTimeToFileTime" },
- { 0x008f, "DosPathToSessionPathA" },
- { 0x0090, "DosPathToSessionPathW" },
- { 0x0091, "DuplicateConsoleHandle" },
- { 0x0092, "DuplicateHandle" },
- { 0x0093, "EncodePointer" },
- { 0x0094, "EncodeSystemPointer" },
- { 0x0095, "EndUpdateResourceA" },
- { 0x0096, "EndUpdateResourceW" },
- { 0x0097, "EnterCriticalSection" },
- { 0x0098, "EnumCalendarInfoA" },
- { 0x0099, "EnumCalendarInfoExA" },
- { 0x009a, "EnumCalendarInfoExW" },
- { 0x009b, "EnumCalendarInfoW" },
- { 0x009c, "EnumDateFormatsA" },
- { 0x009d, "EnumDateFormatsExA" },
- { 0x009e, "EnumDateFormatsExW" },
- { 0x009f, "EnumDateFormatsW" },
- { 0x00a0, "EnumLanguageGroupLocalesA" },
- { 0x00a1, "EnumLanguageGroupLocalesW" },
- { 0x00a2, "EnumResourceLanguagesA" },
- { 0x00a3, "EnumResourceLanguagesW" },
- { 0x00a4, "EnumResourceNamesA" },
- { 0x00a5, "EnumResourceNamesW" },
- { 0x00a6, "EnumResourceTypesA" },
- { 0x00a7, "EnumResourceTypesW" },
- { 0x00a8, "EnumSystemCodePagesA" },
- { 0x00a9, "EnumSystemCodePagesW" },
- { 0x00aa, "EnumSystemGeoID" },
- { 0x00ab, "EnumSystemLanguageGroupsA" },
- { 0x00ac, "EnumSystemLanguageGroupsW" },
- { 0x00ad, "EnumSystemLocalesA" },
- { 0x00ae, "EnumSystemLocalesW" },
- { 0x00af, "EnumTimeFormatsA" },
- { 0x00b0, "EnumTimeFormatsW" },
- { 0x00b1, "EnumUILanguagesA" },
- { 0x00b2, "EnumUILanguagesW" },
- { 0x00b3, "EnumerateLocalComputerNamesA" },
- { 0x00b4, "EnumerateLocalComputerNamesW" },
- { 0x00b5, "EraseTape" },
- { 0x00b6, "EscapeCommFunction" },
- { 0x00b7, "ExitProcess" },
- { 0x00b8, "ExitThread" },
- { 0x00b9, "ExitVDM" },
- { 0x00ba, "ExpandEnvironmentStringsA" },
- { 0x00bb, "ExpandEnvironmentStringsW" },
- { 0x00bc, "ExpungeConsoleCommandHistoryA" },
- { 0x00bd, "ExpungeConsoleCommandHistoryW" },
- { 0x00be, "ExtendVirtualBuffer" },
- { 0x00bf, "FatalAppExitA" },
- { 0x00c0, "FatalAppExitW" },
- { 0x00c1, "FatalExit" },
- { 0x00c2, "FileTimeToDosDateTime" },
- { 0x00c3, "FileTimeToLocalFileTime" },
- { 0x00c4, "FileTimeToSystemTime" },
- { 0x00c5, "FillConsoleOutputAttribute" },
- { 0x00c6, "FillConsoleOutputCharacterA" },
- { 0x00c7, "FillConsoleOutputCharacterW" },
- { 0x00c8, "FindActCtxSectionGuid" },
- { 0x00c9, "FindActCtxSectionStringA" },
- { 0x00ca, "FindActCtxSectionStringW" },
- { 0x00cb, "FindAtomA" },
- { 0x00cc, "FindAtomW" },
- { 0x00cd, "FindClose" },
- { 0x00ce, "FindCloseChangeNotification" },
- { 0x00cf, "FindFirstChangeNotificationA" },
- { 0x00d0, "FindFirstChangeNotificationW" },
- { 0x00d1, "FindFirstFileA" },
- { 0x00d2, "FindFirstFileExA" },
- { 0x00d3, "FindFirstFileExW" },
- { 0x00d4, "FindFirstFileW" },
- { 0x00d5, "FindFirstVolumeA" },
- { 0x00d6, "FindFirstVolumeMountPointA" },
- { 0x00d7, "FindFirstVolumeMountPointW" },
- { 0x00d8, "FindFirstVolumeW" },
- { 0x00d9, "FindNextChangeNotification" },
- { 0x00da, "FindNextFileA" },
- { 0x00db, "FindNextFileW" },
- { 0x00dc, "FindNextVolumeA" },
- { 0x00dd, "FindNextVolumeMountPointA" },
- { 0x00de, "FindNextVolumeMountPointW" },
- { 0x00df, "FindNextVolumeW" },
- { 0x00e0, "FindResourceA" },
- { 0x00e1, "FindResourceExA" },
- { 0x00e2, "FindResourceExW" },
- { 0x00e3, "FindResourceW" },
- { 0x00e4, "FindVolumeClose" },
- { 0x00e5, "FindVolumeMountPointClose" },
- { 0x00e6, "FlushConsoleInputBuffer" },
- { 0x00e7, "FlushFileBuffers" },
- { 0x00e8, "FlushInstructionCache" },
- { 0x00e9, "FlushViewOfFile" },
- { 0x00ea, "FoldStringA" },
- { 0x00eb, "FoldStringW" },
- { 0x00ec, "FormatMessageA" },
- { 0x00ed, "FormatMessageW" },
- { 0x00ee, "FreeConsole" },
- { 0x00ef, "FreeEnvironmentStringsA" },
- { 0x00f0, "FreeEnvironmentStringsW" },
- { 0x00f1, "FreeLibrary" },
- { 0x00f2, "FreeLibraryAndExitThread" },
- { 0x00f3, "FreeResource" },
- { 0x00f4, "FreeUserPhysicalPages" },
- { 0x00f5, "FreeVirtualBuffer" },
- { 0x00f6, "GenerateConsoleCtrlEvent" },
- { 0x00f7, "GetACP" },
- { 0x00f8, "GetAtomNameA" },
- { 0x00f9, "GetAtomNameW" },
- { 0x00fa, "GetBinaryType" },
- { 0x00fb, "GetBinaryTypeA" },
- { 0x00fc, "GetBinaryTypeW" },
- { 0x00fd, "GetCPFileNameFromRegistry" },
- { 0x00fe, "GetCPInfo" },
- { 0x00ff, "GetCPInfoExA" },
- { 0x0100, "GetCPInfoExW" },
- { 0x0101, "GetCalendarInfoA" },
- { 0x0102, "GetCalendarInfoW" },
- { 0x0103, "GetComPlusPackageInstallStatus" },
- { 0x0104, "GetCommConfig" },
- { 0x0105, "GetCommMask" },
- { 0x0106, "GetCommModemStatus" },
- { 0x0107, "GetCommProperties" },
- { 0x0108, "GetCommState" },
- { 0x0109, "GetCommTimeouts" },
- { 0x010a, "GetCommandLineA" },
- { 0x010b, "GetCommandLineW" },
- { 0x010c, "GetCompressedFileSizeA" },
- { 0x010d, "GetCompressedFileSizeW" },
- { 0x010e, "GetComputerNameA" },
- { 0x010f, "GetComputerNameExA" },
- { 0x0110, "GetComputerNameExW" },
- { 0x0111, "GetComputerNameW" },
- { 0x0112, "GetConsoleAliasA" },
- { 0x0113, "GetConsoleAliasExesA" },
- { 0x0114, "GetConsoleAliasExesLengthA" },
- { 0x0115, "GetConsoleAliasExesLengthW" },
- { 0x0116, "GetConsoleAliasExesW" },
- { 0x0117, "GetConsoleAliasW" },
- { 0x0118, "GetConsoleAliasesA" },
- { 0x0119, "GetConsoleAliasesLengthA" },
- { 0x011a, "GetConsoleAliasesLengthW" },
- { 0x011b, "GetConsoleAliasesW" },
- { 0x011c, "GetConsoleCP" },
- { 0x011d, "GetConsoleCharType" },
- { 0x011e, "GetConsoleCommandHistoryA" },
- { 0x011f, "GetConsoleCommandHistoryLengthA" },
- { 0x0120, "GetConsoleCommandHistoryLengthW" },
- { 0x0121, "GetConsoleCommandHistoryW" },
- { 0x0122, "GetConsoleCursorInfo" },
- { 0x0123, "GetConsoleCursorMode" },
- { 0x0124, "GetConsoleDisplayMode" },
- { 0x0125, "GetConsoleFontInfo" },
- { 0x0126, "GetConsoleFontSize" },
- { 0x0127, "GetConsoleHardwareState" },
- { 0x0128, "GetConsoleInputExeNameA" },
- { 0x0129, "GetConsoleInputExeNameW" },
- { 0x012a, "GetConsoleInputWaitHandle" },
- { 0x012b, "GetConsoleKeyboardLayoutNameA" },
- { 0x012c, "GetConsoleKeyboardLayoutNameW" },
- { 0x012d, "GetConsoleMode" },
- { 0x012e, "GetConsoleNlsMode" },
- { 0x012f, "GetConsoleOutputCP" },
- { 0x0130, "GetConsoleProcessList" },
- { 0x0131, "GetConsoleScreenBufferInfo" },
- { 0x0132, "GetConsoleSelectionInfo" },
- { 0x0133, "GetConsoleTitleA" },
- { 0x0134, "GetConsoleTitleW" },
- { 0x0135, "GetConsoleWindow" },
- { 0x0136, "GetCurrencyFormatA" },
- { 0x0137, "GetCurrencyFormatW" },
- { 0x0138, "GetCurrentActCtx" },
- { 0x0139, "GetCurrentConsoleFont" },
- { 0x013a, "GetCurrentDirectoryA" },
- { 0x013b, "GetCurrentDirectoryW" },
- { 0x013c, "GetCurrentProcess" },
- { 0x013d, "GetCurrentProcessId" },
- { 0x013e, "GetCurrentThread" },
- { 0x013f, "GetCurrentThreadId" },
- { 0x0140, "GetDateFormatA" },
- { 0x0141, "GetDateFormatW" },
- { 0x0142, "GetDefaultCommConfigA" },
- { 0x0143, "GetDefaultCommConfigW" },
- { 0x0144, "GetDefaultSortkeySize" },
- { 0x0145, "GetDevicePowerState" },
- { 0x0146, "GetDiskFreeSpaceA" },
- { 0x0147, "GetDiskFreeSpaceExA" },
- { 0x0148, "GetDiskFreeSpaceExW" },
- { 0x0149, "GetDiskFreeSpaceW" },
- { 0x014a, "GetDllDirectoryA" },
- { 0x014b, "GetDllDirectoryW" },
- { 0x014c, "GetDriveTypeA" },
- { 0x014d, "GetDriveTypeW" },
- { 0x014e, "GetEnvironmentStrings" },
- { 0x014f, "GetEnvironmentStringsA" },
- { 0x0150, "GetEnvironmentStringsW" },
- { 0x0151, "GetEnvironmentVariableA" },
- { 0x0152, "GetEnvironmentVariableW" },
- { 0x0153, "GetExitCodeProcess" },
- { 0x0154, "GetExitCodeThread" },
- { 0x0155, "GetExpandedNameA" },
- { 0x0156, "GetExpandedNameW" },
- { 0x0157, "GetFileAttributesA" },
- { 0x0158, "GetFileAttributesExA" },
- { 0x0159, "GetFileAttributesExW" },
- { 0x015a, "GetFileAttributesW" },
- { 0x015b, "GetFileInformationByHandle" },
- { 0x015c, "GetFileSize" },
- { 0x015d, "GetFileSizeEx" },
- { 0x015e, "GetFileTime" },
- { 0x015f, "GetFileType" },
- { 0x0160, "GetFirmwareEnvironmentVariableA" },
- { 0x0161, "GetFirmwareEnvironmentVariableW" },
- { 0x0162, "GetFullPathNameA" },
- { 0x0163, "GetFullPathNameW" },
- { 0x0164, "GetGeoInfoA" },
- { 0x0165, "GetGeoInfoW" },
- { 0x0166, "GetHandleContext" },
- { 0x0167, "GetHandleInformation" },
- { 0x0168, "GetLargestConsoleWindowSize" },
- { 0x0169, "GetLastError" },
- { 0x016a, "GetLinguistLangSize" },
- { 0x016b, "GetLocalTime" },
- { 0x016c, "GetLocaleInfoA" },
- { 0x016d, "GetLocaleInfoW" },
- { 0x016e, "GetLogicalDriveStringsA" },
- { 0x016f, "GetLogicalDriveStringsW" },
- { 0x0170, "GetLogicalDrives" },
- { 0x0171, "GetLongPathNameA" },
- { 0x0172, "GetLongPathNameW" },
- { 0x0173, "GetMailslotInfo" },
- { 0x0174, "GetModuleFileNameA" },
- { 0x0175, "GetModuleFileNameW" },
- { 0x0176, "GetModuleHandleA" },
- { 0x0177, "GetModuleHandleExA" },
- { 0x0178, "GetModuleHandleExW" },
- { 0x0179, "GetModuleHandleW" },
- { 0x017a, "GetNamedPipeHandleStateA" },
- { 0x017b, "GetNamedPipeHandleStateW" },
- { 0x017c, "GetNamedPipeInfo" },
- { 0x017d, "GetNativeSystemInfo" },
- { 0x017e, "GetNextVDMCommand" },
- { 0x017f, "GetNlsSectionName" },
- { 0x0180, "GetNumaAvailableMemory" },
- { 0x0181, "GetNumaAvailableMemoryNode" },
- { 0x0182, "GetNumaHighestNodeNumber" },
- { 0x0183, "GetNumaNodeProcessorMask" },
- { 0x0184, "GetNumaProcessorMap" },
- { 0x0185, "GetNumaProcessorNode" },
- { 0x0186, "GetNumberFormatA" },
- { 0x0187, "GetNumberFormatW" },
- { 0x0188, "GetNumberOfConsoleFonts" },
- { 0x0189, "GetNumberOfConsoleInputEvents" },
- { 0x018a, "GetNumberOfConsoleMouseButtons" },
- { 0x018b, "GetOEMCP" },
- { 0x018c, "GetOverlappedResult" },
- { 0x018d, "GetPriorityClass" },
- { 0x018e, "GetPrivateProfileIntA" },
- { 0x018f, "GetPrivateProfileIntW" },
- { 0x0190, "GetPrivateProfileSectionA" },
- { 0x0191, "GetPrivateProfileSectionNamesA" },
- { 0x0192, "GetPrivateProfileSectionNamesW" },
- { 0x0193, "GetPrivateProfileSectionW" },
- { 0x0194, "GetPrivateProfileStringA" },
- { 0x0195, "GetPrivateProfileStringW" },
- { 0x0196, "GetPrivateProfileStructA" },
- { 0x0197, "GetPrivateProfileStructW" },
- { 0x0198, "GetProcAddress" },
- { 0x0199, "GetProcessAffinityMask" },
- { 0x019a, "GetProcessHandleCount" },
- { 0x019b, "GetProcessHeap" },
- { 0x019c, "GetProcessHeaps" },
- { 0x019d, "GetProcessId" },
- { 0x019e, "GetProcessIoCounters" },
- { 0x019f, "GetProcessPriorityBoost" },
- { 0x01a0, "GetProcessShutdownParameters" },
- { 0x01a1, "GetProcessTimes" },
- { 0x01a2, "GetProcessVersion" },
- { 0x01a3, "GetProcessWorkingSetSize" },
- { 0x01a4, "GetProfileIntA" },
- { 0x01a5, "GetProfileIntW" },
- { 0x01a6, "GetProfileSectionA" },
- { 0x01a7, "GetProfileSectionW" },
- { 0x01a8, "GetProfileStringA" },
- { 0x01a9, "GetProfileStringW" },
- { 0x01aa, "GetQueuedCompletionStatus" },
- { 0x01ab, "GetShortPathNameA" },
- { 0x01ac, "GetShortPathNameW" },
- { 0x01ad, "GetStartupInfoA" },
- { 0x01ae, "GetStartupInfoW" },
- { 0x01af, "GetStdHandle" },
- { 0x01b0, "GetStringTypeA" },
- { 0x01b1, "GetStringTypeExA" },
- { 0x01b2, "GetStringTypeExW" },
- { 0x01b3, "GetStringTypeW" },
- { 0x01b4, "GetSystemDefaultLCID" },
- { 0x01b5, "GetSystemDefaultLangID" },
- { 0x01b6, "GetSystemDefaultUILanguage" },
- { 0x01b7, "GetSystemDirectoryA" },
- { 0x01b8, "GetSystemDirectoryW" },
- { 0x01b9, "GetSystemInfo" },
- { 0x01ba, "GetSystemPowerStatus" },
- { 0x01bb, "GetSystemRegistryQuota" },
- { 0x01bc, "GetSystemTime" },
- { 0x01bd, "GetSystemTimeAdjustment" },
- { 0x01be, "GetSystemTimeAsFileTime" },
- { 0x01bf, "GetSystemTimes" },
- { 0x01c0, "GetSystemWindowsDirectoryA" },
- { 0x01c1, "GetSystemWindowsDirectoryW" },
- { 0x01c2, "GetSystemWow64DirectoryA" },
- { 0x01c3, "GetSystemWow64DirectoryW" },
- { 0x01c4, "GetTapeParameters" },
- { 0x01c5, "GetTapePosition" },
- { 0x01c6, "GetTapeStatus" },
- { 0x01c7, "GetTempFileNameA" },
- { 0x01c8, "GetTempFileNameW" },
- { 0x01c9, "GetTempPathA" },
- { 0x01ca, "GetTempPathW" },
- { 0x01cb, "GetThreadContext" },
- { 0x01cc, "GetThreadIOPendingFlag" },
- { 0x01cd, "GetThreadLocale" },
- { 0x01ce, "GetThreadPriority" },
- { 0x01cf, "GetThreadPriorityBoost" },
- { 0x01d0, "GetThreadSelectorEntry" },
- { 0x01d1, "GetThreadTimes" },
- { 0x01d2, "GetTickCount" },
- { 0x01d3, "GetTimeFormatA" },
- { 0x01d4, "GetTimeFormatW" },
- { 0x01d5, "GetTimeZoneInformation" },
- { 0x01d6, "GetUserDefaultLCID" },
- { 0x01d7, "GetUserDefaultLangID" },
- { 0x01d8, "GetUserDefaultUILanguage" },
- { 0x01d9, "GetUserGeoID" },
- { 0x01da, "GetVDMCurrentDirectories" },
- { 0x01db, "GetVersion" },
- { 0x01dc, "GetVersionExA" },
- { 0x01dd, "GetVersionExW" },
- { 0x01de, "GetVolumeInformationA" },
- { 0x01df, "GetVolumeInformationW" },
- { 0x01e0, "GetVolumeNameForVolumeMountPointA" },
- { 0x01e1, "GetVolumeNameForVolumeMountPointW" },
- { 0x01e2, "GetVolumePathNameA" },
- { 0x01e3, "GetVolumePathNameW" },
- { 0x01e4, "GetVolumePathNamesForVolumeNameA" },
- { 0x01e5, "GetVolumePathNamesForVolumeNameW" },
- { 0x01e6, "GetWindowsDirectoryA" },
- { 0x01e7, "GetWindowsDirectoryW" },
- { 0x01e8, "GetWriteWatch" },
- { 0x01e9, "GlobalAddAtomA" },
- { 0x01ea, "GlobalAddAtomW" },
- { 0x01eb, "GlobalAlloc" },
- { 0x01ec, "GlobalCompact" },
- { 0x01ed, "GlobalDeleteAtom" },
- { 0x01ee, "GlobalFindAtomA" },
- { 0x01ef, "GlobalFindAtomW" },
- { 0x01f0, "GlobalFix" },
- { 0x01f1, "GlobalFlags" },
- { 0x01f2, "GlobalFree" },
- { 0x01f3, "GlobalGetAtomNameA" },
- { 0x01f4, "GlobalGetAtomNameW" },
- { 0x01f5, "GlobalHandle" },
- { 0x01f6, "GlobalLock" },
- { 0x01f7, "GlobalMemoryStatus" },
- { 0x01f8, "GlobalMemoryStatusEx" },
- { 0x01f9, "GlobalReAlloc" },
- { 0x01fa, "GlobalSize" },
- { 0x01fb, "GlobalUnWire" },
- { 0x01fc, "GlobalUnfix" },
- { 0x01fd, "GlobalUnlock" },
- { 0x01fe, "GlobalWire" },
- { 0x01ff, "Heap32First" },
- { 0x0200, "Heap32ListFirst" },
- { 0x0201, "Heap32ListNext" },
- { 0x0202, "Heap32Next" },
- { 0x0203, "HeapAlloc" },
- { 0x0204, "HeapCompact" },
- { 0x0205, "HeapCreate" },
- { 0x0206, "HeapCreateTagsW" },
- { 0x0207, "HeapDestroy" },
- { 0x0208, "HeapExtend" },
- { 0x0209, "HeapFree" },
- { 0x020a, "HeapLock" },
- { 0x020b, "HeapQueryInformation" },
- { 0x020c, "HeapQueryTagW" },
- { 0x020d, "HeapReAlloc" },
- { 0x020e, "HeapSetInformation" },
- { 0x020f, "HeapSize" },
- { 0x0210, "HeapSummary" },
- { 0x0211, "HeapUnlock" },
- { 0x0212, "HeapUsage" },
- { 0x0213, "HeapValidate" },
- { 0x0214, "HeapWalk" },
- { 0x0215, "InitAtomTable" },
- { 0x0216, "InitializeCriticalSection" },
- { 0x0217, "InitializeCriticalSectionAndSpinCount" },
- { 0x0218, "InitializeSListHead" },
- { 0x0219, "InterlockedCompareExchange" },
- { 0x021a, "InterlockedDecrement" },
- { 0x021b, "InterlockedExchange" },
- { 0x021c, "InterlockedExchangeAdd" },
- { 0x021d, "InterlockedFlushSList" },
- { 0x021e, "InterlockedIncrement" },
- { 0x021f, "InterlockedPopEntrySList" },
- { 0x0220, "InterlockedPushEntrySList" },
- { 0x0221, "InvalidateConsoleDIBits" },
- { 0x0222, "IsBadCodePtr" },
- { 0x0223, "IsBadHugeReadPtr" },
- { 0x0224, "IsBadHugeWritePtr" },
- { 0x0225, "IsBadReadPtr" },
- { 0x0226, "IsBadStringPtrA" },
- { 0x0227, "IsBadStringPtrW" },
- { 0x0228, "IsBadWritePtr" },
- { 0x0229, "IsDBCSLeadByte" },
- { 0x022a, "IsDBCSLeadByteEx" },
- { 0x022b, "IsDebuggerPresent" },
- { 0x022c, "IsProcessInJob" },
- { 0x022d, "IsProcessorFeaturePresent" },
- { 0x022e, "IsSystemResumeAutomatic" },
- { 0x022f, "IsValidCodePage" },
- { 0x0230, "IsValidLanguageGroup" },
- { 0x0231, "IsValidLocale" },
- { 0x0232, "IsValidUILanguage" },
- { 0x0233, "IsWow64Process" },
- { 0x0234, "LCMapStringA" },
- { 0x0235, "LCMapStringW" },
- { 0x0236, "LZClose" },
- { 0x0237, "LZCloseFile" },
- { 0x0238, "LZCopy" },
- { 0x0239, "LZCreateFileW" },
- { 0x023a, "LZDone" },
- { 0x023b, "LZInit" },
- { 0x023c, "LZOpenFileA" },
- { 0x023d, "LZOpenFileW" },
- { 0x023e, "LZRead" },
- { 0x023f, "LZSeek" },
- { 0x0240, "LZStart" },
- { 0x0241, "LeaveCriticalSection" },
- { 0x0242, "LoadLibraryA" },
- { 0x0243, "LoadLibraryExA" },
- { 0x0244, "LoadLibraryExW" },
- { 0x0245, "LoadLibraryW" },
- { 0x0246, "LoadModule" },
- { 0x0247, "LoadResource" },
- { 0x0248, "LocalAlloc" },
- { 0x0249, "LocalCompact" },
- { 0x024a, "LocalFileTimeToFileTime" },
- { 0x024b, "LocalFlags" },
- { 0x024c, "LocalFree" },
- { 0x024d, "LocalHandle" },
- { 0x024e, "LocalLock" },
- { 0x024f, "LocalReAlloc" },
- { 0x0250, "LocalShrink" },
- { 0x0251, "LocalSize" },
- { 0x0252, "LocalUnlock" },
- { 0x0253, "LockFile" },
- { 0x0254, "LockFileEx" },
- { 0x0255, "LockResource" },
- { 0x0256, "MapUserPhysicalPages" },
- { 0x0257, "MapUserPhysicalPagesScatter" },
- { 0x0258, "MapViewOfFile" },
- { 0x0259, "MapViewOfFileEx" },
- { 0x025a, "Module32First" },
- { 0x025b, "Module32FirstW" },
- { 0x025c, "Module32Next" },
- { 0x025d, "Module32NextW" },
- { 0x025e, "MoveFileA" },
- { 0x025f, "MoveFileExA" },
- { 0x0260, "MoveFileExW" },
- { 0x0261, "MoveFileW" },
- { 0x0262, "MoveFileWithProgressA" },
- { 0x0263, "MoveFileWithProgressW" },
- { 0x0264, "MulDiv" },
- { 0x0265, "MultiByteToWideChar" },
- { 0x0266, "NlsConvertIntegerToString" },
- { 0x0267, "NlsGetCacheUpdateCount" },
- { 0x0268, "NlsResetProcessLocale" },
- { 0x0269, "NumaVirtualQueryNode" },
- { 0x026a, "OpenConsoleW" },
- { 0x026b, "OpenDataFile" },
- { 0x026c, "OpenEventA" },
- { 0x026d, "OpenEventW" },
- { 0x026e, "OpenFile" },
- { 0x026f, "OpenFileMappingA" },
- { 0x0270, "OpenFileMappingW" },
- { 0x0271, "OpenJobObjectA" },
- { 0x0272, "OpenJobObjectW" },
- { 0x0273, "OpenMutexA" },
- { 0x0274, "OpenMutexW" },
- { 0x0275, "OpenProcess" },
- { 0x0276, "OpenProfileUserMapping" },
- { 0x0277, "OpenSemaphoreA" },
- { 0x0278, "OpenSemaphoreW" },
- { 0x0279, "OpenThread" },
- { 0x027a, "OpenWaitableTimerA" },
- { 0x027b, "OpenWaitableTimerW" },
- { 0x027c, "OutputDebugStringA" },
- { 0x027d, "OutputDebugStringW" },
- { 0x027e, "PeekConsoleInputA" },
- { 0x027f, "PeekConsoleInputW" },
- { 0x0280, "PeekNamedPipe" },
- { 0x0281, "PostQueuedCompletionStatus" },
- { 0x0282, "PrepareTape" },
- { 0x0283, "PrivCopyFileExW" },
- { 0x0284, "PrivMoveFileIdentityW" },
- { 0x0285, "Process32First" },
- { 0x0286, "Process32FirstW" },
- { 0x0287, "Process32Next" },
- { 0x0288, "Process32NextW" },
- { 0x0289, "ProcessIdToSessionId" },
- { 0x028a, "PulseEvent" },
- { 0x028b, "PurgeComm" },
- { 0x028c, "QueryActCtxW" },
- { 0x028d, "QueryDepthSList" },
- { 0x028e, "QueryDosDeviceA" },
- { 0x028f, "QueryDosDeviceW" },
- { 0x0290, "QueryInformationJobObject" },
- { 0x0291, "QueryMemoryResourceNotification" },
- { 0x0292, "QueryPerformanceCounter" },
- { 0x0293, "QueryPerformanceFrequency" },
- { 0x0294, "QueryWin31IniFilesMappedToRegistry" },
- { 0x0295, "QueueUserAPC" },
- { 0x0296, "QueueUserWorkItem" },
- { 0x0297, "RaiseException" },
- { 0x0298, "ReadConsoleA" },
- { 0x0299, "ReadConsoleInputA" },
- { 0x029a, "ReadConsoleInputExA" },
- { 0x029b, "ReadConsoleInputExW" },
- { 0x029c, "ReadConsoleInputW" },
- { 0x029d, "ReadConsoleOutputA" },
- { 0x029e, "ReadConsoleOutputAttribute" },
- { 0x029f, "ReadConsoleOutputCharacterA" },
- { 0x02a0, "ReadConsoleOutputCharacterW" },
- { 0x02a1, "ReadConsoleOutputW" },
- { 0x02a2, "ReadConsoleW" },
- { 0x02a3, "ReadDirectoryChangesW" },
- { 0x02a4, "ReadFile" },
- { 0x02a5, "ReadFileEx" },
- { 0x02a6, "ReadFileScatter" },
- { 0x02a7, "ReadProcessMemory" },
- { 0x02a8, "RegisterConsoleIME" },
- { 0x02a9, "RegisterConsoleOS2" },
- { 0x02aa, "RegisterConsoleVDM" },
- { 0x02ab, "RegisterWaitForInputIdle" },
- { 0x02ac, "RegisterWaitForSingleObject" },
- { 0x02ad, "RegisterWaitForSingleObjectEx" },
- { 0x02ae, "RegisterWowBaseHandlers" },
- { 0x02af, "RegisterWowExec" },
- { 0x02b0, "ReleaseActCtx" },
- { 0x02b1, "ReleaseMutex" },
- { 0x02b2, "ReleaseSemaphore" },
- { 0x02b3, "RemoveDirectoryA" },
- { 0x02b4, "RemoveDirectoryW" },
- { 0x02b5, "RemoveLocalAlternateComputerNameA" },
- { 0x02b6, "RemoveLocalAlternateComputerNameW" },
- { 0x02b7, "RemoveVectoredExceptionHandler" },
- { 0x02b8, "ReplaceFile" },
- { 0x02b9, "ReplaceFileA" },
- { 0x02ba, "ReplaceFileW" },
- { 0x02bb, "RequestDeviceWakeup" },
- { 0x02bc, "RequestWakeupLatency" },
- { 0x02bd, "ResetEvent" },
- { 0x02be, "ResetWriteWatch" },
- { 0x02bf, "RestoreLastError" },
- { 0x02c0, "ResumeThread" },
- { 0x02c1, "RtlCaptureContext" },
- { 0x02c2, "RtlCaptureStackBackTrace" },
- { 0x02c3, "RtlFillMemory" },
- { 0x02c4, "RtlMoveMemory" },
- { 0x02c5, "RtlUnwind" },
- { 0x02c6, "RtlZeroMemory" },
- { 0x02c7, "ScrollConsoleScreenBufferA" },
- { 0x02c8, "ScrollConsoleScreenBufferW" },
- { 0x02c9, "SearchPathA" },
- { 0x02ca, "SearchPathW" },
- { 0x02cb, "SetCPGlobal" },
- { 0x02cc, "SetCalendarInfoA" },
- { 0x02cd, "SetCalendarInfoW" },
- { 0x02ce, "SetClientTimeZoneInformation" },
- { 0x02cf, "SetComPlusPackageInstallStatus" },
- { 0x02d0, "SetCommBreak" },
- { 0x02d1, "SetCommConfig" },
- { 0x02d2, "SetCommMask" },
- { 0x02d3, "SetCommState" },
- { 0x02d4, "SetCommTimeouts" },
- { 0x02d5, "SetComputerNameA" },
- { 0x02d6, "SetComputerNameExA" },
- { 0x02d7, "SetComputerNameExW" },
- { 0x02d8, "SetComputerNameW" },
- { 0x02d9, "SetConsoleActiveScreenBuffer" },
- { 0x02da, "SetConsoleCP" },
- { 0x02db, "SetConsoleCommandHistoryMode" },
- { 0x02dc, "SetConsoleCtrlHandler" },
- { 0x02dd, "SetConsoleCursor" },
- { 0x02de, "SetConsoleCursorInfo" },
- { 0x02df, "SetConsoleCursorMode" },
- { 0x02e0, "SetConsoleCursorPosition" },
- { 0x02e1, "SetConsoleDisplayMode" },
- { 0x02e2, "SetConsoleFont" },
- { 0x02e3, "SetConsoleHardwareState" },
- { 0x02e4, "SetConsoleIcon" },
- { 0x02e5, "SetConsoleInputExeNameA" },
- { 0x02e6, "SetConsoleInputExeNameW" },
- { 0x02e7, "SetConsoleKeyShortcuts" },
- { 0x02e8, "SetConsoleLocalEUDC" },
- { 0x02e9, "SetConsoleMaximumWindowSize" },
- { 0x02ea, "SetConsoleMenuClose" },
- { 0x02eb, "SetConsoleMode" },
- { 0x02ec, "SetConsoleNlsMode" },
- { 0x02ed, "SetConsoleNumberOfCommandsA" },
- { 0x02ee, "SetConsoleNumberOfCommandsW" },
- { 0x02ef, "SetConsoleOS2OemFormat" },
- { 0x02f0, "SetConsoleOutputCP" },
- { 0x02f1, "SetConsolePalette" },
- { 0x02f2, "SetConsoleScreenBufferSize" },
- { 0x02f3, "SetConsoleTextAttribute" },
- { 0x02f4, "SetConsoleTitleA" },
- { 0x02f5, "SetConsoleTitleW" },
- { 0x02f6, "SetConsoleWindowInfo" },
- { 0x02f7, "SetCriticalSectionSpinCount" },
- { 0x02f8, "SetCurrentDirectoryA" },
- { 0x02f9, "SetCurrentDirectoryW" },
- { 0x02fa, "SetDefaultCommConfigA" },
- { 0x02fb, "SetDefaultCommConfigW" },
- { 0x02fc, "SetDllDirectoryA" },
- { 0x02fd, "SetDllDirectoryW" },
- { 0x02fe, "SetEndOfFile" },
- { 0x02ff, "SetEnvironmentVariableA" },
- { 0x0300, "SetEnvironmentVariableW" },
- { 0x0301, "SetErrorMode" },
- { 0x0302, "SetEvent" },
- { 0x0303, "SetFileApisToANSI" },
- { 0x0304, "SetFileApisToOEM" },
- { 0x0305, "SetFileAttributesA" },
- { 0x0306, "SetFileAttributesW" },
- { 0x0307, "SetFilePointer" },
- { 0x0308, "SetFilePointerEx" },
- { 0x0309, "SetFileShortNameA" },
- { 0x030a, "SetFileShortNameW" },
- { 0x030b, "SetFileTime" },
- { 0x030c, "SetFileValidData" },
- { 0x030d, "SetFirmwareEnvironmentVariableA" },
- { 0x030e, "SetFirmwareEnvironmentVariableW" },
- { 0x030f, "SetHandleContext" },
- { 0x0310, "SetHandleCount" },
- { 0x0311, "SetHandleInformation" },
- { 0x0312, "SetInformationJobObject" },
- { 0x0313, "SetLastConsoleEventActive" },
- { 0x0314, "SetLastError" },
- { 0x0315, "SetLocalPrimaryComputerNameA" },
- { 0x0316, "SetLocalPrimaryComputerNameW" },
- { 0x0317, "SetLocalTime" },
- { 0x0318, "SetLocaleInfoA" },
- { 0x0319, "SetLocaleInfoW" },
- { 0x031a, "SetMailslotInfo" },
- { 0x031b, "SetMessageWaitingIndicator" },
- { 0x031c, "SetNamedPipeHandleState" },
- { 0x031d, "SetPriorityClass" },
- { 0x031e, "SetProcessAffinityMask" },
- { 0x031f, "SetProcessPriorityBoost" },
- { 0x0320, "SetProcessShutdownParameters" },
- { 0x0321, "SetProcessWorkingSetSize" },
- { 0x0322, "SetStdHandle" },
- { 0x0323, "SetSystemPowerState" },
- { 0x0324, "SetSystemTime" },
- { 0x0325, "SetSystemTimeAdjustment" },
- { 0x0326, "SetTapeParameters" },
- { 0x0327, "SetTapePosition" },
- { 0x0328, "SetTermsrvAppInstallMode" },
- { 0x0329, "SetThreadAffinityMask" },
- { 0x032a, "SetThreadContext" },
- { 0x032b, "SetThreadExecutionState" },
- { 0x032c, "SetThreadIdealProcessor" },
- { 0x032d, "SetThreadLocale" },
- { 0x032e, "SetThreadPriority" },
- { 0x032f, "SetThreadPriorityBoost" },
- { 0x0330, "SetThreadUILanguage" },
- { 0x0331, "SetTimeZoneInformation" },
- { 0x0332, "SetTimerQueueTimer" },
- { 0x0333, "SetUnhandledExceptionFilter" },
- { 0x0334, "SetUserGeoID" },
- { 0x0335, "SetVDMCurrentDirectories" },
- { 0x0336, "SetVolumeLabelA" },
- { 0x0337, "SetVolumeLabelW" },
- { 0x0338, "SetVolumeMountPointA" },
- { 0x0339, "SetVolumeMountPointW" },
- { 0x033a, "SetWaitableTimer" },
- { 0x033b, "SetupComm" },
- { 0x033c, "ShowConsoleCursor" },
- { 0x033d, "SignalObjectAndWait" },
- { 0x033e, "SizeofResource" },
- { 0x033f, "Sleep" },
- { 0x0340, "SleepEx" },
- { 0x0341, "SuspendThread" },
- { 0x0342, "SwitchToFiber" },
- { 0x0343, "SwitchToThread" },
- { 0x0344, "SystemTimeToFileTime" },
- { 0x0345, "SystemTimeToTzSpecificLocalTime" },
- { 0x0346, "TerminateJobObject" },
- { 0x0347, "TerminateProcess" },
- { 0x0348, "TerminateThread" },
- { 0x0349, "TermsrvAppInstallMode" },
- { 0x034a, "Thread32First" },
- { 0x034b, "Thread32Next" },
- { 0x034c, "TlsAlloc" },
- { 0x034d, "TlsFree" },
- { 0x034e, "TlsGetValue" },
- { 0x034f, "TlsSetValue" },
- { 0x0350, "Toolhelp32ReadProcessMemory" },
- { 0x0351, "TransactNamedPipe" },
- { 0x0352, "TransmitCommChar" },
- { 0x0353, "TrimVirtualBuffer" },
- { 0x0354, "TryEnterCriticalSection" },
- { 0x0355, "TzSpecificLocalTimeToSystemTime" },
- { 0x0356, "UTRegister" },
- { 0x0357, "UTUnRegister" },
- { 0x0358, "UnhandledExceptionFilter" },
- { 0x0359, "UnlockFile" },
- { 0x035a, "UnlockFileEx" },
- { 0x035b, "UnmapViewOfFile" },
- { 0x035c, "UnregisterConsoleIME" },
- { 0x035d, "UnregisterWait" },
- { 0x035e, "UnregisterWaitEx" },
- { 0x035f, "UpdateResourceA" },
- { 0x0360, "UpdateResourceW" },
- { 0x0361, "VDMConsoleOperation" },
- { 0x0362, "VDMOperationStarted" },
- { 0x0363, "ValidateLCType" },
- { 0x0364, "ValidateLocale" },
- { 0x0365, "VerLanguageNameA" },
- { 0x0366, "VerLanguageNameW" },
- { 0x0367, "VerSetConditionMask" },
- { 0x0368, "VerifyConsoleIoHandle" },
- { 0x0369, "VerifyVersionInfoA" },
- { 0x036a, "VerifyVersionInfoW" },
- { 0x036b, "VirtualAlloc" },
- { 0x036c, "VirtualAllocEx" },
- { 0x036d, "VirtualBufferExceptionHandler" },
- { 0x036e, "VirtualFree" },
- { 0x036f, "VirtualFreeEx" },
- { 0x0370, "VirtualLock" },
- { 0x0371, "VirtualProtect" },
- { 0x0372, "VirtualProtectEx" },
- { 0x0373, "VirtualQuery" },
- { 0x0374, "VirtualQueryEx" },
- { 0x0375, "VirtualUnlock" },
- { 0x0376, "WTSGetActiveConsoleSessionId" },
- { 0x0377, "WaitCommEvent" },
- { 0x0378, "WaitForDebugEvent" },
- { 0x0379, "WaitForMultipleObjects" },
- { 0x037a, "WaitForMultipleObjectsEx" },
- { 0x037b, "WaitForSingleObject" },
- { 0x037c, "WaitForSingleObjectEx" },
- { 0x037d, "WaitNamedPipeA" },
- { 0x037e, "WaitNamedPipeW" },
- { 0x037f, "WideCharToMultiByte" },
- { 0x0380, "WinExec" },
- { 0x0381, "WriteConsoleA" },
- { 0x0382, "WriteConsoleInputA" },
- { 0x0383, "WriteConsoleInputVDMA" },
- { 0x0384, "WriteConsoleInputVDMW" },
- { 0x0385, "WriteConsoleInputW" },
- { 0x0386, "WriteConsoleOutputA" },
- { 0x0387, "WriteConsoleOutputAttribute" },
- { 0x0388, "WriteConsoleOutputCharacterA" },
- { 0x0389, "WriteConsoleOutputCharacterW" },
- { 0x038a, "WriteConsoleOutputW" },
- { 0x038b, "WriteConsoleW" },
- { 0x038c, "WriteFile" },
- { 0x038d, "WriteFileEx" },
- { 0x038e, "WriteFileGather" },
- { 0x038f, "WritePrivateProfileSectionA" },
- { 0x0390, "WritePrivateProfileSectionW" },
- { 0x0391, "WritePrivateProfileStringA" },
- { 0x0392, "WritePrivateProfileStringW" },
- { 0x0393, "WritePrivateProfileStructA" },
- { 0x0394, "WritePrivateProfileStructW" },
- { 0x0395, "WriteProcessMemory" },
- { 0x0396, "WriteProfileSectionA" },
- { 0x0397, "WriteProfileSectionW" },
- { 0x0398, "WriteProfileStringA" },
- { 0x0399, "WriteProfileStringW" },
- { 0x039a, "WriteTapemark" },
- { 0x039b, "ZombifyActCtx" },
- { 0x039c, "_hread" },
- { 0x039d, "_hwrite" },
- { 0x039e, "_lclose" },
- { 0x039f, "_lcreat" },
- { 0x03a0, "_llseek" },
- { 0x03a1, "_lopen" },
- { 0x03a2, "_lread" },
- { 0x03a3, "_lwrite" },
- { 0x03a4, "lstrcat" },
- { 0x03a5, "lstrcatA" },
- { 0x03a6, "lstrcatW" },
- { 0x03a7, "lstrcmp" },
- { 0x03a8, "lstrcmpA" },
- { 0x03a9, "lstrcmpW" },
- { 0x03aa, "lstrcmpi" },
- { 0x03ab, "lstrcmpiA" },
- { 0x03ac, "lstrcmpiW" },
- { 0x03ad, "lstrcpy" },
- { 0x03ae, "lstrcpyA" },
- { 0x03af, "lstrcpyW" },
- { 0x03b0, "lstrcpyn" },
- { 0x03b1, "lstrcpynA" },
- { 0x03b2, "lstrcpynW" },
- { 0x03b3, "lstrlen" },
- { 0x03b4, "lstrlenA" },
- { 0x03b5, "lstrlenW" },
-};
+const char* kernel32_dll_lookup(uint32_t i) {
+ switch(i) {
+ case 0x0001: return "ActivateActCtx";
+ case 0x0002: return "AddAtomA";
+ case 0x0003: return "AddAtomW";
+ case 0x0004: return "AddConsoleAliasA";
+ case 0x0005: return "AddConsoleAliasW";
+ case 0x0006: return "AddLocalAlternateComputerNameA";
+ case 0x0007: return "AddLocalAlternateComputerNameW";
+ case 0x0008: return "AddRefActCtx";
+ case 0x0009: return "AddVectoredExceptionHandler";
+ case 0x000a: return "AllocConsole";
+ case 0x000b: return "AllocateUserPhysicalPages";
+ case 0x000c: return "AreFileApisANSI";
+ case 0x000d: return "AssignProcessToJobObject";
+ case 0x000e: return "AttachConsole";
+ case 0x000f: return "BackupRead";
+ case 0x0010: return "BackupSeek";
+ case 0x0011: return "BackupWrite";
+ case 0x0012: return "BaseCheckAppcompatCache";
+ case 0x0013: return "BaseCleanupAppcompatCache";
+ case 0x0014: return "BaseCleanupAppcompatCacheSupport";
+ case 0x0015: return "BaseDumpAppcompatCache";
+ case 0x0016: return "BaseFlushAppcompatCache";
+ case 0x0017: return "BaseInitAppcompatCache";
+ case 0x0018: return "BaseInitAppcompatCacheSupport";
+ case 0x0019: return "BaseProcessInitPostImport";
+ case 0x001a: return "BaseQueryModuleData";
+ case 0x001b: return "BaseUpdateAppcompatCache";
+ case 0x001c: return "BasepCheckWinSaferRestrictions";
+ case 0x001d: return "Beep";
+ case 0x001e: return "BeginUpdateResourceA";
+ case 0x001f: return "BeginUpdateResourceW";
+ case 0x0020: return "BindIoCompletionCallback";
+ case 0x0021: return "BuildCommDCBA";
+ case 0x0022: return "BuildCommDCBAndTimeoutsA";
+ case 0x0023: return "BuildCommDCBAndTimeoutsW";
+ case 0x0024: return "BuildCommDCBW";
+ case 0x0025: return "CallNamedPipeA";
+ case 0x0026: return "CallNamedPipeW";
+ case 0x0027: return "CancelDeviceWakeupRequest";
+ case 0x0028: return "CancelIo";
+ case 0x0029: return "CancelTimerQueueTimer";
+ case 0x002a: return "CancelWaitableTimer";
+ case 0x002b: return "ChangeTimerQueueTimer";
+ case 0x002c: return "CheckNameLegalDOS8Dot3A";
+ case 0x002d: return "CheckNameLegalDOS8Dot3W";
+ case 0x002e: return "CheckRemoteDebuggerPresent";
+ case 0x002f: return "ClearCommBreak";
+ case 0x0030: return "ClearCommError";
+ case 0x0031: return "CloseConsoleHandle";
+ case 0x0032: return "CloseHandle";
+ case 0x0033: return "CloseProfileUserMapping";
+ case 0x0034: return "CmdBatNotification";
+ case 0x0035: return "CommConfigDialogA";
+ case 0x0036: return "CommConfigDialogW";
+ case 0x0037: return "CompareFileTime";
+ case 0x0038: return "CompareStringA";
+ case 0x0039: return "CompareStringW";
+ case 0x003a: return "ConnectNamedPipe";
+ case 0x003b: return "ConsoleMenuControl";
+ case 0x003c: return "ContinueDebugEvent";
+ case 0x003d: return "ConvertDefaultLocale";
+ case 0x003e: return "ConvertFiberToThread";
+ case 0x003f: return "ConvertThreadToFiber";
+ case 0x0040: return "CopyFileA";
+ case 0x0041: return "CopyFileExA";
+ case 0x0042: return "CopyFileExW";
+ case 0x0043: return "CopyFileW";
+ case 0x0044: return "CopyLZFile";
+ case 0x0045: return "CreateActCtxA";
+ case 0x0046: return "CreateActCtxW";
+ case 0x0047: return "CreateConsoleScreenBuffer";
+ case 0x0048: return "CreateDirectoryA";
+ case 0x0049: return "CreateDirectoryExA";
+ case 0x004a: return "CreateDirectoryExW";
+ case 0x004b: return "CreateDirectoryW";
+ case 0x004c: return "CreateEventA";
+ case 0x004d: return "CreateEventW";
+ case 0x004e: return "CreateFiber";
+ case 0x004f: return "CreateFiberEx";
+ case 0x0050: return "CreateFileA";
+ case 0x0051: return "CreateFileMappingA";
+ case 0x0052: return "CreateFileMappingW";
+ case 0x0053: return "CreateFileW";
+ case 0x0054: return "CreateHardLinkA";
+ case 0x0055: return "CreateHardLinkW";
+ case 0x0056: return "CreateIoCompletionPort";
+ case 0x0057: return "CreateJobObjectA";
+ case 0x0058: return "CreateJobObjectW";
+ case 0x0059: return "CreateJobSet";
+ case 0x005a: return "CreateMailslotA";
+ case 0x005b: return "CreateMailslotW";
+ case 0x005c: return "CreateMemoryResourceNotification";
+ case 0x005d: return "CreateMutexA";
+ case 0x005e: return "CreateMutexW";
+ case 0x005f: return "CreateNamedPipeA";
+ case 0x0060: return "CreateNamedPipeW";
+ case 0x0061: return "CreateNlsSecurityDescriptor";
+ case 0x0062: return "CreatePipe";
+ case 0x0063: return "CreateProcessA";
+ case 0x0064: return "CreateProcessInternalA";
+ case 0x0065: return "CreateProcessInternalW";
+ case 0x0066: return "CreateProcessInternalWSecure";
+ case 0x0067: return "CreateProcessW";
+ case 0x0068: return "CreateRemoteThread";
+ case 0x0069: return "CreateSemaphoreA";
+ case 0x006a: return "CreateSemaphoreW";
+ case 0x006b: return "CreateSocketHandle";
+ case 0x006c: return "CreateTapePartition";
+ case 0x006d: return "CreateThread";
+ case 0x006e: return "CreateTimerQueue";
+ case 0x006f: return "CreateTimerQueueTimer";
+ case 0x0070: return "CreateToolhelp32Snapshot";
+ case 0x0071: return "CreateVirtualBuffer";
+ case 0x0072: return "CreateWaitableTimerA";
+ case 0x0073: return "CreateWaitableTimerW";
+ case 0x0074: return "DeactivateActCtx";
+ case 0x0075: return "DebugActiveProcess";
+ case 0x0076: return "DebugActiveProcessStop";
+ case 0x0077: return "DebugBreak";
+ case 0x0078: return "DebugBreakProcess";
+ case 0x0079: return "DebugSetProcessKillOnExit";
+ case 0x007a: return "DecodePointer";
+ case 0x007b: return "DecodeSystemPointer";
+ case 0x007c: return "DefineDosDeviceA";
+ case 0x007d: return "DefineDosDeviceW";
+ case 0x007e: return "DelayLoadFailureHook";
+ case 0x007f: return "DeleteAtom";
+ case 0x0080: return "DeleteCriticalSection";
+ case 0x0081: return "DeleteFiber";
+ case 0x0082: return "DeleteFileA";
+ case 0x0083: return "DeleteFileW";
+ case 0x0084: return "DeleteTimerQueue";
+ case 0x0085: return "DeleteTimerQueueEx";
+ case 0x0086: return "DeleteTimerQueueTimer";
+ case 0x0087: return "DeleteVolumeMountPointA";
+ case 0x0088: return "DeleteVolumeMountPointW";
+ case 0x0089: return "DeviceIoControl";
+ case 0x008a: return "DisableThreadLibraryCalls";
+ case 0x008b: return "DisconnectNamedPipe";
+ case 0x008c: return "DnsHostnameToComputerNameA";
+ case 0x008d: return "DnsHostnameToComputerNameW";
+ case 0x008e: return "DosDateTimeToFileTime";
+ case 0x008f: return "DosPathToSessionPathA";
+ case 0x0090: return "DosPathToSessionPathW";
+ case 0x0091: return "DuplicateConsoleHandle";
+ case 0x0092: return "DuplicateHandle";
+ case 0x0093: return "EncodePointer";
+ case 0x0094: return "EncodeSystemPointer";
+ case 0x0095: return "EndUpdateResourceA";
+ case 0x0096: return "EndUpdateResourceW";
+ case 0x0097: return "EnterCriticalSection";
+ case 0x0098: return "EnumCalendarInfoA";
+ case 0x0099: return "EnumCalendarInfoExA";
+ case 0x009a: return "EnumCalendarInfoExW";
+ case 0x009b: return "EnumCalendarInfoW";
+ case 0x009c: return "EnumDateFormatsA";
+ case 0x009d: return "EnumDateFormatsExA";
+ case 0x009e: return "EnumDateFormatsExW";
+ case 0x009f: return "EnumDateFormatsW";
+ case 0x00a0: return "EnumLanguageGroupLocalesA";
+ case 0x00a1: return "EnumLanguageGroupLocalesW";
+ case 0x00a2: return "EnumResourceLanguagesA";
+ case 0x00a3: return "EnumResourceLanguagesW";
+ case 0x00a4: return "EnumResourceNamesA";
+ case 0x00a5: return "EnumResourceNamesW";
+ case 0x00a6: return "EnumResourceTypesA";
+ case 0x00a7: return "EnumResourceTypesW";
+ case 0x00a8: return "EnumSystemCodePagesA";
+ case 0x00a9: return "EnumSystemCodePagesW";
+ case 0x00aa: return "EnumSystemGeoID";
+ case 0x00ab: return "EnumSystemLanguageGroupsA";
+ case 0x00ac: return "EnumSystemLanguageGroupsW";
+ case 0x00ad: return "EnumSystemLocalesA";
+ case 0x00ae: return "EnumSystemLocalesW";
+ case 0x00af: return "EnumTimeFormatsA";
+ case 0x00b0: return "EnumTimeFormatsW";
+ case 0x00b1: return "EnumUILanguagesA";
+ case 0x00b2: return "EnumUILanguagesW";
+ case 0x00b3: return "EnumerateLocalComputerNamesA";
+ case 0x00b4: return "EnumerateLocalComputerNamesW";
+ case 0x00b5: return "EraseTape";
+ case 0x00b6: return "EscapeCommFunction";
+ case 0x00b7: return "ExitProcess";
+ case 0x00b8: return "ExitThread";
+ case 0x00b9: return "ExitVDM";
+ case 0x00ba: return "ExpandEnvironmentStringsA";
+ case 0x00bb: return "ExpandEnvironmentStringsW";
+ case 0x00bc: return "ExpungeConsoleCommandHistoryA";
+ case 0x00bd: return "ExpungeConsoleCommandHistoryW";
+ case 0x00be: return "ExtendVirtualBuffer";
+ case 0x00bf: return "FatalAppExitA";
+ case 0x00c0: return "FatalAppExitW";
+ case 0x00c1: return "FatalExit";
+ case 0x00c2: return "FileTimeToDosDateTime";
+ case 0x00c3: return "FileTimeToLocalFileTime";
+ case 0x00c4: return "FileTimeToSystemTime";
+ case 0x00c5: return "FillConsoleOutputAttribute";
+ case 0x00c6: return "FillConsoleOutputCharacterA";
+ case 0x00c7: return "FillConsoleOutputCharacterW";
+ case 0x00c8: return "FindActCtxSectionGuid";
+ case 0x00c9: return "FindActCtxSectionStringA";
+ case 0x00ca: return "FindActCtxSectionStringW";
+ case 0x00cb: return "FindAtomA";
+ case 0x00cc: return "FindAtomW";
+ case 0x00cd: return "FindClose";
+ case 0x00ce: return "FindCloseChangeNotification";
+ case 0x00cf: return "FindFirstChangeNotificationA";
+ case 0x00d0: return "FindFirstChangeNotificationW";
+ case 0x00d1: return "FindFirstFileA";
+ case 0x00d2: return "FindFirstFileExA";
+ case 0x00d3: return "FindFirstFileExW";
+ case 0x00d4: return "FindFirstFileW";
+ case 0x00d5: return "FindFirstVolumeA";
+ case 0x00d6: return "FindFirstVolumeMountPointA";
+ case 0x00d7: return "FindFirstVolumeMountPointW";
+ case 0x00d8: return "FindFirstVolumeW";
+ case 0x00d9: return "FindNextChangeNotification";
+ case 0x00da: return "FindNextFileA";
+ case 0x00db: return "FindNextFileW";
+ case 0x00dc: return "FindNextVolumeA";
+ case 0x00dd: return "FindNextVolumeMountPointA";
+ case 0x00de: return "FindNextVolumeMountPointW";
+ case 0x00df: return "FindNextVolumeW";
+ case 0x00e0: return "FindResourceA";
+ case 0x00e1: return "FindResourceExA";
+ case 0x00e2: return "FindResourceExW";
+ case 0x00e3: return "FindResourceW";
+ case 0x00e4: return "FindVolumeClose";
+ case 0x00e5: return "FindVolumeMountPointClose";
+ case 0x00e6: return "FlushConsoleInputBuffer";
+ case 0x00e7: return "FlushFileBuffers";
+ case 0x00e8: return "FlushInstructionCache";
+ case 0x00e9: return "FlushViewOfFile";
+ case 0x00ea: return "FoldStringA";
+ case 0x00eb: return "FoldStringW";
+ case 0x00ec: return "FormatMessageA";
+ case 0x00ed: return "FormatMessageW";
+ case 0x00ee: return "FreeConsole";
+ case 0x00ef: return "FreeEnvironmentStringsA";
+ case 0x00f0: return "FreeEnvironmentStringsW";
+ case 0x00f1: return "FreeLibrary";
+ case 0x00f2: return "FreeLibraryAndExitThread";
+ case 0x00f3: return "FreeResource";
+ case 0x00f4: return "FreeUserPhysicalPages";
+ case 0x00f5: return "FreeVirtualBuffer";
+ case 0x00f6: return "GenerateConsoleCtrlEvent";
+ case 0x00f7: return "GetACP";
+ case 0x00f8: return "GetAtomNameA";
+ case 0x00f9: return "GetAtomNameW";
+ case 0x00fa: return "GetBinaryType";
+ case 0x00fb: return "GetBinaryTypeA";
+ case 0x00fc: return "GetBinaryTypeW";
+ case 0x00fd: return "GetCPFileNameFromRegistry";
+ case 0x00fe: return "GetCPInfo";
+ case 0x00ff: return "GetCPInfoExA";
+ case 0x0100: return "GetCPInfoExW";
+ case 0x0101: return "GetCalendarInfoA";
+ case 0x0102: return "GetCalendarInfoW";
+ case 0x0103: return "GetComPlusPackageInstallStatus";
+ case 0x0104: return "GetCommConfig";
+ case 0x0105: return "GetCommMask";
+ case 0x0106: return "GetCommModemStatus";
+ case 0x0107: return "GetCommProperties";
+ case 0x0108: return "GetCommState";
+ case 0x0109: return "GetCommTimeouts";
+ case 0x010a: return "GetCommandLineA";
+ case 0x010b: return "GetCommandLineW";
+ case 0x010c: return "GetCompressedFileSizeA";
+ case 0x010d: return "GetCompressedFileSizeW";
+ case 0x010e: return "GetComputerNameA";
+ case 0x010f: return "GetComputerNameExA";
+ case 0x0110: return "GetComputerNameExW";
+ case 0x0111: return "GetComputerNameW";
+ case 0x0112: return "GetConsoleAliasA";
+ case 0x0113: return "GetConsoleAliasExesA";
+ case 0x0114: return "GetConsoleAliasExesLengthA";
+ case 0x0115: return "GetConsoleAliasExesLengthW";
+ case 0x0116: return "GetConsoleAliasExesW";
+ case 0x0117: return "GetConsoleAliasW";
+ case 0x0118: return "GetConsoleAliasesA";
+ case 0x0119: return "GetConsoleAliasesLengthA";
+ case 0x011a: return "GetConsoleAliasesLengthW";
+ case 0x011b: return "GetConsoleAliasesW";
+ case 0x011c: return "GetConsoleCP";
+ case 0x011d: return "GetConsoleCharType";
+ case 0x011e: return "GetConsoleCommandHistoryA";
+ case 0x011f: return "GetConsoleCommandHistoryLengthA";
+ case 0x0120: return "GetConsoleCommandHistoryLengthW";
+ case 0x0121: return "GetConsoleCommandHistoryW";
+ case 0x0122: return "GetConsoleCursorInfo";
+ case 0x0123: return "GetConsoleCursorMode";
+ case 0x0124: return "GetConsoleDisplayMode";
+ case 0x0125: return "GetConsoleFontInfo";
+ case 0x0126: return "GetConsoleFontSize";
+ case 0x0127: return "GetConsoleHardwareState";
+ case 0x0128: return "GetConsoleInputExeNameA";
+ case 0x0129: return "GetConsoleInputExeNameW";
+ case 0x012a: return "GetConsoleInputWaitHandle";
+ case 0x012b: return "GetConsoleKeyboardLayoutNameA";
+ case 0x012c: return "GetConsoleKeyboardLayoutNameW";
+ case 0x012d: return "GetConsoleMode";
+ case 0x012e: return "GetConsoleNlsMode";
+ case 0x012f: return "GetConsoleOutputCP";
+ case 0x0130: return "GetConsoleProcessList";
+ case 0x0131: return "GetConsoleScreenBufferInfo";
+ case 0x0132: return "GetConsoleSelectionInfo";
+ case 0x0133: return "GetConsoleTitleA";
+ case 0x0134: return "GetConsoleTitleW";
+ case 0x0135: return "GetConsoleWindow";
+ case 0x0136: return "GetCurrencyFormatA";
+ case 0x0137: return "GetCurrencyFormatW";
+ case 0x0138: return "GetCurrentActCtx";
+ case 0x0139: return "GetCurrentConsoleFont";
+ case 0x013a: return "GetCurrentDirectoryA";
+ case 0x013b: return "GetCurrentDirectoryW";
+ case 0x013c: return "GetCurrentProcess";
+ case 0x013d: return "GetCurrentProcessId";
+ case 0x013e: return "GetCurrentThread";
+ case 0x013f: return "GetCurrentThreadId";
+ case 0x0140: return "GetDateFormatA";
+ case 0x0141: return "GetDateFormatW";
+ case 0x0142: return "GetDefaultCommConfigA";
+ case 0x0143: return "GetDefaultCommConfigW";
+ case 0x0144: return "GetDefaultSortkeySize";
+ case 0x0145: return "GetDevicePowerState";
+ case 0x0146: return "GetDiskFreeSpaceA";
+ case 0x0147: return "GetDiskFreeSpaceExA";
+ case 0x0148: return "GetDiskFreeSpaceExW";
+ case 0x0149: return "GetDiskFreeSpaceW";
+ case 0x014a: return "GetDllDirectoryA";
+ case 0x014b: return "GetDllDirectoryW";
+ case 0x014c: return "GetDriveTypeA";
+ case 0x014d: return "GetDriveTypeW";
+ case 0x014e: return "GetEnvironmentStrings";
+ case 0x014f: return "GetEnvironmentStringsA";
+ case 0x0150: return "GetEnvironmentStringsW";
+ case 0x0151: return "GetEnvironmentVariableA";
+ case 0x0152: return "GetEnvironmentVariableW";
+ case 0x0153: return "GetExitCodeProcess";
+ case 0x0154: return "GetExitCodeThread";
+ case 0x0155: return "GetExpandedNameA";
+ case 0x0156: return "GetExpandedNameW";
+ case 0x0157: return "GetFileAttributesA";
+ case 0x0158: return "GetFileAttributesExA";
+ case 0x0159: return "GetFileAttributesExW";
+ case 0x015a: return "GetFileAttributesW";
+ case 0x015b: return "GetFileInformationByHandle";
+ case 0x015c: return "GetFileSize";
+ case 0x015d: return "GetFileSizeEx";
+ case 0x015e: return "GetFileTime";
+ case 0x015f: return "GetFileType";
+ case 0x0160: return "GetFirmwareEnvironmentVariableA";
+ case 0x0161: return "GetFirmwareEnvironmentVariableW";
+ case 0x0162: return "GetFullPathNameA";
+ case 0x0163: return "GetFullPathNameW";
+ case 0x0164: return "GetGeoInfoA";
+ case 0x0165: return "GetGeoInfoW";
+ case 0x0166: return "GetHandleContext";
+ case 0x0167: return "GetHandleInformation";
+ case 0x0168: return "GetLargestConsoleWindowSize";
+ case 0x0169: return "GetLastError";
+ case 0x016a: return "GetLinguistLangSize";
+ case 0x016b: return "GetLocalTime";
+ case 0x016c: return "GetLocaleInfoA";
+ case 0x016d: return "GetLocaleInfoW";
+ case 0x016e: return "GetLogicalDriveStringsA";
+ case 0x016f: return "GetLogicalDriveStringsW";
+ case 0x0170: return "GetLogicalDrives";
+ case 0x0171: return "GetLongPathNameA";
+ case 0x0172: return "GetLongPathNameW";
+ case 0x0173: return "GetMailslotInfo";
+ case 0x0174: return "GetModuleFileNameA";
+ case 0x0175: return "GetModuleFileNameW";
+ case 0x0176: return "GetModuleHandleA";
+ case 0x0177: return "GetModuleHandleExA";
+ case 0x0178: return "GetModuleHandleExW";
+ case 0x0179: return "GetModuleHandleW";
+ case 0x017a: return "GetNamedPipeHandleStateA";
+ case 0x017b: return "GetNamedPipeHandleStateW";
+ case 0x017c: return "GetNamedPipeInfo";
+ case 0x017d: return "GetNativeSystemInfo";
+ case 0x017e: return "GetNextVDMCommand";
+ case 0x017f: return "GetNlsSectionName";
+ case 0x0180: return "GetNumaAvailableMemory";
+ case 0x0181: return "GetNumaAvailableMemoryNode";
+ case 0x0182: return "GetNumaHighestNodeNumber";
+ case 0x0183: return "GetNumaNodeProcessorMask";
+ case 0x0184: return "GetNumaProcessorMap";
+ case 0x0185: return "GetNumaProcessorNode";
+ case 0x0186: return "GetNumberFormatA";
+ case 0x0187: return "GetNumberFormatW";
+ case 0x0188: return "GetNumberOfConsoleFonts";
+ case 0x0189: return "GetNumberOfConsoleInputEvents";
+ case 0x018a: return "GetNumberOfConsoleMouseButtons";
+ case 0x018b: return "GetOEMCP";
+ case 0x018c: return "GetOverlappedResult";
+ case 0x018d: return "GetPriorityClass";
+ case 0x018e: return "GetPrivateProfileIntA";
+ case 0x018f: return "GetPrivateProfileIntW";
+ case 0x0190: return "GetPrivateProfileSectionA";
+ case 0x0191: return "GetPrivateProfileSectionNamesA";
+ case 0x0192: return "GetPrivateProfileSectionNamesW";
+ case 0x0193: return "GetPrivateProfileSectionW";
+ case 0x0194: return "GetPrivateProfileStringA";
+ case 0x0195: return "GetPrivateProfileStringW";
+ case 0x0196: return "GetPrivateProfileStructA";
+ case 0x0197: return "GetPrivateProfileStructW";
+ case 0x0198: return "GetProcAddress";
+ case 0x0199: return "GetProcessAffinityMask";
+ case 0x019a: return "GetProcessHandleCount";
+ case 0x019b: return "GetProcessHeap";
+ case 0x019c: return "GetProcessHeaps";
+ case 0x019d: return "GetProcessId";
+ case 0x019e: return "GetProcessIoCounters";
+ case 0x019f: return "GetProcessPriorityBoost";
+ case 0x01a0: return "GetProcessShutdownParameters";
+ case 0x01a1: return "GetProcessTimes";
+ case 0x01a2: return "GetProcessVersion";
+ case 0x01a3: return "GetProcessWorkingSetSize";
+ case 0x01a4: return "GetProfileIntA";
+ case 0x01a5: return "GetProfileIntW";
+ case 0x01a6: return "GetProfileSectionA";
+ case 0x01a7: return "GetProfileSectionW";
+ case 0x01a8: return "GetProfileStringA";
+ case 0x01a9: return "GetProfileStringW";
+ case 0x01aa: return "GetQueuedCompletionStatus";
+ case 0x01ab: return "GetShortPathNameA";
+ case 0x01ac: return "GetShortPathNameW";
+ case 0x01ad: return "GetStartupInfoA";
+ case 0x01ae: return "GetStartupInfoW";
+ case 0x01af: return "GetStdHandle";
+ case 0x01b0: return "GetStringTypeA";
+ case 0x01b1: return "GetStringTypeExA";
+ case 0x01b2: return "GetStringTypeExW";
+ case 0x01b3: return "GetStringTypeW";
+ case 0x01b4: return "GetSystemDefaultLCID";
+ case 0x01b5: return "GetSystemDefaultLangID";
+ case 0x01b6: return "GetSystemDefaultUILanguage";
+ case 0x01b7: return "GetSystemDirectoryA";
+ case 0x01b8: return "GetSystemDirectoryW";
+ case 0x01b9: return "GetSystemInfo";
+ case 0x01ba: return "GetSystemPowerStatus";
+ case 0x01bb: return "GetSystemRegistryQuota";
+ case 0x01bc: return "GetSystemTime";
+ case 0x01bd: return "GetSystemTimeAdjustment";
+ case 0x01be: return "GetSystemTimeAsFileTime";
+ case 0x01bf: return "GetSystemTimes";
+ case 0x01c0: return "GetSystemWindowsDirectoryA";
+ case 0x01c1: return "GetSystemWindowsDirectoryW";
+ case 0x01c2: return "GetSystemWow64DirectoryA";
+ case 0x01c3: return "GetSystemWow64DirectoryW";
+ case 0x01c4: return "GetTapeParameters";
+ case 0x01c5: return "GetTapePosition";
+ case 0x01c6: return "GetTapeStatus";
+ case 0x01c7: return "GetTempFileNameA";
+ case 0x01c8: return "GetTempFileNameW";
+ case 0x01c9: return "GetTempPathA";
+ case 0x01ca: return "GetTempPathW";
+ case 0x01cb: return "GetThreadContext";
+ case 0x01cc: return "GetThreadIOPendingFlag";
+ case 0x01cd: return "GetThreadLocale";
+ case 0x01ce: return "GetThreadPriority";
+ case 0x01cf: return "GetThreadPriorityBoost";
+ case 0x01d0: return "GetThreadSelectorEntry";
+ case 0x01d1: return "GetThreadTimes";
+ case 0x01d2: return "GetTickCount";
+ case 0x01d3: return "GetTimeFormatA";
+ case 0x01d4: return "GetTimeFormatW";
+ case 0x01d5: return "GetTimeZoneInformation";
+ case 0x01d6: return "GetUserDefaultLCID";
+ case 0x01d7: return "GetUserDefaultLangID";
+ case 0x01d8: return "GetUserDefaultUILanguage";
+ case 0x01d9: return "GetUserGeoID";
+ case 0x01da: return "GetVDMCurrentDirectories";
+ case 0x01db: return "GetVersion";
+ case 0x01dc: return "GetVersionExA";
+ case 0x01dd: return "GetVersionExW";
+ case 0x01de: return "GetVolumeInformationA";
+ case 0x01df: return "GetVolumeInformationW";
+ case 0x01e0: return "GetVolumeNameForVolumeMountPointA";
+ case 0x01e1: return "GetVolumeNameForVolumeMountPointW";
+ case 0x01e2: return "GetVolumePathNameA";
+ case 0x01e3: return "GetVolumePathNameW";
+ case 0x01e4: return "GetVolumePathNamesForVolumeNameA";
+ case 0x01e5: return "GetVolumePathNamesForVolumeNameW";
+ case 0x01e6: return "GetWindowsDirectoryA";
+ case 0x01e7: return "GetWindowsDirectoryW";
+ case 0x01e8: return "GetWriteWatch";
+ case 0x01e9: return "GlobalAddAtomA";
+ case 0x01ea: return "GlobalAddAtomW";
+ case 0x01eb: return "GlobalAlloc";
+ case 0x01ec: return "GlobalCompact";
+ case 0x01ed: return "GlobalDeleteAtom";
+ case 0x01ee: return "GlobalFindAtomA";
+ case 0x01ef: return "GlobalFindAtomW";
+ case 0x01f0: return "GlobalFix";
+ case 0x01f1: return "GlobalFlags";
+ case 0x01f2: return "GlobalFree";
+ case 0x01f3: return "GlobalGetAtomNameA";
+ case 0x01f4: return "GlobalGetAtomNameW";
+ case 0x01f5: return "GlobalHandle";
+ case 0x01f6: return "GlobalLock";
+ case 0x01f7: return "GlobalMemoryStatus";
+ case 0x01f8: return "GlobalMemoryStatusEx";
+ case 0x01f9: return "GlobalReAlloc";
+ case 0x01fa: return "GlobalSize";
+ case 0x01fb: return "GlobalUnWire";
+ case 0x01fc: return "GlobalUnfix";
+ case 0x01fd: return "GlobalUnlock";
+ case 0x01fe: return "GlobalWire";
+ case 0x01ff: return "Heap32First";
+ case 0x0200: return "Heap32ListFirst";
+ case 0x0201: return "Heap32ListNext";
+ case 0x0202: return "Heap32Next";
+ case 0x0203: return "HeapAlloc";
+ case 0x0204: return "HeapCompact";
+ case 0x0205: return "HeapCreate";
+ case 0x0206: return "HeapCreateTagsW";
+ case 0x0207: return "HeapDestroy";
+ case 0x0208: return "HeapExtend";
+ case 0x0209: return "HeapFree";
+ case 0x020a: return "HeapLock";
+ case 0x020b: return "HeapQueryInformation";
+ case 0x020c: return "HeapQueryTagW";
+ case 0x020d: return "HeapReAlloc";
+ case 0x020e: return "HeapSetInformation";
+ case 0x020f: return "HeapSize";
+ case 0x0210: return "HeapSummary";
+ case 0x0211: return "HeapUnlock";
+ case 0x0212: return "HeapUsage";
+ case 0x0213: return "HeapValidate";
+ case 0x0214: return "HeapWalk";
+ case 0x0215: return "InitAtomTable";
+ case 0x0216: return "InitializeCriticalSection";
+ case 0x0217: return "InitializeCriticalSectionAndSpinCount";
+ case 0x0218: return "InitializeSListHead";
+ case 0x0219: return "InterlockedCompareExchange";
+ case 0x021a: return "InterlockedDecrement";
+ case 0x021b: return "InterlockedExchange";
+ case 0x021c: return "InterlockedExchangeAdd";
+ case 0x021d: return "InterlockedFlushSList";
+ case 0x021e: return "InterlockedIncrement";
+ case 0x021f: return "InterlockedPopEntrySList";
+ case 0x0220: return "InterlockedPushEntrySList";
+ case 0x0221: return "InvalidateConsoleDIBits";
+ case 0x0222: return "IsBadCodePtr";
+ case 0x0223: return "IsBadHugeReadPtr";
+ case 0x0224: return "IsBadHugeWritePtr";
+ case 0x0225: return "IsBadReadPtr";
+ case 0x0226: return "IsBadStringPtrA";
+ case 0x0227: return "IsBadStringPtrW";
+ case 0x0228: return "IsBadWritePtr";
+ case 0x0229: return "IsDBCSLeadByte";
+ case 0x022a: return "IsDBCSLeadByteEx";
+ case 0x022b: return "IsDebuggerPresent";
+ case 0x022c: return "IsProcessInJob";
+ case 0x022d: return "IsProcessorFeaturePresent";
+ case 0x022e: return "IsSystemResumeAutomatic";
+ case 0x022f: return "IsValidCodePage";
+ case 0x0230: return "IsValidLanguageGroup";
+ case 0x0231: return "IsValidLocale";
+ case 0x0232: return "IsValidUILanguage";
+ case 0x0233: return "IsWow64Process";
+ case 0x0234: return "LCMapStringA";
+ case 0x0235: return "LCMapStringW";
+ case 0x0236: return "LZClose";
+ case 0x0237: return "LZCloseFile";
+ case 0x0238: return "LZCopy";
+ case 0x0239: return "LZCreateFileW";
+ case 0x023a: return "LZDone";
+ case 0x023b: return "LZInit";
+ case 0x023c: return "LZOpenFileA";
+ case 0x023d: return "LZOpenFileW";
+ case 0x023e: return "LZRead";
+ case 0x023f: return "LZSeek";
+ case 0x0240: return "LZStart";
+ case 0x0241: return "LeaveCriticalSection";
+ case 0x0242: return "LoadLibraryA";
+ case 0x0243: return "LoadLibraryExA";
+ case 0x0244: return "LoadLibraryExW";
+ case 0x0245: return "LoadLibraryW";
+ case 0x0246: return "LoadModule";
+ case 0x0247: return "LoadResource";
+ case 0x0248: return "LocalAlloc";
+ case 0x0249: return "LocalCompact";
+ case 0x024a: return "LocalFileTimeToFileTime";
+ case 0x024b: return "LocalFlags";
+ case 0x024c: return "LocalFree";
+ case 0x024d: return "LocalHandle";
+ case 0x024e: return "LocalLock";
+ case 0x024f: return "LocalReAlloc";
+ case 0x0250: return "LocalShrink";
+ case 0x0251: return "LocalSize";
+ case 0x0252: return "LocalUnlock";
+ case 0x0253: return "LockFile";
+ case 0x0254: return "LockFileEx";
+ case 0x0255: return "LockResource";
+ case 0x0256: return "MapUserPhysicalPages";
+ case 0x0257: return "MapUserPhysicalPagesScatter";
+ case 0x0258: return "MapViewOfFile";
+ case 0x0259: return "MapViewOfFileEx";
+ case 0x025a: return "Module32First";
+ case 0x025b: return "Module32FirstW";
+ case 0x025c: return "Module32Next";
+ case 0x025d: return "Module32NextW";
+ case 0x025e: return "MoveFileA";
+ case 0x025f: return "MoveFileExA";
+ case 0x0260: return "MoveFileExW";
+ case 0x0261: return "MoveFileW";
+ case 0x0262: return "MoveFileWithProgressA";
+ case 0x0263: return "MoveFileWithProgressW";
+ case 0x0264: return "MulDiv";
+ case 0x0265: return "MultiByteToWideChar";
+ case 0x0266: return "NlsConvertIntegerToString";
+ case 0x0267: return "NlsGetCacheUpdateCount";
+ case 0x0268: return "NlsResetProcessLocale";
+ case 0x0269: return "NumaVirtualQueryNode";
+ case 0x026a: return "OpenConsoleW";
+ case 0x026b: return "OpenDataFile";
+ case 0x026c: return "OpenEventA";
+ case 0x026d: return "OpenEventW";
+ case 0x026e: return "OpenFile";
+ case 0x026f: return "OpenFileMappingA";
+ case 0x0270: return "OpenFileMappingW";
+ case 0x0271: return "OpenJobObjectA";
+ case 0x0272: return "OpenJobObjectW";
+ case 0x0273: return "OpenMutexA";
+ case 0x0274: return "OpenMutexW";
+ case 0x0275: return "OpenProcess";
+ case 0x0276: return "OpenProfileUserMapping";
+ case 0x0277: return "OpenSemaphoreA";
+ case 0x0278: return "OpenSemaphoreW";
+ case 0x0279: return "OpenThread";
+ case 0x027a: return "OpenWaitableTimerA";
+ case 0x027b: return "OpenWaitableTimerW";
+ case 0x027c: return "OutputDebugStringA";
+ case 0x027d: return "OutputDebugStringW";
+ case 0x027e: return "PeekConsoleInputA";
+ case 0x027f: return "PeekConsoleInputW";
+ case 0x0280: return "PeekNamedPipe";
+ case 0x0281: return "PostQueuedCompletionStatus";
+ case 0x0282: return "PrepareTape";
+ case 0x0283: return "PrivCopyFileExW";
+ case 0x0284: return "PrivMoveFileIdentityW";
+ case 0x0285: return "Process32First";
+ case 0x0286: return "Process32FirstW";
+ case 0x0287: return "Process32Next";
+ case 0x0288: return "Process32NextW";
+ case 0x0289: return "ProcessIdToSessionId";
+ case 0x028a: return "PulseEvent";
+ case 0x028b: return "PurgeComm";
+ case 0x028c: return "QueryActCtxW";
+ case 0x028d: return "QueryDepthSList";
+ case 0x028e: return "QueryDosDeviceA";
+ case 0x028f: return "QueryDosDeviceW";
+ case 0x0290: return "QueryInformationJobObject";
+ case 0x0291: return "QueryMemoryResourceNotification";
+ case 0x0292: return "QueryPerformanceCounter";
+ case 0x0293: return "QueryPerformanceFrequency";
+ case 0x0294: return "QueryWin31IniFilesMappedToRegistry";
+ case 0x0295: return "QueueUserAPC";
+ case 0x0296: return "QueueUserWorkItem";
+ case 0x0297: return "RaiseException";
+ case 0x0298: return "ReadConsoleA";
+ case 0x0299: return "ReadConsoleInputA";
+ case 0x029a: return "ReadConsoleInputExA";
+ case 0x029b: return "ReadConsoleInputExW";
+ case 0x029c: return "ReadConsoleInputW";
+ case 0x029d: return "ReadConsoleOutputA";
+ case 0x029e: return "ReadConsoleOutputAttribute";
+ case 0x029f: return "ReadConsoleOutputCharacterA";
+ case 0x02a0: return "ReadConsoleOutputCharacterW";
+ case 0x02a1: return "ReadConsoleOutputW";
+ case 0x02a2: return "ReadConsoleW";
+ case 0x02a3: return "ReadDirectoryChangesW";
+ case 0x02a4: return "ReadFile";
+ case 0x02a5: return "ReadFileEx";
+ case 0x02a6: return "ReadFileScatter";
+ case 0x02a7: return "ReadProcessMemory";
+ case 0x02a8: return "RegisterConsoleIME";
+ case 0x02a9: return "RegisterConsoleOS2";
+ case 0x02aa: return "RegisterConsoleVDM";
+ case 0x02ab: return "RegisterWaitForInputIdle";
+ case 0x02ac: return "RegisterWaitForSingleObject";
+ case 0x02ad: return "RegisterWaitForSingleObjectEx";
+ case 0x02ae: return "RegisterWowBaseHandlers";
+ case 0x02af: return "RegisterWowExec";
+ case 0x02b0: return "ReleaseActCtx";
+ case 0x02b1: return "ReleaseMutex";
+ case 0x02b2: return "ReleaseSemaphore";
+ case 0x02b3: return "RemoveDirectoryA";
+ case 0x02b4: return "RemoveDirectoryW";
+ case 0x02b5: return "RemoveLocalAlternateComputerNameA";
+ case 0x02b6: return "RemoveLocalAlternateComputerNameW";
+ case 0x02b7: return "RemoveVectoredExceptionHandler";
+ case 0x02b8: return "ReplaceFile";
+ case 0x02b9: return "ReplaceFileA";
+ case 0x02ba: return "ReplaceFileW";
+ case 0x02bb: return "RequestDeviceWakeup";
+ case 0x02bc: return "RequestWakeupLatency";
+ case 0x02bd: return "ResetEvent";
+ case 0x02be: return "ResetWriteWatch";
+ case 0x02bf: return "RestoreLastError";
+ case 0x02c0: return "ResumeThread";
+ case 0x02c1: return "RtlCaptureContext";
+ case 0x02c2: return "RtlCaptureStackBackTrace";
+ case 0x02c3: return "RtlFillMemory";
+ case 0x02c4: return "RtlMoveMemory";
+ case 0x02c5: return "RtlUnwind";
+ case 0x02c6: return "RtlZeroMemory";
+ case 0x02c7: return "ScrollConsoleScreenBufferA";
+ case 0x02c8: return "ScrollConsoleScreenBufferW";
+ case 0x02c9: return "SearchPathA";
+ case 0x02ca: return "SearchPathW";
+ case 0x02cb: return "SetCPGlobal";
+ case 0x02cc: return "SetCalendarInfoA";
+ case 0x02cd: return "SetCalendarInfoW";
+ case 0x02ce: return "SetClientTimeZoneInformation";
+ case 0x02cf: return "SetComPlusPackageInstallStatus";
+ case 0x02d0: return "SetCommBreak";
+ case 0x02d1: return "SetCommConfig";
+ case 0x02d2: return "SetCommMask";
+ case 0x02d3: return "SetCommState";
+ case 0x02d4: return "SetCommTimeouts";
+ case 0x02d5: return "SetComputerNameA";
+ case 0x02d6: return "SetComputerNameExA";
+ case 0x02d7: return "SetComputerNameExW";
+ case 0x02d8: return "SetComputerNameW";
+ case 0x02d9: return "SetConsoleActiveScreenBuffer";
+ case 0x02da: return "SetConsoleCP";
+ case 0x02db: return "SetConsoleCommandHistoryMode";
+ case 0x02dc: return "SetConsoleCtrlHandler";
+ case 0x02dd: return "SetConsoleCursor";
+ case 0x02de: return "SetConsoleCursorInfo";
+ case 0x02df: return "SetConsoleCursorMode";
+ case 0x02e0: return "SetConsoleCursorPosition";
+ case 0x02e1: return "SetConsoleDisplayMode";
+ case 0x02e2: return "SetConsoleFont";
+ case 0x02e3: return "SetConsoleHardwareState";
+ case 0x02e4: return "SetConsoleIcon";
+ case 0x02e5: return "SetConsoleInputExeNameA";
+ case 0x02e6: return "SetConsoleInputExeNameW";
+ case 0x02e7: return "SetConsoleKeyShortcuts";
+ case 0x02e8: return "SetConsoleLocalEUDC";
+ case 0x02e9: return "SetConsoleMaximumWindowSize";
+ case 0x02ea: return "SetConsoleMenuClose";
+ case 0x02eb: return "SetConsoleMode";
+ case 0x02ec: return "SetConsoleNlsMode";
+ case 0x02ed: return "SetConsoleNumberOfCommandsA";
+ case 0x02ee: return "SetConsoleNumberOfCommandsW";
+ case 0x02ef: return "SetConsoleOS2OemFormat";
+ case 0x02f0: return "SetConsoleOutputCP";
+ case 0x02f1: return "SetConsolePalette";
+ case 0x02f2: return "SetConsoleScreenBufferSize";
+ case 0x02f3: return "SetConsoleTextAttribute";
+ case 0x02f4: return "SetConsoleTitleA";
+ case 0x02f5: return "SetConsoleTitleW";
+ case 0x02f6: return "SetConsoleWindowInfo";
+ case 0x02f7: return "SetCriticalSectionSpinCount";
+ case 0x02f8: return "SetCurrentDirectoryA";
+ case 0x02f9: return "SetCurrentDirectoryW";
+ case 0x02fa: return "SetDefaultCommConfigA";
+ case 0x02fb: return "SetDefaultCommConfigW";
+ case 0x02fc: return "SetDllDirectoryA";
+ case 0x02fd: return "SetDllDirectoryW";
+ case 0x02fe: return "SetEndOfFile";
+ case 0x02ff: return "SetEnvironmentVariableA";
+ case 0x0300: return "SetEnvironmentVariableW";
+ case 0x0301: return "SetErrorMode";
+ case 0x0302: return "SetEvent";
+ case 0x0303: return "SetFileApisToANSI";
+ case 0x0304: return "SetFileApisToOEM";
+ case 0x0305: return "SetFileAttributesA";
+ case 0x0306: return "SetFileAttributesW";
+ case 0x0307: return "SetFilePointer";
+ case 0x0308: return "SetFilePointerEx";
+ case 0x0309: return "SetFileShortNameA";
+ case 0x030a: return "SetFileShortNameW";
+ case 0x030b: return "SetFileTime";
+ case 0x030c: return "SetFileValidData";
+ case 0x030d: return "SetFirmwareEnvironmentVariableA";
+ case 0x030e: return "SetFirmwareEnvironmentVariableW";
+ case 0x030f: return "SetHandleContext";
+ case 0x0310: return "SetHandleCount";
+ case 0x0311: return "SetHandleInformation";
+ case 0x0312: return "SetInformationJobObject";
+ case 0x0313: return "SetLastConsoleEventActive";
+ case 0x0314: return "SetLastError";
+ case 0x0315: return "SetLocalPrimaryComputerNameA";
+ case 0x0316: return "SetLocalPrimaryComputerNameW";
+ case 0x0317: return "SetLocalTime";
+ case 0x0318: return "SetLocaleInfoA";
+ case 0x0319: return "SetLocaleInfoW";
+ case 0x031a: return "SetMailslotInfo";
+ case 0x031b: return "SetMessageWaitingIndicator";
+ case 0x031c: return "SetNamedPipeHandleState";
+ case 0x031d: return "SetPriorityClass";
+ case 0x031e: return "SetProcessAffinityMask";
+ case 0x031f: return "SetProcessPriorityBoost";
+ case 0x0320: return "SetProcessShutdownParameters";
+ case 0x0321: return "SetProcessWorkingSetSize";
+ case 0x0322: return "SetStdHandle";
+ case 0x0323: return "SetSystemPowerState";
+ case 0x0324: return "SetSystemTime";
+ case 0x0325: return "SetSystemTimeAdjustment";
+ case 0x0326: return "SetTapeParameters";
+ case 0x0327: return "SetTapePosition";
+ case 0x0328: return "SetTermsrvAppInstallMode";
+ case 0x0329: return "SetThreadAffinityMask";
+ case 0x032a: return "SetThreadContext";
+ case 0x032b: return "SetThreadExecutionState";
+ case 0x032c: return "SetThreadIdealProcessor";
+ case 0x032d: return "SetThreadLocale";
+ case 0x032e: return "SetThreadPriority";
+ case 0x032f: return "SetThreadPriorityBoost";
+ case 0x0330: return "SetThreadUILanguage";
+ case 0x0331: return "SetTimeZoneInformation";
+ case 0x0332: return "SetTimerQueueTimer";
+ case 0x0333: return "SetUnhandledExceptionFilter";
+ case 0x0334: return "SetUserGeoID";
+ case 0x0335: return "SetVDMCurrentDirectories";
+ case 0x0336: return "SetVolumeLabelA";
+ case 0x0337: return "SetVolumeLabelW";
+ case 0x0338: return "SetVolumeMountPointA";
+ case 0x0339: return "SetVolumeMountPointW";
+ case 0x033a: return "SetWaitableTimer";
+ case 0x033b: return "SetupComm";
+ case 0x033c: return "ShowConsoleCursor";
+ case 0x033d: return "SignalObjectAndWait";
+ case 0x033e: return "SizeofResource";
+ case 0x033f: return "Sleep";
+ case 0x0340: return "SleepEx";
+ case 0x0341: return "SuspendThread";
+ case 0x0342: return "SwitchToFiber";
+ case 0x0343: return "SwitchToThread";
+ case 0x0344: return "SystemTimeToFileTime";
+ case 0x0345: return "SystemTimeToTzSpecificLocalTime";
+ case 0x0346: return "TerminateJobObject";
+ case 0x0347: return "TerminateProcess";
+ case 0x0348: return "TerminateThread";
+ case 0x0349: return "TermsrvAppInstallMode";
+ case 0x034a: return "Thread32First";
+ case 0x034b: return "Thread32Next";
+ case 0x034c: return "TlsAlloc";
+ case 0x034d: return "TlsFree";
+ case 0x034e: return "TlsGetValue";
+ case 0x034f: return "TlsSetValue";
+ case 0x0350: return "Toolhelp32ReadProcessMemory";
+ case 0x0351: return "TransactNamedPipe";
+ case 0x0352: return "TransmitCommChar";
+ case 0x0353: return "TrimVirtualBuffer";
+ case 0x0354: return "TryEnterCriticalSection";
+ case 0x0355: return "TzSpecificLocalTimeToSystemTime";
+ case 0x0356: return "UTRegister";
+ case 0x0357: return "UTUnRegister";
+ case 0x0358: return "UnhandledExceptionFilter";
+ case 0x0359: return "UnlockFile";
+ case 0x035a: return "UnlockFileEx";
+ case 0x035b: return "UnmapViewOfFile";
+ case 0x035c: return "UnregisterConsoleIME";
+ case 0x035d: return "UnregisterWait";
+ case 0x035e: return "UnregisterWaitEx";
+ case 0x035f: return "UpdateResourceA";
+ case 0x0360: return "UpdateResourceW";
+ case 0x0361: return "VDMConsoleOperation";
+ case 0x0362: return "VDMOperationStarted";
+ case 0x0363: return "ValidateLCType";
+ case 0x0364: return "ValidateLocale";
+ case 0x0365: return "VerLanguageNameA";
+ case 0x0366: return "VerLanguageNameW";
+ case 0x0367: return "VerSetConditionMask";
+ case 0x0368: return "VerifyConsoleIoHandle";
+ case 0x0369: return "VerifyVersionInfoA";
+ case 0x036a: return "VerifyVersionInfoW";
+ case 0x036b: return "VirtualAlloc";
+ case 0x036c: return "VirtualAllocEx";
+ case 0x036d: return "VirtualBufferExceptionHandler";
+ case 0x036e: return "VirtualFree";
+ case 0x036f: return "VirtualFreeEx";
+ case 0x0370: return "VirtualLock";
+ case 0x0371: return "VirtualProtect";
+ case 0x0372: return "VirtualProtectEx";
+ case 0x0373: return "VirtualQuery";
+ case 0x0374: return "VirtualQueryEx";
+ case 0x0375: return "VirtualUnlock";
+ case 0x0376: return "WTSGetActiveConsoleSessionId";
+ case 0x0377: return "WaitCommEvent";
+ case 0x0378: return "WaitForDebugEvent";
+ case 0x0379: return "WaitForMultipleObjects";
+ case 0x037a: return "WaitForMultipleObjectsEx";
+ case 0x037b: return "WaitForSingleObject";
+ case 0x037c: return "WaitForSingleObjectEx";
+ case 0x037d: return "WaitNamedPipeA";
+ case 0x037e: return "WaitNamedPipeW";
+ case 0x037f: return "WideCharToMultiByte";
+ case 0x0380: return "WinExec";
+ case 0x0381: return "WriteConsoleA";
+ case 0x0382: return "WriteConsoleInputA";
+ case 0x0383: return "WriteConsoleInputVDMA";
+ case 0x0384: return "WriteConsoleInputVDMW";
+ case 0x0385: return "WriteConsoleInputW";
+ case 0x0386: return "WriteConsoleOutputA";
+ case 0x0387: return "WriteConsoleOutputAttribute";
+ case 0x0388: return "WriteConsoleOutputCharacterA";
+ case 0x0389: return "WriteConsoleOutputCharacterW";
+ case 0x038a: return "WriteConsoleOutputW";
+ case 0x038b: return "WriteConsoleW";
+ case 0x038c: return "WriteFile";
+ case 0x038d: return "WriteFileEx";
+ case 0x038e: return "WriteFileGather";
+ case 0x038f: return "WritePrivateProfileSectionA";
+ case 0x0390: return "WritePrivateProfileSectionW";
+ case 0x0391: return "WritePrivateProfileStringA";
+ case 0x0392: return "WritePrivateProfileStringW";
+ case 0x0393: return "WritePrivateProfileStructA";
+ case 0x0394: return "WritePrivateProfileStructW";
+ case 0x0395: return "WriteProcessMemory";
+ case 0x0396: return "WriteProfileSectionA";
+ case 0x0397: return "WriteProfileSectionW";
+ case 0x0398: return "WriteProfileStringA";
+ case 0x0399: return "WriteProfileStringW";
+ case 0x039a: return "WriteTapemark";
+ case 0x039b: return "ZombifyActCtx";
+ case 0x039c: return "_hread";
+ case 0x039d: return "_hwrite";
+ case 0x039e: return "_lclose";
+ case 0x039f: return "_lcreat";
+ case 0x03a0: return "_llseek";
+ case 0x03a1: return "_lopen";
+ case 0x03a2: return "_lread";
+ case 0x03a3: return "_lwrite";
+ case 0x03a4: return "lstrcat";
+ case 0x03a5: return "lstrcatA";
+ case 0x03a6: return "lstrcatW";
+ case 0x03a7: return "lstrcmp";
+ case 0x03a8: return "lstrcmpA";
+ case 0x03a9: return "lstrcmpW";
+ case 0x03aa: return "lstrcmpi";
+ case 0x03ab: return "lstrcmpiA";
+ case 0x03ac: return "lstrcmpiW";
+ case 0x03ad: return "lstrcpy";
+ case 0x03ae: return "lstrcpyA";
+ case 0x03af: return "lstrcpyW";
+ case 0x03b0: return "lstrcpyn";
+ case 0x03b1: return "lstrcpynA";
+ case 0x03b2: return "lstrcpynW";
+ case 0x03b3: return "lstrlen";
+ case 0x03b4: return "lstrlenA";
+ case 0x03b5: return "lstrlenW";
+ }
+ return nullptr;
+}
}
diff --git a/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp b/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp
index 2102391e..129f4a67 100644
--- a/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/libraries_table.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,7 @@
#ifndef LIEF_PE_UTILS_LIBRARY_TABLE_H_
#define LIEF_PE_UTILS_LIBRARY_TABLE_H_
-#include <map>
-#include "frozen.hpp"
+#include <unordered_map>
#include "kernel32_dll_lookup.hpp"
#include "ntdll_dll_lookup.hpp"
@@ -45,25 +44,26 @@
namespace LIEF {
namespace PE {
-static const std::map<std::string, const std::map<uint32_t, const char*>&> ordinals_library_tables =
+static const std::unordered_map<std::string, const char* (*)(uint32_t)>
+ordinals_library_tables =
{
- { "kernel32.dll", kernel32_dll_lookup },
- { "ntdll.dll", ntdll_dll_lookup },
- { "advapi32.dll", advapi32_dll_lookup },
- { "msvcp110.dll", msvcp110_dll_lookup },
- { "msvcp120.dll", msvcp120_dll_lookup },
- { "msvcr100.dll", msvcr100_dll_lookup },
- { "msvcr110.dll", msvcr110_dll_lookup },
- { "msvcr120.dll", msvcr120_dll_lookup },
- { "user32.dll", user32_dll_lookup },
- { "comctl32.dll", comctl32_dll_lookup },
- { "ws2_32.dll", ws2_32_dll_lookup },
- { "shcore.dll", shcore_dll_lookup },
- { "oleaut32.dll", oleaut32_dll_lookup },
- { "mfc42u.dll", mfc42u_dll_lookup },
- { "shlwapi.dll", shlwapi_dll_lookup },
- { "gdi32.dll", gdi32_dll_lookup },
- { "shell32.dll", shell32_dll_lookup },
+ { "kernel32.dll", &kernel32_dll_lookup },
+ { "ntdll.dll", &ntdll_dll_lookup },
+ { "advapi32.dll", &advapi32_dll_lookup },
+ { "msvcp110.dll", &msvcp110_dll_lookup },
+ { "msvcp120.dll", &msvcp120_dll_lookup },
+ { "msvcr100.dll", &msvcr100_dll_lookup },
+ { "msvcr110.dll", &msvcr110_dll_lookup },
+ { "msvcr120.dll", &msvcr120_dll_lookup },
+ { "user32.dll", &user32_dll_lookup },
+ { "comctl32.dll", &comctl32_dll_lookup },
+ { "ws2_32.dll", &ws2_32_dll_lookup },
+ { "shcore.dll", &shcore_dll_lookup },
+ { "oleaut32.dll", &oleaut32_dll_lookup },
+ { "mfc42u.dll", &mfc42u_dll_lookup },
+ { "shlwapi.dll", &shlwapi_dll_lookup },
+ { "gdi32.dll", &gdi32_dll_lookup },
+ { "shell32.dll", &shell32_dll_lookup },
};
}
diff --git a/src/PE/utils/ordinals_lookup_tables/mfc42u_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/mfc42u_dll_lookup.hpp
index 74d4a024..9e27ca72 100644
--- a/src/PE/utils/ordinals_lookup_tables/mfc42u_dll_lookup.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/mfc42u_dll_lookup.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,19 +16,21 @@
#ifndef LIEF_PE_MFC42U_DLL_LOOKUP_H_
#define LIEF_PE_MFC42U_DLL_LOOKUP_H_
-#include <map>
namespace LIEF {
namespace PE {
-static const std::map<uint32_t, const char*> mfc42u_dll_lookup {
- { 0x0005, "?classCCachedDataPathProperty@CCachedDataPathProperty@@2UCRuntimeClass@@B" },
- { 0x0006, "?classCDataPathProperty@CDataPathProperty@@2UCRuntimeClass@@B" },
- { 0x0002, "DllCanUnloadNow" },
- { 0x0001, "DllGetClassObject" },
- { 0x0003, "DllRegisterServer" },
- { 0x0004, "DllUnregisterServer" },
-};
+const char* mfc42u_dll_lookup(uint32_t i) {
+ switch(i) {
+ case 0x0005: return "?classCCachedDataPathProperty@CCachedDataPathProperty@@2UCRuntimeClass@@B";
+ case 0x0006: return "?classCDataPathProperty@CDataPathProperty@@2UCRuntimeClass@@B";
+ case 0x0002: return "DllCanUnloadNow";
+ case 0x0001: return "DllGetClassObject";
+ case 0x0003: return "DllRegisterServer";
+ case 0x0004: return "DllUnregisterServer";
+ }
+ return nullptr;
+}
}
diff --git a/src/PE/utils/ordinals_lookup_tables/msvcp110_dll_lookup.hpp b/src/PE/utils/ordinals_lookup_tables/msvcp110_dll_lookup.hpp
index 2ecb078b..2f2d0f6d 100644
--- a/src/PE/utils/ordinals_lookup_tables/msvcp110_dll_lookup.hpp
+++ b/src/PE/utils/ordinals_lookup_tables/msvcp110_dll_lookup.hpp
@@ -1,5 +1,5 @@
-/* Copyright 2017 R. Thomas
- * Copyright 2017 Quarkslab
+/* Copyright 2017 - 2021 R. Thomas
+ * Copyright 2017 - 2021 Quarkslab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,1604 +16,1606 @@
#ifndef LIEF_PE_MSVCP110_DLL_LOOKUP_H_
#define LIEF_PE_MSVCP110_DLL_LOOKUP_H_
-#include <map>
namespace LIEF {
namespace PE {
-static const std::map<uint32_t, const char*> msvcp110_dll_lookup {
- { 0x0001, "??$_Getvals@_W@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z" },
- { 0x0002, "??$_Getvals@_W@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z" },
- { 0x0003, "??$_Getvals@_W@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z" },
- { 0x0004, "??0?$_Yarn@D@std@@QEAA@AEBV01@@Z" },
- { 0x0005, "??0?$_Yarn@D@std@@QEAA@PEBD@Z" },
- { 0x0006, "??0?$_Yarn@D@std@@QEAA@XZ" },
- { 0x0007, "??0?$_Yarn@_W@std@@QEAA@XZ" },
- { 0x0008, "??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ" },
- { 0x0009, "??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z" },
- { 0x000a, "??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ" },
- { 0x000b, "??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z" },
- { 0x000c, "??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ" },
- { 0x000d, "??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z" },
- { 0x000e, "??0?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x000f, "??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z" },
- { 0x0010, "??0?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0011, "??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z" },
- { 0x0012, "??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0013, "??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z" },
- { 0x0014, "??0?$basic_istream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0015, "??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z" },
- { 0x0016, "??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z" },
- { 0x0017, "??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z" },
- { 0x0018, "??0?$basic_istream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0019, "??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z" },
- { 0x001a, "??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z" },
- { 0x001b, "??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z" },
- { 0x001c, "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x001d, "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z" },
- { 0x001e, "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z" },
- { 0x001f, "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z" },
- { 0x0020, "??0?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0021, "??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z" },
- { 0x0022, "??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z" },
- { 0x0023, "??0?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0024, "??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z" },
- { 0x0025, "??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z" },
- { 0x0026, "??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z" },
- { 0x0027, "??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z" },
- { 0x0028, "??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z" },
- { 0x0029, "??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@AEBV01@@Z" },
- { 0x002a, "??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@W4_Uninitialized@1@@Z" },
- { 0x002b, "??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ" },
- { 0x002c, "??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@AEBV01@@Z" },
- { 0x002d, "??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@W4_Uninitialized@1@@Z" },
- { 0x002e, "??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@XZ" },
- { 0x002f, "??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@AEBV01@@Z" },
- { 0x0030, "??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@W4_Uninitialized@1@@Z" },
- { 0x0031, "??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@XZ" },
- { 0x0032, "??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0033, "??0?$codecvt@DDH@std@@QEAA@_K@Z" },
- { 0x0034, "??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0035, "??0?$codecvt@GDH@std@@QEAA@_K@Z" },
- { 0x0036, "??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0037, "??0?$codecvt@_WDH@std@@QEAA@_K@Z" },
- { 0x0038, "??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0039, "??0?$ctype@D@std@@QEAA@PEBF_N_K@Z" },
- { 0x003a, "??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x003b, "??0?$ctype@G@std@@QEAA@_K@Z" },
- { 0x003c, "??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x003d, "??0?$ctype@_W@std@@QEAA@_K@Z" },
- { 0x003e, "??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x003f, "??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0040, "??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0041, "??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0042, "??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0043, "??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0044, "??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0045, "??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0046, "??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0047, "??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0048, "??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0049, "??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x004a, "??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAA@PEBD_K@Z" },
- { 0x004b, "??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x004c, "??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x004d, "??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z" },
- { 0x004e, "??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x004f, "??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0050, "??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z" },
- { 0x0051, "??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0052, "??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0053, "??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0054, "??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0055, "??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z" },
- { 0x0056, "??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x0057, "??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x0058, "??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z" },
- { 0x0059, "??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z" },
- { 0x005a, "??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z" },
- { 0x005b, "??0Init@ios_base@std@@QEAA@XZ" },
- { 0x005c, "??0_Concurrent_queue_base_v4@details@Concurrency@@IEAA@_K@Z" },
- { 0x005d, "??0_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAA@AEBV_Concurrent_queue_base_v4@12@@Z" },
- { 0x005e, "??0_Container_base12@std@@QEAA@AEBU01@@Z" },
- { 0x005f, "??0_Container_base12@std@@QEAA@XZ" },
- { 0x0060, "??0_Facet_base@std@@QEAA@AEBV01@@Z" },
- { 0x0061, "??0_Facet_base@std@@QEAA@XZ" },
- { 0x0062, "??0_Init_locks@std@@QEAA@XZ" },
- { 0x0063, "??0_Locimp@locale@std@@AEAA@AEBV012@@Z" },
- { 0x0064, "??0_Locimp@locale@std@@AEAA@_N@Z" },
- { 0x0065, "??0_Locinfo@std@@QEAA@HPEBD@Z" },
- { 0x0066, "??0_Locinfo@std@@QEAA@PEBD@Z" },
- { 0x0067, "??0_Lockit@std@@QEAA@H@Z" },
- { 0x0068, "??0_Lockit@std@@QEAA@XZ" },
- { 0x0069, "??0_Pad@std@@QEAA@AEBV01@@Z" },
- { 0x006a, "??0_Pad@std@@QEAA@XZ" },
- { 0x006b, "??0_Runtime_object@details@Concurrency@@QEAA@H@Z" },
- { 0x006c, "??0_Runtime_object@details@Concurrency@@QEAA@XZ" },
- { 0x006d, "??0_Timevec@std@@QEAA@AEBV01@@Z" },
- { 0x006e, "??0_Timevec@std@@QEAA@PEAX@Z" },
- { 0x006f, "??0_UShinit@std@@QEAA@XZ" },
- { 0x0070, "??0_Winit@std@@QEAA@XZ" },
- { 0x0071, "??0agent@Concurrency@@QEAA@AEAVScheduleGroup@1@@Z" },
- { 0x0072, "??0agent@Concurrency@@QEAA@AEAVScheduler@1@@Z" },
- { 0x0073, "??0agent@Concurrency@@QEAA@XZ" },
- { 0x0074, "??0codecvt_base@std@@QEAA@_K@Z" },
- { 0x0075, "??0ctype_base@std@@QEAA@_K@Z" },
- { 0x0076, "??0facet@locale@std@@IEAA@_K@Z" },
- { 0x0077, "??0id@locale@std@@QEAA@_K@Z" },
- { 0x0078, "??0ios_base@std@@IEAA@XZ" },
- { 0x0079, "??0time_base@std@@QEAA@_K@Z" },
- { 0x007a, "??1?$_Yarn@D@std@@QEAA@XZ" },
- { 0x007b, "??1?$_Yarn@_W@std@@QEAA@XZ" },
- { 0x007c, "??1?$basic_ios@DU?$char_traits@D@std@@@std@@UEAA@XZ" },
- { 0x007d, "??1?$basic_ios@GU?$char_traits@G@std@@@std@@UEAA@XZ" },
- { 0x007e, "??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAA@XZ" },
- { 0x007f, "??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ" },
- { 0x0080, "??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UEAA@XZ" },
- { 0x0081, "??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ" },
- { 0x0082, "??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ" },
- { 0x0083, "??1?$basic_istream@GU?$char_traits@G@std@@@std@@UEAA@XZ" },
- { 0x0084, "??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ" },
- { 0x0085, "??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ" },
- { 0x0086, "??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAA@XZ" },
- { 0x0087, "??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ" },
- { 0x0088, "??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAA@XZ" },
- { 0x0089, "??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAA@XZ" },
- { 0x008a, "??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ" },
- { 0x008b, "??1?$codecvt@DDH@std@@MEAA@XZ" },
- { 0x008c, "??1?$codecvt@GDH@std@@MEAA@XZ" },
- { 0x008d, "??1?$codecvt@_WDH@std@@MEAA@XZ" },
- { 0x008e, "??1?$ctype@D@std@@MEAA@XZ" },
- { 0x008f, "??1?$ctype@G@std@@MEAA@XZ" },
- { 0x0090, "??1?$ctype@_W@std@@MEAA@XZ" },
- { 0x0091, "??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ" },
- { 0x0092, "??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ" },
- { 0x0093, "??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ" },
- { 0x0094, "??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ" },
- { 0x0095, "??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ" },
- { 0x0096, "??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ" },
- { 0x0097, "??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ" },
- { 0x0098, "??1?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ" },
- { 0x0099, "??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ" },
- { 0x009a, "??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ" },
- { 0x009b, "??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ" },
- { 0x009c, "??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ" },
- { 0x009d, "??1Init@ios_base@std@@QEAA@XZ" },
- { 0x009e, "??1_Concurrent_queue_base_v4@details@Concurrency@@MEAA@XZ" },
- { 0x009f, "??1_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAA@XZ" },
- { 0x00a0, "??1_Concurrent_vector_base_v4@details@Concurrency@@IEAA@XZ" },
- { 0x00a1, "??1_Container_base12@std@@QEAA@XZ" },
- { 0x00a2, "??1_Facet_base@std@@UEAA@XZ" },
- { 0x00a3, "??1_Init_locks@std@@QEAA@XZ" },
- { 0x00a4, "??1_Locimp@locale@std@@MEAA@XZ" },
- { 0x00a5, "??1_Locinfo@std@@QEAA@XZ" },
- { 0x00a6, "??1_Lockit@std@@QEAA@XZ" },
- { 0x00a7, "??1_Pad@std@@QEAA@XZ" },
- { 0x00a8, "??1_Timevec@std@@QEAA@XZ" },
- { 0x00a9, "??1_UShinit@std@@QEAA@XZ" },
- { 0x00aa, "??1_Winit@std@@QEAA@XZ" },
- { 0x00ab, "??1agent@Concurrency@@UEAA@XZ" },
- { 0x00ac, "??1codecvt_base@std@@UEAA@XZ" },
- { 0x00ad, "??1ctype_base@std@@UEAA@XZ" },
- { 0x00ae, "??1facet@locale@std@@MEAA@XZ" },
- { 0x00af, "??1ios_base@std@@UEAA@XZ" },
- { 0x00b0, "??1time_base@std@@UEAA@XZ" },
- { 0x00b1, "??4?$_Iosb@H@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00b2, "??4?$_Yarn@D@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00b3, "??4?$_Yarn@D@std@@QEAAAEAV01@PEBD@Z" },
- { 0x00b4, "??4?$_Yarn@_W@std@@QEAAAEAV01@PEB_W@Z" },
- { 0x00b5, "??4?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00b6, "??4?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00b7, "??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00b8, "??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00b9, "??4?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00ba, "??4?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00bb, "??4?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00bc, "??4?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00bd, "??4?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z" },
- { 0x00be, "??4?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAAEAV01@AEBV01@@Z" },
- { 0x00bf, "??4?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAAEAV01@AEBV01@@Z" },
- { 0x00c0, "??4?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@AEBV01@@Z" },
- { 0x00c1, "??4Init@ios_base@std@@QEAAAEAV012@AEBV012@@Z" },
- { 0x00c2, "??4_Container_base0@std@@QEAAAEAU01@AEBU01@@Z" },
- { 0x00c3, "??4_Container_base12@std@@QEAAAEAU01@AEBU01@@Z" },
- { 0x00c4, "??4_Facet_base@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00c5, "??4_Init_locks@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00c6, "??4_Pad@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00c7, "??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00c8, "??4_UShinit@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00c9, "??4_Winit@std@@QEAAAEAV01@AEBV01@@Z" },
- { 0x00ca, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAF@Z" },
- { 0x00cb, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAG@Z" },
- { 0x00cc, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z" },
- { 0x00cd, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAI@Z" },
- { 0x00ce, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAJ@Z" },
- { 0x00cf, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAK@Z" },
- { 0x00d0, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAM@Z" },
- { 0x00d1, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z" },
- { 0x00d2, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAO@Z" },
- { 0x00d3, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAPEAX@Z" },
- { 0x00d4, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_J@Z" },
- { 0x00d5, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_K@Z" },
- { 0x00d6, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_N@Z" },
- { 0x00d7, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z" },
- { 0x00d8, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z" },
- { 0x00d9, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z" },
- { 0x00da, "??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z" },
- { 0x00db, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAF@Z" },
- { 0x00dc, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAG@Z" },
- { 0x00dd, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAH@Z" },
- { 0x00de, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAI@Z" },
- { 0x00df, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAJ@Z" },
- { 0x00e0, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAK@Z" },
- { 0x00e1, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAM@Z" },
- { 0x00e2, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAN@Z" },
- { 0x00e3, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAO@Z" },
- { 0x00e4, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAPEAX@Z" },
- { 0x00e5, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_J@Z" },
- { 0x00e6, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_K@Z" },
- { 0x00e7, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_N@Z" },
- { 0x00e8, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z" },
- { 0x00e9, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z" },
- { 0x00ea, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z" },
- { 0x00eb, "??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z" },
- { 0x00ec, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAF@Z" },
- { 0x00ed, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAG@Z" },
- { 0x00ee, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAH@Z" },
- { 0x00ef, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAI@Z" },
- { 0x00f0, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z" },
- { 0x00f1, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAK@Z" },
- { 0x00f2, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAM@Z" },
- { 0x00f3, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAN@Z" },
- { 0x00f4, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAO@Z" },
- { 0x00f5, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAPEAX@Z" },
- { 0x00f6, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_J@Z" },
- { 0x00f7, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_K@Z" },
- { 0x00f8, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_N@Z" },
- { 0x00f9, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z" },
- { 0x00fa, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z" },
- { 0x00fb, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z" },
- { 0x00fc, "??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z" },
- { 0x00fd, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@F@Z" },
- { 0x00fe, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@G@Z" },
- { 0x00ff, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z" },
- { 0x0100, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@I@Z" },
- { 0x0101, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@J@Z" },
- { 0x0102, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z" },
- { 0x0103, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z" },
- { 0x0104, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z" },
- { 0x0105, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@O@Z" },
- { 0x0106, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z" },
- { 0x0107, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z" },
- { 0x0108, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z" },
- { 0x0109, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z" },
- { 0x010a, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEBX@Z" },
- { 0x010b, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_J@Z" },
- { 0x010c, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z" },
- { 0x010d, "??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z" },
- { 0x010e, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@F@Z" },
- { 0x010f, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@G@Z" },
- { 0x0110, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@H@Z" },
- { 0x0111, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@I@Z" },
- { 0x0112, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@J@Z" },
- { 0x0113, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@K@Z" },
- { 0x0114, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@M@Z" },
- { 0x0115, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@N@Z" },
- { 0x0116, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@O@Z" },
- { 0x0117, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z" },
- { 0x0118, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z" },
- { 0x0119, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z" },
- { 0x011a, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z" },
- { 0x011b, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEBX@Z" },
- { 0x011c, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_J@Z" },
- { 0x011d, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_K@Z" },
- { 0x011e, "??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_N@Z" },
- { 0x011f, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@F@Z" },
- { 0x0120, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@G@Z" },
- { 0x0121, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@H@Z" },
- { 0x0122, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@I@Z" },
- { 0x0123, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@J@Z" },
- { 0x0124, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@K@Z" },
- { 0x0125, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@M@Z" },
- { 0x0126, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@N@Z" },
- { 0x0127, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@O@Z" },
- { 0x0128, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z" },
- { 0x0129, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z" },
- { 0x012a, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z" },
- { 0x012b, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z" },
- { 0x012c, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEBX@Z" },
- { 0x012d, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_J@Z" },
- { 0x012e, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_K@Z" },
- { 0x012f, "??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_N@Z" },
- { 0x0130, "??7ios_base@std@@QEBA_NXZ" },
- { 0x0131, "??Bid@locale@std@@QEAA_KXZ" },
- { 0x0132, "??Bios_base@std@@QEBAPEAXXZ" },
- { 0x0133, "??_7?$basic_ios@DU?$char_traits@D@std@@@std@@6B@" },
- { 0x0134, "??_7?$basic_ios@GU?$char_traits@G@std@@@std@@6B@" },
- { 0x0135, "??_7?$basic_ios@_WU?$char_traits@_W@std@@@std@@6B@" },
- { 0x0136, "??_7?$basic_iostream@DU?$char_traits@D@std@@@std@@6B@" },
- { 0x0137, "??_7?$basic_iostream@GU?$char_traits@G@std@@@std@@6B@" },
- { 0x0138, "??_7?$basic_iostream@_WU?$char_traits@_W@std@@@std@@6B@" },
- { 0x0139, "??_7?$basic_istream@DU?$char_traits@D@std@@@std@@6B@" },
- { 0x013a, "??_7?$basic_istream@GU?$char_traits@G@std@@@std@@6B@" },
- { 0x013b, "??_7?$basic_istream@_WU?$char_traits@_W@std@@@std@@6B@" },
- { 0x013c, "??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@" },
- { 0x013d, "??_7?$basic_ostream@GU?$char_traits@G@std@@@std@@6B@" },
- { 0x013e, "??_7?$basic_ostream@_WU?$char_traits@_W@std@@@std@@6B@" },
- { 0x013f, "??_7?$basic_streambuf@DU?$char_traits@D@std@@@std@@6B@" },
- { 0x0140, "??_7?$basic_streambuf@GU?$char_traits@G@std@@@std@@6B@" },
- { 0x0141, "??_7?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@6B@" },
- { 0x0142, "??_7?$codecvt@DDH@std@@6B@" },
- { 0x0143, "??_7?$codecvt@GDH@std@@6B@" },
- { 0x0144, "??_7?$codecvt@_WDH@std@@6B@" },
- { 0x0145, "??_7?$ctype@D@std@@6B@" },
- { 0x0146, "??_7?$ctype@G@std@@6B@" },
- { 0x0147, "??_7?$ctype@_W@std@@6B@" },
- { 0x0148, "??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@" },
- { 0x0149, "??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@" },
- { 0x014a, "??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@" },
- { 0x014b, "??_7?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@" },
- { 0x014c, "??_7?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@" },
- { 0x014d, "??_7?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@" },
- { 0x014e, "??_7?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@" },
- { 0x014f, "??_7?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@" },
- { 0x0150, "??_7?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@" },
- { 0x0151, "??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@" },
- { 0x0152, "??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@" },
- { 0x0153, "??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@" },
- { 0x0154, "??_7_Facet_base@std@@6B@" },
- { 0x0155, "??_7_Locimp@locale@std@@6B@" },
- { 0x0156, "??_7_Pad@std@@6B@" },
- { 0x0157, "??_7codecvt_base@std@@6B@" },
- { 0x0158, "??_7ctype_base@std@@6B@" },
- { 0x0159, "??_7facet@locale@std@@6B@" },
- { 0x015a, "??_7ios_base@std@@6B@" },
- { 0x015b, "??_7time_base@std@@6B@" },
- { 0x015c, "??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@" },
- { 0x015d, "??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@" },
- { 0x015e, "??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@" },
- { 0x015f, "??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@" },
- { 0x0160, "??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@" },
- { 0x0161, "??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@" },
- { 0x0162, "??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@" },
- { 0x0163, "??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@" },
- { 0x0164, "??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@" },
- { 0x0165, "??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@" },
- { 0x0166, "??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@" },
- { 0x0167, "??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@" },
- { 0x0168, "??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x0169, "??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x016a, "??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x016b, "??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x016c, "??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x016d, "??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x016e, "??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x016f, "??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x0170, "??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x0171, "??_F?$codecvt@DDH@std@@QEAAXXZ" },
- { 0x0172, "??_F?$codecvt@GDH@std@@QEAAXXZ" },
- { 0x0173, "??_F?$codecvt@_WDH@std@@QEAAXXZ" },
- { 0x0174, "??_F?$ctype@D@std@@QEAAXXZ" },
- { 0x0175, "??_F?$ctype@G@std@@QEAAXXZ" },
- { 0x0176, "??_F?$ctype@_W@std@@QEAAXXZ" },
- { 0x0177, "??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ" },
- { 0x0178, "??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ" },
- { 0x0179, "??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ" },
- { 0x017a, "??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ" },
- { 0x017b, "??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ" },
- { 0x017c, "??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ" },
- { 0x017d, "??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ" },
- { 0x017e, "??_F?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ" },
- { 0x017f, "??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ" },
- { 0x0180, "??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ" },
- { 0x0181, "??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ" },
- { 0x0182, "??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ" },
- { 0x0183, "??_F_Locinfo@std@@QEAAXXZ" },
- { 0x0184, "??_F_Timevec@std@@QEAAXXZ" },
- { 0x0185, "??_Fcodecvt_base@std@@QEAAXXZ" },
- { 0x0186, "??_Fctype_base@std@@QEAAXXZ" },
- { 0x0187, "??_Ffacet@locale@std@@QEAAXXZ" },
- { 0x0188, "??_Fid@locale@std@@QEAAXXZ" },
- { 0x0189, "??_Ftime_base@std@@QEAAXXZ" },
- { 0x018a, "?NFS_Allocate@details@Concurrency@@YAPEAX_K0PEAX@Z" },
- { 0x018b, "?NFS_Free@details@Concurrency@@YAXPEAX@Z" },
- { 0x018c, "?NFS_GetLineSize@details@Concurrency@@YA_KXZ" },
- { 0x018d, "?_10@placeholders@std@@3V?$_Ph@$09@2@A" },
- { 0x018e, "?_11@placeholders@std@@3V?$_Ph@$0L@@2@A" },
- { 0x018f, "?_12@placeholders@std@@3V?$_Ph@$0M@@2@A" },
- { 0x0190, "?_13@placeholders@std@@3V?$_Ph@$0N@@2@A" },
- { 0x0191, "?_14@placeholders@std@@3V?$_Ph@$0O@@2@A" },
- { 0x0192, "?_15@placeholders@std@@3V?$_Ph@$0P@@2@A" },
- { 0x0193, "?_16@placeholders@std@@3V?$_Ph@$0BA@@2@A" },
- { 0x0194, "?_17@placeholders@std@@3V?$_Ph@$0BB@@2@A" },
- { 0x0195, "?_18@placeholders@std@@3V?$_Ph@$0BC@@2@A" },
- { 0x0196, "?_19@placeholders@std@@3V?$_Ph@$0BD@@2@A" },
- { 0x0197, "?_1@placeholders@std@@3V?$_Ph@$00@2@A" },
- { 0x0198, "?_20@placeholders@std@@3V?$_Ph@$0BE@@2@A" },
- { 0x0199, "?_2@placeholders@std@@3V?$_Ph@$01@2@A" },
- { 0x019a, "?_3@placeholders@std@@3V?$_Ph@$02@2@A" },
- { 0x019b, "?_4@placeholders@std@@3V?$_Ph@$03@2@A" },
- { 0x019c, "?_5@placeholders@std@@3V?$_Ph@$04@2@A" },
- { 0x019d, "?_6@placeholders@std@@3V?$_Ph@$05@2@A" },
- { 0x019e, "?_7@placeholders@std@@3V?$_Ph@$06@2@A" },
- { 0x019f, "?_8@placeholders@std@@3V?$_Ph@$07@2@A" },
- { 0x01a0, "?_9@placeholders@std@@3V?$_Ph@$08@2@A" },
- { 0x01a1, "?_Add_vtordisp1@?$basic_ios@DU?$char_traits@D@std@@@std@@UEAAXXZ" },
- { 0x01a2, "?_Add_vtordisp1@?$basic_ios@GU?$char_traits@G@std@@@std@@UEAAXXZ" },
- { 0x01a3, "?_Add_vtordisp1@?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAAXXZ" },
- { 0x01a4, "?_Add_vtordisp1@?$basic_istream@DU?$char_traits@D@std@@@std@@UEAAXXZ" },
- { 0x01a5, "?_Add_vtordisp1@?$basic_istream@GU?$char_traits@G@std@@@std@@UEAAXXZ" },
- { 0x01a6, "?_Add_vtordisp1@?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAAXXZ" },
- { 0x01a7, "?_Add_vtordisp2@?$basic_ios@DU?$char_traits@D@std@@@std@@UEAAXXZ" },
- { 0x01a8, "?_Add_vtordisp2@?$basic_ios@GU?$char_traits@G@std@@@std@@UEAAXXZ" },
- { 0x01a9, "?_Add_vtordisp2@?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAAXXZ" },
- { 0x01aa, "?_Add_vtordisp2@?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAAXXZ" },
- { 0x01ab, "?_Add_vtordisp2@?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAAXXZ" },
- { 0x01ac, "?_Add_vtordisp2@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAAXXZ" },
- { 0x01ad, "?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z" },
- { 0x01ae, "?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z" },
- { 0x01af, "?_Addstd@ios_base@std@@SAXPEAV12@@Z" },
- { 0x01b0, "?_Advance@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAAXXZ" },
- { 0x01b1, "?_Assign@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAAXAEBV123@@Z" },
- { 0x01b2, "?_Atexit@@YAXP6AXXZ@Z" },
- { 0x01b3, "?_BADOFF@std@@3_JB" },
- { 0x01b4, "?_Byte_reverse_table@details@Concurrency@@3QBEB" },
- { 0x01b5, "?_C_str@?$_Yarn@D@std@@QEBAPEBDXZ" },
- { 0x01b6, "?_C_str@?$_Yarn@_W@std@@QEBAPEB_WXZ" },
- { 0x01b7, "?_Callfns@ios_base@std@@AEAAXW4event@12@@Z" },
- { 0x01b8, "?_Clocptr@_Locimp@locale@std@@0PEAV123@EA" },
- { 0x01b9, "?_Close_dir@sys@tr2@std@@YAXPEAX@Z" },
- { 0x01ba, "?_Copy_file@sys@tr2@std@@YAHPEBD0_N@Z" },
- { 0x01bb, "?_Copy_file@sys@tr2@std@@YAHPEB_W0_N@Z" },
- { 0x01bc, "?_Current_get@sys@tr2@std@@YAPEADPEAD@Z" },
- { 0x01bd, "?_Current_get@sys@tr2@std@@YAPEA_WPEA_W@Z" },
- { 0x01be, "?_Current_set@sys@tr2@std@@YA_NPEBD@Z" },
- { 0x01bf, "?_Current_set@sys@tr2@std@@YA_NPEB_W@Z" },
- { 0x01c0, "?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ" },
- { 0x01c1, "?_Donarrow@?$ctype@G@std@@IEBADGD@Z" },
- { 0x01c2, "?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z" },
- { 0x01c3, "?_Dowiden@?$ctype@G@std@@IEBAGD@Z" },
- { 0x01c4, "?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z" },
- { 0x01c5, "?_Empty@?$_Yarn@D@std@@QEBA_NXZ" },
- { 0x01c6, "?_Empty@?$_Yarn@_W@std@@QEBA_NXZ" },
- { 0x01c7, "?_Equivalent@sys@tr2@std@@YAHPEBD0@Z" },
- { 0x01c8, "?_Equivalent@sys@tr2@std@@YAHPEB_W0@Z" },
- { 0x01c9, "?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z" },
- { 0x01ca, "?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z" },
- { 0x01cb, "?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z" },
- { 0x01cc, "?_File_size@sys@tr2@std@@YA_KPEBD@Z" },
- { 0x01cd, "?_File_size@sys@tr2@std@@YA_KPEB_W@Z" },
- { 0x01ce, "?_Findarr@ios_base@std@@AEAAAEAU_Iosarray@12@H@Z" },
- { 0x01cf, "?_Fiopen@std@@YAPEAU_iobuf@@PEBDHH@Z" },
- { 0x01d0, "?_Fiopen@std@@YAPEAU_iobuf@@PEBGHH@Z" },
- { 0x01d1, "?_Fiopen@std@@YAPEAU_iobuf@@PEB_WHH@Z" },
- { 0x01d2, "?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K333@Z" },
- { 0x01d3, "?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBD_K333@Z" },
- { 0x01d4, "?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBD_K444@Z" },
- { 0x01d5, "?_Future_error_map@std@@YAPEBDH@Z" },
- { 0x01d6, "?_GetCombinableSize@details@Concurrency@@YA_KXZ" },
- { 0x01d7, "?_GetCurrentThreadId@details@Concurrency@@YAKXZ" },
- { 0x01d8, "?_GetNextAsyncId@details@Concurrency@@YAIXZ" },
- { 0x01d9, "?_Get_future_error_what@std@@YAPEBDH@Z" },
- { 0x01da, "?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01db, "?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01dc, "?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01dd, "?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01de, "?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01df, "?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e0, "?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e1, "?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e2, "?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e3, "?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e4, "?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e5, "?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e6, "?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e7, "?_Getcat@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e8, "?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01e9, "?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01ea, "?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01eb, "?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z" },
- { 0x01ec, "?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z" },
- { 0x01ed, "?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ" },
- { 0x01ee, "?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ" },
- { 0x01ef, "?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ" },
- { 0x01f0, "?_Getdateorder@_Locinfo@std@@QEBAHXZ" },
- { 0x01f1, "?_Getdays@_Locinfo@std@@QEBAPEBDXZ" },
- { 0x01f2, "?_Getfalse@_Locinfo@std@@QEBAPEBDXZ" },
- { 0x01f3, "?_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEAVios_base@2@PEAH@Z" },
- { 0x01f4, "?_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEAVios_base@2@PEAH@Z" },
- { 0x01f5, "?_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEAVios_base@2@PEAH@Z" },
- { 0x01f6, "?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEAVios_base@2@PEAH@Z" },
- { 0x01f7, "?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEAVios_base@2@PEAH@Z" },
- { 0x01f8, "?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEAVios_base@2@PEAH@Z" },
- { 0x01f9, "?_Getfmt@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z" },
- { 0x01fa, "?_Getfmt@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z" },
- { 0x01fb, "?_Getfmt@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z" },
- { 0x01fc, "?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ" },
- { 0x01fd, "?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HAEBVlocale@2@@Z" },
- { 0x01fe, "?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HAEBVlocale@2@@Z" },
- { 0x01ff, "?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HAEBVlocale@2@@Z" },
- { 0x0200, "?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAEAHAEBV?$ctype@D@2@@Z" },
- { 0x0201, "?_Getint@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@0HHAEAHAEBV?$ctype@G@2@@Z" },
- { 0x0202, "?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAEAHAEBV?$ctype@_W@2@@Z" },
- { 0x0203, "?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ" },
- { 0x0204, "?_Getmonths@_Locinfo@std@@QEBAPEBDXZ" },
- { 0x0205, "?_Getname@_Locinfo@std@@QEBAPEBDXZ" },
- { 0x0206, "?_Getpfirst@_Container_base12@std@@QEBAPEAPEAU_Iterator_base12@2@XZ" },
- { 0x0207, "?_Getptr@_Timevec@std@@QEBAPEAXXZ" },
- { 0x0208, "?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ" },
- { 0x0209, "?_Gettrue@_Locinfo@std@@QEBAPEBDXZ" },
- { 0x020a, "?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ" },
- { 0x020b, "?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ" },
- { 0x020c, "?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ" },
- { 0x020d, "?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ" },
- { 0x020e, "?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ" },
- { 0x020f, "?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ" },
- { 0x0210, "?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ" },
- { 0x0211, "?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ" },
- { 0x0212, "?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ" },
- { 0x0213, "?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ" },
- { 0x0214, "?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ" },
- { 0x0215, "?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ" },
- { 0x0216, "?_Id_cnt@id@locale@std@@0HA" },
- { 0x0217, "?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z" },
- { 0x0218, "?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z" },
- { 0x0219, "?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z" },
- { 0x021a, "?_Incref@facet@locale@std@@UEAAXXZ" },
- { 0x021b, "?_Index@ios_base@std@@0HA" },
- { 0x021c, "?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAPEAD0PEAH001@Z" },
- { 0x021d, "?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXXZ" },
- { 0x021e, "?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAPEAG0PEAH001@Z" },
- { 0x021f, "?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXXZ" },
- { 0x0220, "?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAPEA_W0PEAH001@Z" },
- { 0x0221, "?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXXZ" },
- { 0x0222, "?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0223, "?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0224, "?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0225, "?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0226, "?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0227, "?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0228, "?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0229, "?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x022a, "?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x022b, "?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x022c, "?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x022d, "?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x022e, "?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x022f, "?_Init@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0230, "?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0231, "?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0232, "?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0233, "?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z" },
- { 0x0234, "?_Init@ios_base@std@@IEAAXXZ" },
- { 0x0235, "?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z" },
- { 0x0236, "?_Init_cnt@Init@ios_base@std@@0HA" },
- { 0x0237, "?_Init_cnt@_UShinit@std@@0HA" },
- { 0x0238, "?_Init_cnt@_Winit@std@@0HA" },
- { 0x0239, "?_Init_cnt_func@Init@ios_base@std@@CAAEAHXZ" },
- { 0x023a, "?_Init_ctor@Init@ios_base@std@@CAXPEAV123@@Z" },
- { 0x023b, "?_Init_dtor@Init@ios_base@std@@CAXPEAV123@@Z" },
- { 0x023c, "?_Init_locks_ctor@_Init_locks@std@@CAXPEAV12@@Z" },
- { 0x023d, "?_Init_locks_dtor@_Init_locks@std@@CAXPEAV12@@Z" },
- { 0x023e, "?_Internal_assign@_Concurrent_vector_base_v4@details@Concurrency@@IEAAXAEBV123@_KP6AXPEAX1@ZP6AX2PEBX1@Z5@Z" },
- { 0x023f, "?_Internal_capacity@_Concurrent_vector_base_v4@details@Concurrency@@IEBA_KXZ" },
- { 0x0240, "?_Internal_clear@_Concurrent_vector_base_v4@details@Concurrency@@IEAA_KP6AXPEAX_K@Z@Z" },
- { 0x0241, "?_Internal_compact@_Concurrent_vector_base_v4@details@Concurrency@@IEAAPEAX_KPEAXP6AX10@ZP6AX1PEBX0@Z@Z" },
- { 0x0242, "?_Internal_copy@_Concurrent_vector_base_v4@details@Concurrency@@IEAAXAEBV123@_KP6AXPEAXPEBX1@Z@Z" },
- { 0x0243, "?_Internal_empty@_Concurrent_queue_base_v4@details@Concurrency@@IEBA_NXZ" },
- { 0x0244, "?_Internal_finish_clear@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXXZ" },
- { 0x0245, "?_Internal_grow_by@_Concurrent_vector_base_v4@details@Concurrency@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z" },
- { 0x0246, "?_Internal_grow_to_at_least_with_result@_Concurrent_vector_base_v4@details@Concurrency@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z" },
- { 0x0247, "?_Internal_move_push@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXPEAX@Z" },
- { 0x0248, "?_Internal_pop_if_present@_Concurrent_queue_base_v4@details@Concurrency@@IEAA_NPEAX@Z" },
- { 0x0249, "?_Internal_push@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXPEBX@Z" },
- { 0x024a, "?_Internal_push_back@_Concurrent_vector_base_v4@details@Concurrency@@IEAAPEAX_KAEA_K@Z" },
- { 0x024b, "?_Internal_reserve@_Concurrent_vector_base_v4@details@Concurrency@@IEAAX_K00@Z" },
- { 0x024c, "?_Internal_resize@_Concurrent_vector_base_v4@details@Concurrency@@IEAAX_K00P6AXPEAX0@ZP6AX1PEBX0@Z3@Z" },
- { 0x024d, "?_Internal_size@_Concurrent_queue_base_v4@details@Concurrency@@IEBA_KXZ" },
- { 0x024e, "?_Internal_swap@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXAEAV123@@Z" },
- { 0x024f, "?_Internal_swap@_Concurrent_vector_base_v4@details@Concurrency@@IEAAXAEAV123@@Z" },
- { 0x0250, "?_Internal_throw_exception@_Concurrent_queue_base_v4@details@Concurrency@@IEBAXXZ" },
- { 0x0251, "?_Internal_throw_exception@_Concurrent_vector_base_v4@details@Concurrency@@IEBAX_K@Z" },
- { 0x0252, "?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z" },
- { 0x0253, "?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z" },
- { 0x0254, "?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z" },
- { 0x0255, "?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z" },
- { 0x0256, "?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z" },
- { 0x0257, "?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEAD_K@Z" },
- { 0x0258, "?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEAD_K@Z" },
- { 0x0259, "?_Last_write_time@sys@tr2@std@@YAXPEBD_J@Z" },
- { 0x025a, "?_Last_write_time@sys@tr2@std@@YAXPEB_W_J@Z" },
- { 0x025b, "?_Last_write_time@sys@tr2@std@@YA_JPEBD@Z" },
- { 0x025c, "?_Last_write_time@sys@tr2@std@@YA_JPEB_W@Z" },
- { 0x025d, "?_Launch@_Pad@std@@QEAAXPEAU_Thrd_imp_t@@@Z" },
- { 0x025e, "?_Link@sys@tr2@std@@YAHPEBD0@Z" },
- { 0x025f, "?_Link@sys@tr2@std@@YAHPEB_W0@Z" },
- { 0x0260, "?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z" },
- { 0x0261, "?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z" },
- { 0x0262, "?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z" },
- { 0x0263, "?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z" },
- { 0x0264, "?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z" },
- { 0x0265, "?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z" },
- { 0x0266, "?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z" },
- { 0x0267, "?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ" },
- { 0x0268, "?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAAXXZ" },
- { 0x0269, "?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ" },
- { 0x026a, "?_Lockit_ctor@_Lockit@std@@CAXPEAV12@@Z" },
- { 0x026b, "?_Lockit_ctor@_Lockit@std@@CAXPEAV12@H@Z" },
- { 0x026c, "?_Lockit_ctor@_Lockit@std@@SAXH@Z" },
- { 0x026d, "?_Lockit_dtor@_Lockit@std@@CAXPEAV12@@Z" },
- { 0x026e, "?_Lockit_dtor@_Lockit@std@@SAXH@Z" },
- { 0x026f, "?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PEBDAEAH@Z" },
- { 0x0270, "?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PEB_WAEAH@Z" },
- { 0x0271, "?_MP_Add@std@@YAXQEA_K_K@Z" },
- { 0x0272, "?_MP_Get@std@@YA_KQEA_K@Z" },
- { 0x0273, "?_MP_Mul@std@@YAXQEA_K_K1@Z" },
- { 0x0274, "?_MP_Rem@std@@YAXQEA_K_K@Z" },
- { 0x0275, "?_Make_dir@sys@tr2@std@@YAHPEBD@Z" },
- { 0x0276, "?_Make_dir@sys@tr2@std@@YAHPEB_W@Z" },
- { 0x0277, "?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z" },
- { 0x0278, "?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z" },
- { 0x0279, "?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z" },
- { 0x027a, "?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z" },
- { 0x027b, "?_Mtx_delete@threads@stdext@@YAXPEAX@Z" },
- { 0x027c, "?_Mtx_lock@threads@stdext@@YAXPEAX@Z" },
- { 0x027d, "?_Mtx_new@threads@stdext@@YAXAEAPEAX@Z" },
- { 0x027e, "?_Mtx_unlock@threads@stdext@@YAXPEAX@Z" },
- { 0x027f, "?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z" },
- { 0x0280, "?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z" },
- { 0x0281, "?_Open_dir@sys@tr2@std@@YAPEAXPEADPEBDAEAHAEAW4file_type@123@@Z" },
- { 0x0282, "?_Open_dir@sys@tr2@std@@YAPEAXPEA_WPEB_WAEAHAEAW4file_type@123@@Z" },
- { 0x0283, "?_Orphan_all@_Container_base0@std@@QEAAXXZ" },
- { 0x0284, "?_Orphan_all@_Container_base12@std@@QEAAXXZ" },
- { 0x0285, "?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x0286, "?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x0287, "?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x0288, "?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ" },
- { 0x0289, "?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ" },
- { 0x028a, "?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ" },
- { 0x028b, "?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ" },
- { 0x028c, "?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ" },
- { 0x028d, "?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ" },
- { 0x028e, "?_Ptr_cerr@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA" },
- { 0x028f, "?_Ptr_cin@std@@3PEAV?$basic_istream@DU?$char_traits@D@std@@@1@EA" },
- { 0x0290, "?_Ptr_clog@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA" },
- { 0x0291, "?_Ptr_cout@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA" },
- { 0x0292, "?_Ptr_wcerr@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA" },
- { 0x0293, "?_Ptr_wcerr@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA" },
- { 0x0294, "?_Ptr_wcin@std@@3PEAV?$basic_istream@GU?$char_traits@G@std@@@1@EA" },
- { 0x0295, "?_Ptr_wcin@std@@3PEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@EA" },
- { 0x0296, "?_Ptr_wclog@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA" },
- { 0x0297, "?_Ptr_wclog@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA" },
- { 0x0298, "?_Ptr_wcout@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA" },
- { 0x0299, "?_Ptr_wcout@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA" },
- { 0x029a, "?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PEBD_K@Z" },
- { 0x029b, "?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PEBG_K@Z" },
- { 0x029c, "?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PEB_W_K@Z" },
- { 0x029d, "?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA" },
- { 0x029e, "?_Random_device@std@@YAIXZ" },
- { 0x029f, "?_Read_dir@sys@tr2@std@@YAPEADPEADPEAXAEAW4file_type@123@@Z" },
- { 0x02a0, "?_Read_dir@sys@tr2@std@@YAPEA_WPEA_WPEAXAEAW4file_type@123@@Z" },
- { 0x02a1, "?_Release@_Pad@std@@QEAAXXZ" },
- { 0x02a2, "?_Remove_dir@sys@tr2@std@@YA_NPEBD@Z" },
- { 0x02a3, "?_Remove_dir@sys@tr2@std@@YA_NPEB_W@Z" },
- { 0x02a4, "?_Rename@sys@tr2@std@@YAHPEBD0@Z" },
- { 0x02a5, "?_Rename@sys@tr2@std@@YAHPEB_W0@Z" },
- { 0x02a6, "?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@D_K@Z" },
- { 0x02a7, "?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@G_K@Z" },
- { 0x02a8, "?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_W_K@Z" },
- { 0x02a9, "?_Rethrow_future_exception@std@@YAXVexception_ptr@1@@Z" },
- { 0x02aa, "?_Rng_abort@std@@YAXPEBD@Z" },
- { 0x02ab, "?_Segment_index_of@_Concurrent_vector_base_v4@details@Concurrency@@KA_K_K@Z" },
- { 0x02ac, "?_Setgloballocale@locale@std@@CAXPEAX@Z" },
- { 0x02ad, "?_Src@?1??_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB" },
- { 0x02ae, "?_Src@?1??_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB" },
- { 0x02af, "?_Src@?1??_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB" },
- { 0x02b0, "?_Src@?1??_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1HAEBVlocale@3@@Z@4QBDB" },
- { 0x02b1, "?_Src@?1??_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1HAEBVlocale@3@@Z@4QBDB" },
- { 0x02b2, "?_Src@?1??_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1HAEBVlocale@3@@Z@4QBDB" },
- { 0x02b3, "?_Src@?3??_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB" },
- { 0x02b4, "?_Src@?3??_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB" },
- { 0x02b5, "?_Src@?3??_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB" },
- { 0x02b6, "?_Stat@sys@tr2@std@@YA?AW4file_type@123@PEBDAEAH@Z" },
- { 0x02b7, "?_Stat@sys@tr2@std@@YA?AW4file_type@123@PEB_WAEAH@Z" },
- { 0x02b8, "?_Statvfs@sys@tr2@std@@YA?AUspace_info@123@PEBD@Z" },
- { 0x02b9, "?_Statvfs@sys@tr2@std@@YA?AUspace_info@123@PEB_W@Z" },
- { 0x02ba, "?_Swap_all@_Container_base0@std@@QEAAXAEAU12@@Z" },
- { 0x02bb, "?_Swap_all@_Container_base12@std@@QEAAXAEAU12@@Z" },
- { 0x02bc, "?_Symlink@sys@tr2@std@@YAHPEBD0@Z" },
- { 0x02bd, "?_Symlink@sys@tr2@std@@YAHPEB_W0@Z" },
- { 0x02be, "?_Sync@ios_base@std@@0_NA" },
- { 0x02bf, "?_Syserror_map@std@@YAPEBDH@Z" },
- { 0x02c0, "?_Throw_C_error@std@@YAXH@Z" },
- { 0x02c1, "?_Throw_Cpp_error@std@@YAXH@Z" },
- { 0x02c2, "?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z" },
- { 0x02c3, "?_Throw_lock_error@threads@stdext@@YAXXZ" },
- { 0x02c4, "?_Throw_resource_error@threads@stdext@@YAXXZ" },
- { 0x02c5, "?_Tidy@?$_Yarn@D@std@@AEAAXXZ" },
- { 0x02c6, "?_Tidy@?$_Yarn@_W@std@@AEAAXXZ" },
- { 0x02c7, "?_Tidy@?$ctype@D@std@@IEAAXXZ" },
- { 0x02c8, "?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEAAXXZ" },
- { 0x02c9, "?_Tidy@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEAAXXZ" },
- { 0x02ca, "?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEAAXXZ" },
- { 0x02cb, "?_Tidy@ios_base@std@@AEAAXXZ" },
- { 0x02cc, "?_Unlink@sys@tr2@std@@YAHPEBD@Z" },
- { 0x02cd, "?_Unlink@sys@tr2@std@@YAHPEB_W@Z" },
- { 0x02ce, "?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ" },
- { 0x02cf, "?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAAXXZ" },
- { 0x02d0, "?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ" },
- { 0x02d1, "?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ" },
- { 0x02d2, "?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ" },
- { 0x02d3, "?_W_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ" },
- { 0x02d4, "?_Winerror_map@std@@YAPEBDH@Z" },
- { 0x02d5, "?_XLgamma@std@@YAMM@Z" },
- { 0x02d6, "?_XLgamma@std@@YANN@Z" },
- { 0x02d7, "?_XLgamma@std@@YAOO@Z" },
- { 0x02d8, "?_Xbad_alloc@std@@YAXXZ" },
- { 0x02d9, "?_Xbad_function_call@std@@YAXXZ" },
- { 0x02da, "?_Xinvalid_argument@std@@YAXPEBD@Z" },
- { 0x02db, "?_Xlength_error@std@@YAXPEBD@Z" },
- { 0x02dc, "?_Xout_of_range@std@@YAXPEBD@Z" },
- { 0x02dd, "?_Xoverflow_error@std@@YAXPEBD@Z" },
- { 0x02de, "?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z" },
- { 0x02df, "?_Xruntime_error@std@@YAXPEBD@Z" },
- { 0x02e0, "?adopt_lock@std@@3Uadopt_lock_t@1@B" },
- { 0x02e1, "?always_noconv@codecvt_base@std@@QEBA_NXZ" },
- { 0x02e2, "?bad@ios_base@std@@QEBA_NXZ" },
- { 0x02e3, "?c_str@?$_Yarn@D@std@@QEBAPEBDXZ" },
- { 0x02e4, "?cancel@agent@Concurrency@@QEAA_NXZ" },
- { 0x02e5, "?cancel_current_task@Concurrency@@YAXXZ" },
- { 0x02e6, "?cerr@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A" },
- { 0x02e7, "?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A" },
- { 0x02e8, "?classic@locale@std@@SAAEBV12@XZ" },
- { 0x02e9, "?classic_table@?$ctype@D@std@@SAPEBFXZ" },
- { 0x02ea, "?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z" },
- { 0x02eb, "?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z" },
- { 0x02ec, "?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z" },
- { 0x02ed, "?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z" },
- { 0x02ee, "?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z" },
- { 0x02ef, "?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z" },
- { 0x02f0, "?clear@ios_base@std@@QEAAXH@Z" },
- { 0x02f1, "?clear@ios_base@std@@QEAAXH_N@Z" },
- { 0x02f2, "?clear@ios_base@std@@QEAAXI@Z" },
- { 0x02f3, "?clog@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A" },
- { 0x02f4, "?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z" },
- { 0x02f5, "?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEBV12@@Z" },
- { 0x02f6, "?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEBV12@@Z" },
- { 0x02f7, "?copyfmt@ios_base@std@@QEAAAEAV12@AEBV12@@Z" },
- { 0x02f8, "?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A" },
- { 0x02f9, "?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ" },
- { 0x02fa, "?date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ" },
- { 0x02fb, "?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ" },
- { 0x02fc, "?defer_lock@std@@3Udefer_lock_t@1@B" },
- { 0x02fd, "?do_always_noconv@?$codecvt@DDH@std@@MEBA_NXZ" },
- { 0x02fe, "?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ" },
- { 0x02ff, "?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ" },
- { 0x0300, "?do_always_noconv@codecvt_base@std@@MEBA_NXZ" },
- { 0x0301, "?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ" },
- { 0x0302, "?do_date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ" },
- { 0x0303, "?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ" },
- { 0x0304, "?do_encoding@?$codecvt@GDH@std@@MEBAHXZ" },
- { 0x0305, "?do_encoding@?$codecvt@_WDH@std@@MEBAHXZ" },
- { 0x0306, "?do_encoding@codecvt_base@std@@MEBAHXZ" },
- { 0x0307, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z" },
- { 0x0308, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z" },
- { 0x0309, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z" },
- { 0x030a, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z" },
- { 0x030b, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z" },
- { 0x030c, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z" },
- { 0x030d, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z" },
- { 0x030e, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z" },
- { 0x030f, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z" },
- { 0x0310, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z" },
- { 0x0311, "?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z" },
- { 0x0312, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z" },
- { 0x0313, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z" },
- { 0x0314, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z" },
- { 0x0315, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z" },
- { 0x0316, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z" },
- { 0x0317, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z" },
- { 0x0318, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z" },
- { 0x0319, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z" },
- { 0x031a, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z" },
- { 0x031b, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z" },
- { 0x031c, "?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z" },
- { 0x031d, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z" },
- { 0x031e, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z" },
- { 0x031f, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z" },
- { 0x0320, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z" },
- { 0x0321, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z" },
- { 0x0322, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z" },
- { 0x0323, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z" },
- { 0x0324, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z" },
- { 0x0325, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z" },
- { 0x0326, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z" },
- { 0x0327, "?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z" },
- { 0x0328, "?do_get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z" },
- { 0x0329, "?do_get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z" },
- { 0x032a, "?do_get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z" },
- { 0x032b, "?do_get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x032c, "?do_get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x032d, "?do_get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x032e, "?do_get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x032f, "?do_get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0330, "?do_get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0331, "?do_get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0332, "?do_get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0333, "?do_get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0334, "?do_get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0335, "?do_get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0336, "?do_get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0337, "?do_get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0338, "?do_get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x0339, "?do_get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x033a, "?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z" },
- { 0x033b, "?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z" },
- { 0x033c, "?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z" },
- { 0x033d, "?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z" },
- { 0x033e, "?do_is@?$ctype@G@std@@MEBA_NFG@Z" },
- { 0x033f, "?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z" },
- { 0x0340, "?do_is@?$ctype@_W@std@@MEBA_NF_W@Z" },
- { 0x0341, "?do_length@?$codecvt@DDH@std@@MEBAHAEAHPEBD1_K@Z" },
- { 0x0342, "?do_length@?$codecvt@GDH@std@@MEBAHAEAHPEBD1_K@Z" },
- { 0x0343, "?do_length@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1_K@Z" },
- { 0x0344, "?do_max_length@?$codecvt@GDH@std@@MEBAHXZ" },
- { 0x0345, "?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ" },
- { 0x0346, "?do_max_length@codecvt_base@std@@MEBAHXZ" },
- { 0x0347, "?do_narrow@?$ctype@D@std@@MEBADDD@Z" },
- { 0x0348, "?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z" },
- { 0x0349, "?do_narrow@?$ctype@G@std@@MEBADGD@Z" },
- { 0x034a, "?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z" },
- { 0x034b, "?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z" },
- { 0x034c, "?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z" },
- { 0x034d, "?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z" },
- { 0x034e, "?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z" },
- { 0x034f, "?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z" },
- { 0x0350, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z" },
- { 0x0351, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z" },
- { 0x0352, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z" },
- { 0x0353, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z" },
- { 0x0354, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z" },
- { 0x0355, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z" },
- { 0x0356, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z" },
- { 0x0357, "?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z" },
- { 0x0358, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z" },
- { 0x0359, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z" },
- { 0x035a, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z" },
- { 0x035b, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z" },
- { 0x035c, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z" },
- { 0x035d, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z" },
- { 0x035e, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z" },
- { 0x035f, "?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z" },
- { 0x0360, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z" },
- { 0x0361, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z" },
- { 0x0362, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z" },
- { 0x0363, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z" },
- { 0x0364, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z" },
- { 0x0365, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z" },
- { 0x0366, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z" },
- { 0x0367, "?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z" },
- { 0x0368, "?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z" },
- { 0x0369, "?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z" },
- { 0x036a, "?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z" },
- { 0x036b, "?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z" },
- { 0x036c, "?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z" },
- { 0x036d, "?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z" },
- { 0x036e, "?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z" },
- { 0x036f, "?do_tolower@?$ctype@D@std@@MEBADD@Z" },
- { 0x0370, "?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z" },
- { 0x0371, "?do_tolower@?$ctype@G@std@@MEBAGG@Z" },
- { 0x0372, "?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z" },
- { 0x0373, "?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z" },
- { 0x0374, "?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z" },
- { 0x0375, "?do_toupper@?$ctype@D@std@@MEBADD@Z" },
- { 0x0376, "?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z" },
- { 0x0377, "?do_toupper@?$ctype@G@std@@MEBAGG@Z" },
- { 0x0378, "?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z" },
- { 0x0379, "?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z" },
- { 0x037a, "?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z" },
- { 0x037b, "?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z" },
- { 0x037c, "?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z" },
- { 0x037d, "?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z" },
- { 0x037e, "?do_widen@?$ctype@D@std@@MEBADD@Z" },
- { 0x037f, "?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z" },
- { 0x0380, "?do_widen@?$ctype@G@std@@MEBAGD@Z" },
- { 0x0381, "?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z" },
- { 0x0382, "?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z" },
- { 0x0383, "?do_widen@?$ctype@_W@std@@MEBA_WD@Z" },
- { 0x0384, "?done@agent@Concurrency@@IEAA_NXZ" },
- { 0x0385, "?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ" },
- { 0x0386, "?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ" },
- { 0x0387, "?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ" },
- { 0x0388, "?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ" },
- { 0x0389, "?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ" },
- { 0x038a, "?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ" },
- { 0x038b, "?empty@?$_Yarn@D@std@@QEBA_NXZ" },
- { 0x038c, "?empty@locale@std@@SA?AV12@XZ" },
- { 0x038d, "?encoding@codecvt_base@std@@QEBAHXZ" },
- { 0x038e, "?endl@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z" },
- { 0x038f, "?endl@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z" },
- { 0x0390, "?endl@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z" },
- { 0x0391, "?ends@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z" },
- { 0x0392, "?ends@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z" },
- { 0x0393, "?ends@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z" },
- { 0x0394, "?eof@ios_base@std@@QEBA_NXZ" },
- { 0x0395, "?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ" },
- { 0x0396, "?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ" },
- { 0x0397, "?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ" },
- { 0x0398, "?exceptions@ios_base@std@@QEAAXH@Z" },
- { 0x0399, "?exceptions@ios_base@std@@QEAAXI@Z" },
- { 0x039a, "?exceptions@ios_base@std@@QEBAHXZ" },
- { 0x039b, "?fail@ios_base@std@@QEBA_NXZ" },
- { 0x039c, "?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAADD@Z" },
- { 0x039d, "?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ" },
- { 0x039e, "?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAGG@Z" },
- { 0x039f, "?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGXZ" },
- { 0x03a0, "?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA_W_W@Z" },
- { 0x03a1, "?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WXZ" },
- { 0x03a2, "?flags@ios_base@std@@QEAAHH@Z" },
- { 0x03a3, "?flags@ios_base@std@@QEBAHXZ" },
- { 0x03a4, "?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ" },
- { 0x03a5, "?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ" },
- { 0x03a6, "?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ" },
- { 0x03a7, "?flush@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z" },
- { 0x03a8, "?flush@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z" },
- { 0x03a9, "?flush@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z" },
- { 0x03aa, "?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z" },
- { 0x03ab, "?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z" },
- { 0x03ac, "?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z" },
- { 0x03ad, "?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QEBA_JXZ" },
- { 0x03ae, "?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QEBA_JXZ" },
- { 0x03af, "?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEBA_JXZ" },
- { 0x03b0, "?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAD@Z" },
- { 0x03b1, "?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z" },
- { 0x03b2, "?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z" },
- { 0x03b3, "?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z" },
- { 0x03b4, "?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z" },
- { 0x03b5, "?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x03b6, "?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAG@Z" },
- { 0x03b7, "?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z" },
- { 0x03b8, "?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z" },
- { 0x03b9, "?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z" },
- { 0x03ba, "?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z" },
- { 0x03bb, "?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ" },
- { 0x03bc, "?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z" },
- { 0x03bd, "?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z" },
- { 0x03be, "?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEA_W@Z" },
- { 0x03bf, "?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z" },
- { 0x03c0, "?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z" },
- { 0x03c1, "?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ" },
- { 0x03c2, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z" },
- { 0x03c3, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z" },
- { 0x03c4, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z" },
- { 0x03c5, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z" },
- { 0x03c6, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z" },
- { 0x03c7, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z" },
- { 0x03c8, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z" },
- { 0x03c9, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z" },
- { 0x03ca, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z" },
- { 0x03cb, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z" },
- { 0x03cc, "?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z" },
- { 0x03cd, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z" },
- { 0x03ce, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z" },
- { 0x03cf, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z" },
- { 0x03d0, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z" },
- { 0x03d1, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z" },
- { 0x03d2, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z" },
- { 0x03d3, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z" },
- { 0x03d4, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z" },
- { 0x03d5, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z" },
- { 0x03d6, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z" },
- { 0x03d7, "?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z" },
- { 0x03d8, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z" },
- { 0x03d9, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z" },
- { 0x03da, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z" },
- { 0x03db, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z" },
- { 0x03dc, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z" },
- { 0x03dd, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z" },
- { 0x03de, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z" },
- { 0x03df, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z" },
- { 0x03e0, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z" },
- { 0x03e1, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z" },
- { 0x03e2, "?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z" },
- { 0x03e3, "?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z" },
- { 0x03e4, "?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD4@Z" },
- { 0x03e5, "?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z" },
- { 0x03e6, "?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBG4@Z" },
- { 0x03e7, "?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z" },
- { 0x03e8, "?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEB_W4@Z" },
- { 0x03e9, "?get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03ea, "?get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03eb, "?get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03ec, "?get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03ed, "?get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03ee, "?get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03ef, "?get_new_handler@std@@YAP6AXXZXZ" },
- { 0x03f0, "?get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f1, "?get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f2, "?get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f3, "?get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f4, "?get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f5, "?get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f6, "?get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f7, "?get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f8, "?get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z" },
- { 0x03f9, "?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z" },
- { 0x03fa, "?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z" },
- { 0x03fb, "?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z" },
- { 0x03fc, "?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z" },
- { 0x03fd, "?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z" },
- { 0x03fe, "?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z" },
- { 0x03ff, "?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEBA?AVlocale@2@XZ" },
- { 0x0400, "?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEBA?AVlocale@2@XZ" },
- { 0x0401, "?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEBA?AVlocale@2@XZ" },
- { 0x0402, "?getloc@ios_base@std@@QEBA?AVlocale@2@XZ" },
- { 0x0403, "?global@locale@std@@SA?AV12@AEBV12@@Z" },
- { 0x0404, "?good@ios_base@std@@QEBA_NXZ" },
- { 0x0405, "?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ" },
- { 0x0406, "?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ" },
- { 0x0407, "?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ" },
- { 0x0408, "?id@?$codecvt@DDH@std@@2V0locale@2@A" },
- { 0x0409, "?id@?$codecvt@GDH@std@@2V0locale@2@A" },
- { 0x040a, "?id@?$codecvt@_WDH@std@@2V0locale@2@A" },
- { 0x040b, "?id@?$collate@D@std@@2V0locale@2@A" },
- { 0x040c, "?id@?$collate@G@std@@2V0locale@2@A" },
- { 0x040d, "?id@?$collate@_W@std@@2V0locale@2@A" },
- { 0x040e, "?id@?$ctype@D@std@@2V0locale@2@A" },
- { 0x040f, "?id@?$ctype@G@std@@2V0locale@2@A" },
- { 0x0410, "?id@?$ctype@_W@std@@2V0locale@2@A" },
- { 0x0411, "?id@?$messages@D@std@@2V0locale@2@A" },
- { 0x0412, "?id@?$messages@G@std@@2V0locale@2@A" },
- { 0x0413, "?id@?$messages@_W@std@@2V0locale@2@A" },
- { 0x0414, "?id@?$money_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0415, "?id@?$money_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0416, "?id@?$money_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0417, "?id@?$money_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0418, "?id@?$money_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0419, "?id@?$money_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A" },
- { 0x041a, "?id@?$moneypunct@D$00@std@@2V0locale@2@A" },
- { 0x041b, "?id@?$moneypunct@D$0A@@std@@2V0locale@2@A" },
- { 0x041c, "?id@?$moneypunct@G$00@std@@2V0locale@2@A" },
- { 0x041d, "?id@?$moneypunct@G$0A@@std@@2V0locale@2@A" },
- { 0x041e, "?id@?$moneypunct@_W$00@std@@2V0locale@2@A" },
- { 0x041f, "?id@?$moneypunct@_W$0A@@std@@2V0locale@2@A" },
- { 0x0420, "?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0421, "?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0422, "?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0423, "?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0424, "?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0425, "?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A" },
- { 0x0426, "?id@?$numpunct@D@std@@2V0locale@2@A" },
- { 0x0427, "?id@?$numpunct@G@std@@2V0locale@2@A" },
- { 0x0428, "?id@?$numpunct@_W@std@@2V0locale@2@A" },
- { 0x0429, "?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A" },
- { 0x042a, "?id@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A" },
- { 0x042b, "?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A" },
- { 0x042c, "?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A" },
- { 0x042d, "?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A" },
- { 0x042e, "?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A" },
- { 0x042f, "?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x0430, "?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JG@Z" },
- { 0x0431, "?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JG@Z" },
- { 0x0432, "?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x0433, "?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x0434, "?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x0435, "?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAXAEBVlocale@2@@Z" },
- { 0x0436, "?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAXAEBVlocale@2@@Z" },
- { 0x0437, "?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAXAEBVlocale@2@@Z" },
- { 0x0438, "?imbue@ios_base@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x0439, "?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z" },
- { 0x043a, "?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z" },
- { 0x043b, "?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z" },
- { 0x043c, "?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JXZ" },
- { 0x043d, "?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JXZ" },
- { 0x043e, "?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JXZ" },
- { 0x043f, "?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z" },
- { 0x0440, "?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z" },
- { 0x0441, "?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z" },
- { 0x0442, "?intl@?$moneypunct@D$00@std@@2_NB" },
- { 0x0443, "?intl@?$moneypunct@D$0A@@std@@2_NB" },
- { 0x0444, "?intl@?$moneypunct@G$00@std@@2_NB" },
- { 0x0445, "?intl@?$moneypunct@G$0A@@std@@2_NB" },
- { 0x0446, "?intl@?$moneypunct@_W$00@std@@2_NB" },
- { 0x0447, "?intl@?$moneypunct@_W$0A@@std@@2_NB" },
- { 0x0448, "?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z" },
- { 0x0449, "?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z" },
- { 0x044a, "?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z" },
- { 0x044b, "?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z" },
- { 0x044c, "?is@?$ctype@D@std@@QEBA_NFD@Z" },
- { 0x044d, "?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z" },
- { 0x044e, "?is@?$ctype@G@std@@QEBA_NFG@Z" },
- { 0x044f, "?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z" },
- { 0x0450, "?is@?$ctype@_W@std@@QEBA_NF_W@Z" },
- { 0x0451, "?is_current_task_group_canceling@Concurrency@@YA_NXZ" },
- { 0x0452, "?is_task_cancellation_requested@Concurrency@@YA_NXZ" },
- { 0x0453, "?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x0454, "?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x0455, "?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x0456, "?iword@ios_base@std@@QEAAAEAJH@Z" },
- { 0x0457, "?length@?$codecvt@DDH@std@@QEBAHAEAHPEBD1_K@Z" },
- { 0x0458, "?length@?$codecvt@GDH@std@@QEBAHAEAHPEBD1_K@Z" },
- { 0x0459, "?length@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1_K@Z" },
- { 0x045a, "?max_length@codecvt_base@std@@QEBAHXZ" },
- { 0x045b, "?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAX$$QEAV12@@Z" },
- { 0x045c, "?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z" },
- { 0x045d, "?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAX$$QEAV12@@Z" },
- { 0x045e, "?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z" },
- { 0x045f, "?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAX$$QEAV12@@Z" },
- { 0x0460, "?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z" },
- { 0x0461, "?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADDD@Z" },
- { 0x0462, "?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBADGD@Z" },
- { 0x0463, "?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAD_WD@Z" },
- { 0x0464, "?narrow@?$ctype@D@std@@QEBADDD@Z" },
- { 0x0465, "?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z" },
- { 0x0466, "?narrow@?$ctype@G@std@@QEBADGD@Z" },
- { 0x0467, "?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z" },
- { 0x0468, "?narrow@?$ctype@_W@std@@QEBAD_WD@Z" },
- { 0x0469, "?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z" },
- { 0x046a, "?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA_NXZ" },
- { 0x046b, "?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA_NXZ" },
- { 0x046c, "?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA_NXZ" },
- { 0x046d, "?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x046e, "?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x046f, "?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x0470, "?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z" },
- { 0x0471, "?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z" },
- { 0x0472, "?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z" },
- { 0x0473, "?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z" },
- { 0x0474, "?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z" },
- { 0x0475, "?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z" },
- { 0x0476, "?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z" },
- { 0x0477, "?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z" },
- { 0x0478, "?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z" },
- { 0x0479, "?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ" },
- { 0x047a, "?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ" },
- { 0x047b, "?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ" },
- { 0x047c, "?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z" },
- { 0x047d, "?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z" },
- { 0x047e, "?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z" },
- { 0x047f, "?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x0480, "?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ" },
- { 0x0481, "?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ" },
- { 0x0482, "?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ" },
- { 0x0483, "?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ" },
- { 0x0484, "?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ" },
- { 0x0485, "?precision@ios_base@std@@QEAA_J_J@Z" },
- { 0x0486, "?precision@ios_base@std@@QEBA_JXZ" },
- { 0x0487, "?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x0488, "?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x0489, "?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z" },
- { 0x048a, "?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z" },
- { 0x048b, "?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z" },
- { 0x048c, "?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z" },
- { 0x048d, "?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z" },
- { 0x048e, "?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z" },
- { 0x048f, "?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z" },
- { 0x0490, "?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z" },
- { 0x0491, "?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z" },
- { 0x0492, "?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z" },
- { 0x0493, "?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z" },
- { 0x0494, "?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z" },
- { 0x0495, "?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z" },
- { 0x0496, "?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEAD_J@Z" },
- { 0x0497, "?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEAG_J@Z" },
- { 0x0498, "?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEA_W_J@Z" },
- { 0x0499, "?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x049a, "?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAHXZ" },
- { 0x049b, "?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAHXZ" },
- { 0x049c, "?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z" },
- { 0x049d, "?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z" },
- { 0x049e, "?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z" },
- { 0x049f, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z" },
- { 0x04a0, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z" },
- { 0x04a1, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z" },
- { 0x04a2, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z" },
- { 0x04a3, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z" },
- { 0x04a4, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z" },
- { 0x04a5, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z" },
- { 0x04a6, "?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z" },
- { 0x04a7, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z" },
- { 0x04a8, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z" },
- { 0x04a9, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z" },
- { 0x04aa, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z" },
- { 0x04ab, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z" },
- { 0x04ac, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z" },
- { 0x04ad, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z" },
- { 0x04ae, "?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z" },
- { 0x04af, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z" },
- { 0x04b0, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z" },
- { 0x04b1, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z" },
- { 0x04b2, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z" },
- { 0x04b3, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z" },
- { 0x04b4, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z" },
- { 0x04b5, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z" },
- { 0x04b6, "?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z" },
- { 0x04b7, "?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z" },
- { 0x04b8, "?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@PEBD3@Z" },
- { 0x04b9, "?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z" },
- { 0x04ba, "?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@PEBG3@Z" },
- { 0x04bb, "?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z" },
- { 0x04bc, "?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@PEB_W4@Z" },
- { 0x04bd, "?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z" },
- { 0x04be, "?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z" },
- { 0x04bf, "?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z" },
- { 0x04c0, "?pword@ios_base@std@@QEAAAEAPEAXH@Z" },
- { 0x04c1, "?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAV32@@Z" },
- { 0x04c2, "?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ" },
- { 0x04c3, "?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAV32@@Z" },
- { 0x04c4, "?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ" },
- { 0x04c5, "?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEAV32@@Z" },
- { 0x04c6, "?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ" },
- { 0x04c7, "?rdstate@ios_base@std@@QEBAHXZ" },
- { 0x04c8, "?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z" },
- { 0x04c9, "?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z" },
- { 0x04ca, "?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z" },
- { 0x04cb, "?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z" },
- { 0x04cc, "?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z" },
- { 0x04cd, "?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z" },
- { 0x04ce, "?register_callback@ios_base@std@@QEAAXP6AXW4event@12@AEAV12@H@ZH@Z" },
- { 0x04cf, "?resetiosflags@std@@YA?AU?$_Smanip@H@1@H@Z" },
- { 0x04d0, "?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x04d1, "?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ" },
- { 0x04d2, "?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ" },
- { 0x04d3, "?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z" },
- { 0x04d4, "?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z" },
- { 0x04d5, "?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z" },
- { 0x04d6, "?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z" },
- { 0x04d7, "?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z" },
- { 0x04d8, "?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z" },
- { 0x04d9, "?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z" },
- { 0x04da, "?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x04db, "?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z" },
- { 0x04dc, "?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x04dd, "?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z" },
- { 0x04de, "?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x04df, "?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z" },
- { 0x04e0, "?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z" },
- { 0x04e1, "?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z" },
- { 0x04e2, "?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z" },
- { 0x04e3, "?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x04e4, "?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z" },
- { 0x04e5, "?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x04e6, "?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z" },
- { 0x04e7, "?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z" },
- { 0x04e8, "?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z" },
- { 0x04e9, "?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z" },
- { 0x04ea, "?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z" },
- { 0x04eb, "?set_new_handler@std@@YAP6AXXZP6AXXZ@Z" },
- { 0x04ec, "?set_rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z" },
- { 0x04ed, "?set_rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z" },
- { 0x04ee, "?set_rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z" },
- { 0x04ef, "?setbase@std@@YA?AU?$_Smanip@H@1@H@Z" },
- { 0x04f0, "?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAPEAV12@PEAD_J@Z" },
- { 0x04f1, "?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAPEAV12@PEAG_J@Z" },
- { 0x04f2, "?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAPEAV12@PEA_W_J@Z" },
- { 0x04f3, "?setf@ios_base@std@@QEAAHH@Z" },
- { 0x04f4, "?setf@ios_base@std@@QEAAHHH@Z" },
- { 0x04f5, "?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z" },
- { 0x04f6, "?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z" },
- { 0x04f7, "?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z" },
- { 0x04f8, "?setiosflags@std@@YA?AU?$_Smanip@H@1@H@Z" },
- { 0x04f9, "?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z" },
- { 0x04fa, "?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD0@Z" },
- { 0x04fb, "?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z" },
- { 0x04fc, "?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG0@Z" },
- { 0x04fd, "?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z" },
- { 0x04fe, "?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W0@Z" },
- { 0x04ff, "?setprecision@std@@YA?AU?$_Smanip@_J@1@_J@Z" },
- { 0x0500, "?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z" },
- { 0x0501, "?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z" },
- { 0x0502, "?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z" },
- { 0x0503, "?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z" },
- { 0x0504, "?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z" },
- { 0x0505, "?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z" },
- { 0x0506, "?setstate@ios_base@std@@QEAAXH@Z" },
- { 0x0507, "?setstate@ios_base@std@@QEAAXH_N@Z" },
- { 0x0508, "?setstate@ios_base@std@@QEAAXI@Z" },
- { 0x0509, "?setw@std@@YA?AU?$_Smanip@_J@1@_J@Z" },
- { 0x050a, "?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x050b, "?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ" },
- { 0x050c, "?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ" },
- { 0x050d, "?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z" },
- { 0x050e, "?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z" },
- { 0x050f, "?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z" },
- { 0x0510, "?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JXZ" },
- { 0x0511, "?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JXZ" },
- { 0x0512, "?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JXZ" },
- { 0x0513, "?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x0514, "?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ" },
- { 0x0515, "?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ" },
- { 0x0516, "?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z" },
- { 0x0517, "?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z" },
- { 0x0518, "?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z" },
- { 0x0519, "?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z" },
- { 0x051a, "?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z" },
- { 0x051b, "?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z" },
- { 0x051c, "?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z" },
- { 0x051d, "?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEBG_J@Z" },
- { 0x051e, "?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEB_W_J@Z" },
- { 0x051f, "?start@agent@Concurrency@@QEAA_NXZ" },
- { 0x0520, "?status@agent@Concurrency@@QEAA?AW4agent_status@2@XZ" },
- { 0x0521, "?status_port@agent@Concurrency@@QEAAPEAV?$ISource@W4agent_status@Concurrency@@@2@XZ" },
- { 0x0522, "?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ" },
- { 0x0523, "?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAXXZ" },
- { 0x0524, "?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ" },
- { 0x0525, "?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x0526, "?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ" },
- { 0x0527, "?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ" },
- { 0x0528, "?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z" },
- { 0x0529, "?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z" },
- { 0x052a, "?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z" },
- { 0x052b, "?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x052c, "?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x052d, "?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x052e, "?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x052f, "?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0530, "?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0531, "?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0532, "?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0533, "?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0534, "?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0535, "?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0536, "?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z" },
- { 0x0537, "?swap@ios_base@std@@QEAAXAEAV12@@Z" },
- { 0x0538, "?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ" },
- { 0x0539, "?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAHXZ" },
- { 0x053a, "?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAHXZ" },
- { 0x053b, "?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ" },
- { 0x053c, "?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAHXZ" },
- { 0x053d, "?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAHXZ" },
- { 0x053e, "?sync_with_stdio@ios_base@std@@SA_N_N@Z" },
- { 0x053f, "?table@?$ctype@D@std@@QEBAPEBFXZ" },
- { 0x0540, "?table_size@?$ctype@D@std@@2_KB" },
- { 0x0541, "?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ" },
- { 0x0542, "?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ" },
- { 0x0543, "?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ" },
- { 0x0544, "?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ" },
- { 0x0545, "?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ" },
- { 0x0546, "?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ" },
- { 0x0547, "?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@PEAV32@@Z" },
- { 0x0548, "?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ" },
- { 0x0549, "?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@PEAV32@@Z" },
- { 0x054a, "?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ" },
- { 0x054b, "?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PEAV32@@Z" },
- { 0x054c, "?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ" },
- { 0x054d, "?tolower@?$ctype@D@std@@QEBADD@Z" },
- { 0x054e, "?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z" },
- { 0x054f, "?tolower@?$ctype@G@std@@QEBAGG@Z" },
- { 0x0550, "?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z" },
- { 0x0551, "?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z" },
- { 0x0552, "?tolower@?$ctype@_W@std@@QEBA_W_W@Z" },
- { 0x0553, "?toupper@?$ctype@D@std@@QEBADD@Z" },
- { 0x0554, "?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z" },
- { 0x0555, "?toupper@?$ctype@G@std@@QEBAGG@Z" },
- { 0x0556, "?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z" },
- { 0x0557, "?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z" },
- { 0x0558, "?toupper@?$ctype@_W@std@@QEBA_W_W@Z" },
- { 0x0559, "?try_to_lock@std@@3Utry_to_lock_t@1@B" },
- { 0x055a, "?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ" },
- { 0x055b, "?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ" },
- { 0x055c, "?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ" },
- { 0x055d, "?uncaught_exception@std@@YA_NXZ" },
- { 0x055e, "?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ" },
- { 0x055f, "?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ" },
- { 0x0560, "?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ" },
- { 0x0561, "?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ" },
- { 0x0562, "?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ" },
- { 0x0563, "?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ" },
- { 0x0564, "?unsetf@ios_base@std@@QEAAXH@Z" },
- { 0x0565, "?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z" },
- { 0x0566, "?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z" },
- { 0x0567, "?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z" },
- { 0x0568, "?wait@agent@Concurrency@@SA?AW4agent_status@2@PEAV12@I@Z" },
- { 0x0569, "?wait_for_all@agent@Concurrency@@SAX_KPEAPEAV12@PEAW4agent_status@2@I@Z" },
- { 0x056a, "?wait_for_one@agent@Concurrency@@SAX_KPEAPEAV12@AEAW4agent_status@2@AEA_KI@Z" },
- { 0x056b, "?wcerr@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A" },
- { 0x056c, "?wcerr@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A" },
- { 0x056d, "?wcin@std@@3V?$basic_istream@GU?$char_traits@G@std@@@1@A" },
- { 0x056e, "?wcin@std@@3V?$basic_istream@_WU?$char_traits@_W@std@@@1@A" },
- { 0x056f, "?wclog@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A" },
- { 0x0570, "?wclog@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A" },
- { 0x0571, "?wcout@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A" },
- { 0x0572, "?wcout@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A" },
- { 0x0573, "?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z" },
- { 0x0574, "?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGD@Z" },
- { 0x0575, "?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WD@Z" },
- { 0x0576, "?widen@?$ctype@D@std@@QEBADD@Z" },
- { 0x0577, "?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z" },
- { 0x0578, "?widen@?$ctype@G@std@@QEBAGD@Z" },
- { 0x0579, "?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z" },
- { 0x057a, "?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z" },
- { 0x057b, "?widen@?$ctype@_W@std@@QEBA_WD@Z" },
- { 0x057c, "?width@ios_base@std@@QEAA_J_J@Z" },
- { 0x057d, "?width@ios_base@std@@QEBA_JXZ" },
- { 0x057e, "?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEBD_J@Z" },
- { 0x057f, "?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEBG_J@Z" },
- { 0x0580, "?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEB_W_J@Z" },
- { 0x0581, "?ws@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@1@AEAV21@@Z" },
- { 0x0582, "?ws@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@1@AEAV21@@Z" },
- { 0x0583, "?ws@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z" },
- { 0x0584, "?xalloc@ios_base@std@@SAHXZ" },
- { 0x0585, "?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z" },
- { 0x0586, "?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_J@Z" },
- { 0x0587, "?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_J@Z" },
- { 0x0588, "?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z" },
- { 0x0589, "?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEBG_J@Z" },
- { 0x058a, "?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEB_W_J@Z" },
- { 0x058b, "_Call_once" },
- { 0x058c, "_Call_onceEx" },
- { 0x058d, "_Cnd_broadcast" },
- { 0x058e, "_Cnd_destroy" },
- { 0x058f, "_Cnd_do_broadcast_at_thread_exit" },
- { 0x0590, "_Cnd_init" },
- { 0x0591, "_Cnd_register_at_thread_exit" },
- { 0x0592, "_Cnd_signal" },
- { 0x0593, "_Cnd_timedwait" },
- { 0x0594, "_Cnd_unregister_at_thread_exit" },
- { 0x0595, "_Cnd_wait" },
- { 0x0596, "_Cosh" },
- { 0x0597, "_Denorm" },
- { 0x0598, "_Dint" },
- { 0x0599, "_Dnorm" },
- { 0x059a, "_Do_call" },
- { 0x059b, "_Dscale" },
- { 0x059c, "_Dtento" },
- { 0x059d, "_Dtest" },
- { 0x059e, "_Dunscale" },
- { 0x059f, "_Eps" },
- { 0x05a0, "_Exp" },
- { 0x05a1, "_FCosh" },
- { 0x05a2, "_FDenorm" },
- { 0x05a3, "_FDint" },
- { 0x05a4, "_FDnorm" },
- { 0x05a5, "_FDscale" },
- { 0x05a6, "_FDtento" },
- { 0x05a7, "_FDtest" },
- { 0x05a8, "_FDunscale" },
- { 0x05a9, "_FEps" },
- { 0x05aa, "_FExp" },
- { 0x05ab, "_FInf" },
- { 0x05ac, "_FNan" },
- { 0x05ad, "_FRteps" },
- { 0x05ae, "_FSinh" },
- { 0x05af, "_FSnan" },
- { 0x05b0, "_FXbig" },
- { 0x05b1, "_FXp_addh" },
- { 0x05b2, "_FXp_addx" },
- { 0x05b3, "_FXp_getw" },
- { 0x05b4, "_FXp_invx" },
- { 0x05b5, "_FXp_ldexpx" },
- { 0x05b6, "_FXp_movx" },
- { 0x05b7, "_FXp_mulh" },
- { 0x05b8, "_FXp_mulx" },
- { 0x05b9, "_FXp_setn" },
- { 0x05ba, "_FXp_setw" },
- { 0x05bb, "_FXp_sqrtx" },
- { 0x05bc, "_FXp_subx" },
- { 0x05bd, "_FZero" },
- { 0x05be, "_Getcoll" },
- { 0x05bf, "_Getctype" },
- { 0x05c0, "_Getcvt" },
- { 0x05c1, "_Getdateorder" },
- { 0x05c2, "_Getwctype" },
- { 0x05c3, "_Getwctypes" },
- { 0x05c4, "_Hugeval" },
- { 0x05c5, "_Inf" },
- { 0x05c6, "_LCosh" },
- { 0x05c7, "_LDenorm" },
- { 0x05c8, "_LDint" },
- { 0x05c9, "_LDscale" },
- { 0x05ca, "_LDtento" },
- { 0x05cb, "_LDtest" },
- { 0x05cc, "_LDunscale" },
- { 0x05cd, "_LEps" },
- { 0x05ce, "_LExp" },
- { 0x05cf, "_LInf" },
- { 0x05d0, "_LNan" },
- { 0x05d1, "_LPoly" },
- { 0x05d2, "_LRteps" },
- { 0x05d3, "_LSinh" },
- { 0x05d4, "_LSnan" },
- { 0x05d5, "_LXbig" },
- { 0x05d6, "_LXp_addh" },
- { 0x05d7, "_LXp_addx" },
- { 0x05d8, "_LXp_getw" },
- { 0x05d9, "_LXp_invx" },
- { 0x05da, "_LXp_ldexpx" },
- { 0x05db, "_LXp_movx" },
- { 0x05dc, "_LXp_mulh" },
- { 0x05dd, "_LXp_mulx" },
- { 0x05de, "_LXp_setn" },
- { 0x05df, "_LXp_setw" },
- { 0x05e0, "_LXp_sqrtx" },
- { 0x05e1, "_LXp_subx" },
- { 0x05e2, "_LZero" },
- { 0x05e3, "_Lock_shared_ptr_spin_lock" },
- { 0x05e4, "_Mbrtowc" },
- { 0x05e5, "_Mtx_clear_owner" },
- { 0x05e6, "_Mtx_current_owns" },
- { 0x05e7, "_Mtx_destroy" },
- { 0x05e8, "_Mtx_getconcrtcs" },
- { 0x05e9, "_Mtx_init" },
- { 0x05ea, "_Mtx_lock" },
- { 0x05eb, "_Mtx_reset_owner" },
- { 0x05ec, "_Mtx_timedlock" },
- { 0x05ed, "_Mtx_trylock" },
- { 0x05ee, "_Mtx_unlock" },
- { 0x05ef, "_Mtxdst" },
- { 0x05f0, "_Mtxinit" },
- { 0x05f1, "_Mtxlock" },
- { 0x05f2, "_Mtxunlock" },
- { 0x05f3, "_Nan" },
- { 0x05f4, "_Once" },
- { 0x05f5, "_Poly" },
- { 0x05f6, "_Rteps" },
- { 0x05f7, "_Sinh" },
- { 0x05f8, "_Snan" },
- { 0x05f9, "_Stod" },
- { 0x05fa, "_Stodx" },
- { 0x05fb, "_Stof" },
- { 0x05fc, "_Stoflt" },
- { 0x05fd, "_Stofx" },
- { 0x05fe, "_Stold" },
- { 0x05ff, "_Stoldx" },
- { 0x0600, "_Stoll" },
- { 0x0601, "_Stollx" },
- { 0x0602, "_Stolx" },
- { 0x0603, "_Stopfx" },
- { 0x0604, "_Stoul" },
- { 0x0605, "_Stoull" },
- { 0x0606, "_Stoullx" },
- { 0x0607, "_Stoulx" },
- { 0x0608, "_Stoxflt" },
- { 0x0609, "_Strcoll" },
- { 0x060a, "_Strxfrm" },
- { 0x060b, "_Thrd_abort" },
- { 0x060c, "_Thrd_create" },
- { 0x060d, "_Thrd_current" },
- { 0x060e, "_Thrd_detach" },
- { 0x060f, "_Thrd_equal" },
- { 0x0610, "_Thrd_exit" },
- { 0x0611, "_Thrd_join" },
- { 0x0612, "_Thrd_lt" },
- { 0x0613, "_Thrd_sleep" },
- { 0x0614, "_Thrd_start" },
- { 0x0615, "_Thrd_yield" },
- { 0x0616, "_Tolower" },
- { 0x0617, "_Toupper" },
- { 0x0618, "_Towlower" },
- { 0x0619, "_Towupper" },
- { 0x061a, "_Tss_create" },
- { 0x061b, "_Tss_delete" },
- { 0x061c, "_Tss_get" },
- { 0x061d, "_Tss_set" },
- { 0x061e, "_Unlock_shared_ptr_spin_lock" },
- { 0x061f, "_Wcrtomb" },
- { 0x0620, "_Wcscoll" },
- { 0x0621, "_Wcsxfrm" },
- { 0x0622, "_Xbig" },
- { 0x0623, "_Xp_addh" },
- { 0x0624, "_Xp_addx" },
- { 0x0625, "_Xp_getw" },
- { 0x0626, "_Xp_invx" },
- { 0x0627, "_Xp_ldexpx" },
- { 0x0628, "_Xp_movx" },
- { 0x0629, "_Xp_mulh" },
- { 0x062a, "_Xp_mulx" },
- { 0x062b, "_Xp_setn" },
- { 0x062c, "_Xp_setw" },
- { 0x062d, "_Xp_sqrtx" },
- { 0x062e, "_Xp_subx" },
- { 0x062f, "_Xtime_diff_to_millis" },
- { 0x0630, "_Xtime_diff_to_millis2" },
- { 0x0631, "_Xtime_get_ticks" },
- { 0x0632, "_Zero" },
- { 0x0633, "__Wcrtomb_lk" },
- { 0x0634, "towctrans" },
- { 0x0635, "wctrans" },
- { 0x0636, "wctype" },
- { 0x0637, "xtime_get" },
-};
+const char* msvcp110_dll_lookup(uint32_t i) {
+ switch(i) {
+ case 0x0001: return "??$_Getvals@_W@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z";
+ case 0x0002: return "??$_Getvals@_W@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z";
+ case 0x0003: return "??$_Getvals@_W@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z";
+ case 0x0004: return "??0?$_Yarn@D@std@@QEAA@AEBV01@@Z";
+ case 0x0005: return "??0?$_Yarn@D@std@@QEAA@PEBD@Z";
+ case 0x0006: return "??0?$_Yarn@D@std@@QEAA@XZ";
+ case 0x0007: return "??0?$_Yarn@_W@std@@QEAA@XZ";
+ case 0x0008: return "??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ";
+ case 0x0009: return "??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z";
+ case 0x000a: return "??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ";
+ case 0x000b: return "??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z";
+ case 0x000c: return "??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ";
+ case 0x000d: return "??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z";
+ case 0x000e: return "??0?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x000f: return "??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z";
+ case 0x0010: return "??0?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0011: return "??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z";
+ case 0x0012: return "??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0013: return "??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z";
+ case 0x0014: return "??0?$basic_istream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0015: return "??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z";
+ case 0x0016: return "??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z";
+ case 0x0017: return "??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z";
+ case 0x0018: return "??0?$basic_istream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0019: return "??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z";
+ case 0x001a: return "??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z";
+ case 0x001b: return "??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z";
+ case 0x001c: return "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x001d: return "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z";
+ case 0x001e: return "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z";
+ case 0x001f: return "??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z";
+ case 0x0020: return "??0?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0021: return "??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z";
+ case 0x0022: return "??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z";
+ case 0x0023: return "??0?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0024: return "??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z";
+ case 0x0025: return "??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z";
+ case 0x0026: return "??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z";
+ case 0x0027: return "??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z";
+ case 0x0028: return "??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z";
+ case 0x0029: return "??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@AEBV01@@Z";
+ case 0x002a: return "??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@W4_Uninitialized@1@@Z";
+ case 0x002b: return "??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ";
+ case 0x002c: return "??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@AEBV01@@Z";
+ case 0x002d: return "??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@W4_Uninitialized@1@@Z";
+ case 0x002e: return "??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@XZ";
+ case 0x002f: return "??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@AEBV01@@Z";
+ case 0x0030: return "??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@W4_Uninitialized@1@@Z";
+ case 0x0031: return "??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@XZ";
+ case 0x0032: return "??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x0033: return "??0?$codecvt@DDH@std@@QEAA@_K@Z";
+ case 0x0034: return "??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x0035: return "??0?$codecvt@GDH@std@@QEAA@_K@Z";
+ case 0x0036: return "??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x0037: return "??0?$codecvt@_WDH@std@@QEAA@_K@Z";
+ case 0x0038: return "??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x0039: return "??0?$ctype@D@std@@QEAA@PEBF_N_K@Z";
+ case 0x003a: return "??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x003b: return "??0?$ctype@G@std@@QEAA@_K@Z";
+ case 0x003c: return "??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x003d: return "??0?$ctype@_W@std@@QEAA@_K@Z";
+ case 0x003e: return "??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x003f: return "??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z";
+ case 0x0040: return "??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x0041: return "??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z";
+ case 0x0042: return "??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z";
+ case 0x0043: return "??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z";
+ case 0x0044: return "??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@st
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment