diff --git a/CMakeLists.txt b/CMakeLists.txt index 63d06d5..3081748 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,3 +71,4 @@ target_link_libraries(jewena_patch utils) target_link_libraries(jewena_patch zip) add_executable(jewena-chs WIN32 main.cpp winres.rc jewena-chs.exe.manifest) +target_link_libraries(jewena-chs utils) diff --git a/main.cpp b/main.cpp index ad6c067..ebcf08c 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,53 @@ #include #include +#include "hash_lib.h" +#include "wchar_util.h" +#include "str_util.h" + +using namespace hash_lib; + +static std::string dir; + +std::wstring FindStartProcess() { + wchar_t path[MAX_PATH]; + if (GetModuleFileNameW(NULL, path, MAX_PATH) == 0) { + return L""; + } + std::string tPath; + if (!wchar_util::wstr_to_str(tPath, path, CP_UTF8)) { + return L""; + } + dir = fileop::dirname(tPath); + dir = str_util::str_replace(dir, "/", "\\"); + std::string name = fileop::join(dir, "*.exe"); + std::wstring wName; + if (!wchar_util::str_to_wstr(wName, name, CP_UTF8)) { + return L""; + } + WIN32_FIND_DATAW data; + auto re = FindFirstFileW(wName.c_str(), &data); + if (re == INVALID_HANDLE_VALUE) { + return L""; + } + do { + std::string tmp; + if (!wchar_util::wstr_to_str(tmp, data.cFileName, CP_UTF8)) { + FindClose(re); + return L""; + } + if (hashHexFile(tmp) == "01bb9a1b072faa2e10e5489c624eb3b65a7304fd1e32f9015779c341102439e3ec229aa9cb4e1c1fe76e42803320a9c68cbf62cfaa8b145ac7f1481eb37185dc") { + FindClose(re); + return data.cFileName; + } + BOOL r = FindNextFileW(re, &data); + if (!r) { + FindClose(re); + if (GetLastError() == ERROR_NO_MORE_FILES) break; + return L""; + } + } while (1); + return L""; +} void ShowErrorMsg(LPCWSTR text) { wchar_t* buf[1024]; @@ -9,7 +57,7 @@ void ShowErrorMsg(LPCWSTR text) { int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 要启动的进程名 - const wchar_t* processName = L"jewena.exe"; + auto processName = FindStartProcess(); // 要注入的 DLL 路径 const wchar_t* dllPath = L"jewena_patch.dll"; @@ -21,8 +69,18 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine si.cb = sizeof(si); + if (processName.empty()) { + MessageBoxW(nullptr, L"无法找到游戏的启动文件。", L"错误", MB_ICONERROR); + return 1; + } + + if (hashHexFile(fileop::join(dir, "system.arc")) != "c69925d1016d1a4b327193bf97c6ac5d1940da0a5c5c28bd693d5655c33a6e0ea7c85e5fa057b98d9dde885f8bca320dee3e46f8b79913dc7a03cebddd1ac771") { + MessageBoxW(nullptr, L"system.arc 校验失败。请检查游戏是否正确。", L"错误", MB_ICONERROR); + return 1; + } + // 创建新进程 - if (!CreateProcessW((LPCWSTR)processName, nullptr, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) { + if (!CreateProcessW(processName.c_str(), nullptr, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) { ShowErrorMsg(L"CreateProcessW failed: "); return 1; } diff --git a/utils b/utils index 252c20d..eeeedae 160000 --- a/utils +++ b/utils @@ -1 +1 @@ -Subproject commit 252c20d0688a84d59227c9934ade5085dd63d291 +Subproject commit eeeedae69730fb108bc5cc0063b963a9ff304b9c