diff --git a/src/main.cpp b/src/main.cpp index 344864c..7b7f4f8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,134 +2,124 @@ #include "../include/rapidjson/document.h" +#include #include #include -Server *server = nullptr; - void init() { +#if defined(_WIN_PLATFORM_) + std::string version = "9.9.12-25300"; try { -#if defined(_WIN_PLATFORM_) - std::string version = "9.9.12-25300"; - try + TCHAR pathm[MAX_PATH]; + GetModuleFileName(NULL, pathm, MAX_PATH); + std::filesystem::path path = pathm; + path = path.parent_path().append("resources\\app\\versions\\config.json"); + std::ifstream versionConfig(path.wstring()); + if (versionConfig.is_open()) { - std::ifstream versionConfig("resources\\app\\versions\\config.json"); - if (versionConfig.is_open()) - { - std::string versionConfigStr; - versionConfig >> versionConfigStr; - versionConfig.close(); - rapidjson::Document doc; - doc.Parse(versionConfigStr.c_str(), versionConfigStr.size()); - if (doc.HasMember("curVersion") && doc["curVersion"].IsString()) - version = doc["curVersion"].GetString(); - } + std::stringstream versionConfigStream; + versionConfigStream << versionConfig.rdbuf(); + versionConfig.close(); + rapidjson::Document doc; + doc.Parse(versionConfigStream.str().c_str(), versionConfigStream.str().size()); + if (doc.HasMember("curVersion") && doc["curVersion"].IsString()) + version = doc["curVersion"].GetString(); } - catch (const std::exception &e) - { - std::cerr << e.what() << '\n'; - } -#elif defined(_MAC_PLATFORM_) - std::string version = "6.9.19-16183"; -#elif defined(_LINUX_PLATFORM_) - std::string version = "3.2.9-24815"; - try - { - std::ifstream versionConfig("/opt/QQ/resources/app/package.json"); - if (versionConfig.is_open()) - { - std::string versionConfigStr; - versionConfig >> versionConfigStr; - versionConfig.close(); - rapidjson::Document doc; - doc.Parse(versionConfigStr.c_str(), versionConfigStr.size()); - if (doc.HasMember("version") && doc["version"].IsString()) - version = doc["version"].GetString(); - } - } - catch (const std::exception &e) - { - std::cerr << e.what() << '\n'; - } -#endif - std::string ip = "0.0.0.0"; - int port = 8080; - - std::string default_config = R"({"ip":"0.0.0.0","port":8080})"; - - rapidjson::Document doc; - - std::ifstream configFile("sign.json"); - if (!configFile.is_open()) - { - printf("sign.json not found, use default\n"); - std::ofstream("sign.json") << default_config; - doc.Parse(default_config.c_str(), default_config.size()); - } - else - { - std::string config; - configFile >> config; - configFile.close(); - try - { - doc.Parse(config.c_str(), config.size()); - } - catch (const std::exception &e) - { - printf("Parse config failed, use default: %s\n", e.what()); - doc.Parse(default_config.c_str(), default_config.size()); - } - } - - if (doc.HasMember("ip") && doc["ip"].IsString()) - ip = doc["ip"].GetString(); - if (doc.HasMember("port") && doc["port"].IsInt()) - port = doc["port"].GetInt(); - if (doc.HasMember("version") && doc["version"].IsString()) - version = doc["version"].GetString(); - - printf("Start Init server\n"); - server = new Server(); - server->Init(); - - printf("Start Init sign\n"); - std::thread([=] { // Cannot use '&' capture!!!!! will cause crash - for (int i = 0; i < 10; i++) - { - try - { - if (Sign::Init(version)) - { - if (!server->Run(ip, port)) - printf("Server run failed\n"); - break; - } - } - catch (const std::exception &e) - { - printf("Init failed: %s\n", e.what()); - } - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - }) - .detach(); } catch (const std::exception &e) { - printf("Init failed: %s\n", e.what()); + std::cerr << e.what() << '\n'; } +#elif defined(_MAC_PLATFORM_) + std::string version = "6.9.19-16183"; +#elif defined(_LINUX_PLATFORM_) + std::string version = "3.2.9-24815"; + try + { + std::ifstream versionConfig("/opt/QQ/resources/app/package.json"); + if (versionConfig.is_open()) + { + std::stringstream versionConfigStrBuf; + versionConfigStrBuf << versionConfig.rdbuf(); + versionConfig.close(); + rapidjson::Document doc; + doc.Parse(versionConfigStrBuf.str().c_str(), versionConfigStrBuf.str().c_str()); + if (doc.HasMember("version") && doc["version"].IsString()) + version = doc["version"].GetString(); + } + } + catch (const std::exception &e) + { + std::cerr << e.what() << '\n'; + } +#endif + std::string ip = "0.0.0.0"; + int port = 8080; + + std::string default_config = R"({"ip":"0.0.0.0","port":8080})"; + + rapidjson::Document doc; + + std::ifstream configFile("sign.json"); + if (!configFile.is_open()) + { + printf("sign.json not found, use default\n"); + std::ofstream("sign.json") << default_config; + doc.Parse(default_config.c_str(), default_config.size()); + } + else + { + std::stringstream configStream; + configStream << configFile.rdbuf(); + configFile.close(); + try + { + doc.Parse(configStream.str().c_str(), configStream.str().size()); + } + catch (const std::exception &e) + { + printf("Parse config failed, use default: %s\n", e.what()); + doc.Parse(default_config.c_str(), default_config.size()); + } + } + + if (doc.HasMember("ip") && doc["ip"].IsString()) + ip = doc["ip"].GetString(); + if (doc.HasMember("port") && doc["port"].IsInt()) + port = doc["port"].GetInt(); + if (doc.HasMember("version") && doc["version"].IsString()) + version = doc["version"].GetString(); + + std::thread sign_init([version, ip, port] + { + printf("Start Init sign\n"); + for (int i = 0; i < 10; i++) + { + try + { + if (Sign::Init(version)) + { + printf("Start Init server\n"); + Server server; + server.Init(); + if (!server.Run(ip, port)) + printf("Server run failed\n"); + return; + } + } + catch (const std::exception &e) + { + printf("Init failed: %s\n", e.what()); + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + } }); + sign_init.detach(); } void uninit() { - if (server != nullptr) - { - delete server; - server = nullptr; - } } #if defined(_WIN_PLATFORM_) @@ -156,7 +146,7 @@ void __attribute__((constructor)) my_init(void) init(); } -void __attribute__ ((destructor)) my_fini(void) +void __attribute__((destructor)) my_fini(void) { uninit(); } diff --git a/src/run_as_node.cpp b/src/run_as_node.cpp index a38ad22..c409e26 100644 --- a/src/run_as_node.cpp +++ b/src/run_as_node.cpp @@ -21,7 +21,6 @@ std::shared_ptr (*nodeInitializeOncePerProcess)( int __stdcall fakeWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { - MessageBoxA(NULL, "Init", "fakeWinMain", MB_OK); checkRunAsNode(nullptr); return oriWinMain(hInstance, hPrevInstance, lpCmdLine, nShowCmd); } @@ -43,11 +42,7 @@ bool RunAsNode::RunNode() [](auto &a) { return std::wstring_convert>().to_bytes(a); }); - MessageBoxA(NULL, "pre nodeInitializeOncePerProcess", "fakeWinMain", MB_OK); - std::for_each(argv.begin(), argv.end(), [](const std::string &arg) - { MessageBoxA(NULL, arg.c_str(), "fakeWinMain", MB_OK); }); nodeInitializeOncePerProcess(argv, (1 << 6) | (1 << 7)); - MessageBoxA(NULL, "post nodeInitializeOncePerProcess", "fakeWinMain", MB_OK); return true; } diff --git a/src/server.cpp b/src/server.cpp index ae5da20..7baa119 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2,8 +2,6 @@ #include "../include/rapidjson/document.h" #include "../include/rapidjson/writer.h" -#include - std::string Server::GetSign(const std::string_view &cmd, const std::string_view &src, const int seq) { auto [signDataHex, extraDataHex, tokenDataHex] = Sign::Call(cmd, src, seq); diff --git a/src/server.h b/src/server.h index add6b0f..8488da8 100644 --- a/src/server.h +++ b/src/server.h @@ -1,4 +1,5 @@ #pragma once +#define _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR #include "sign.h" #include "../include/cpp-httplib/httplib.h" diff --git a/start.bat b/start.bat index b687b5f..8581de9 100644 --- a/start.bat +++ b/start.bat @@ -5,6 +5,9 @@ for /f "tokens=2*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\M set "RetString=%%b" goto :boot ) +echo QQ installation not found +pause +exit :boot for %%a in ("!RetString!") do ( @@ -36,7 +39,8 @@ if errorlevel 1 ( goto launch :restart - powershell Start-Process -FilePath cmd.exe -ArgumentList """/c pushd %~dp0 && %~s0 %*""" -Verb RunAs +powershell Start-Process -FilePath cmd.exe -ArgumentList """/c pushd %~dp0 && %~s0 %*""" -Verb RunAs +exit :launch set "QQPath=!pathWithoutUninstall!QQ.exe"