Improve: Exit authorization client after succeed authorizing

This commit is contained in:
shaun
2025-12-23 15:16:01 +01:00
parent c24cc29093
commit 94ff731223
15 changed files with 164 additions and 35 deletions

View File

@@ -513,10 +513,12 @@ DWORD WINAPI StartClient(LPVOID lParam)
continue; continue;
} }
SAFE_DELETE(Manager); SAFE_DELETE(Manager);
Manager = new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit);
//准备第一波数据 //准备第一波数据
LOGIN_INFOR login = GetLoginInfo(GetTickCount64() - dwTickCount, settings); BOOL auth = FALSE;
LOGIN_INFOR login = GetLoginInfo(GetTickCount64() - dwTickCount, settings, auth);
Manager = auth ? new AuthKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit) :
new CKernelManager(&settings, ClientObject, app.g_hInstance, kb, bExit);
while (ClientObject->IsRunning() && ClientObject->IsConnected() && !ClientObject->SendLoginInfo(login)) while (ClientObject->IsRunning() && ClientObject->IsConnected() && !ClientObject->SendLoginInfo(login))
WAIT_n(app.m_bIsRunning(&app), 5 + time(0)%10, 200); WAIT_n(app.m_bIsRunning(&app), 5 + time(0)%10, 200);
WAIT_n(app.m_bIsRunning(&app)&& ClientObject->IsRunning() && ClientObject->IsConnected(), 10, 200); WAIT_n(app.m_bIsRunning(&app)&& ClientObject->IsRunning() && ClientObject->IsConnected(), 10, 200);

View File

@@ -806,11 +806,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
break; break;
case CMD_HEARTBEAT_ACK: case CMD_HEARTBEAT_ACK:
if (ulLength > 8) { OnHeatbeatResponse(szBuffer, ulLength);
uint64_t n = 0;
memcpy(&n, szBuffer + 1, sizeof(uint64_t));
m_nNetPing.update_from_sample(GetUnixMs() - n);
}
break; break;
case CMD_MASTERSETTING: case CMD_MASTERSETTING:
if (ulLength > MasterSettingsOldSize) { if (ulLength > MasterSettingsOldSize) {
@@ -963,3 +959,67 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
} }
} }
} }
void CKernelManager::OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength) {
if (ulLength > 8) {
uint64_t n = 0;
memcpy(&n, szBuffer + 1, sizeof(uint64_t));
m_nNetPing.update_from_sample(GetUnixMs() - n);
}
}
int AuthKernelManager::SendHeartbeat()
{
for (int i = 0; i < m_settings.ReportInterval && !g_bExit && m_ClientObject->IsConnected(); ++i)
Sleep(1000);
if (!m_bFirstHeartbeat && m_settings.ReportInterval <= 0) { // 关闭上报信息(含心跳)
for (int i = rand() % 120; i && !g_bExit && m_ClientObject->IsConnected() && m_settings.ReportInterval <= 0; --i)
Sleep(1000);
return 0;
}
if (g_bExit || !m_ClientObject->IsConnected())
return -1;
if (m_bFirstHeartbeat) {
m_bFirstHeartbeat = false;
}
ActivityWindow checker;
auto s = checker.Check();
Heartbeat a(s, m_nNetPing.srtt);
a.HasSoftware = SoftwareCheck(m_settings.DetectSoftware);
iniFile THIS_CFG;
auto SN = THIS_CFG.GetStr("settings", "SN", "");
auto passCode = THIS_CFG.GetStr("settings", "Password", "");
auto pwdHmac = THIS_CFG.GetStr("settings", "PwdHmac", "");
uint64_t value = std::strtoull(pwdHmac.c_str(), nullptr, 10);
strcpy_s(a.SN, SN.c_str());
strcpy_s(a.Passcode, passCode.c_str());
memcpy(&a.PwdHmac, &value, 8);
BYTE buf[sizeof(Heartbeat) + 1];
buf[0] = TOKEN_HEARTBEAT;
memcpy(buf + 1, &a, sizeof(Heartbeat));
m_ClientObject->Send2Server((char*)buf, sizeof(buf));
return 0;
}
void AuthKernelManager::OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength) {
if (ulLength > sizeof(HeartbeatACK)) {
HeartbeatACK n = { 0 };
memcpy(&n, szBuffer + 1, sizeof(HeartbeatACK));
m_nNetPing.update_from_sample(GetUnixMs() - n.Time);
if (n.Authorized == TRUE) {
Mprintf("======> Client authorized successfully.\n");
// Once the client is authorized, authentication is no longer needed
// So we can set exit flag to terminate the AuthKernelManager
g_bExit = S_CLIENT_EXIT;
}
}
else if (ulLength > 8) {
uint64_t n = 0;
memcpy(&n, szBuffer + 1, sizeof(uint64_t));
m_nNetPing.update_from_sample(GetUnixMs() - n);
}
}

