2019-01-05 20:21:43 +08:00
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#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-03-15 04:35:53 +08:00
|
|
|
|
|
|
|
|
|
|
// by ChatGPT
|
|
|
|
|
|
bool IsWindows11() {
|
|
|
|
|
|
typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
|
|
|
|
|
|
RTL_OSVERSIONINFOW rovi = { 0 };
|
|
|
|
|
|
rovi.dwOSVersionInfoSize = sizeof(rovi);
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2019-03-29 10:40:08 +08:00
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
|
|
---------------------
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>IT1995
|
|
|
|
|
|
<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>CSDN
|
|
|
|
|
|
ԭ<EFBFBD>ģ<EFBFBD>https://blog.csdn.net/qq78442761/article/details/64440535
|
|
|
|
|
|
<EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>븽<EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2019.3.29<EFBFBD><EFBFBD>Ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
************************************************************************/
|
|
|
|
|
|
std::string getSystemName()
|
|
|
|
|
|
{
|
|
|
|
|
|
std::string vname("δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ");
|
|
|
|
|
|
//<2F><><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊwin8.1<EFBFBD><EFBFBD>win10
|
|
|
|
|
|
typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
|
|
|
|
|
|
HINSTANCE hinst = LoadLibrary("ntdll.dll");
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (hinst == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
2025-03-15 04:35:53 +08:00
|
|
|
|
if (IsWindows11()) {
|
|
|
|
|
|
vname = "Windows 11";
|
2025-04-28 16:08:16 +08:00
|
|
|
|
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
2025-03-15 04:35:53 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
2019-03-29 10:40:08 +08:00
|
|
|
|
DWORD dwMajor, dwMinor, dwBuildNumber;
|
|
|
|
|
|
NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (proc==NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
2019-03-29 10:40:08 +08:00
|
|
|
|
proc(&dwMajor, &dwMinor, &dwBuildNumber);
|
|
|
|
|
|
if (dwMajor == 6 && dwMinor == 3) //win 8.1
|
|
|
|
|
|
{
|
|
|
|
|
|
vname = "Windows 8.1";
|
2025-04-28 16:08:16 +08:00
|
|
|
|
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
2019-03-29 10:40:08 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (dwMajor == 10 && dwMinor == 0) //win 10
|
|
|
|
|
|
{
|
|
|
|
|
|
vname = "Windows 10";
|
2025-04-28 16:08:16 +08:00
|
|
|
|
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
2019-03-29 10:40:08 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
|
|
|
|
|
//<2F><><EFBFBD>治<EFBFBD><E6B2BB><EFBFBD>ж<EFBFBD>Win Server<65><72><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>˻<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5>Ļ<EFBFBD><C4BB>ӣ<EFBFBD><D3A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
//<2F>ж<EFBFBD>win8.1<EFBFBD><EFBFBD><EFBFBD>µİ汾
|
|
|
|
|
|
SYSTEM_INFO info; //<2F><>SYSTEM_INFO<46>ṹ<EFBFBD>ж<EFBFBD>64λAMD<4D><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
GetSystemInfo(&info); //<2F><><EFBFBD><EFBFBD>GetSystemInfo<66><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
|
|
|
|
|
OSVERSIONINFOEX os;
|
|
|
|
|
|
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|
|
|
|
|
if (GetVersionEx((OSVERSIONINFO *)&os))
|
|
|
|
|
|
{
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ汾<DDB0><E6B1BE>Ϣ<EFBFBD>жϲ<D0B6><CFB2><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
|
|
|
|
|
|
switch (os.dwMajorVersion)
|
|
|
|
|
|
{ //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
switch (os.dwMinorVersion)
|
|
|
|
|
|
{ //<2F>жϴΰ汾<CEB0><E6B1BE>
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
|
|
|
|
vname ="Windows NT 4.0"; //1996<39><36>7<EFBFBD>·<EFBFBD><C2B7><EFBFBD>
|
|
|
|
|
|
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)
|
|
|
|
|
|
{ //<2F>ٱȽ<D9B1>dwMinorVersion<6F><6E>ֵ
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
vname = "Windows 2000"; //1999<39><39>12<31>·<EFBFBD><C2B7><EFBFBD>
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
vname = "Windows XP"; //2001<30><31>8<EFBFBD>·<EFBFBD><C2B7><EFBFBD>
|
|
|
|
|
|
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)
|
|
|
|
|
|
vname = "Windows Server 2003"; //2003<30><33>3<EFBFBD>·<EFBFBD><C2B7><EFBFBD>
|
|
|
|
|
|
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
|
|
|
|
|
|
vname = "Windows Server 2008"; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>汾
|
|
|
|
|
|
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:
|
|
|
|
|
|
vname = "δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ";
|
|
|
|
|
|
}
|
2025-04-28 16:08:16 +08:00
|
|
|
|
Mprintf("<EFBFBD>˵<EFBFBD><EFBFBD>Եİ汾Ϊ:%s\n", vname.c_str());
|
2019-03-29 10:40:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
2025-04-28 16:08:16 +08:00
|
|
|
|
Mprintf("<EFBFBD>汾<EFBFBD><EFBFBD>ȡʧ<EFBFBD><EFBFBD>\n");
|
2019-03-29 10:40:08 +08:00
|
|
|
|
return vname;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2024-12-28 04:34:54 +08:00
|
|
|
|
std::string formatTime(const FILETIME& fileTime) {
|
|
|
|
|
|
// ת<><D7AA>Ϊ 64 λʱ<CEBB><CAB1>
|
|
|
|
|
|
ULARGE_INTEGER ull;
|
|
|
|
|
|
ull.LowPart = fileTime.dwLowDateTime;
|
|
|
|
|
|
ull.HighPart = fileTime.dwHighDateTime;
|
|
|
|
|
|
|
|
|
|
|
|
// ת<><D7AA>Ϊ<EFBFBD>뼶ʱ<EBBCB6><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::time_t startTime = static_cast<std::time_t>((ull.QuadPart / 10000000ULL) - 11644473600ULL);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string getProcessTime() {
|
|
|
|
|
|
FILETIME creationTime, exitTime, kernelTime, userTime;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD>̵<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2025-06-15 16:57:32 +08:00
|
|
|
|
int getOSBits() {
|
|
|
|
|
|
SYSTEM_INFO si;
|
|
|
|
|
|
GetNativeSystemInfo(&si);
|
|
|
|
|
|
|
|
|
|
|
|
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
|
|
|
|
|
|
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64) {
|
|
|
|
|
|
return 64;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
return 32;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// SYSTEM_INFO.dwNumberOfProcessors
|
|
|
|
|
|
int GetCPUCores()
|
|
|
|
|
|
{
|
|
|
|
|
|
INT i = 0;
|
|
|
|
|
|
#ifdef _WIN64
|
|
|
|
|
|
// <20><> x64 <20>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<D2AA><CAB9> `NtQuerySystemInformation`
|
|
|
|
|
|
SYSTEM_INFO sysInfo;
|
|
|
|
|
|
GetSystemInfo(&sysInfo);
|
|
|
|
|
|
i = sysInfo.dwNumberOfProcessors; // <20><>ȡ CPU <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
#else
|
|
|
|
|
|
_asm { // x64<36><34><EFBFBD><EFBFBD>ģʽ<C4A3>²<EFBFBD>֧<EFBFBD><D6A7>__asm<73>Ļ<EFBFBD><C4BB><EFBFBD>Ƕ<EFBFBD><C7B6>
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
Mprintf("<EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d\n", i);
|
|
|
|
|
|
return i;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double GetMemorySizeGB() {
|
|
|
|
|
|
_MEMORYSTATUSEX mst;
|
|
|
|
|
|
mst.dwLength = sizeof(mst);
|
|
|
|
|
|
GlobalMemoryStatusEx(&mst);
|
|
|
|
|
|
double GB = mst.ullTotalPhys / (1024.0 * 1024 * 1024);
|
|
|
|
|
|
Mprintf("<EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>: %fGB\n", GB);
|
|
|
|
|
|
return GB;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-28 16:08:16 +08:00
|
|
|
|
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2024-12-28 04:34:54 +08:00
|
|
|
|
LOGIN_INFOR LoginInfor;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
LoginInfor.bToken = TOKEN_LOGIN; // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>¼
|
|
|
|
|
|
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ϵͳ<CFB5><CDB3>Ϣ
|
2019-03-29 10:40:08 +08:00
|
|
|
|
strcpy_s(LoginInfor.OsVerInfoEx, getSystemName().c_str());
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>PCName
|
|
|
|
|
|
char szPCName[MAX_PATH] = {0};
|
|
|
|
|
|
gethostname(szPCName, MAX_PATH);
|
|
|
|
|
|
|
|
|
|
|
|
DWORD dwCPUMHz;
|
|
|
|
|
|
dwCPUMHz = CPUClockMHz();
|
|
|
|
|
|
|
|
|
|
|
|
BOOL bWebCamIsExist = WebCamIsExist();
|
|
|
|
|
|
|
2025-04-28 16:08:16 +08:00
|
|
|
|
memcpy(LoginInfor.szPCName,szPCName,sizeof(LoginInfor.szPCName));
|
2019-01-05 20:21:43 +08:00
|
|
|
|
LoginInfor.dwSpeed = dwSpeed;
|
|
|
|
|
|
LoginInfor.dwCPUMHz = dwCPUMHz;
|
|
|
|
|
|
LoginInfor.bWebCamIsExist = bWebCamIsExist;
|
2024-12-28 04:34:54 +08:00
|
|
|
|
strcpy_s(LoginInfor.szStartTime, getProcessTime().c_str());
|
2025-06-15 16:57:32 +08:00
|
|
|
|
LoginInfor.AddReserved(GetClientType(conn.ClientType())); // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
LoginInfor.AddReserved(getOSBits()); // ϵͳλ<CDB3><CEBB>
|
|
|
|
|
|
LoginInfor.AddReserved(GetCPUCores()); // CPU<50><55><EFBFBD><EFBFBD>
|
|
|
|
|
|
LoginInfor.AddReserved(GetMemorySizeGB()); // ϵͳ<CFB5>ڴ<EFBFBD>
|
2025-05-03 20:57:22 +08:00
|
|
|
|
char buf[_MAX_PATH] = {};
|
|
|
|
|
|
GetModuleFileNameA(NULL, buf, sizeof(buf));
|
|
|
|
|
|
LoginInfor.AddReserved(buf); // <20>ļ<EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
|
LoginInfor.AddReserved("?"); // test
|
|
|
|
|
|
std::string installTime;
|
|
|
|
|
|
auto b = ReadAppSettingA("install_time", installTime);
|
|
|
|
|
|
if (!b || installTime.empty()) {
|
|
|
|
|
|
installTime = ToPekingTimeAsString(nullptr);;
|
|
|
|
|
|
WriteAppSettingA("install_time", installTime);
|
|
|
|
|
|
}
|
2025-06-15 16:57:32 +08:00
|
|
|
|
LoginInfor.AddReserved(installTime.c_str()); // <20><>װʱ<D7B0><CAB1>
|
|
|
|
|
|
LoginInfor.AddReserved("?"); // <20><>װ<EFBFBD><D7B0>Ϣ
|
|
|
|
|
|
LoginInfor.AddReserved(sizeof(void*)==4 ? 32 : 64); // <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|
|
|
|
|
std::string str;
|
2025-06-19 17:50:11 +08:00
|
|
|
|
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-06-15 16:57:32 +08:00
|
|
|
|
if (hMutex != NULL) {
|
2025-06-28 04:03:06 +08:00
|
|
|
|
#else
|
|
|
|
|
|
{
|
|
|
|
|
|
#endif
|
2025-06-15 16:57:32 +08:00
|
|
|
|
CloseHandle(hMutex);
|
2025-06-19 17:50:11 +08:00
|
|
|
|
config*cfg = conn.pwdHash == masterHash ? new config : new iniFile;
|
|
|
|
|
|
str = cfg->GetStr("settings", "Password", "");
|
|
|
|
|
|
delete cfg;
|
2025-06-15 16:57:32 +08:00
|
|
|
|
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
|
|
|
|
|
|
auto list = StringToVector(str, '-', 3);
|
2025-06-17 04:21:29 +08:00
|
|
|
|
str = list[1].empty() ? "Unknown" : list[1];
|
2025-06-15 16:57:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
LoginInfor.AddReserved(str.c_str()); // <20><>Ȩ<EFBFBD><C8A8>Ϣ
|
2025-04-28 16:08:16 +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));
|
2025-04-07 18:18:36 +08:00
|
|
|
|
return LoginInfor;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DWORD CPUClockMHz()
|
|
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL WebCamIsExist()
|
|
|
|
|
|
{
|
|
|
|
|
|
BOOL bOk = FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
char szDeviceName[100], szVer[50];
|
2019-01-18 17:37:15 +08:00
|
|
|
|
for (int i = 0; i < 10 && !bOk; ++i)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
bOk = capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
|
|
|
|
|
|
//ϵͳ<CFB5><CDB3>API<50><49><EFBFBD><EFBFBD>
|
|
|
|
|
|
szVer, sizeof(szVer));
|
|
|
|
|
|
}
|
|
|
|
|
|
return bOk;
|
|
|
|
|
|
}
|