Merge pull request #20 from yuanyuanxiang/bugFix
fix #19: server application crash
This commit is contained in:
@@ -225,3 +225,9 @@ TestRun在写入开机自启动项时先提升权限,以防止因权限不足
|
|||||||
2.增加了使用VLD的操作方法,详见"server\2015Remote\stdafx.h"。
|
2.增加了使用VLD的操作方法,详见"server\2015Remote\stdafx.h"。
|
||||||
注意:自VS2019开始,不支持XP系统了(微软已经声明这个变更)。如果有需要在XP系统进行监控的需求,推荐使用"2015Remote.sln"。
|
注意:自VS2019开始,不支持XP系统了(微软已经声明这个变更)。如果有需要在XP系统进行监控的需求,推荐使用"2015Remote.sln"。
|
||||||
如果使用VS2015编译,需将WindowsTargetPlatformVersion修改为8.1,将PlatformToolset修改为v140_xp。
|
如果使用VS2015编译,需将WindowsTargetPlatformVersion修改为8.1,将PlatformToolset修改为v140_xp。
|
||||||
|
|
||||||
|
2024.12.26
|
||||||
|
解决主控程序概率性崩溃的问题,增强主控程序运行的稳定性。本人未进行广泛测试,不保证彻底根治,但稳定性有明显改观。
|
||||||
|
fix: client threads number excceeding bug
|
||||||
|
fix: #19 the CBuffer causing server crash
|
||||||
|
fix: showing the wrong host quantity in status bar
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ CKernelManager::~CKernelManager()
|
|||||||
{
|
{
|
||||||
printf("~CKernelManager begin\n");
|
printf("~CKernelManager begin\n");
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i=0;i<0x1000;++i)
|
for (i=0;i<MAX_THREADNUM;++i)
|
||||||
{
|
{
|
||||||
if (m_hThread[i].h!=0)
|
if (m_hThread[i].h!=0)
|
||||||
{
|
{
|
||||||
@@ -33,10 +33,33 @@ CKernelManager::~CKernelManager()
|
|||||||
printf("~CKernelManager end\n");
|
printf("~CKernelManager end\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>õ<EFBFBD><C3B5>߳<EFBFBD><DFB3>±<EFBFBD>
|
||||||
|
UINT CKernelManager::GetAvailableIndex() {
|
||||||
|
if (m_ulThreadCount < MAX_THREADNUM) {
|
||||||
|
return m_ulThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_THREADNUM; ++i)
|
||||||
|
{
|
||||||
|
if (m_hThread[i].p == NULL) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
||||||
{
|
{
|
||||||
IOCPClient *pNew = szBuffer[0] == COMMAND_BYE ? NULL : new IOCPClient(true);
|
bool isExit = szBuffer[0] == COMMAND_BYE || szBuffer[0] == SERVER_EXIT;
|
||||||
m_hThread[m_ulThreadCount].p = pNew;
|
if ((m_ulThreadCount = GetAvailableIndex()) == -1) {
|
||||||
|
if (!isExit) {
|
||||||
|
printf("CKernelManager: The number of threads exceeds the limit.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!isExit){
|
||||||
|
m_hThread[m_ulThreadCount].p = new IOCPClient(true);
|
||||||
|
}
|
||||||
|
|
||||||
switch(szBuffer[0])
|
switch(szBuffer[0])
|
||||||
{
|
{
|
||||||
@@ -78,9 +101,6 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
||||||
m_bIsDead = 1;
|
m_bIsDead = 1;
|
||||||
OutputDebugStringA("======> Client exit \n");
|
OutputDebugStringA("======> Client exit \n");
|
||||||
m_hThread[m_ulThreadCount].p = NULL;
|
|
||||||
delete pNew;
|
|
||||||
pNew = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,9 +110,6 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
||||||
m_bIsDead = 2;
|
m_bIsDead = 2;
|
||||||
OutputDebugStringA("======> Server exit \n");
|
OutputDebugStringA("======> Server exit \n");
|
||||||
m_hThread[m_ulThreadCount].p = NULL;
|
|
||||||
delete pNew;
|
|
||||||
pNew = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,9 +164,10 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
OutputDebugStringA("======> Error operator\n");
|
OutputDebugStringA("======> Error operator\n");
|
||||||
m_hThread[m_ulThreadCount].p = NULL;
|
if (m_ulThreadCount != -1) {
|
||||||
delete pNew;
|
delete m_hThread[m_ulThreadCount].p;
|
||||||
pNew = NULL;
|
m_hThread[m_ulThreadCount].p = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,9 @@
|
|||||||
#include "Manager.h"
|
#include "Manager.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
// <20>߳<EFBFBD><DFB3><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
#define MAX_THREADNUM 0x1000
|
||||||
|
|
||||||
|
// <20>߳<EFBFBD><DFB3><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>, <20><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD>Ա: <20><><EFBFBD><EFBFBD>״̬(run)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(h)<29><>ͨѶ<CDA8>ͻ<EFBFBD><CDBB><EFBFBD>(p).
|
||||||
struct ThreadInfo
|
struct ThreadInfo
|
||||||
{
|
{
|
||||||
BOOL run;
|
BOOL run;
|
||||||
@@ -28,8 +30,11 @@ public:
|
|||||||
virtual ~CKernelManager();
|
virtual ~CKernelManager();
|
||||||
VOID OnReceive(PBYTE szBuffer, ULONG ulLength);
|
VOID OnReceive(PBYTE szBuffer, ULONG ulLength);
|
||||||
|
|
||||||
ThreadInfo m_hThread[0x1000];
|
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><EFBFBD><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD>ֵ<EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD>Ϊ"<22><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>±<EFBFBD>"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_hThread<61><64><EFBFBD><EFBFBD>ָλ<D6B8>ÿ<EFBFBD><C3BF>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>̷߳<DFB3><CCB7><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB>
|
||||||
ULONG m_ulThreadCount;
|
ULONG m_ulThreadCount;
|
||||||
|
UINT GetAvailableIndex();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !defined(AFX_KERNELMANAGER_H__B1186DC0_E4D7_4D1A_A8B8_08A01B87B89E__INCLUDED_)
|
#endif // !defined(AFX_KERNELMANAGER_H__B1186DC0_E4D7_4D1A_A8B8_08A01B87B89E__INCLUDED_)
|
||||||
|
|||||||
@@ -122,7 +122,6 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::I
|
|||||||
m_bmOnline[0].LoadBitmap(IDB_BITMAP_ONLINE);
|
m_bmOnline[0].LoadBitmap(IDB_BITMAP_ONLINE);
|
||||||
m_bmOnline[1].LoadBitmap(IDB_BITMAP_ONLINE);
|
m_bmOnline[1].LoadBitmap(IDB_BITMAP_ONLINE);
|
||||||
|
|
||||||
m_iCount = 0;
|
|
||||||
InitializeCriticalSection(&m_cs);
|
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.SetItemText(i,ONLINELIST_PING,strPing);
|
||||||
|
|
||||||
m_CList_Online.SetItemData(i,(DWORD_PTR)ContextObject);
|
m_CList_Online.SetItemData(i,(DWORD_PTR)ContextObject);
|
||||||
m_iCount++;
|
|
||||||
|
|
||||||
ShowMessage(true,strIP+"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
ShowMessage(true,strIP+"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
@@ -356,7 +354,9 @@ VOID CMy2015RemoteDlg::ShowMessage(BOOL bOk, CString strMsg)
|
|||||||
|
|
||||||
CString strStatusMsg;
|
CString strStatusMsg;
|
||||||
|
|
||||||
m_iCount=(m_iCount<=0?0:m_iCount); //<2F><>ֹiCount <20><>-1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
EnterCriticalSection(&m_cs);
|
||||||
|
int m_iCount = m_CList_Online.GetItemCount();
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
|
||||||
strStatusMsg.Format("<EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",m_iCount);
|
strStatusMsg.Format("<EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",m_iCount);
|
||||||
m_StatusBar.SetPaneText(0,strStatusMsg); //<2F><>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
m_StatusBar.SetPaneText(0,strStatusMsg); //<2F><>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||||||
@@ -393,7 +393,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
|||||||
SetIcon(m_hIcon, FALSE); // <20><><EFBFBD><EFBFBD>Сͼ<D0A1><CDBC>
|
SetIcon(m_hIcon, FALSE); // <20><><EFBFBD><EFBFBD>Сͼ<D0A1><CDBC>
|
||||||
|
|
||||||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
isClosed = FALSE;
|
||||||
g_2015RemoteDlg = this;
|
g_2015RemoteDlg = this;
|
||||||
CreateToolBar();
|
CreateToolBar();
|
||||||
InitControl();
|
InitControl();
|
||||||
@@ -479,6 +479,7 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
if (m_CList_Online.m_hWnd!=NULL) //<2F><><EFBFBD>ؼ<EFBFBD>Ҳ<EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>
|
if (m_CList_Online.m_hWnd!=NULL) //<2F><><EFBFBD>ؼ<EFBFBD>Ҳ<EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
CRect rc;
|
CRect rc;
|
||||||
@@ -496,6 +497,7 @@ void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy)
|
|||||||
m_CList_Online.SetColumnWidth(i,(lenth)); //<2F><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
m_CList_Online.SetColumnWidth(i,(lenth)); //<2F><><EFBFBD>õ<EFBFBD>ǰ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
|
||||||
if (m_CList_Message.m_hWnd!=NULL)
|
if (m_CList_Message.m_hWnd!=NULL)
|
||||||
{
|
{
|
||||||
@@ -542,18 +544,21 @@ void CMy2015RemoteDlg::OnTimer(UINT_PTR nIDEvent)
|
|||||||
|
|
||||||
void CMy2015RemoteDlg::OnClose()
|
void CMy2015RemoteDlg::OnClose()
|
||||||
{
|
{
|
||||||
|
isClosed = TRUE;
|
||||||
ShowWindow(SW_HIDE);
|
ShowWindow(SW_HIDE);
|
||||||
#if INDEPENDENT
|
#if INDEPENDENT
|
||||||
Shell_NotifyIcon(NIM_DELETE, &m_Nid);
|
Shell_NotifyIcon(NIM_DELETE, &m_Nid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT;
|
BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT;
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
int n = m_CList_Online.GetItemCount();
|
int n = m_CList_Online.GetItemCount();
|
||||||
for(int Pos = 0; Pos < n; ++Pos)
|
for(int Pos = 0; Pos < n; ++Pos)
|
||||||
{
|
{
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(Pos);
|
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(Pos);
|
||||||
m_iocpServer->OnClientPreSending(ContextObject, &bToken, sizeof(BYTE));
|
m_iocpServer->OnClientPreSending(ContextObject, &bToken, sizeof(BYTE));
|
||||||
}
|
}
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
Sleep(200);
|
Sleep(200);
|
||||||
|
|
||||||
EnterCriticalSection(&m_cs);
|
EnterCriticalSection(&m_cs);
|
||||||
@@ -607,7 +612,10 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult)
|
|||||||
GetCursorPos(&Point);
|
GetCursorPos(&Point);
|
||||||
|
|
||||||
int iCount = SubMenu->GetMenuItemCount();
|
int iCount = SubMenu->GetMenuItemCount();
|
||||||
if (m_CList_Online.GetSelectedCount() == 0) //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ѡ<EFBFBD><D1A1>
|
EnterCriticalSection(&m_cs);
|
||||||
|
int n = m_CList_Online.GetSelectedCount();
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
if (n == 0) //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ѡ<EFBFBD><D1A1>
|
||||||
{
|
{
|
||||||
for (int i = 0;i<iCount;++i)
|
for (int i = 0;i<iCount;++i)
|
||||||
{
|
{
|
||||||
@@ -639,8 +647,8 @@ void CMy2015RemoteDlg::OnOnlineDelete()
|
|||||||
BYTE bToken = COMMAND_BYE; //<2F>ض˷<D8B6><CBB7><EFBFBD>һ<EFBFBD><D2BB>COMMAND_SYSTEM
|
BYTE bToken = COMMAND_BYE; //<2F>ض˷<D8B6><CBB7><EFBFBD>һ<EFBFBD><D2BB>COMMAND_SYSTEM
|
||||||
SendSelectedCommand(&bToken, sizeof(BYTE)); //Context PreSending PostSending
|
SendSelectedCommand(&bToken, sizeof(BYTE)); //Context PreSending PostSending
|
||||||
|
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
int iCount = m_CList_Online.GetSelectedCount();
|
int iCount = m_CList_Online.GetSelectedCount();
|
||||||
|
|
||||||
for (int i=0;i<iCount;++i)
|
for (int i=0;i<iCount;++i)
|
||||||
{
|
{
|
||||||
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
|
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
|
||||||
@@ -650,6 +658,7 @@ void CMy2015RemoteDlg::OnOnlineDelete()
|
|||||||
strIP+="<EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
strIP+="<EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||||||
ShowMessage(true,strIP);
|
ShowMessage(true,strIP);
|
||||||
}
|
}
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID CMy2015RemoteDlg::OnOnlineCmdManager()
|
VOID CMy2015RemoteDlg::OnOnlineCmdManager()
|
||||||
@@ -727,6 +736,7 @@ void CMy2015RemoteDlg::OnOnlineBuildClient()
|
|||||||
|
|
||||||
VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength)
|
VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength)
|
||||||
{
|
{
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
|
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
|
||||||
while(Pos)
|
while(Pos)
|
||||||
{
|
{
|
||||||
@@ -736,6 +746,7 @@ VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength)
|
|||||||
// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
||||||
m_iocpServer->OnClientPreSending(ContextObject,szBuffer, ulLength);
|
m_iocpServer->OnClientPreSending(ContextObject,szBuffer, ulLength);
|
||||||
}
|
}
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
//<2F><><EFBFBD><EFBFBD>Bar
|
//<2F><><EFBFBD><EFBFBD>Bar
|
||||||
@@ -888,7 +899,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
|
switch (ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case COMMAND_BYE:
|
case COMMAND_BYE:
|
||||||
{
|
{
|
||||||
@@ -956,7 +967,7 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam)
|
|||||||
CString strIP, strAddr, strPCName, strOS, strCPU, strVideo, strPing;
|
CString strIP, strAddr, strPCName, strOS, strCPU, strVideo, strPing;
|
||||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; //ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ClientContext <20><><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; //ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ClientContext <20><><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
if (ContextObject == NULL)
|
if (ContextObject == NULL || isClosed)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -970,7 +981,8 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam)
|
|||||||
return -1;
|
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;
|
sockaddr_in ClientAddr;
|
||||||
memset(&ClientAddr, 0, sizeof(ClientAddr));
|
memset(&ClientAddr, 0, sizeof(ClientAddr));
|
||||||
@@ -997,6 +1009,7 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam)
|
|||||||
strAddr.Format("%d", nSocket);
|
strAddr.Format("%d", nSocket);
|
||||||
|
|
||||||
AddList(strIP,strAddr,strPCName,strOS,strCPU,strVideo,strPing,ContextObject);
|
AddList(strIP,strAddr,strPCName,strOS,strCPU,strVideo,strPing,ContextObject);
|
||||||
|
delete LoginInfor;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}catch(...){
|
}catch(...){
|
||||||
OutputDebugStringA("[ERROR] OnUserToOnlineList catch an error \n");
|
OutputDebugStringA("[ERROR] OnUserToOnlineList catch an error \n");
|
||||||
@@ -1019,7 +1032,6 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam)
|
|||||||
{
|
{
|
||||||
ip = m_CList_Online.GetItemText(i, ONLINELIST_IP);
|
ip = m_CList_Online.GetItemText(i, ONLINELIST_IP);
|
||||||
m_CList_Online.DeleteItem(i);
|
m_CList_Online.DeleteItem(i);
|
||||||
m_iCount--;
|
|
||||||
ShowMessage(true, ip + "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
ShowMessage(true, ip + "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ public:
|
|||||||
NOTIFYICONDATA m_Nid;
|
NOTIFYICONDATA m_Nid;
|
||||||
#endif
|
#endif
|
||||||
CRITICAL_SECTION m_cs;
|
CRITICAL_SECTION m_cs;
|
||||||
|
BOOL isClosed;
|
||||||
|
|
||||||
UINT m_iCount;
|
|
||||||
CBitmap m_bmOnline[2];
|
CBitmap m_bmOnline[2];
|
||||||
afx_msg void OnTimer(UINT_PTR nIDEvent);
|
afx_msg void OnTimer(UINT_PTR nIDEvent);
|
||||||
afx_msg void OnClose();
|
afx_msg void OnClose();
|
||||||
|
|||||||
@@ -106,12 +106,12 @@ void CAudioDlg::OnReceiveComplete(void)
|
|||||||
CString strString;
|
CString strString;
|
||||||
strString.Format("Receive %d KBytes", m_nTotalRecvBytes / 1024);
|
strString.Format("Receive %d KBytes", m_nTotalRecvBytes / 1024);
|
||||||
SetDlgItemText(IDC_TIPS, strString);
|
SetDlgItemText(IDC_TIPS, strString);
|
||||||
switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
|
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case TOKEN_AUDIO_DATA:
|
case TOKEN_AUDIO_DATA:
|
||||||
{
|
{
|
||||||
m_AudioObject.PlayBuffer(m_ContextObject->InDeCompressedBuffer.GetBuffer(1),
|
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1);
|
||||||
m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1); //<2F><><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
m_AudioObject.PlayBuffer(tmp.Buf(), tmp.length()); //<2F><><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#define U_PAGE_ALIGNMENT 3
|
#define U_PAGE_ALIGNMENT 3
|
||||||
#define F_PAGE_ALIGNMENT 3.0
|
#define F_PAGE_ALIGNMENT 3.0
|
||||||
|
|
||||||
CBuffer::CBuffer(void)
|
CBuffer::CBuffer(void)
|
||||||
{
|
{
|
||||||
m_ulMaxLength = 0;
|
m_ulMaxLength = 0;
|
||||||
@@ -30,25 +31,29 @@ CBuffer::~CBuffer(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ULONG CBuffer::RemoveComletedBuffer(ULONG ulLength)
|
ULONG CBuffer::RemoveCompletedBuffer(ULONG ulLength)
|
||||||
{
|
{
|
||||||
if (ulLength >GetBufferMaxLength()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȱ<EFBFBD><C8B1>ڴ<EFBFBD><DAB4>ij<EFBFBD><C4B3>Ȼ<EFBFBD><C8BB><EFBFBD>
|
EnterCriticalSection(&m_cs);
|
||||||
|
|
||||||
|
if (ulLength > m_ulMaxLength) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ȱ<EFBFBD><C8B1>ڴ<EFBFBD><DAB4>ij<EFBFBD><C4B3>Ȼ<EFBFBD><C8BB><EFBFBD>
|
||||||
{
|
{
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (ulLength >GetBufferLength()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD> <20><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȼ<EFBFBD><C8BB><EFBFBD>
|
if (ulLength > ((ULONG)m_Ptr - (ULONG)m_Base)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD> <20><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>Ȼ<EFBFBD><C8BB><EFBFBD>
|
||||||
{
|
{
|
||||||
ulLength = GetBufferLength();
|
ulLength = (ULONG)m_Ptr - (ULONG)m_Base;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ulLength)
|
if (ulLength)
|
||||||
{
|
{
|
||||||
MoveMemory(m_Base,m_Base+ulLength,GetBufferMaxLength() - ulLength); //<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0> [Shinexxxx??]
|
MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength); //<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0> [Shinexxxx??]
|
||||||
|
|
||||||
m_Ptr -= ulLength;
|
m_Ptr -= ulLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeAllocateBuffer(GetBufferLength());
|
DeAllocateBuffer((ULONG)m_Ptr - (ULONG)m_Base);
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
|
||||||
return ulLength;
|
return ulLength;
|
||||||
}
|
}
|
||||||
@@ -57,44 +62,46 @@ ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength)
|
|||||||
{
|
{
|
||||||
EnterCriticalSection(&m_cs);
|
EnterCriticalSection(&m_cs);
|
||||||
|
|
||||||
if (ulLength > GetBufferMaxLength())
|
if (ulLength > m_ulMaxLength)
|
||||||
{
|
{
|
||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (ulLength > GetBufferLength())
|
|
||||||
|
if (ulLength > ((ULONG)m_Ptr - (ULONG)m_Base))
|
||||||
{
|
{
|
||||||
ulLength = GetBufferLength();
|
ulLength = (ULONG)m_Ptr - (ULONG)m_Base;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ulLength)
|
if (ulLength)
|
||||||
{
|
{
|
||||||
CopyMemory(Buffer,m_Base,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;
|
m_Ptr -= ulLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeAllocateBuffer(GetBufferLength());
|
DeAllocateBuffer((ULONG)m_Ptr - (ULONG)m_Base);
|
||||||
|
|
||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
return ulLength;
|
return ulLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ˽<><CBBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
ULONG CBuffer::DeAllocateBuffer(ULONG ulLength)
|
ULONG CBuffer::DeAllocateBuffer(ULONG ulLength)
|
||||||
{
|
{
|
||||||
if (ulLength < GetBufferLength())
|
if (ulLength < ((ULONG)m_Ptr - (ULONG)m_Base))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
||||||
|
|
||||||
if (GetBufferMaxLength() <= ulNewMaxLength)
|
if (m_ulMaxLength <= ulNewMaxLength)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
|
PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
|
||||||
|
|
||||||
ULONG ulv1 = GetBufferLength(); //<2F><>ԭ<EFBFBD><D4AD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
ULONG ulv1 = (ULONG)m_Ptr - (ULONG)m_Base; //<2F><>ԭ<EFBFBD><D4AD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
||||||
CopyMemory(NewBase,m_Base,ulv1);
|
CopyMemory(NewBase,m_Base,ulv1);
|
||||||
|
|
||||||
VirtualFree(m_Base,0,MEM_RELEASE);
|
VirtualFree(m_Base,0,MEM_RELEASE);
|
||||||
@@ -113,7 +120,7 @@ BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength)
|
|||||||
{
|
{
|
||||||
EnterCriticalSection(&m_cs);
|
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);
|
LeaveCriticalSection(&m_cs);
|
||||||
return false;
|
return false;
|
||||||
@@ -126,9 +133,10 @@ BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ˽<><CBBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
ULONG CBuffer::ReAllocateBuffer(ULONG ulLength)
|
ULONG CBuffer::ReAllocateBuffer(ULONG ulLength)
|
||||||
{
|
{
|
||||||
if (ulLength < GetBufferMaxLength())
|
if (ulLength < m_ulMaxLength)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
|
||||||
@@ -138,7 +146,9 @@ ULONG CBuffer::ReAllocateBuffer(ULONG ulLength)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG ulv1 = GetBufferLength(); //ԭ<>ȵ<EFBFBD><C8B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|
||||||
|
ULONG ulv1 = (ULONG)m_Ptr - (ULONG)m_Base; //ԭ<>ȵ<EFBFBD><C8B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||||
|
|
||||||
CopyMemory(NewBase,m_Base,ulv1);
|
CopyMemory(NewBase,m_Base,ulv1);
|
||||||
|
|
||||||
if (m_Base)
|
if (m_Base)
|
||||||
@@ -162,29 +172,75 @@ VOID CBuffer::ClearBuffer()
|
|||||||
LeaveCriticalSection(&m_cs);
|
LeaveCriticalSection(&m_cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG CBuffer::GetBufferLength() const //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
ULONG CBuffer::GetBufferLength() // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
|
EnterCriticalSection(&m_cs);
|
||||||
if (m_Base == NULL)
|
if (m_Base == NULL)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
ULONG len = (ULONG)m_Ptr - (ULONG)m_Base;
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
|
||||||
return (ULONG)m_Ptr - (ULONG)m_Base;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. ֻ<><D6BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>.
|
||||||
ULONG CBuffer::GetBufferMaxLength() const
|
LPBYTE CBuffer::GetBuffer(ULONG ulPos)
|
||||||
{
|
{
|
||||||
return m_ulMaxLength;
|
EnterCriticalSection(&m_cs);
|
||||||
}
|
if (m_Base==NULL || ulPos >= ((ULONG)m_Ptr - (ULONG)m_Base))
|
||||||
|
|
||||||
PBYTE CBuffer::GetBuffer(ULONG ulPos) const
|
|
||||||
{
|
|
||||||
if (m_Base==NULL)
|
|
||||||
{
|
{
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (ulPos>=GetBufferLength())
|
LPBYTE result = m_Base + ulPos;
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. <20><>ȡ<EFBFBD><C8A1><EFBFBD>棬<EFBFBD>õ<EFBFBD>Buffer<65><72><EFBFBD><EFBFBD>.
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ֵ.
|
||||||
|
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 NULL;
|
||||||
}
|
}
|
||||||
return m_Base+ulPos;
|
BYTE p = *(m_Base + ulPos);
|
||||||
|
LeaveCriticalSection(&m_cs);
|
||||||
|
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <20>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6>̰߳<DFB3>ȫ<EFBFBD><C8AB>. <20><><EFBFBD><EFBFBD><EFBFBD>濽<EFBFBD><E6BFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>.
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -1,5 +1,61 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
// Buffer <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>.
|
||||||
|
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
|
class CBuffer
|
||||||
{
|
{
|
||||||
@@ -7,21 +63,21 @@ public:
|
|||||||
CBuffer(void);
|
CBuffer(void);
|
||||||
~CBuffer(void);
|
~CBuffer(void);
|
||||||
|
|
||||||
ULONG GetBufferMaxLength() const;
|
|
||||||
ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength);
|
ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength);
|
||||||
ULONG GetBufferLength() const; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>;
|
ULONG GetBufferLength(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
ULONG DeAllocateBuffer(ULONG ulLength);
|
|
||||||
VOID ClearBuffer();
|
VOID ClearBuffer();
|
||||||
ULONG ReAllocateBuffer(ULONG ulLength);
|
|
||||||
BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength);
|
BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength);
|
||||||
PBYTE GetBuffer(ULONG ulPos=0) const;
|
LPBYTE GetBuffer(ULONG ulPos);
|
||||||
ULONG RemoveComletedBuffer(ULONG ulLength);
|
Buffer GetMyBuffer(ULONG ulPos);
|
||||||
VOID ReleaseMember();
|
BYTE GetBYTE(ULONG ulPos);
|
||||||
VOID InitMember();
|
BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos);
|
||||||
|
ULONG RemoveCompletedBuffer(ULONG ulLength);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
PBYTE m_Base;
|
PBYTE m_Base;
|
||||||
PBYTE m_Ptr;
|
PBYTE m_Ptr;
|
||||||
ULONG m_ulMaxLength;
|
ULONG m_ulMaxLength;
|
||||||
CRITICAL_SECTION m_cs;
|
CRITICAL_SECTION m_cs;
|
||||||
|
ULONG DeAllocateBuffer(ULONG ulLength); // ˽<><CBBD>
|
||||||
|
ULONG ReAllocateBuffer(ULONG ulLength); // ˽<><CBBD>
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -459,13 +459,13 @@ BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans
|
|||||||
while (ContextObject->InCompressedBuffer.GetBufferLength() > HDR_LENGTH)
|
while (ContextObject->InCompressedBuffer.GetBufferLength() > HDR_LENGTH)
|
||||||
{
|
{
|
||||||
char szPacketFlag[FLAG_LENGTH + 3]= {0}; // 8<>ֽڶ<D6BD><DAB6><EFBFBD>
|
char szPacketFlag[FLAG_LENGTH + 3]= {0}; // 8<>ֽڶ<D6BD><DAB6><EFBFBD>
|
||||||
CopyMemory(szPacketFlag, ContextObject->InCompressedBuffer.GetBuffer(),FLAG_LENGTH);
|
ContextObject->InCompressedBuffer.CopyBuffer(szPacketFlag, FLAG_LENGTH, 0);
|
||||||
if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0)
|
if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0)
|
||||||
throw "Bad Buffer";
|
throw "Bad Buffer";
|
||||||
|
|
||||||
//Shine[50][kdjfkdjfkj]
|
//Shine[50][kdjfkdjfkj]
|
||||||
ULONG ulPackTotalLength = 0;
|
ULONG ulPackTotalLength = 0;
|
||||||
CopyMemory(&ulPackTotalLength, ContextObject->InCompressedBuffer.GetBuffer(FLAG_LENGTH), sizeof(ULONG));
|
ContextObject->InCompressedBuffer.CopyBuffer(&ulPackTotalLength, sizeof(ULONG), FLAG_LENGTH);
|
||||||
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>ܳ<EFBFBD>
|
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>ܳ<EFBFBD>
|
||||||
//50
|
//50
|
||||||
if (ulPackTotalLength && (ContextObject->InCompressedBuffer.GetBufferLength()) >= ulPackTotalLength)
|
if (ulPackTotalLength && (ContextObject->InCompressedBuffer.GetBufferLength()) >= ulPackTotalLength)
|
||||||
@@ -584,7 +584,7 @@ BOOL IOCPServer::OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompl
|
|||||||
{
|
{
|
||||||
DWORD ulFlags = MSG_PARTIAL;
|
DWORD ulFlags = MSG_PARTIAL;
|
||||||
|
|
||||||
ContextObject->OutCompressedBuffer.RemoveComletedBuffer(ulCompletedLength); //<2F><><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>ȥ<EFBFBD><C8A5>
|
ContextObject->OutCompressedBuffer.RemoveCompletedBuffer(ulCompletedLength); //<2F><><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>ȥ<EFBFBD><C8A5>
|
||||||
if (ContextObject->OutCompressedBuffer.GetBufferLength() == 0)
|
if (ContextObject->OutCompressedBuffer.GetBufferLength() == 0)
|
||||||
{
|
{
|
||||||
ContextObject->OutCompressedBuffer.ClearBuffer();
|
ContextObject->OutCompressedBuffer.ClearBuffer();
|
||||||
@@ -594,7 +594,7 @@ BOOL IOCPServer::OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompl
|
|||||||
{
|
{
|
||||||
OVERLAPPEDPLUS * OverlappedPlus = new OVERLAPPEDPLUS(IOWrite); //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD>Ͷ<EFBFBD><CDB6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
OVERLAPPEDPLUS * OverlappedPlus = new OVERLAPPEDPLUS(IOWrite); //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD>Ͷ<EFBFBD><CDB6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
|
||||||
ContextObject->wsaOutBuffer.buf = (char*)ContextObject->OutCompressedBuffer.GetBuffer();
|
ContextObject->wsaOutBuffer.buf = (char*)ContextObject->OutCompressedBuffer.GetBuffer(0);
|
||||||
ContextObject->wsaOutBuffer.len = ContextObject->OutCompressedBuffer.GetBufferLength();
|
ContextObject->wsaOutBuffer.len = ContextObject->OutCompressedBuffer.GetBufferLength();
|
||||||
int iOk = WSASend(ContextObject->sClientSocket, &ContextObject->wsaOutBuffer,1,
|
int iOk = WSASend(ContextObject->sClientSocket, &ContextObject->wsaOutBuffer,1,
|
||||||
&ContextObject->wsaOutBuffer.len, ulFlags,&OverlappedPlus->m_ol, NULL);
|
&ContextObject->wsaOutBuffer.len, ulFlags,&OverlappedPlus->m_ol, NULL);
|
||||||
|
|||||||
@@ -214,16 +214,18 @@ char CRegisterDlg::GetFatherPath(CString& strFullPath)
|
|||||||
void CRegisterDlg::OnReceiveComplete(void)
|
void CRegisterDlg::OnReceiveComplete(void)
|
||||||
{
|
{
|
||||||
m_bIsWorking = TRUE;
|
m_bIsWorking = TRUE;
|
||||||
switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
|
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case TOKEN_REG_PATH:
|
case TOKEN_REG_PATH:
|
||||||
{
|
{
|
||||||
AddPath((char*)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1)));
|
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1);
|
||||||
|
AddPath(tmp.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TOKEN_REG_KEY:
|
case TOKEN_REG_KEY:
|
||||||
{
|
{
|
||||||
AddKey((char*)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1)));
|
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1);
|
||||||
|
AddKey(tmp.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// ScreenSpyDlg.cpp : ʵ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
// ScreenSpyDlg.cpp : 实现文件
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
@@ -8,18 +8,18 @@
|
|||||||
#include <imm.h>
|
#include <imm.h>
|
||||||
|
|
||||||
|
|
||||||
// CScreenSpyDlg <EFBFBD>Ի<EFBFBD><EFBFBD><EFBFBD>
|
// CScreenSpyDlg 对话框
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
IDM_CONTROL = 0x1010,
|
IDM_CONTROL = 0x1010,
|
||||||
IDM_FULLSCREEN,
|
IDM_FULLSCREEN,
|
||||||
IDM_SEND_CTRL_ALT_DEL,
|
IDM_SEND_CTRL_ALT_DEL,
|
||||||
IDM_TRACE_CURSOR, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾԶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
IDM_TRACE_CURSOR, // 跟踪显示远程鼠标
|
||||||
IDM_BLOCK_INPUT, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
IDM_BLOCK_INPUT, // 锁定远程计算机输入
|
||||||
IDM_SAVEDIB, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ
|
IDM_SAVEDIB, // 保存图片
|
||||||
IDM_GET_CLIPBOARD, // <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
IDM_GET_CLIPBOARD, // 获取剪贴板
|
||||||
IDM_SET_CLIPBOARD, // <EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
IDM_SET_CLIPBOARD, // 设置剪贴板
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog)
|
IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog)
|
||||||
@@ -29,7 +29,7 @@ IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog)
|
|||||||
CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject)
|
CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject)
|
||||||
: CDialog(CScreenSpyDlg::IDD, Parent)
|
: CDialog(CScreenSpyDlg::IDD, Parent)
|
||||||
{
|
{
|
||||||
ImmDisableIME(0);// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뷨
|
ImmDisableIME(0);// 禁用输入法
|
||||||
m_bFullScreen = FALSE;
|
m_bFullScreen = FALSE;
|
||||||
|
|
||||||
m_iocpServer = IOCPServer;
|
m_iocpServer = IOCPServer;
|
||||||
@@ -37,7 +37,7 @@ CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJEC
|
|||||||
|
|
||||||
CHAR szFullPath[MAX_PATH];
|
CHAR szFullPath[MAX_PATH];
|
||||||
GetSystemDirectory(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_hIcon = ExtractIcon(AfxGetApp()->m_hInstance, szFullPath, 17);
|
||||||
m_hCursor = LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_ARROWS));
|
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;
|
ULONG ulBitmapInforLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1;
|
||||||
m_BitmapInfor_Full = (BITMAPINFO *) new BYTE[ulBitmapInforLength];
|
m_BitmapInfor_Full = (BITMAPINFO *) new BYTE[ulBitmapInforLength];
|
||||||
|
m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1);
|
||||||
memcpy(m_BitmapInfor_Full, m_ContextObject->InDeCompressedBuffer.GetBuffer(1), ulBitmapInforLength);
|
|
||||||
|
|
||||||
m_bIsCtrl = FALSE;
|
m_bIsCtrl = FALSE;
|
||||||
m_bIsTraceCursor = FALSE;
|
m_bIsTraceCursor = FALSE;
|
||||||
@@ -78,7 +77,7 @@ CScreenSpyDlg::~CScreenSpyDlg()
|
|||||||
}
|
}
|
||||||
|
|
||||||
::ReleaseDC(m_hWnd, m_hFullDC); //GetDC
|
::ReleaseDC(m_hWnd, m_hFullDC); //GetDC
|
||||||
::DeleteDC(m_hFullMemDC); //Createƥ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>DC
|
::DeleteDC(m_hFullMemDC); //Create匹配内存DC
|
||||||
|
|
||||||
::DeleteObject(m_BitmapHandle);
|
::DeleteObject(m_BitmapHandle);
|
||||||
if (m_BitmapData_Full!=NULL)
|
if (m_BitmapData_Full!=NULL)
|
||||||
@@ -108,7 +107,7 @@ BEGIN_MESSAGE_MAP(CScreenSpyDlg, CDialog)
|
|||||||
END_MESSAGE_MAP()
|
END_MESSAGE_MAP()
|
||||||
|
|
||||||
|
|
||||||
// CScreenSpyDlg <EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// CScreenSpyDlg 消息处理程序
|
||||||
|
|
||||||
|
|
||||||
BOOL CScreenSpyDlg::OnInitDialog()
|
BOOL CScreenSpyDlg::OnInitDialog()
|
||||||
@@ -117,37 +116,37 @@ BOOL CScreenSpyDlg::OnInitDialog()
|
|||||||
SetIcon(m_hIcon,FALSE);
|
SetIcon(m_hIcon,FALSE);
|
||||||
|
|
||||||
CString strString;
|
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);
|
m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight);
|
||||||
SetWindowText(strString);
|
SetWindowText(strString);
|
||||||
|
|
||||||
m_hFullDC = ::GetDC(m_hWnd);
|
m_hFullDC = ::GetDC(m_hWnd);
|
||||||
m_hFullMemDC = CreateCompatibleDC(m_hFullDC);
|
m_hFullMemDC = CreateCompatibleDC(m_hFullDC);
|
||||||
m_BitmapHandle = CreateDIBSection(m_hFullDC, m_BitmapInfor_Full,
|
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
|
SetScrollRange(SB_VERT, 0, m_BitmapInfor_Full->bmiHeader.biHeight);//1366 768
|
||||||
|
|
||||||
CMenu* SysMenu = GetSystemMenu(FALSE);
|
CMenu* SysMenu = GetSystemMenu(FALSE);
|
||||||
if (SysMenu != NULL)
|
if (SysMenu != NULL)
|
||||||
{
|
{
|
||||||
SysMenu->AppendMenu(MF_SEPARATOR);
|
SysMenu->AppendMenu(MF_SEPARATOR);
|
||||||
SysMenu->AppendMenu(MF_STRING, IDM_CONTROL, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ(&Y)");
|
SysMenu->AppendMenu(MF_STRING, IDM_CONTROL, "控制屏幕(&Y)");
|
||||||
SysMenu->AppendMenu(MF_STRING, IDM_FULLSCREEN, "ȫ<EFBFBD><EFBFBD>(&F)");
|
SysMenu->AppendMenu(MF_STRING, IDM_FULLSCREEN, "全屏(&F)");
|
||||||
SysMenu->AppendMenu(MF_STRING, IDM_TRACE_CURSOR, "<EFBFBD><EFBFBD><EFBFBD>ٱ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&T)");
|
SysMenu->AppendMenu(MF_STRING, IDM_TRACE_CURSOR, "跟踪被控端鼠标(&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_BLOCK_INPUT, "锁定被控端鼠标和键盘(&L)");
|
||||||
SysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&S)");
|
SysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, "保存快照(&S)");
|
||||||
SysMenu->AppendMenu(MF_SEPARATOR);
|
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_GET_CLIPBOARD, "获取剪贴板(&R)");
|
||||||
SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(&L)");
|
SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "设置剪贴板(&L)");
|
||||||
SysMenu->AppendMenu(MF_SEPARATOR);
|
SysMenu->AppendMenu(MF_SEPARATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_bIsCtrl = FALSE; //<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD>
|
m_bIsCtrl = FALSE; //不是控制
|
||||||
m_bIsTraceCursor = FALSE; //<EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD>
|
m_bIsTraceCursor = FALSE; //不是跟踪
|
||||||
m_ClientCursorPos.x = 0;
|
m_ClientCursorPos.x = 0;
|
||||||
m_ClientCursorPos.y = 0;
|
m_ClientCursorPos.y = 0;
|
||||||
m_bCursorIndex = 0;
|
m_bCursorIndex = 0;
|
||||||
@@ -177,7 +176,7 @@ VOID CScreenSpyDlg::OnReceiveComplete()
|
|||||||
{
|
{
|
||||||
assert (m_ContextObject);
|
assert (m_ContextObject);
|
||||||
|
|
||||||
switch(m_ContextObject->InDeCompressedBuffer.GetBuffer()[0])
|
switch(m_ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case TOKEN_FIRSTSCREEN:
|
case TOKEN_FIRSTSCREEN:
|
||||||
{
|
{
|
||||||
@@ -186,7 +185,7 @@ VOID CScreenSpyDlg::OnReceiveComplete()
|
|||||||
}
|
}
|
||||||
case TOKEN_NEXTSCREEN:
|
case TOKEN_NEXTSCREEN:
|
||||||
{
|
{
|
||||||
if (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[1]==ALGORITHM_DIFF)
|
if (m_ContextObject->InDeCompressedBuffer.GetBYTE(1)==ALGORITHM_DIFF)
|
||||||
{
|
{
|
||||||
DrawNextScreenDiff();
|
DrawNextScreenDiff();
|
||||||
}
|
}
|
||||||
@@ -194,8 +193,8 @@ VOID CScreenSpyDlg::OnReceiveComplete()
|
|||||||
}
|
}
|
||||||
case TOKEN_CLIPBOARD_TEXT:
|
case TOKEN_CLIPBOARD_TEXT:
|
||||||
{
|
{
|
||||||
UpdateServerClipboard((char*)m_ContextObject->InDeCompressedBuffer.GetBuffer(1),
|
Buffer str = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(1);
|
||||||
m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1);
|
UpdateServerClipboard(str.c_str(), str.length());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,19 +204,19 @@ VOID CScreenSpyDlg::DrawFirstScreen(void)
|
|||||||
{
|
{
|
||||||
m_bIsFirst = FALSE;
|
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>
|
//得到被控端发来的数据 ,将他拷贝到HBITMAP的缓冲区中,这样一个图像就出现了
|
||||||
memcpy(m_BitmapData_Full, m_ContextObject->InDeCompressedBuffer.GetBuffer(1), m_BitmapInfor_Full->bmiHeader.biSizeImage);
|
|
||||||
|
|
||||||
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)
|
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>ȥ
|
//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>˸
|
//根据鼠标是否移动和屏幕是否变化判断是否重绘鼠标,防止鼠标闪烁
|
||||||
BOOL bChange = FALSE;
|
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 FirstScreenData = m_BitmapData_Full;
|
||||||
LPVOID NextScreenData = m_ContextObject->InDeCompressedBuffer.GetBuffer(ulHeadLength);
|
LPVOID NextScreenData = m_ContextObject->InDeCompressedBuffer.GetBuffer(ulHeadLength);
|
||||||
ULONG NextScreenLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - ulHeadLength;
|
ULONG NextScreenLength = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - ulHeadLength;
|
||||||
@@ -226,30 +225,30 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(void)
|
|||||||
memcpy(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT));
|
memcpy(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT));
|
||||||
memcpy(&m_ClientCursorPos, m_ContextObject->InDeCompressedBuffer.GetBuffer(2), 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)
|
if (memcmp(&OldClientCursorPos, &m_ClientCursorPos, sizeof(POINT)) != 0)
|
||||||
{
|
{
|
||||||
bChange = TRUE;
|
bChange = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>仯
|
// 光标类型发生变化
|
||||||
BYTE bOldCursorIndex = m_bCursorIndex;
|
BYTE bOldCursorIndex = m_bCursorIndex;
|
||||||
m_bCursorIndex = m_ContextObject->InDeCompressedBuffer.GetBuffer(2+sizeof(POINT))[0];
|
m_bCursorIndex = m_ContextObject->InDeCompressedBuffer.GetBuffer(2+sizeof(POINT))[0];
|
||||||
if (bOldCursorIndex != m_bCursorIndex)
|
if (bOldCursorIndex != m_bCursorIndex)
|
||||||
{
|
{
|
||||||
bChange = TRUE;
|
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));
|
SetClassLong(m_hWnd, GCL_HCURSOR, (LONG)m_CursorInfo.getCursorHandle(m_bCursorIndex == (BYTE)-1 ? 1 : m_bCursorIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>Ļ<EFBFBD>Ƿ<EFBFBD><EFBFBD>仯
|
// 屏幕是否变化
|
||||||
if (NextScreenLength > 0)
|
if (NextScreenLength > 0)
|
||||||
{
|
{
|
||||||
bChange = TRUE;
|
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
|
//lodsd指令从ESI指向的内存位置4个字节内容放入EAX中并且下移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>ַ
|
//movsb指令字节传送数据,通过SI和DI这两个寄存器控制字符串的源地址和目标地址
|
||||||
//m_rectBuffer [0002 esi0002 esi000A 000C] [][]edi[][][][][][][][][][][][][][][][][]
|
//m_rectBuffer [0002 esi0002 esi000A 000C] [][]edi[][][][][][][][][][][][][][][][][]
|
||||||
__asm
|
__asm
|
||||||
{
|
{
|
||||||
@@ -258,15 +257,15 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(void)
|
|||||||
jmp CopyEnd
|
jmp CopyEnd
|
||||||
CopyNextBlock:
|
CopyNextBlock:
|
||||||
mov edi, [FirstScreenData]
|
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>
|
lodsd // 把lpNextScreen的第一个双字节,放到eax中,就是DIB中改变区域的偏移
|
||||||
add edi, eax // lpFirstScreenƫ<EFBFBD><EFBFBD>eax
|
add edi, eax // lpFirstScreen偏移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中, 就是改变区域的大小
|
||||||
mov ecx, eax
|
mov ecx, eax
|
||||||
sub ebx, 8 // ebx <EFBFBD><EFBFBD>ȥ <20><><EFBFBD><EFBFBD>dword
|
sub ebx, 8 // ebx 减去 两个dword
|
||||||
sub ebx, ecx // ebx <EFBFBD><EFBFBD>ȥDIB<EFBFBD><EFBFBD><EFBFBD>ݵĴ<EFBFBD>С
|
sub ebx, ecx // ebx 减去DIB数据的大小
|
||||||
rep movsb
|
rep movsb
|
||||||
CopyEnd:
|
CopyEnd:
|
||||||
cmp ebx, 0 // <EFBFBD>Ƿ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
cmp ebx, 0 // 是否写入完毕
|
||||||
jnz CopyNextBlock
|
jnz CopyNextBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,7 +282,7 @@ void CScreenSpyDlg::OnPaint()
|
|||||||
|
|
||||||
if (m_bIsFirst)
|
if (m_bIsFirst)
|
||||||
{
|
{
|
||||||
DrawTipString("<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>......");
|
DrawTipString("请等待......");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,11 +312,11 @@ VOID CScreenSpyDlg::DrawTipString(CString strString)
|
|||||||
{
|
{
|
||||||
RECT Rect;
|
RECT Rect;
|
||||||
GetClientRect(&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 BackgroundColor = RGB(0x00, 0x00, 0x00);
|
||||||
COLORREF OldBackgroundColor = SetBkColor(m_hFullDC, BackgroundColor);
|
COLORREF OldBackgroundColor = SetBkColor(m_hFullDC, BackgroundColor);
|
||||||
COLORREF OldTextColor = SetTextColor(m_hFullDC, RGB(0xff,0x00,0x00));
|
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);
|
ExtTextOut(m_hFullDC, 0, 0, ETO_OPAQUE, &Rect, NULL, 0, NULL);
|
||||||
|
|
||||||
DrawText (m_hFullDC, strString, -1, &Rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
|
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)
|
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);
|
CMenu* SysMenu = GetSystemMenu(FALSE);
|
||||||
|
|
||||||
switch (nID)
|
switch (nID)
|
||||||
@@ -340,27 +339,27 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|||||||
SysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED);
|
SysMenu->CheckMenuItem(IDM_CONTROL, m_bIsCtrl ? MF_CHECKED : MF_UNCHECKED);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IDM_FULLSCREEN: // ȫ<EFBFBD><EFBFBD>
|
case IDM_FULLSCREEN: // 全屏
|
||||||
{
|
{
|
||||||
EnterFullScreen();
|
EnterFullScreen();
|
||||||
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_CHECKED); //<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʽ
|
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_CHECKED); //菜单样式
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IDM_SAVEDIB: // <EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>
|
case IDM_SAVEDIB: // 快照保存
|
||||||
{
|
{
|
||||||
SaveSnapshot();
|
SaveSnapshot();
|
||||||
break;
|
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>
|
m_bIsTraceCursor = !m_bIsTraceCursor; //这里在改变数据
|
||||||
SysMenu->CheckMenuItem(IDM_TRACE_CURSOR, m_bIsTraceCursor ? MF_CHECKED : MF_UNCHECKED);//<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><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 重绘消除或显示鼠标
|
||||||
OnPaint();
|
OnPaint();
|
||||||
break;
|
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;
|
BOOL bIsChecked = SysMenu->GetMenuState(IDM_BLOCK_INPUT, MF_BYCOMMAND) & MF_CHECKED;
|
||||||
SysMenu->CheckMenuItem(IDM_BLOCK_INPUT, bIsChecked ? MF_UNCHECKED : 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));
|
m_iocpServer->OnClientPreSending(m_ContextObject, bToken, sizeof(bToken));
|
||||||
break;
|
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;
|
BYTE bToken = COMMAND_SCREEN_GET_CLIPBOARD;
|
||||||
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(bToken));
|
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(bToken));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IDM_SET_CLIPBOARD: //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
case IDM_SET_CLIPBOARD: //给他
|
||||||
{
|
{
|
||||||
SendServerClipboard();
|
SendServerClipboard();
|
||||||
break;
|
break;
|
||||||
@@ -416,7 +415,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
|
|||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
case WM_SYSKEYDOWN:
|
case WM_SYSKEYDOWN:
|
||||||
case WM_SYSKEYUP:
|
case WM_SYSKEYUP:
|
||||||
if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: <EFBFBD>˳<EFBFBD>ȫ<EFBFBD><EFBFBD>
|
if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: 退出全屏
|
||||||
return TRUE;
|
return TRUE;
|
||||||
if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN)
|
if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN)
|
||||||
{
|
{
|
||||||
@@ -428,7 +427,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
|
|||||||
SendCommand(&Msg);
|
SendCommand(&Msg);
|
||||||
}
|
}
|
||||||
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
|
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
|
||||||
return TRUE;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Enter<EFBFBD><EFBFBD>ESC<EFBFBD>رնԻ<EFBFBD>
|
return TRUE;// 屏蔽Enter和ESC关闭对话
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,7 +451,7 @@ VOID CScreenSpyDlg::SendCommand(MSG* Msg)
|
|||||||
BOOL CScreenSpyDlg::SaveSnapshot(void)
|
BOOL CScreenSpyDlg::SaveSnapshot(void)
|
||||||
{
|
{
|
||||||
CString strFileName = m_strClientIP + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.bmp");
|
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)
|
if(Dlg.DoModal () != IDOK)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@@ -464,12 +463,12 @@ BOOL CScreenSpyDlg::SaveSnapshot(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// BITMAPINFO<EFBFBD><EFBFBD>С
|
// BITMAPINFO大小
|
||||||
//+ (BitMapInfor->bmiHeader.biBitCount > 16 ? 1 : (1 << BitMapInfor->bmiHeader.biBitCount)) * sizeof(RGBQUAD)
|
//+ (BitMapInfor->bmiHeader.biBitCount > 16 ? 1 : (1 << BitMapInfor->bmiHeader.biBitCount)) * sizeof(RGBQUAD)
|
||||||
//bmp fjkdfj dkfjkdfj [][][][]
|
//bmp fjkdfj dkfjkdfj [][][][]
|
||||||
int nbmiSize = sizeof(BITMAPINFO);
|
int nbmiSize = sizeof(BITMAPINFO);
|
||||||
|
|
||||||
//Э<EFBFBD><EFBFBD> TCP У<EFBFBD><EFBFBD>ֵ
|
//协议 TCP 校验值
|
||||||
BitMapFileHeader.bfType = ((WORD) ('M' << 8) | 'B');
|
BitMapFileHeader.bfType = ((WORD) ('M' << 8) | 'B');
|
||||||
BitMapFileHeader.bfSize = BitMapInfor->bmiHeader.biSizeImage + sizeof(BitMapFileHeader); //8421
|
BitMapFileHeader.bfSize = BitMapInfor->bmiHeader.biSizeImage + sizeof(BitMapFileHeader); //8421
|
||||||
BitMapFileHeader.bfReserved1 = 0; //8000
|
BitMapFileHeader.bfReserved1 = 0; //8000
|
||||||
@@ -506,16 +505,16 @@ VOID CScreenSpyDlg::UpdateServerClipboard(char *szBuffer,ULONG ulLength)
|
|||||||
|
|
||||||
VOID CScreenSpyDlg::SendServerClipboard(void)
|
VOID CScreenSpyDlg::SendServerClipboard(void)
|
||||||
{
|
{
|
||||||
if (!::OpenClipboard(NULL)) //<EFBFBD><EFBFBD><EFBFBD>а<EFBFBD><EFBFBD>豸
|
if (!::OpenClipboard(NULL)) //打开剪切板设备
|
||||||
return;
|
return;
|
||||||
HGLOBAL hGlobal = GetClipboardData(CF_TEXT); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
HGLOBAL hGlobal = GetClipboardData(CF_TEXT); //代表着一个内存
|
||||||
if (hGlobal == NULL)
|
if (hGlobal == NULL)
|
||||||
{
|
{
|
||||||
::CloseClipboard();
|
::CloseClipboard();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int iPacketLength = GlobalSize(hGlobal) + 1;
|
int iPacketLength = GlobalSize(hGlobal) + 1;
|
||||||
char* szClipboardVirtualAddress = (LPSTR) GlobalLock(hGlobal); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
char* szClipboardVirtualAddress = (LPSTR) GlobalLock(hGlobal); //锁定
|
||||||
LPBYTE szBuffer = new BYTE[iPacketLength];
|
LPBYTE szBuffer = new BYTE[iPacketLength];
|
||||||
|
|
||||||
szBuffer[0] = COMMAND_SCREEN_SET_CLIPBOARD;
|
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()
|
bool CScreenSpyDlg::LeaveFullScreen()
|
||||||
{
|
{
|
||||||
if (m_bFullScreen)
|
if (m_bFullScreen)
|
||||||
{
|
{
|
||||||
SetWindowPlacement(&m_struOldWndpl);
|
SetWindowPlacement(&m_struOldWndpl);
|
||||||
CMenu *SysMenu = GetSystemMenu(FALSE);
|
CMenu *SysMenu = GetSystemMenu(FALSE);
|
||||||
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_UNCHECKED); //<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʽ
|
SysMenu->CheckMenuItem(IDM_FULLSCREEN, MF_UNCHECKED); //菜单样式
|
||||||
m_bFullScreen = false;
|
m_bFullScreen = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ BOOL CServicesDlg::OnInitDialog()
|
|||||||
|
|
||||||
int CServicesDlg::ShowServicesList(void)
|
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 *szDisplayName;
|
||||||
char *szServiceName;
|
char *szServiceName;
|
||||||
char *szRunWay;
|
char *szRunWay;
|
||||||
@@ -169,7 +170,7 @@ void CServicesDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)
|
|||||||
|
|
||||||
void CServicesDlg::OnReceiveComplete(void)
|
void CServicesDlg::OnReceiveComplete(void)
|
||||||
{
|
{
|
||||||
switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
|
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case TOKEN_SERVERLIST:
|
case TOKEN_SERVERLIST:
|
||||||
ShowServicesList();
|
ShowServicesList();
|
||||||
|
|||||||
@@ -83,7 +83,8 @@ VOID CShellDlg::AddKeyBoardData(void)
|
|||||||
//Hello>dir
|
//Hello>dir
|
||||||
//Shit\0
|
//Shit\0
|
||||||
m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //<2F>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>\0
|
m_ContextObject->InDeCompressedBuffer.WriteBuffer((LPBYTE)"", 1); //<2F>ӱ<EFBFBD><D3B1><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>\0
|
||||||
CString strResult = (char*)m_ContextObject->InDeCompressedBuffer.GetBuffer(0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> \0
|
Buffer tmp = m_ContextObject->InDeCompressedBuffer.GetMyBuffer(0);
|
||||||
|
CString strResult = tmp.c_str(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> \0
|
||||||
|
|
||||||
//<2F>滻<EFBFBD><E6BBBB>ԭ<EFBFBD><D4AD><EFBFBD>Ļ<EFBFBD><C4BB>з<EFBFBD> <20><><EFBFBD><EFBFBD>cmd <20>Ļ<EFBFBD><C4BB><EFBFBD>ͬw32<33>µı༭<C4B1>ؼ<EFBFBD><D8BC>Ļ<EFBFBD><C4BB>з<EFBFBD><D0B7><EFBFBD>һ<EFBFBD><D2BB> <20><><EFBFBD>еĻس<C4BB><D8B3><EFBFBD><EFBFBD><EFBFBD>
|
//<2F>滻<EFBFBD><E6BBBB>ԭ<EFBFBD><D4AD><EFBFBD>Ļ<EFBFBD><C4BB>з<EFBFBD> <20><><EFBFBD><EFBFBD>cmd <20>Ļ<EFBFBD><C4BB><EFBFBD>ͬw32<33>µı༭<C4B1>ؼ<EFBFBD><D8BC>Ļ<EFBFBD><C4BB>з<EFBFBD><D0B7><EFBFBD>һ<EFBFBD><D2BB> <20><><EFBFBD>еĻس<C4BB><D8B3><EFBFBD><EFBFBD><EFBFBD>
|
||||||
strResult.Replace("\n", "\r\n");
|
strResult.Replace("\n", "\r\n");
|
||||||
|
|||||||
@@ -22,8 +22,7 @@ IMPLEMENT_DYNAMIC(CSystemDlg, CDialog)
|
|||||||
m_ContextObject = ContextObject;
|
m_ContextObject = ContextObject;
|
||||||
m_iocpServer = IOCPServer;
|
m_iocpServer = IOCPServer;
|
||||||
|
|
||||||
char *lpBuffer = (char *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(0)); //<2F><><EFBFBD>ض˴<D8B6><CBB4>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
m_bHow= m_ContextObject->InDeCompressedBuffer.GetBYTE(0);
|
||||||
m_bHow=lpBuffer[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CSystemDlg::~CSystemDlg()
|
CSystemDlg::~CSystemDlg()
|
||||||
@@ -90,7 +89,8 @@ BOOL CSystemDlg::OnInitDialog()
|
|||||||
|
|
||||||
void CSystemDlg::ShowWindowsList(void)
|
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;
|
DWORD dwOffset = 0;
|
||||||
char *szTitle = NULL;
|
char *szTitle = NULL;
|
||||||
bool isDel=false;
|
bool isDel=false;
|
||||||
@@ -120,7 +120,8 @@ void CSystemDlg::ShowWindowsList(void)
|
|||||||
|
|
||||||
void CSystemDlg::ShowProcessList(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 *szExeFile;
|
||||||
char *szProcessFullPath;
|
char *szProcessFullPath;
|
||||||
DWORD dwOffset = 0;
|
DWORD dwOffset = 0;
|
||||||
@@ -270,7 +271,7 @@ void CSystemDlg::GetWindowsList(void)
|
|||||||
|
|
||||||
void CSystemDlg::OnReceiveComplete(void)
|
void CSystemDlg::OnReceiveComplete(void)
|
||||||
{
|
{
|
||||||
switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
|
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case TOKEN_PSLIST:
|
case TOKEN_PSLIST:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -139,8 +139,7 @@ void CVideoDlg::ResetScreen(void)
|
|||||||
|
|
||||||
int iBitMapInforSize = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1;
|
int iBitMapInforSize = m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1;
|
||||||
m_BitmapInfor_Full = (LPBITMAPINFO) new BYTE[iBitMapInforSize];
|
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_BitmapData_Full = new BYTE[m_BitmapInfor_Full->bmiHeader.biSizeImage];
|
||||||
m_BitmapCompressedData_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;
|
++m_nCount;
|
||||||
|
|
||||||
switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
|
switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0))
|
||||||
{
|
{
|
||||||
case TOKEN_WEBCAM_DIB:
|
case TOKEN_WEBCAM_DIB:
|
||||||
{
|
{
|
||||||
@@ -270,7 +269,8 @@ void CVideoDlg::DrawDIB(void)
|
|||||||
|
|
||||||
const int nHeadLen = 1 + 1 + 4;
|
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();
|
UINT ulBufferLen = m_ContextObject->InDeCompressedBuffer.GetBufferLength();
|
||||||
if (szBuffer[1] == 0) // û<>о<EFBFBD><D0BE><EFBFBD>H263ѹ<33><D1B9><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
if (szBuffer[1] == 0) // û<>о<EFBFBD><D0BE><EFBFBD>H263ѹ<33><D1B9><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user