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

@@ -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();
@@ -542,6 +542,7 @@ 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);
@@ -888,7 +889,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 +957,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 +971,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 +999,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");

View File

@@ -81,7 +81,7 @@ public:
NOTIFYICONDATA m_Nid; NOTIFYICONDATA m_Nid;
#endif #endif
CRITICAL_SECTION m_cs; CRITICAL_SECTION m_cs;
BOOL isClosed;
UINT m_iCount; 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);

View File

@@ -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;
} }

View File

@@ -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;
}

View File

@@ -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>
}; };

View File

@@ -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);

View File

@@ -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:

View File

@@ -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;// 屏蔽EnterESC关闭对话
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;
} }

View File

@@ -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();

View File

@@ -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");

View File

@@ -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:
{ {

View File

@@ -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>
{ {