View File

@@ -132,6 +132,7 @@ public:
CKernelManager(CONNECT_ADDRESS* conn, IOCPClient* ClientObject, HINSTANCE hInstance, ThreadInfo* kb, State& s); CKernelManager(CONNECT_ADDRESS* conn, IOCPClient* ClientObject, HINSTANCE hInstance, ThreadInfo* kb, State& s);
virtual ~CKernelManager(); virtual ~CKernelManager();
VOID OnReceive(PBYTE szBuffer, ULONG ulLength); VOID OnReceive(PBYTE szBuffer, ULONG ulLength);
virtual VOID OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength);
ThreadInfo* m_hKeyboard; ThreadInfo* m_hKeyboard;
ThreadInfo m_hThread[MAX_THREADNUM]; ThreadInfo m_hThread[MAX_THREADNUM];
// <20><>ֵ<EFBFBD><D6B5>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>¼<EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱm_hThread<61><64>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD> // <20><>ֵ<EFBFBD><D6B5>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>¼<EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱm_hThread<61><64>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><C2B3><EFBFBD><EFBFBD>
@@ -143,7 +144,7 @@ public:
MasterSettings m_settings; MasterSettings m_settings;
RttEstimator m_nNetPing; // <20><><EFBFBD><EFBFBD>״<EFBFBD><D7B4> RttEstimator m_nNetPing; // <20><><EFBFBD><EFBFBD>״<EFBFBD><D7B4>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int SendHeartbeat() virtual int SendHeartbeat()
{ {
for (int i = 0; i < m_settings.ReportInterval && !g_bExit && m_ClientObject->IsConnected(); ++i) for (int i = 0; i < m_settings.ReportInterval && !g_bExit && m_ClientObject->IsConnected(); ++i)
Sleep(1000); Sleep(1000);
@@ -209,4 +210,25 @@ public:
} }
}; };
// [IMPORTANT]
// <20><>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ȩ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̽<DFB3><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֺ<EFBFBD><D6BA><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD>.
// ע<><D7A2>: <20><>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ں˹<DABA><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ.
// <20>κ<EFBFBD><CEBA><EFBFBD>ͼͨ<CDBC><CDA8><EFBFBD>޸Ĵ<DEB8><C4B4><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD>˳<EFBFBD>.
class AuthKernelManager : public CKernelManager
{
public:
bool m_bFirstHeartbeat = true;
AuthKernelManager(CONNECT_ADDRESS* conn, IOCPClient* ClientObject, HINSTANCE hInstance, ThreadInfo* kb, State& s)
: CKernelManager(conn, ClientObject, hInstance, kb, s)
{
}
virtual ~AuthKernelManager() {}
virtual int SendHeartbeat()override;
virtual VOID OnHeatbeatResponse(PBYTE szBuffer, ULONG ulLength)override;
};
#endif // !defined(AFX_KERNELMANAGER_H__B1186DC0_E4D7_4D1A_A8B8_08A01B87B89E__INCLUDED_) #endif // !defined(AFX_KERNELMANAGER_H__B1186DC0_E4D7_4D1A_A8B8_08A01B87B89E__INCLUDED_)

View File

