From 04cdd3338f05ac530d60eb5bdb38604fc789c635 Mon Sep 17 00:00:00 2001 From: kizer Date: Sat, 18 Jun 2022 04:06:38 +0900 Subject: [PATCH] Make more stuff loggable (#885) --- Dalamud.Boot/bootconfig.h | 4 ++++ Dalamud.Boot/dllmain.cpp | 47 +++++++++++++++++++++++++++++---------- Dalamud.Boot/xivfixes.cpp | 4 +--- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/Dalamud.Boot/bootconfig.h b/Dalamud.Boot/bootconfig.h index 661052fe8..574a7f4ef 100644 --- a/Dalamud.Boot/bootconfig.h +++ b/Dalamud.Boot/bootconfig.h @@ -26,6 +26,10 @@ namespace bootconfig { return utils::get_env(L"DALAMUD_SHOW_CONSOLE"); } + inline bool is_disable_fallback_console() { + return utils::get_env(L"DALAMUD_DISABLE_FALLBACK_CONSOLE"); + } + inline bool is_wait_debugger() { return utils::get_env(L"DALAMUD_WAIT_DEBUGGER"); } diff --git a/Dalamud.Boot/dllmain.cpp b/Dalamud.Boot/dllmain.cpp index 3c516039c..62cac4e24 100644 --- a/Dalamud.Boot/dllmain.cpp +++ b/Dalamud.Boot/dllmain.cpp @@ -11,18 +11,38 @@ HINSTANCE g_hGameInstance = GetModuleHandleW(nullptr); DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue) { if (bootconfig::is_show_console()) ConsoleSetup(L"Dalamud Boot"); + + logging::update_dll_load_status(true); - if (const auto logFilePath = utils::get_env("DALAMUD_BOOT_LOGFILE"); logFilePath.empty()) + if (const auto logFilePath = utils::get_env("DALAMUD_BOOT_LOGFILE"); logFilePath.empty()) { + if (!bootconfig::is_show_console() && !bootconfig::is_disable_fallback_console()) + ConsoleSetup(L"Dalamud Boot - Fallback Console"); + logging::I("No log file path given; not logging to file."); - else { + } else { try { logging::start_file_logging(logFilePath, !bootconfig::is_show_console()); logging::I("Logging to file: {}", logFilePath); + } catch (const std::exception& e) { + if (!bootconfig::is_show_console() && !bootconfig::is_disable_fallback_console()) + ConsoleSetup(L"Dalamud Boot - Fallback Console"); + logging::E("Couldn't open log file: {}", logFilePath); logging::E("Error: {} / {}", errno, e.what()); } } + + auto minHookLoaded = false; + if (const auto mhStatus = MH_Initialize(); mhStatus == MH_OK) { + logging::I("MinHook initialized."); + minHookLoaded = true; + } else if (mhStatus == MH_ERROR_ALREADY_INITIALIZED) { + logging::I("MinHook already initialized."); + minHookLoaded = true; + } else { + logging::E("Failed to initialize MinHook (status={}({}))", MH_StatusToString(mhStatus), static_cast(mhStatus)); + } logging::I("Dalamud.Boot Injectable, (c) 2021 XIVLauncher Contributors"); logging::I("Built at: " __DATE__ "@" __TIME__); @@ -30,9 +50,13 @@ DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue) { if (bootconfig::wait_messagebox() & bootconfig::WaitMessageboxFlags::BeforeInitialize) MessageBoxW(nullptr, L"Press OK to continue", L"Dalamud Boot", MB_OK); - logging::I("Applying fixes..."); - xivfixes::apply_all(true); - logging::I("Fixes OK"); + if (minHookLoaded) { + logging::I("Applying fixes..."); + xivfixes::apply_all(true); + logging::I("Fixes OK"); + } else { + logging::W("Skipping fixes, as MinHook has failed to load."); + } if (bootconfig::is_wait_debugger()) { logging::I("Waiting for debugger to attach..."); @@ -104,20 +128,19 @@ BOOL APIENTRY DllMain(const HMODULE hModule, const DWORD dwReason, LPVOID lpRese switch (dwReason) { case DLL_PROCESS_ATTACH: g_hModule = hModule; - if (const auto mhStatus = MH_Initialize(); MH_OK != mhStatus) { - logging::E("Failed to initialize MinHook (status={})", static_cast(mhStatus)); - return FALSE; - } - - logging::update_dll_load_status(true); break; case DLL_PROCESS_DETACH: + // process is terminating; don't bother cleaning up + if (lpReserved) + return TRUE; + logging::update_dll_load_status(false); xivfixes::apply_all(false); - if (const auto mhStatus = MH_Uninitialize(); MH_OK != mhStatus) { + MH_DisableHook(MH_ALL_HOOKS); + if (const auto mhStatus = MH_Uninitialize(); MH_OK != mhStatus && MH_ERROR_NOT_INITIALIZED != mhStatus) { logging::E("Failed to uninitialize MinHook (status={})", static_cast(mhStatus)); __fastfail(logging::MinHookUnload); } diff --git a/Dalamud.Boot/xivfixes.cpp b/Dalamud.Boot/xivfixes.cpp index 690bbe9a3..d96fdb0f0 100644 --- a/Dalamud.Boot/xivfixes.cpp +++ b/Dalamud.Boot/xivfixes.cpp @@ -212,9 +212,7 @@ void xivfixes::prevent_devicechange_crashes(bool bApply) { s_hookWndProc.emplace("FFXIVGAME:WndProc (prevent_devicechange_crashes)", hWnd); s_hookWndProc->set_detour([](HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -> LRESULT { - if (uMsg == WM_CREATE) { - s_hookCreateWindowExA.reset(); - } else if (uMsg == WM_DEVICECHANGE && wParam == DBT_DEVNODES_CHANGED) { + if (uMsg == WM_DEVICECHANGE && wParam == DBT_DEVNODES_CHANGED) { if (!GetGetInputDeviceManager(hWnd)()) { logging::I("{} WndProc(0x{:X}, WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, {}) called but the game does not have InputDeviceManager initialized; doing nothing.", LogTag, reinterpret_cast(hWnd), lParam); return 0;