Files
spice2x.github.io/src/spice2x/util/libutils.h
T
bicarus-dev bf9074a76e launcher: complain when duplicate DLLs are detected (#306)
## Link to GitHub Issue, if one exists
#304 

## Description of change
Complain loudly about DLL conflicts. Show warnings for each DLL that
exists in both modules directory and the root.

This is not based on LoadLibrary hooks, just enumerating DLLs via
filesystem access.

Deliberately not using `log_fatal` since these are not necessarily going
to crash the game. Some people just love to have messy installs and if
the game booted fine before, it should continue to boot.

## Testing
Tested with/without `-modules`, with/without duplicate DLLs.
2025-04-24 10:35:34 -07:00

80 lines
2.8 KiB
C++

#pragma once
#include <filesystem>
#include <initializer_list>
#include <string>
#include <windows.h>
namespace libutils {
// loaded module handle helpers
std::filesystem::path module_file_name(HMODULE module);
// load library helpers
HMODULE load_library(const char *module_name, bool fatal = true);
HMODULE load_library(const std::filesystem::path &path, bool fatal = true);
HMODULE try_library(const char *module_name);
HMODULE try_library(const std::filesystem::path &path);
inline HMODULE load_library(const std::string &module_name) {
return load_library(module_name.c_str());
}
inline HMODULE try_library(const std::string &module_name) {
return try_library(module_name.c_str());
}
void check_duplicate_dlls();
// get module handle helpers
HMODULE get_module(const char *module_name);
HMODULE try_module(const char *module_name);
HMODULE try_module(const std::filesystem::path &module_path);
inline HMODULE get_module(const std::string &module_name) {
return get_module(module_name.c_str());
}
inline HMODULE try_module(const std::string &module_name) {
return try_module(module_name.c_str());
}
// get proc address helpers
FARPROC get_proc(const char *proc_name);
FARPROC get_proc(HMODULE module, const char *proc_name);
FARPROC get_proc_list(HMODULE module, std::initializer_list<const char *> list);
FARPROC try_proc(const char *proc_name);
FARPROC try_proc(HMODULE module, const char *proc_name);
FARPROC try_proc_list(HMODULE module, std::initializer_list<const char *> list);
template<typename T>
inline T get_proc(const char *proc_name) {
return reinterpret_cast<T>(get_proc(proc_name));
}
template<typename T>
inline T get_proc(HMODULE module, const char *proc_name) {
return reinterpret_cast<T>(get_proc(module, proc_name));
}
template<typename T>
inline T get_proc_list(HMODULE module, std::initializer_list<const char *> list) {
return reinterpret_cast<T>(get_proc_list(module, list));
}
template<typename T>
inline T try_proc(const char *proc_name) {
return reinterpret_cast<T>(try_proc(proc_name));
}
template<typename T>
inline T try_proc(HMODULE module, const char *proc_name) {
return reinterpret_cast<T>(try_proc(module, proc_name));
}
template<typename T>
inline T try_proc_list(HMODULE module, std::initializer_list<const char *> list) {
return reinterpret_cast<T>(try_proc_list(module, list));
}
// offset helpers
intptr_t rva2offset(IMAGE_NT_HEADERS *nt_headers, intptr_t rva);
intptr_t rva2offset(const std::filesystem::path &path, intptr_t rva);
intptr_t offset2rva(IMAGE_NT_HEADERS *nt_headers, intptr_t offset);
intptr_t offset2rva(const std::filesystem::path &path, intptr_t offset);
}