35 lines
912 B
C++
35 lines
912 B
C++
#include <std_include.hpp>
|
|
#include "tls.hpp"
|
|
|
|
#include <utils/nt.hpp>
|
|
#include <utils/binary_resource.hpp>
|
|
|
|
#include <resource.hpp>
|
|
|
|
namespace tls {
|
|
namespace {
|
|
utils::binary_resource tls_dll_file(TLS_DLL, "iw4sp-tlsdll.dll");
|
|
}
|
|
|
|
PIMAGE_TLS_DIRECTORY allocate_tls_index() {
|
|
static auto already_allocated = false;
|
|
if (already_allocated) {
|
|
throw std::runtime_error(
|
|
"Currently only a single allocation is supported!");
|
|
}
|
|
|
|
already_allocated = true;
|
|
|
|
const auto dll_path = tls_dll_file.get_extracted_file();
|
|
const auto tls_dll = utils::nt::library::load(dll_path);
|
|
if (!tls_dll) {
|
|
throw std::runtime_error("Failed to load TLS DLL");
|
|
}
|
|
|
|
return reinterpret_cast<PIMAGE_TLS_DIRECTORY>(
|
|
tls_dll.get_ptr() + tls_dll.get_optional_header()
|
|
->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS]
|
|
.VirtualAddress);
|
|
}
|
|
} // namespace tls
|