@@ -287,8 +287,9 @@ uint64_t CalcalateID(const std::vector<std::string>& clientInfo)
return XXH64(s.c_str(), s.length(), 0); return XXH64(s.c_str(), s.length(), 0);
} }
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn) LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, BOOL& isAuthKernel)
{ {
isAuthKernel = FALSE;
iniFile cfg(CLIENT_PATH); iniFile cfg(CLIENT_PATH);
LOGIN_INFOR LoginInfor; LOGIN_INFOR LoginInfor;
LoginInfor.bToken = TOKEN_LOGIN; // 令牌为登录 LoginInfor.bToken = TOKEN_LOGIN; // 令牌为登录
@@ -332,14 +333,15 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn)
LoginInfor.AddReserved(sizeof(void*)==4 ? 32 : 64); // 程序位数 LoginInfor.AddReserved(sizeof(void*)==4 ? 32 : 64); // 程序位数
std::string str; std::string str;
std::string masterHash(skCrypt(MASTER_HASH)); std::string masterHash(skCrypt(MASTER_HASH));
HANDLE hMutex = OpenMutex(SYNCHRONIZE, FALSE, "MASTER.EXE"); std::string pid = std::to_string(GetCurrentProcessId());
hMutex = hMutex ? hMutex : OpenMutex(SYNCHRONIZE, FALSE, "YAMA.EXE"); HANDLE hEvent1 = OpenEventA(SYNCHRONIZE, FALSE, std::string("YAMA_" + pid).c_str());
#ifndef _DEBUG HANDLE hEvent2 = OpenEventA(SYNCHRONIZE, FALSE, std::string("EVENT_" + pid).c_str());
if (hMutex != NULL) { if (hEvent1 != NULL || hEvent2 != NULL)
#else
{ {
#endif Mprintf("Check event handle: %d, %d\n", hEvent1 != NULL, hEvent2 != NULL);
CloseHandle(hMutex); isAuthKernel = TRUE;
CloseHandle(hEvent1);
CloseHandle(hEvent2);
config*cfg = conn.pwdHash == masterHash ? new config : new iniFile; config*cfg = conn.pwdHash == masterHash ? new config : new iniFile;
str = cfg->GetStr("settings", "Password", ""); str = cfg->GetStr("settings", "Password", "");
delete cfg; delete cfg;

View File

@@ -5,6 +5,6 @@
#pragma comment(lib,"Vfw32.lib") #pragma comment(lib,"Vfw32.lib")
LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS &conn); LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS &conn, BOOL &isAuthKernel);
DWORD CPUClockMHz(); DWORD CPUClockMHz();
BOOL WebCamIsExist(); BOOL WebCamIsExist();

View File

@@ -859,7 +859,10 @@ typedef struct Heartbeat {
char ActiveWnd[512]; char ActiveWnd[512];
int Ping; int Ping;
int HasSoftware; int HasSoftware;
char Reserved[496]; char SN[20];
char Passcode[44];
uint64_t PwdHmac;
char Reserved[424];
Heartbeat() Heartbeat()
{ {
@@ -880,7 +883,8 @@ typedef struct Heartbeat {
typedef struct HeartbeatACK { typedef struct HeartbeatACK {
uint64_t Time; uint64_t Time;
char Reserved[24]; char Authorized;
char Reserved[23];
} HeartbeatACK; } HeartbeatACK;
// <20>̶<EFBFBD>500<30>ֽ<EFBFBD> // <20>̶<EFBFBD>500<30>ֽ<EFBFBD>

View File

@@ -311,6 +311,18 @@ BOOL CMy2015RemoteApp::InitInstance()
// 例如修改为公司或组织名 // 例如修改为公司或组织名
SetRegistryKey(_T("YAMA")); SetRegistryKey(_T("YAMA"));
// 注册一个事件,用于进程间通信
// 请勿修改此事件名称,否则可能导致无法启动程序、鉴权失败等问题
char eventName[64] = { 0 };
sprintf(eventName, "YAMA_%d", GetCurrentProcessId());
HANDLE hEvent = CreateEventA(NULL, TRUE, FALSE, eventName);
if (hEvent == NULL) {
Mprintf("[InitInstance] 创建事件失败,错误码: %d\n", GetLastError());
}
else {
Mprintf("[InitInstance] 创建事件成功,事件名: %s\n", eventName);
}
CMy2015RemoteDlg dlg(nullptr); CMy2015RemoteDlg dlg(nullptr);
m_pMainWnd = &dlg; m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal(); INT_PTR nResponse = dlg.DoModal();
@@ -327,6 +339,11 @@ BOOL CMy2015RemoteApp::InitInstance()
delete pShellManager; delete pShellManager;
} }
if (hEvent) {
CloseHandle(hEvent);
Mprintf("[InitInstance] 关闭事件句柄。\n");
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。 // 而不是启动应用程序的消息泵。
return FALSE; return FALSE;

Binary file not shown.

View File

@@ -2326,6 +2326,16 @@ void FinishSend(void* user)
std::thread(delay_cancel, ctx, 15).detach(); std::thread(delay_cancel, ctx, 15).detach();
} }
BOOL CMy2015RemoteDlg::AuthorizeClient(const std::string& sn, const std::string& passcode, uint64_t hmac)
{
if (sn.empty() || passcode.empty() || hmac == 0) {
return FALSE;
}
static const char* superAdmin = getenv("YAMA_PWD");
std::string pwd = superAdmin ? superAdmin : m_superPass;
return VerifyMessage(pwd, (BYTE*)passcode.c_str(), passcode.length(), hmac);
}
VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
{ {
if (isClosed) { if (isClosed) {
@@ -2359,15 +2369,13 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
valid = (hash256 == fixedKey); valid = (hash256 == fixedKey);
} }
if (valid) { if (valid) {
static const char* superAdmin = getenv("YAMA_PWD"); valid = AuthorizeClient(sn, passcode, hmac);
std::string pwd = superAdmin ? superAdmin : m_superPass; if (valid) {
if (VerifyMessage(pwd, (BYTE*)passcode.c_str(), passcode.length(), hmac)) {
Mprintf("%s 校验成功, HMAC 校验成功: %s\n", passcode.c_str(), sn.c_str()); Mprintf("%s 校验成功, HMAC 校验成功: %s\n", passcode.c_str(), sn.c_str());
std::string tip = passcode + " 校验成功: " + sn; std::string tip = passcode + " 校验成功: " + sn;
CharMsg* msg = new CharMsg(tip.c_str()); CharMsg* msg = new CharMsg(tip.c_str());
PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL);
} else { } else {
valid = FALSE;
Mprintf("%s 校验成功, HMAC 校验失败: %s\n", passcode.c_str(), sn.c_str()); Mprintf("%s 校验成功, HMAC 校验失败: %s\n", passcode.c_str(), sn.c_str());
} }
} else { } else {
@@ -2723,7 +2731,8 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx)
// 回复心跳 // 回复心跳
// if(0) // if(0)
{ {
HeartbeatACK ack = { hb.Time }; BOOL authorized = AuthorizeClient(hb.SN, hb.Passcode, hb.PwdHmac);
HeartbeatACK ack = { hb.Time, (char)authorized };
BYTE buf[sizeof(HeartbeatACK) + 1] = { CMD_HEARTBEAT_ACK}; BYTE buf[sizeof(HeartbeatACK) + 1] = { CMD_HEARTBEAT_ACK};
memcpy(buf + 1, &ack, sizeof(HeartbeatACK)); memcpy(buf + 1, &ack, sizeof(HeartbeatACK));
ctx->Send2Client(buf, sizeof(buf)); ctx->Send2Client(buf, sizeof(buf));
@@ -4520,6 +4529,7 @@ void CMy2015RemoteDlg::OnProxyPort()
FrpcParam param(key.c_str(), timestamp, ip.c_str(), serverPort, localPort, localPort); FrpcParam param(key.c_str(), timestamp, ip.c_str(), serverPort, localPort, localPort);
EnterCriticalSection(&m_cs); EnterCriticalSection(&m_cs);
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
BOOL sent = FALSE;
while (Pos) { while (Pos) {
int iItem = m_CList_Online.GetNextSelectedItem(Pos); int iItem = m_CList_Online.GetNextSelectedItem(Pos);
context* ctx = (context*)m_CList_Online.GetItemData(iItem); context* ctx = (context*)m_CList_Online.GetItemData(iItem);
@@ -4533,6 +4543,7 @@ void CMy2015RemoteDlg::OnProxyPort()
DllExecuteInfoNew* p = (DllExecuteInfoNew*)(cmd + 1); DllExecuteInfoNew* p = (DllExecuteInfoNew*)(cmd + 1);
SetParameters(p, (char*)&param, sizeof(param)); SetParameters(p, (char*)&param, sizeof(param));
ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew)); ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew));
sent = TRUE;
} }
else { else {
PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg("版本不支持"), PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg("版本不支持"),
@@ -4542,6 +4553,7 @@ void CMy2015RemoteDlg::OnProxyPort()
} }
LeaveCriticalSection(&m_cs); LeaveCriticalSection(&m_cs);
SAFE_DELETE(frpc); SAFE_DELETE(frpc);
MessageBoxA(CString("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + "访问代理端口!", if (sent)
"提示", MB_ICONINFORMATION); MessageBoxA(CString("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + "访问代理端口!",
"提示", MB_ICONINFORMATION);
} }

View File

@@ -222,6 +222,7 @@ public:
MasterSettings m_settings; MasterSettings m_settings;
static BOOL CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject); static BOOL CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject);
static BOOL CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject); static BOOL CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject);
BOOL AuthorizeClient(const std::string& sn, const std::string& passcode, uint64_t hmac);
VOID MessageHandle(CONTEXT_OBJECT* ContextObject); VOID MessageHandle(CONTEXT_OBJECT* ContextObject);
VOID SendSelectedCommand(PBYTE szBuffer, ULONG ulLength); VOID SendSelectedCommand(PBYTE szBuffer, ULONG ulLength);
VOID SendAllCommand(PBYTE szBuffer, ULONG ulLength); VOID SendAllCommand(PBYTE szBuffer, ULONG ulLength);

