fix: #19 the CBuffer causing server crash

This commit is contained in:
yuanyuanxiang
2024-12-26 17:07:43 +08:00
parent 5b86910cb2
commit 0c0c24534b
12 changed files with 256 additions and 137 deletions

View File

@@ -1,4 +1,4 @@
// ScreenSpyDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
// ScreenSpyDlg.cpp : 实现文件
//
#include "stdafx.h"
@@ -8,18 +8,18 @@
#include <imm.h>
// CScreenSpyDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
// CScreenSpyDlg 对话框
enum
{
IDM_CONTROL = 0x1010,
IDM_FULLSCREEN,
IDM_SEND_CTRL_ALT_DEL,
IDM_TRACE_CURSOR, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾԶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IDM_BLOCK_INPUT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IDM_SAVEDIB, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ
IDM_GET_CLIPBOARD, // <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IDM_SET_CLIPBOARD, // <EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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"); //ͼ<EFBFBD><EFBFBD>
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ƥ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>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 <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CScreenSpyDlg 消息处理程序
BOOL CScreenSpyDlg::OnInitDialog()
@@ -117,37 +116,37 @@ BOOL CScreenSpyDlg::OnInitDialog()
SetIcon(m_hIcon,FALSE);
CString strString;
strString.Format("%s - Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<EFBFBD><EFBFBD>%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); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹ص<EFBFBD>λͼ
DIB_RGB_COLORS, &m_BitmapData_Full, NULL, NULL); //创建应用程序可以直接写入的、与设备无关的位图
SelectObject(m_hFullMemDC, m_BitmapHandle);//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>
SelectObject(m_hFullMemDC, m_BitmapHandle);//择一对象到指定的设备上下文环境
SetScrollRange(SB_HORZ, 0, m_BitmapInfor_Full->bmiHeader.biWidth); //ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
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, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ(&Y)");
SysMenu->AppendMenu(MF_STRING, IDM_FULLSCREEN, "ȫ<EFBFBD><EFBFBD>(&F)");
SysMenu->AppendMenu(MF_STRING, IDM_TRACE_CURSOR, "<EFBFBD><EFBFBD><EFBFBD>ٱ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&T)");
SysMenu->AppendMenu(MF_STRING, IDM_BLOCK_INPUT, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>(&L)");
SysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&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, "<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&R)");
SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&L)");
SysMenu->AppendMenu(MF_STRING, IDM_GET_CLIPBOARD, "获取剪贴板(&R)");
SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "设置剪贴板(&L)");
SysMenu->AppendMenu(MF_SEPARATOR);
}
m_bIsCtrl = FALSE; //<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD>
m_bIsTraceCursor = FALSE; //<EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD>
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;
//<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HBITMAP<41>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>
memcpy(m_BitmapData_Full, m_ContextObject->InDeCompressedBuffer.GetBuffer(1), m_BitmapInfor_Full->bmiHeader.biSizeImage);
//得到被控端发来的数据 将他拷贝到HBITMAP的缓冲区中这样一个图像就出现了
PostMessage(WM_PAINT);//<2F><><EFBFBD><EFBFBD>WM_PAINT<4E><54>Ϣ
m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapData_Full, m_BitmapInfor_Full->bmiHeader.biSizeImage, 1);
PostMessage(WM_PAINT);//触发WM_PAINT消息
}
VOID CScreenSpyDlg::DrawNextScreenDiff(void)
{
//<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>
//OnPaint<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><EFBFBD>˸
//该函数不是直接画到屏幕上,而是更新一下变化部分的屏幕数据然后调用
//OnPaint画上去
//根据鼠标是否移动和屏幕是否变化判断是否重绘鼠标,防止鼠标闪烁
BOOL bChange = FALSE;
ULONG ulHeadLength = 1 + 1 + sizeof(POINT) + sizeof(BYTE); // <EFBFBD><EFBFBD>ʶ + <EFBFBD> + <EFBFBD><EFBFBD><EFBFBD><EFBFBD> λ<><CEBB> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD>
// 鼠标移动了
if (memcmp(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT)) != 0)
{
bChange = TRUE;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 光标类型发生变化
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)//<EFBFBD>滻ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>WNDCLASSEX<EFBFBD>
if (m_bIsCtrl && !m_bIsTraceCursor)//替换指定窗口所属类的WNDCLASSEX结构
SetClassLong(m_hWnd, GCL_HCURSOR, (LONG)m_CursorInfo.getCursorHandle(m_bCursorIndex == (BYTE)-1 ? 1 : m_bCursorIndex));
}
// <EFBFBD><EFBFBD>Ļ<EFBFBD>Ƿ<EFBFBD><EFBFBD>
// 屏幕是否变化
if (NextScreenLength > 0)
{
bChange = TRUE;
}
//lodsdָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ESIָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>λ<EFBFBD><EFBFBD>4<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD>EAX<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4
//movsbָ<EFBFBD><EFBFBD><EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ͨ<EFBFBD><EFBFBD>SI<EFBFBD><EFBFBD>DI<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>ַ
//lodsd指令从ESI指向的内存位置4个字节内容放入EAX中并且下移4
//movsb指令字节传送数据通过SI和DI这两个寄存器控制字符串的源地址和目标地址
//m_rectBuffer [0002 esi0002 esi000A 000C] [][]edi[][][][][][][][][][][][][][][][][]
__asm
{
@@ -258,15 +257,15 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(void)
jmp CopyEnd
CopyNextBlock:
mov edi, [FirstScreenData]
lodsd // <EFBFBD><EFBFBD>lpNextScreen<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><EFBFBD>˫<EFBFBD>ֽڣ<EFBFBD><EFBFBD>ŵ<EFBFBD>eax<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>DIB<49>иı<D0B8><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
add edi, eax // lpFirstScreenƫ<EFBFBD><EFBFBD>eax
lodsd // <EFBFBD><EFBFBD>lpNextScreen<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>˫<EFBFBD>ֽڣ<EFBFBD><EFBFBD>ŵ<EFBFBD>eax<EFBFBD><EFBFBD>, <20><><EFBFBD>Ǹı<C7B8><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
lodsd // lpNextScreen的第一个双字节放到eax中,就是DIB中改变区域的偏移
add edi, eax // lpFirstScreen偏移eax
lodsd // lpNextScreen的下一个双字节放到eax中, 就是改变区域的大小
mov ecx, eax
sub ebx, 8 // ebx <EFBFBD><EFBFBD>ȥ <20><><EFBFBD><EFBFBD>dword
sub ebx, ecx // ebx <EFBFBD><EFBFBD>ȥDIB<EFBFBD><EFBFBD><EFBFBD>ݵĴ<EFBFBD>С
sub ebx, 8 // ebx 减去 两个dword
sub ebx, ecx // ebx 减去DIB数据的大小
rep movsb
CopyEnd:
cmp ebx, 0 // <EFBFBD>Ƿ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cmp ebx, 0 // 是否写入完毕
jnz CopyNextBlock
}
@@ -283,7 +282,7 @@ void CScreenSpyDlg::OnPaint()
if (m_bIsFirst)
{
DrawTipString("<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>......");
DrawTipString("请等待......");
return;
}
@@ -313,11 +312,11 @@ VOID CScreenSpyDlg::DrawTipString(CString strString)
{
RECT Rect;
GetClientRect(&Rect);
//COLORREF<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>RGB<EFBFBD><EFBFBD>ɫ
//COLORREF用来描绘一个RGB颜色
COLORREF BackgroundColor = RGB(0x00, 0x00, 0x00);
COLORREF OldBackgroundColor = SetBkColor(m_hFullDC, BackgroundColor);
COLORREF OldTextColor = SetTextColor(m_hFullDC, RGB(0xff,0x00,0x00));
//ExtTextOut<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><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
//ExtTextOut函数可以提供一个可供选择的矩形,用当前选择的字体、背景颜色和正文颜色来绘制一个字符串
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: <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
// TODO: 在此添加消息处理程序代码和/或调用默认值
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: // ȫ<EFBFBD><EFBFBD>
case IDM_FULLSCREEN: // 全屏
{
EnterFullScreen();
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_CHECKED); //<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʽ
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_CHECKED); //菜单样式
break;
}
case IDM_SAVEDIB: // <EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>
case IDM_SAVEDIB: // 快照保存
{
SaveSnapshot();
break;
}
case IDM_TRACE_CURSOR: // <EFBFBD><EFBFBD><EFBFBD>ٱ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case IDM_TRACE_CURSOR: // 跟踪被控端鼠标
{
m_bIsTraceCursor = !m_bIsTraceCursor; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SysMenu->CheckMenuItem(IDM_TRACE_CURSOR, m_bIsTraceCursor ? MF_CHECKED : MF_UNCHECKED);//<EFBFBD>ڲ˵<EFBFBD><EFBFBD>򹳲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bIsTraceCursor = !m_bIsTraceCursor; //这里在改变数据
SysMenu->CheckMenuItem(IDM_TRACE_CURSOR, m_bIsTraceCursor ? MF_CHECKED : MF_UNCHECKED);//在菜单打钩不打钩
// <EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 重绘消除或显示鼠标
OnPaint();
break;
}
case IDM_BLOCK_INPUT: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>
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: //<EFBFBD><EFBFBD>ҪClient<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case IDM_GET_CLIPBOARD: //想要Client的剪贴板内容
{
BYTE bToken = COMMAND_SCREEN_GET_CLIPBOARD;
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(bToken));
break;
}
case IDM_SET_CLIPBOARD: //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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: <EFBFBD>˳<EFBFBD>ȫ<EFBFBD><EFBFBD>
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;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Enter<EFBFBD><EFBFBD>ESC<EFBFBD>رնԻ<EFBFBD>
return TRUE;// 屏蔽EnterESC关闭对话
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, "λͼ<EFBFBD>ļ<EFBFBD>(*.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<EFBFBD><EFBFBD>С
// BITMAPINFO大小
//+ (BitMapInfor->bmiHeader.biBitCount > 16 ? 1 : (1 << BitMapInfor->bmiHeader.biBitCount)) * sizeof(RGBQUAD)
//bmp fjkdfj dkfjkdfj [][][][]
int nbmiSize = sizeof(BITMAPINFO);
//Э<EFBFBD><EFBFBD> TCP У<EFBFBD><EFBFBD>ֵ
//协议 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)) //<EFBFBD>򿪼<EFBFBD><EFBFBD>а<EFBFBD><EFBFBD>
if (!::OpenClipboard(NULL)) //打开剪切板设备
return;
HGLOBAL hGlobal = GetClipboardData(CF_TEXT); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
HGLOBAL hGlobal = GetClipboardData(CF_TEXT); //代表着一个内存
if (hGlobal == NULL)
{
::CloseClipboard();
return;
}
int iPacketLength = GlobalSize(hGlobal) + 1;
char* szClipboardVirtualAddress = (LPSTR) GlobalLock(hGlobal); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* szClipboardVirtualAddress = (LPSTR) GlobalLock(hGlobal); //锁定
LPBYTE szBuffer = new BYTE[iPacketLength];
szBuffer[0] = COMMAND_SCREEN_SET_CLIPBOARD;
@@ -650,14 +649,14 @@ void CScreenSpyDlg::EnterFullScreen()
}
}
// ȫ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD>򷵻<EFBFBD>true
// 全屏退出成功则返回true
bool CScreenSpyDlg::LeaveFullScreen()
{
if (m_bFullScreen)
{
SetWindowPlacement(&m_struOldWndpl);
CMenu *SysMenu = GetSystemMenu(FALSE);
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_UNCHECKED); //<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʽ
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_UNCHECKED); //菜单样式
m_bFullScreen = false;
return true;
}