fix bug(fxxk microsoft)

This commit is contained in:
simplxs 2024-07-02 19:28:03 +08:00
parent d120834ac1
commit 52d2fa4851
No known key found for this signature in database
GPG Key ID: 1A3833A46D84A08C
5 changed files with 108 additions and 120 deletions

View File

@ -2,134 +2,124 @@
#include "../include/rapidjson/document.h"
#include <filesystem>
#include <fstream>
#include <iostream>
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();
}

View File

@ -21,7 +21,6 @@ std::shared_ptr<void> (*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<std::codecvt_utf8<wchar_t>>().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;
}

View File

@ -2,8 +2,6 @@
#include "../include/rapidjson/document.h"
#include "../include/rapidjson/writer.h"
#include <thread>
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);

View File

@ -1,4 +1,5 @@
#pragma once
#define _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR
#include "sign.h"
#include "../include/cpp-httplib/httplib.h"

View File

@ -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"