96 lines
3.1 KiB
C
96 lines
3.1 KiB
C
#include "common.h"
|
|
#include "devices/_devices.h"
|
|
#include "drivers/mx.h"
|
|
#include "hooks/_hooks.h"
|
|
|
|
WCHAR exePath[MAX_PATH + 1];
|
|
|
|
void enable_traces() {
|
|
patches_t patches;
|
|
char error[256];
|
|
if (!load_patches(&patches, "patches.json", error)) {
|
|
log_error(BOOT_LOGGER, "Failed to load patches file: %s", error);
|
|
} else {
|
|
char exePathC[MAX_PATH + 1];
|
|
WideCharToMultiByte(CP_ACP, 0, exePath, -1, exePathC, sizeof exePathC, NULL, NULL);
|
|
|
|
for (size_t i = 0; i < patches.nopatchsets; i++) {
|
|
patchset_t* patchset = patches.patchsets[i];
|
|
|
|
// Require the binary explicitly named
|
|
if (patchset->binary_name == NULL || strcmp(patchset->binary_name, exePathC) != 0) {
|
|
continue;
|
|
}
|
|
if (!patchset->apply) continue;
|
|
|
|
for (size_t j = 0; j < patchset->nopatches; j++) {
|
|
patch_t patch = patchset->patches[j];
|
|
|
|
if (memcmp(patch.from, (void*)patch.offset, patch.count) != 0) {
|
|
log_error(BOOT_LOGGER, "Patch %s[%d] failed! from-value missmatch", patchset->name, j);
|
|
continue;
|
|
}
|
|
|
|
memcpy((void*)patch.offset, patch.to, patch.count);
|
|
log_misc(BOOT_LOGGER, "Patched %d bytes at %08x", patch.count, patch.offset);
|
|
}
|
|
}
|
|
}
|
|
free_patches(&patches);
|
|
}
|
|
|
|
|
|
|
|
void prebind_hooks() {
|
|
hook_all();
|
|
install_devices();
|
|
// TODO: Figure out why we're needing to call this manually (medium priority)
|
|
if (wcscmp(exePath, L"ALLNetProc.exe") == 0) {
|
|
log_warning(BOOT_LOGGER, "Making explicit call to OPENSSL_add_all_algorithms_noconf");
|
|
|
|
// OPENSSL_add_all_algorithms_noconf
|
|
((void (*)(void))(0x00459770))();
|
|
}
|
|
}
|
|
|
|
void init_injection() {
|
|
// We're in a new context now, so need to reconfigure
|
|
setup_logging();
|
|
log_info(BOOT_LOGGER, "Handover complete. Now executing within %ls", exePath);
|
|
|
|
enable_traces();
|
|
|
|
// Columba: Driver-level memory access, used to read the DMI tables
|
|
setup_columba();
|
|
// MX SRAM: SRAM-based nv memory
|
|
setup_mxsram();
|
|
// MX SuperIO: Communicate with the HW monitor chip
|
|
setup_mxsuperio();
|
|
// MX JVS: Interacting with JVS-based devices
|
|
setup_mxjvs();
|
|
// MX HW Reset: Forcibly reboot the machine
|
|
setup_mxhwreset();
|
|
// MX SMBus: Communicate over the LPC bus. This contains the EEPROM, and PCA9535
|
|
setup_mxsmbus();
|
|
|
|
if (!add_fake_device(&PLATFORM_GUID, L"\\\\.\\platform")) {
|
|
log_error("platform", "failed to install platform device");
|
|
}
|
|
|
|
// Must be the last thing called!
|
|
// register_devices();
|
|
prebind_hooks();
|
|
setup_hooks();
|
|
}
|
|
|
|
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
|
|
if (ul_reason_for_call != DLL_PROCESS_ATTACH) return TRUE;
|
|
|
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
|
wcscpy_s(exePath, MAX_PATH + 1, PathFindFileNameW(exePath));
|
|
|
|
init_injection();
|
|
|
|
return TRUE;
|
|
}
|