Fix #281: Check if CPU has SSE2 to avoid client crash

This commit is contained in:
yuanyuanxiang
2026-01-12 22:54:15 +01:00
parent 2c15b842ca
commit e5872dc0b8
7 changed files with 29 additions and 7 deletions

View File

@@ -17,6 +17,15 @@
#include "X264Encoder.h" #include "X264Encoder.h"
#include "common/file_upload.h" #include "common/file_upload.h"
inline bool HasSSE2() {
#ifdef _DEBUG
return false;
#else
auto static has = IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE);
return has;
#endif
}
class ThreadPool class ThreadPool
{ {
public: public:
@@ -304,7 +313,7 @@ public:
virtual ULONG CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer, virtual ULONG CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer,
DWORD ulCompareLength, BYTE algo, int startPostion = 0) DWORD ulCompareLength, BYTE algo, int startPostion = 0)
{ {
if (UsingDXGI()) if (UsingDXGI() || !HasSSE2())
return CompareBitmapDXGI(CompareSourData, CompareDestData, szBuffer, ulCompareLength, algo, startPostion); return CompareBitmapDXGI(CompareSourData, CompareDestData, szBuffer, ulCompareLength, algo, startPostion);
LPBYTE p = szBuffer; LPBYTE p = szBuffer;

View File

@@ -110,7 +110,7 @@ public:
// 9. 初始化 BITMAPINFO // 9. 初始化 BITMAPINFO
m_BitmapInfor_Full = ConstructBitmapInfo(32, m_ulFullWidth, m_ulFullHeight); m_BitmapInfor_Full = ConstructBitmapInfo(32, m_ulFullWidth, m_ulFullHeight);
iniFile cfg(CLIENT_PATH); iniFile cfg(CLIENT_PATH);
int strategy = cfg.GetInt("settings", "ScreenStrategy", 0); int strategy = HasSSE2() ? cfg.GetInt("settings", "ScreenStrategy", 0) : 1;
switch (strategy) { switch (strategy) {
case 1: case 1:
break; break;

View File

@@ -332,6 +332,11 @@ BOOL IsRunningAsSystem()
BOOL CScreenManager::OnReconnect() BOOL CScreenManager::OnReconnect()
{ {
auto duration = GetTickCount64() - m_nReconnectTime;
if (duration <= 3000)
Sleep(3000 - duration);
m_nReconnectTime = GetTickCount64();
m_SendFirst = FALSE; m_SendFirst = FALSE;
BOOL r = m_ClientObject ? m_ClientObject->Reconnect(this) : FALSE; BOOL r = m_ClientObject ? m_ClientObject->Reconnect(this) : FALSE;
Mprintf("CScreenManager OnReconnect '%s'\n", r ? "succeed" : "failed"); Mprintf("CScreenManager OnReconnect '%s'\n", r ? "succeed" : "failed");

View File

@@ -75,6 +75,7 @@ public:
bool SwitchScreen(); bool SwitchScreen();
bool RestartScreen(); bool RestartScreen();
virtual BOOL OnReconnect(); virtual BOOL OnReconnect();
uint64_t m_nReconnectTime = 0; // 重连开始时间
uint64_t m_DlgID = 0; uint64_t m_DlgID = 0;
BOOL m_SendFirst = FALSE; BOOL m_SendFirst = FALSE;

View File

@@ -20,7 +20,7 @@ CScreenSpy::CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk, int gop, BOOL
m_BitmapInfor_Full = ConstructBitmapInfo(ulbiBitCount, m_ulFullWidth, m_ulFullHeight); m_BitmapInfor_Full = ConstructBitmapInfo(ulbiBitCount, m_ulFullWidth, m_ulFullHeight);
iniFile cfg(CLIENT_PATH); iniFile cfg(CLIENT_PATH);
int strategy = cfg.GetInt("settings", "ScreenStrategy", 0); int strategy = HasSSE2() ? cfg.GetInt("settings", "ScreenStrategy", 0) : 1;
m_BitmapInfor_Send = new BITMAPINFO(*m_BitmapInfor_Full); m_BitmapInfor_Send = new BITMAPINFO(*m_BitmapInfor_Full);
switch (strategy) { switch (strategy) {
case 1: // 1 - Original size case 1: // 1 - Original size

View File

@@ -2350,7 +2350,8 @@ void delay_cancel(CONTEXT_OBJECT* ctx, int sec)
CDlgFileSend* dlg = (CDlgFileSend*)ctx->hDlg; CDlgFileSend* dlg = (CDlgFileSend*)ctx->hDlg;
dlg->FinishFileSend(TRUE); dlg->FinishFileSend(TRUE);
Sleep(sec*1000); Sleep(sec*1000);
dlg->PostMessageA(WM_CLOSE); if (::IsWindow(dlg->GetSafeHwnd()))
dlg->PostMessageA(WM_CLOSE);
ctx->hDlg = NULL; ctx->hDlg = NULL;
ctx->CancelIO(); ctx->CancelIO();
} }

View File

@@ -304,8 +304,8 @@ BOOL CScreenSpyDlg::OnInitDialog()
// 设置合理的"正常"窗口大小(屏幕的 80%),否则还原时窗口极小 // 设置合理的"正常"窗口大小(屏幕的 80%),否则还原时窗口极小
int cxScreen = GetSystemMetrics(SM_CXSCREEN); int cxScreen = GetSystemMetrics(SM_CXSCREEN);
int cyScreen = GetSystemMetrics(SM_CYSCREEN); int cyScreen = GetSystemMetrics(SM_CYSCREEN);
int normalWidth = cxScreen * 80 / 100; int normalWidth = cxScreen * 0.382;
int normalHeight = cyScreen * 80 / 100; int normalHeight = cyScreen * 0.382;
int normalX = (cxScreen - normalWidth) / 2; int normalX = (cxScreen - normalWidth) / 2;
int normalY = (cyScreen - normalHeight) / 2; int normalY = (cyScreen - normalHeight) / 2;
@@ -332,6 +332,7 @@ VOID CScreenSpyDlg::OnClose()
{ {
KillTimer(1); KillTimer(1);
KillTimer(2); KillTimer(2);
KillTimer(3);
if (!m_aviFile.IsEmpty()) { if (!m_aviFile.IsEmpty()) {
KillTimer(TIMER_ID); KillTimer(TIMER_ID);
m_aviFile = ""; m_aviFile = "";
@@ -365,6 +366,7 @@ afx_msg LRESULT CScreenSpyDlg::OnDisconnect(WPARAM wParam, LPARAM lParam)
m_nDisconnectTime = GetTickCount64(); m_nDisconnectTime = GetTickCount64();
// Close the dialog if reconnect not succeed in 15 seconds // Close the dialog if reconnect not succeed in 15 seconds
SetTimer(2, 15000, NULL); SetTimer(2, 15000, NULL);
SetTimer(3, 3000, NULL);
PostMessage(WM_PAINT); PostMessage(WM_PAINT);
return S_OK; return S_OK;
} }
@@ -615,7 +617,7 @@ void CScreenSpyDlg::OnPaint()
NULL, NULL,
DI_NORMAL | DI_COMPAT DI_NORMAL | DI_COMPAT
); );
if (!m_bConnected && GetTickCount64()-m_nDisconnectTime>2000) { if (!m_bConnected && GetTickCount64() - m_nDisconnectTime>2000) {
DrawTipString("正在重连......", 2); DrawTipString("正在重连......", 2);
} }
} }
@@ -863,6 +865,10 @@ void CScreenSpyDlg::OnTimer(UINT_PTR nIDEvent)
this->PostMessageA(WM_CLOSE, 0, 0); this->PostMessageA(WM_CLOSE, 0, 0);
return; return;
} }
if (nIDEvent == 3) {
KillTimer(3);
PostMessageA(WM_PAINT);
}
CDialog::OnTimer(nIDEvent); CDialog::OnTimer(nIDEvent);
} }