if load_order.txt is present then only load these .dll files in order, otherwise load all valid .dlls

This commit is contained in:
otavepto 2024-06-21 07:48:30 +03:00
parent d30a5bf081
commit bd92ee624b

View File

@ -88,11 +88,11 @@ static std::vector<std::wstring> collect_dlls_to_inject(const std::wstring &extr
auto dll_path = dir_entry.path().wstring(); auto dll_path = dir_entry.path().wstring();
// ignore this file if it is the load order file // ignore this file if it is the load order file
if (common_helpers::to_upper(dll_path) == common_helpers::to_upper(load_order_file.wstring())) continue; if (common_helpers::str_cmp_insensitive(dll_path, load_order_file.wstring())) continue;
auto dll_header = get_pe_header(dll_path); auto dll_header = get_pe_header(dll_path);
if (dll_header.empty()) { if (dll_header.empty()) {
dbg_log::write(L"Failed to get PE header of dll: " + dll_path); dbg_log::write(L"Failed to get PE header of dll: '" + dll_path + L"'");
failed_dlls += dll_path + L"\n"; failed_dlls += dll_path + L"\n";
continue; continue;
} }
@ -100,53 +100,47 @@ static std::vector<std::wstring> collect_dlls_to_inject(const std::wstring &extr
bool is_dll_32 = pe_helpers::is_module_32((HMODULE)&dll_header[0]); bool is_dll_32 = pe_helpers::is_module_32((HMODULE)&dll_header[0]);
bool is_dll_64 = pe_helpers::is_module_64((HMODULE)&dll_header[0]); bool is_dll_64 = pe_helpers::is_module_64((HMODULE)&dll_header[0]);
if ((!is_dll_32 && !is_dll_64) || (is_dll_32 && is_dll_64)) { // ARM, or just a regular file if ((!is_dll_32 && !is_dll_64) || (is_dll_32 && is_dll_64)) { // ARM, or just a regular file
dbg_log::write(L"Dll " + dll_path + L" is neither 32 nor 64 bit and will be ignored"); dbg_log::write(L"Dll '" + dll_path + L"' is neither 32 nor 64 bit and will be ignored");
failed_dlls += dll_path + L"\n"; failed_dlls += dll_path + L"\n";
continue; continue;
} }
if (is_dll_32 == is_exe_32) { // same arch if (is_dll_32 == is_exe_32) { // same arch
dlls_to_inject.push_back(dll_path); dlls_to_inject.push_back(dll_path);
dbg_log::write(L"Dll " + dll_path + L" will be injected"); dbg_log::write(L"Dll '" + dll_path + L"' is valid");
} else { } else {
dbg_log::write(L"Dll " + dll_path + L" has a different arch than the exe and will be ignored"); dbg_log::write(L"Dll '" + dll_path + L"' has a different arch than the exe and will be ignored");
failed_dlls += dll_path + L"\n"; failed_dlls += dll_path + L"\n";
} }
} }
bool only_specified = false;
std::vector<std::wstring> ordered_dlls_to_inject{}; std::vector<std::wstring> ordered_dlls_to_inject{};
{ {
dbg_log::write(L"Searching for load order file: " + load_order_file.wstring()); dbg_log::write(L"Searching for load order file: '" + load_order_file.wstring() + L"'");
auto f_order = std::wifstream(load_order_file, std::ios::in); auto f_order = std::wifstream(load_order_file, std::ios::in);
if (f_order.is_open()) { if (f_order.is_open()) {
dbg_log::write(L"Reading load order file: " + load_order_file.wstring()); only_specified = true;
dbg_log::write(L"Reading load order file...");
std::wstring line{}; std::wstring line{};
while (std::getline(f_order, line)) { while (std::getline(f_order, line)) {
auto abs = common_helpers::to_absolute(line, extra_dlls_folder); auto abs = common_helpers::to_absolute(line, extra_dlls_folder);
auto abs_upper = common_helpers::to_upper(abs); dbg_log::write(L"Load order line: '" + abs + L"'");
dbg_log::write(L"Load order line: " + abs_upper); auto it = std::find_if(dlls_to_inject.begin(), dlls_to_inject.end(), [&abs](const std::wstring &dll_to_inject) {
auto it = std::find_if(dlls_to_inject.begin(), dlls_to_inject.end(), [&abs_upper](const std::wstring &dll_to_inject) { return common_helpers::str_cmp_insensitive(dll_to_inject, abs);
return common_helpers::to_upper(dll_to_inject) == abs_upper;
}); });
if (it != dlls_to_inject.end()) { if (it != dlls_to_inject.end()) {
dbg_log::write("Found the dll specified by the load order line"); dbg_log::write("Found the dll specified by the load order line");
ordered_dlls_to_inject.push_back(*it); ordered_dlls_to_inject.push_back(*it);
// mark for deletion
it->clear();
} }
} }
f_order.close(); f_order.close();
} }
} }
// add the remaining dlls if (only_specified) return ordered_dlls_to_inject;
for (auto &dll : dlls_to_inject) {
if (dll.size()) {
ordered_dlls_to_inject.push_back(dll);
}
}
return ordered_dlls_to_inject; return dlls_to_inject;
} }
static void to_bool_ini_val(std::wstring &val) static void to_bool_ini_val(std::wstring &val)