Merge pull request #67 from yuanyuanxiang/bugFix
fix: #64 Size of MSG is different on Win32 and Win64
This commit is contained in:
@@ -273,17 +273,24 @@ VOID CScreenManager::SendNextScreen(const char* szBuffer, ULONG ulNextSendLength
|
||||
|
||||
VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength)
|
||||
{
|
||||
// <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>Ϸ<EFBFBD>
|
||||
if (ulLength % sizeof(MSG) != 0)
|
||||
return;
|
||||
int msgSize = sizeof(MSG64);
|
||||
if (ulLength % 28 == 0) // 32λ<32><CEBB><EFBFBD>ƶ˷<C6B6><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
msgSize = 28;
|
||||
else if (ulLength % 48 == 0) // 64λ<34><CEBB><EFBFBD>ƶ˷<C6B6><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
msgSize = 48;
|
||||
else return; // <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>Ϸ<EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ULONG ulMsgCount = ulLength / sizeof(MSG);
|
||||
ULONG ulMsgCount = ulLength / msgSize;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for (int i = 0; i < ulMsgCount; ++i)
|
||||
BYTE* ptr = szBuffer;
|
||||
MSG32 msg32;
|
||||
MSG64 msg64;
|
||||
for (int i = 0; i < ulMsgCount; ++i, ptr += msgSize)
|
||||
{
|
||||
MSG *Msg = (MSG *)(szBuffer + i * sizeof(MSG));
|
||||
MSG64* Msg = msgSize == 48 ? (MSG64*)ptr :
|
||||
(MSG64*)msg64.Create(msg32.Create(ptr, msgSize));
|
||||
switch (Msg->message)
|
||||
{
|
||||
case WM_LBUTTONDOWN:
|
||||
|
||||
@@ -241,3 +241,86 @@ inline bool WriteBitmap(LPBITMAPINFO bmpInfo, const void* bmpData, const std::st
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef _WINDOWS
|
||||
#include <afxwin.h>
|
||||
#else
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#endif
|
||||
class MSG32 { // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(32λ)
|
||||
public:
|
||||
uint32_t hwnd;
|
||||
uint32_t message;
|
||||
uint32_t wParam;
|
||||
uint32_t lParam;
|
||||
uint32_t time;
|
||||
POINT pt;
|
||||
|
||||
MSG32(const void* buffer, int size) {
|
||||
if (size == sizeof(MSG32)) {
|
||||
memcpy(this, buffer, sizeof(MSG32));
|
||||
}
|
||||
else {
|
||||
memset(this, 0, sizeof(MSG32));
|
||||
}
|
||||
}
|
||||
|
||||
MSG32() {
|
||||
memset(this, 0, sizeof(MSG32));
|
||||
}
|
||||
|
||||
MSG32* Create(const void* buffer, int size) {
|
||||
if (size == sizeof(MSG32)) {
|
||||
memcpy(this, buffer, sizeof(MSG32));
|
||||
}
|
||||
else {
|
||||
memset(this, 0, sizeof(MSG32));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
// Windows <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϢMSG<53><47>32λ<32><CEBB>64λϵͳ<CFB5>´<EFBFBD>С<EFBFBD><D0A1>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD>ƽ̨<C6BD>ܹ<EFBFBD>Զ<EFBFBD>̿<EFBFBD><CCBF><EFBFBD><EFBFBD>쳣
|
||||
// <20><>Ҫʹ<D2AA><CAB9><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(ͳһ<CDB3><D2BB><EFBFBD><EFBFBD>64λwindows <20><>MSG<53><47><EFBFBD><EFBFBD>)
|
||||
class MSG64 { // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ(64λ)
|
||||
public:
|
||||
uint64_t hwnd;
|
||||
uint64_t message;
|
||||
uint64_t wParam;
|
||||
uint64_t lParam;
|
||||
uint64_t time;
|
||||
POINT pt;
|
||||
|
||||
MSG64(const MSG& msg) :hwnd((uint64_t)msg.hwnd), message(msg.message), wParam(msg.wParam),
|
||||
lParam(msg.lParam), time(msg.time), pt(msg.pt) {}
|
||||
|
||||
MSG64(const MSG32& msg) :hwnd((uint64_t)msg.hwnd), message(msg.message), wParam(msg.wParam),
|
||||
lParam(msg.lParam), time(msg.time), pt(msg.pt) {}
|
||||
|
||||
MSG64(const void* buffer, int size) {
|
||||
if (size == sizeof(MSG64)) {
|
||||
memcpy(this, buffer, sizeof(MSG64));
|
||||
}
|
||||
else {
|
||||
memset(this, 0, sizeof(MSG64));
|
||||
}
|
||||
}
|
||||
|
||||
MSG64() {
|
||||
memset(this, 0, sizeof(MSG64));
|
||||
}
|
||||
|
||||
MSG64* Create(const MSG32* msg32) {
|
||||
hwnd = msg32->hwnd;
|
||||
message = msg32->message;
|
||||
wParam = msg32->wParam;
|
||||
lParam = msg32->lParam;
|
||||
time = msg32->time;
|
||||
pt = msg32->pt;
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -535,8 +535,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
|
||||
case WM_MBUTTONUP:
|
||||
case WM_MOUSEWHEEL:
|
||||
{
|
||||
MSG Msg;
|
||||
memcpy(&Msg, pMsg, sizeof(MSG));
|
||||
MSG64 Msg(*pMsg);
|
||||
Msg.lParam = MAKEDWORD(HIWORD(pMsg->lParam) + m_ulVScrollPos, LOWORD(pMsg->lParam) + m_ulHScrollPos);
|
||||
Msg.pt.x += m_ulHScrollPos;
|
||||
Msg.pt.y += m_ulVScrollPos;
|
||||
@@ -551,8 +550,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
|
||||
return TRUE;
|
||||
if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN)
|
||||
{
|
||||
MSG Msg;
|
||||
memcpy(&Msg, pMsg, sizeof(MSG));
|
||||
MSG64 Msg(*pMsg);
|
||||
Msg.lParam = MAKEDWORD(HIWORD(pMsg->lParam) + m_ulVScrollPos, LOWORD(pMsg->lParam) + m_ulHScrollPos);
|
||||
Msg.pt.x += m_ulHScrollPos;
|
||||
Msg.pt.y += m_ulVScrollPos;
|
||||
@@ -567,15 +565,15 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
|
||||
}
|
||||
|
||||
|
||||
VOID CScreenSpyDlg::SendCommand(MSG* Msg)
|
||||
VOID CScreenSpyDlg::SendCommand(const MSG64* Msg)
|
||||
{
|
||||
if (!m_bIsCtrl)
|
||||
return;
|
||||
|
||||
const int length = sizeof(MSG) + 1;
|
||||
const int length = sizeof(MSG64) + 1;
|
||||
BYTE szData[length + 3];
|
||||
szData[0] = COMMAND_SCREEN_CONTROL;
|
||||
memcpy(szData + 1, Msg, sizeof(MSG));
|
||||
memcpy(szData + 1, Msg, sizeof(MSG64));
|
||||
szData[length] = 0;
|
||||
m_iocpServer->OnClientPreSending(m_ContextObject, szData, length);
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
CString m_strClientIP;
|
||||
BOOL m_bIsTraceCursor;
|
||||
CCursorInfo m_CursorInfo; //<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ϵͳ<CFB5>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>
|
||||
VOID SendCommand(MSG* Msg);
|
||||
VOID SendCommand(const MSG64* Msg);
|
||||
|
||||
VOID UpdateServerClipboard(char *szBuffer,ULONG ulLength);
|
||||
VOID SendServerClipboard(void);
|
||||
|
||||
Reference in New Issue
Block a user