Files
SimpleRemoter/client/FileManager.cpp

498 lines
12 KiB
C++
Raw Normal View History

// FileManager.cpp: implementation of the CFileManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FileManager.h"
#include "Common.h"
#include <Shellapi.h>
#include <IOSTREAM>
using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileManager::CFileManager(IOCPClient* ClientObject, int n):CManager(ClientObject)
{
m_ulTransferMode = TRANSFER_MODE_NORMAL;
SendDiskDriverList();
}
ULONG CFileManager::SendDiskDriverList() //<2F><><EFBFBD>ñ<EFBFBD><C3B1>ض˵Ĵ<CBB5><C4B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
char szDiskDriverString[0x500] = {0};
// ǰһ<C7B0><D2BB><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>Ϣ<EFBFBD><CFA2><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>52<35>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BYTE szBuffer[0x1000] = {0};
char szFileSystem[MAX_PATH] = {0};
char *Travel = NULL;
szBuffer[0] = TOKEN_DRIVE_LIST; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
GetLogicalDriveStrings(sizeof(szDiskDriverString), szDiskDriverString);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//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; // <20>ܴ<EFBFBD>С
unsigned long ulHardDiskFreeMB = 0; // ʣ<><CAA3><EFBFBD>ռ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//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
//ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dwOffset<65><74><EFBFBD>ܴ<EFBFBD>0 <20><>Ϊ0<CEAA><30>λ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
DWORD dwOffset = 1;
for (; *Travel != '\0'; Travel += lstrlen(Travel) + 1) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+1Ϊ<31>˹<EFBFBD>\0
{
memset(szFileSystem, 0, sizeof(szFileSystem));
// <20>õ<EFBFBD><C3B5>ļ<EFBFBD>ϵͳ<CFB5><CDB3>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>С
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>С
if (Travel[0] != 'A' && Travel[0] != 'B'
&& GetDiskFreeSpaceEx(Travel, (PULARGE_INTEGER)&ulHardDiskFreeSpace,
(PULARGE_INTEGER)&ulHardDiskAmount, NULL))
{
ulHardDiskAmountMB = ulHardDiskAmount / 1024 / 1024; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>Ҫת<D2AA><D7AA><EFBFBD><EFBFBD>G
ulHardDiskFreeMB = ulHardDiskFreeSpace / 1024 / 1024;
}
else
{
ulHardDiskAmountMB = 0;
ulHardDiskFreeMB = 0;
}
// <20><>ʼ<EFBFBD><CABC>ֵ
szBuffer[dwOffset] = Travel[0]; //<2F>̷<EFBFBD>
szBuffer[dwOffset + 1] = GetDriveType(Travel); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>̿ռ<CCBF><D5BC><EFBFBD><EFBFBD><EFBFBD>ռȥ<D5BC><C8A5>8<EFBFBD>ֽ<EFBFBD>
memcpy(szBuffer + dwOffset + 2, &ulHardDiskAmountMB, sizeof(unsigned long));
memcpy(szBuffer + dwOffset + 6, &ulHardDiskFreeMB, sizeof(unsigned long));
// <20><><EFBFBD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
}
CFileManager::~CFileManager()
{
2019-01-10 19:35:03 +08:00
cout<<"Զ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n";
}
VOID CFileManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
{
switch(szBuffer[0])
{
case COMMAND_LIST_FILES:
{
SendFilesList((char*)szBuffer + 1); //<2F><>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
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_RENAME_FILE:
{
szBuffer+=1;
char* szExistingFileFullPath = NULL;
char* szNewFileFullPath = NULL;
szNewFileFullPath = szExistingFileFullPath = (char*)szBuffer;
szNewFileFullPath += strlen((char*)szNewFileFullPath)+1;
Rename(szExistingFileFullPath,szNewFileFullPath);
break;
}
}
}
//dkfj C:\1.txt\0 D:\3.txt\0
VOID CFileManager::Rename(char* szExistingFileFullPath,char* szNewFileFullPath)
{
MoveFile(szExistingFileFullPath, szNewFileFullPath);
}
VOID CFileManager::SetTransferMode(LPBYTE szBuffer)
{
memcpy(&m_ulTransferMode, szBuffer, sizeof(m_ulTransferMode));
GetFileData();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С
VOID CFileManager::CreateClientRecvFile(LPBYTE szBuffer)
{
// //[Flag 0001 0001 E:\1.txt\0 ]
FILE_SIZE* FileSize = (FILE_SIZE*)szBuffer;
// <20><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
memset(m_szOperatingFileName, 0,
sizeof(m_szOperatingFileName));
strcpy(m_szOperatingFileName, (char *)szBuffer + 8); //<2F>Ѿ<EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>Ϣͷ<CFA2><CDB7>
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
m_OperatingFileLength =
(FileSize->dwSizeHigh * (MAXDWORD + 1)) + FileSize->dwSizeLow;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
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
)
{
BYTE bToken[1];
bToken[0] = TOKEN_GET_TRANSFER_MODE;
m_ClientObject->OnServerSending((char*)&bToken, sizeof(bToken));
}
else
{
GetFileData(); //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ļ<EFBFBD><C4BC>ͻ<EFBFBD>ִ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
}
FindClose(hFind);
}
VOID CFileManager::WriteClientRecvFile(LPBYTE szBuffer, ULONG ulLength)
{
BYTE *Travel;
DWORD dwNumberOfBytesToWrite = 0;
DWORD dwNumberOfBytesWirte = 0;
int nHeadLength = 9; // 1 + 4 + 4 <20><><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ϊ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>9
FILE_SIZE *FileSize;
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݵ<EFBFBD>ƫ<EFBFBD><C6AB>
Travel = szBuffer + 8;
FileSize = (FILE_SIZE *)szBuffer;
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>ƫ<EFBFBD><C6AB>
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;
// д<><D0B4><EFBFBD>ļ<EFBFBD>
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));
}
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); //<2F><EFBFBD>Ƿ<EFBFBD><C7B7>Ƿ<EFBFBD>Ŀ¼ Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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)
{
// <20><><EFBFBD>ô<EFBFBD><C3B4>ʽ
m_ulTransferMode = TRANSFER_MODE_NORMAL;
ULONG ulRet = 0;
DWORD dwOffset = 0; // λ<><CEBB>ָ<EFBFBD><D6B8>
char *szBuffer = NULL;
ULONG ulLength = 1024 * 10; // <20>ȷ<EFBFBD><C8B7><EFBFBD>10K<30>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
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);
if (hFile == INVALID_HANDLE_VALUE)
{
BYTE bToken = TOKEN_FILE_LIST;
if (szBuffer!=NULL)
{
LocalFree(szBuffer);
szBuffer = NULL;
}
return m_ClientObject->OnServerSending((char*)&bToken, 1); //·<><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
szBuffer[0] = TOKEN_FILE_LIST;
// 1 Ϊ<><CEAA><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ռ<EFBFBD>ֽ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
dwOffset = 1;
/*
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD> strlen(filename) + 1 ('\0')
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>С 4
*/
do
{
// <20><>̬<EFBFBD><CCAC>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (dwOffset > (ulLength - MAX_PATH * 2))
{
ulLength += MAX_PATH * 2;
szBuffer = (char*)LocalReAlloc(szBuffer,
ulLength, LMEM_ZEROINIT|LMEM_MOVEABLE);
}
char* szFileName = wfd.cFileName;
if (strcmp(szFileName, ".") == 0 || strcmp(szFileName, "..") == 0)
continue;
// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> 1 <20>ֽ<EFBFBD>
//[Flag 1 HelloWorld\0<><30>С <20><>С ʱ<><CAB1> ʱ<><CAB1>
// 0 1.txt\0 <20><>С <20><>С ʱ<><CAB1> ʱ<><CAB1>]
*(szBuffer + dwOffset) = wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
dwOffset++;
// <20>ļ<EFBFBD><C4BC><EFBFBD> lstrlen(pszFileName) + 1 <20>ֽ<EFBFBD>
ULONG ulFileNameLength = strlen(szFileName);
memcpy(szBuffer + dwOffset, szFileName, ulFileNameLength);
dwOffset += ulFileNameLength;
*(szBuffer + dwOffset) = 0;
dwOffset++;
// <20>ļ<EFBFBD><C4BC><EFBFBD>С 8 <20>ֽ<EFBFBD>
memcpy(szBuffer + dwOffset, &wfd.nFileSizeHigh, sizeof(DWORD));
memcpy(szBuffer + dwOffset + 4, &wfd.nFileSizeLow, sizeof(DWORD));
dwOffset += 8;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 8 <20>ֽ<EFBFBD>
memcpy(szBuffer + dwOffset, &wfd.ftLastWriteTime, sizeof(FILETIME));
dwOffset += 8;
} while(FindNextFile(hFile, &wfd));
ulRet = m_ClientObject->OnServerSending(szBuffer, dwOffset);
LocalFree(szBuffer);
FindClose(hFile);
return ulRet;
}
VOID CFileManager::GetFileData()
{
int nTransferMode;
switch (m_ulTransferMode) //<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Case<73>е<EFBFBD>
{
case TRANSFER_MODE_OVERWRITE_ALL:
nTransferMode = TRANSFER_MODE_OVERWRITE;
break;
case TRANSFER_MODE_JUMP_ALL:
nTransferMode = TRANSFER_MODE_JUMP; //CreateFile<6C><65>always open<65><6E><EFBFBD><EFBFBD>eixt<78><74>
break;
default:
nTransferMode = m_ulTransferMode; //1. 2 3
}
WIN32_FIND_DATA wfa;
HANDLE hFind = FindFirstFile(m_szOperatingFileName, &wfa);
//1<>ֽ<EFBFBD>Token,<2C><><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>λ
BYTE bToken[9];
DWORD dwCreationDisposition; // <20>ļ<EFBFBD><C4BC>򿪷<EFBFBD>ʽ
memset(bToken, 0, sizeof(bToken));
bToken[0] = TOKEN_DATA_CONTINUE;
// <20>ļ<EFBFBD><C4BC>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
if (hFind != INVALID_HANDLE_VALUE)
{
// <20><><EFBFBD><EFBFBD>
if (nTransferMode == TRANSFER_MODE_OVERWRITE)
{
//ƫ<><C6AB><EFBFBD><EFBFBD>0
memset(bToken + 1, 0, 8);//0000 0000
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>
dwCreationDisposition = CREATE_ALWAYS; //<2F><><EFBFBD>и<EFBFBD><D0B8><EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
else if(nTransferMode == TRANSFER_MODE_JUMP)
{
DWORD dwOffset = -1; //0000 -1
memcpy(bToken + 5, &dwOffset, 4);
dwCreationDisposition = OPEN_EXISTING;
}
}
else
{
memset(bToken + 1, 0, 8); //0000 0000 //û<><C3BB><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>
dwCreationDisposition = CREATE_ALWAYS; //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD>
}
FindClose(hFind);
HANDLE hFile =
CreateFile
(
m_szOperatingFileName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
dwCreationDisposition, //
FILE_ATTRIBUTE_NORMAL,
0
);
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (hFile == INVALID_HANDLE_VALUE)
{
m_OperatingFileLength = 0;
return;
}
CloseHandle(hFile);
m_ClientObject->OnServerSending((char*)&bToken, sizeof(bToken));
}