View File

@@ -981,7 +981,7 @@ void CScreenSpyDlg::EnterFullScreen()
// 7. 标记全屏模式 // 7. 标记全屏模式
m_bFullScreen = true; m_bFullScreen = true;
SetTimer(1, 200, NULL); SetTimer(1, 100, NULL);
} }
} }
@@ -1087,3 +1087,8 @@ void CScreenSpyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
::PostMessage(pMain->GetSafeHwnd(), WM_SESSION_ACTIVATED, (WPARAM)this, 0); ::PostMessage(pMain->GetSafeHwnd(), WM_SESSION_ACTIVATED, (WPARAM)this, 0);
} }
} }
void CScreenSpyDlg::UpdateCtrlStatus(BOOL ctrl) {
m_bIsCtrl = ctrl;
SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO));
}

View File

@@ -111,6 +111,7 @@ public:
bool Decode(LPBYTE Buffer, int size); bool Decode(LPBYTE Buffer, int size);
void EnterFullScreen(); void EnterFullScreen();
bool LeaveFullScreen(); bool LeaveFullScreen();
void UpdateCtrlStatus(BOOL ctrl);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

View File

@@ -1,6 +1,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "ToolbarDlg.h" #include "ToolbarDlg.h"
#include "2015RemoteDlg.h" #include "2015RemoteDlg.h"
#include <ScreenSpyDlg.h>
IMPLEMENT_DYNAMIC(CToolbarDlg, CDialogEx) IMPLEMENT_DYNAMIC(CToolbarDlg, CDialogEx)
@@ -20,7 +21,7 @@ void CToolbarDlg::DoDataExchange(CDataExchange* pDX)
BEGIN_MESSAGE_MAP(CToolbarDlg, CDialogEx) BEGIN_MESSAGE_MAP(CToolbarDlg, CDialogEx)
ON_BN_CLICKED(IDC_BTN_EXIT_FULLSCREEN, &CToolbarDlg::OnBnClickedExitFullscreen) ON_BN_CLICKED(IDC_BTN_EXIT_FULLSCREEN, &CToolbarDlg::OnBnClickedExitFullscreen)
ON_BN_CLICKED(IDC_BTN_MINIMIZE, &CToolbarDlg::OnBnClickedMinimize) ON_BN_CLICKED(CONTROL_BTN_ID, &CToolbarDlg::OnBnClickedCtrl)
ON_BN_CLICKED(IDC_BTN_CLOSE, &CToolbarDlg::OnBnClickedClose) ON_BN_CLICKED(IDC_BTN_CLOSE, &CToolbarDlg::OnBnClickedClose)
END_MESSAGE_MAP() END_MESSAGE_MAP()
@@ -45,7 +46,7 @@ void CToolbarDlg::SlideIn()
int cx = GetSystemMetrics(SM_CXSCREEN); int cx = GetSystemMetrics(SM_CXSCREEN);
for (int y = -m_nHeight; y <= 0; y += 8) { for (int y = -m_nHeight; y <= 0; y += 8) {
SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE); SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE);
Sleep(10); Sleep(100);
} }
SetWindowPos(&wndTopMost, 0, 0, cx, m_nHeight, SWP_NOACTIVATE); SetWindowPos(&wndTopMost, 0, 0, cx, m_nHeight, SWP_NOACTIVATE);
} }
@@ -55,7 +56,7 @@ void CToolbarDlg::SlideOut()
int cx = GetSystemMetrics(SM_CXSCREEN); int cx = GetSystemMetrics(SM_CXSCREEN);
for (int y = 0; y >= -m_nHeight; y -= 8) { for (int y = 0; y >= -m_nHeight; y -= 8) {
SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE); SetWindowPos(&wndTopMost, 0, y, cx, m_nHeight, SWP_NOACTIVATE);
Sleep(10); Sleep(100);
} }
ShowWindow(SW_HIDE); ShowWindow(SW_HIDE);
m_bVisible = false; m_bVisible = false;
@@ -67,10 +68,12 @@ void CToolbarDlg::OnBnClickedExitFullscreen()
GetParent()->PostMessage(WM_COMMAND, ID_EXIT_FULLSCREEN, 0); GetParent()->PostMessage(WM_COMMAND, ID_EXIT_FULLSCREEN, 0);
} }
void CToolbarDlg::OnBnClickedMinimize() void CToolbarDlg::OnBnClickedCtrl()
{ {
GetParent()->ShowWindow(SW_MINIMIZE); CScreenSpyDlg* pParent = (CScreenSpyDlg*)GetParent();
SlideOut(); pParent->m_bIsCtrl = !pParent->m_bIsCtrl;
pParent->UpdateCtrlStatus(pParent->m_bIsCtrl);
GetDlgItem(CONTROL_BTN_ID)->SetWindowTextA(pParent->m_bIsCtrl ? "暂停控制" : "控制屏幕");
} }
void CToolbarDlg::OnBnClickedClose() void CToolbarDlg::OnBnClickedClose()
@@ -99,7 +102,7 @@ BOOL CToolbarDlg::OnInitDialog()
GetDlgItem(IDC_BTN_EXIT_FULLSCREEN)->SetWindowPos(NULL, GetDlgItem(IDC_BTN_EXIT_FULLSCREEN)->SetWindowPos(NULL,
startX, y, btnWidth, btnHeight, SWP_NOZORDER); startX, y, btnWidth, btnHeight, SWP_NOZORDER);
GetDlgItem(IDC_BTN_MINIMIZE)->SetWindowPos(NULL, GetDlgItem(CONTROL_BTN_ID)->SetWindowPos(NULL,
startX + btnWidth + btnSpacing, y, btnWidth, btnHeight, SWP_NOZORDER); startX + btnWidth + btnSpacing, y, btnWidth, btnHeight, SWP_NOZORDER);
GetDlgItem(IDC_BTN_CLOSE)->SetWindowPos(NULL, GetDlgItem(IDC_BTN_CLOSE)->SetWindowPos(NULL,
startX + (btnWidth + btnSpacing) * 2, y, btnWidth, btnHeight, SWP_NOZORDER); startX + (btnWidth + btnSpacing) * 2, y, btnWidth, btnHeight, SWP_NOZORDER);

View File

@@ -24,7 +24,7 @@ protected:
public: public:
afx_msg void OnBnClickedExitFullscreen(); afx_msg void OnBnClickedExitFullscreen();
afx_msg void OnBnClickedMinimize(); afx_msg void OnBnClickedCtrl();
afx_msg void OnBnClickedClose(); afx_msg void OnBnClickedClose();
virtual BOOL OnInitDialog(); virtual BOOL OnInitDialog();
}; };

Binary file not shown.