#include "socketwrapper.h"\r
#include "protectprocess.h"\r
#include "mbswrapper.h"\r
+#include "apiemulator.h"\r
\r
typedef struct\r
{\r
UPDATE_LIST_FILE File[1];\r
} UPDATE_LIST;\r
\r
+#define UPDATE_MAX_LIST_SIZE 1048576\r
+#define UPDATE_MAX_FILE_SIZE 16777216\r
+\r
BOOL ReadFileViaHTTPW(void* pOut, DWORD Length, DWORD* pLength, LPCWSTR UserAgent, LPCWSTR ServerName, LPCWSTR ObjectName)\r
{\r
BOOL bResult;\r
{\r
if(pList)\r
{\r
- if(pBuf = malloc(16777216))\r
+ if(pBuf = malloc(UPDATE_MAX_FILE_SIZE))\r
{\r
- if(LoadMemoryFromFileWithTimestamp(Temp3, pBuf, 16777216, &Length, &Time))\r
+ if(LoadMemoryFromFileWithTimestamp(Temp3, pBuf, UPDATE_MAX_FILE_SIZE, &Length, &Time))\r
{\r
if(GetHashSHA512(pBuf, Length, &Hash))\r
{\r
{\r
if(p = _tcsrchr(Name, _T('\\')))\r
*p = _T('\0');\r
- if(pList = (UPDATE_LIST*)malloc(1048576))\r
+ if(pList = (UPDATE_LIST*)malloc(UPDATE_MAX_LIST_SIZE))\r
{\r
- memset(pList, 0, 1048576);\r
+ memset(pList, 0, UPDATE_MAX_LIST_SIZE);\r
pList->Version = Version;\r
_tcscpy(pList->VersionString, VersionString);\r
_tcscpy(pList->Description, Description);\r
- ListUpdateFile(pList, (1048576 - sizeof(UPDATE_LIST)) / sizeof(UPDATE_LIST_FILE) + 1, ServerPath, Name, NULL);\r
+ ListUpdateFile(pList, (UPDATE_MAX_LIST_SIZE - sizeof(UPDATE_LIST)) / sizeof(UPDATE_LIST_FILE) + 1, ServerPath, Name, NULL);\r
Length = (pList->FileCount - 1) * sizeof(UPDATE_LIST_FILE) + sizeof(UPDATE_LIST);\r
if(SaveMemoryToFileWithTimestamp(ListFile, pList, Length, NULL))\r
{\r
memcpy(&UpdateHash, &Buf2, sizeof(UPDATE_HASH));\r
if(memcmp(&UpdateHash.Signature, UPDATE_SIGNATURE, 64) == 0)\r
{\r
- if(pBuf = malloc(1048576))\r
+ if(pBuf = malloc(UPDATE_MAX_LIST_SIZE))\r
{\r
- if(ReadFileViaHTTP(pBuf, 1048576, &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
+ if(ReadFileViaHTTP(pBuf, UPDATE_MAX_LIST_SIZE, &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
{\r
if(GetHashSHA512(pBuf, Length, &Hash))\r
{\r
BOOL bResult;\r
UPDATE_LIST* pUpdateList;\r
void* pBuf;\r
+ TCHAR LocalDir[MAX_PATH];\r
+ TCHAR* p;\r
DWORD i;\r
BOOL b;\r
+ TCHAR Path[MAX_PATH];\r
DWORD Length;\r
BYTE Hash[64];\r
- TCHAR Path[MAX_PATH];\r
bResult = FALSE;\r
if(ListLength >= sizeof(UPDATE_LIST))\r
{\r
bResult = TRUE;\r
DeleteDirectoryAndContents(DownloadDir);\r
CreateDirectory(DownloadDir, NULL);\r
- if(pBuf = malloc(16777216))\r
+ if(pBuf = malloc(UPDATE_MAX_FILE_SIZE))\r
{\r
+ if(GetModuleFileName(NULL, LocalDir, MAX_PATH) > 0)\r
+ {\r
+ if(p = _tcsrchr(LocalDir, _T('\\')))\r
+ *p = _T('\0');\r
+ }\r
+ else\r
+ _tcscpy(LocalDir, _T("."));\r
for(i = 0; i < pUpdateList->FileCount; i++)\r
{\r
b = FALSE;\r
}\r
if(strlen(pUpdateList->File[i].SrcPath) > 0)\r
{\r
- if(ReadFileViaHTTP(pBuf, 16777216, &Length, HTTP_USER_AGENT, UPDATE_SERVER, pUpdateList->File[i].SrcPath))\r
+ _tcscpy(Path, LocalDir);\r
+ _tcscat(Path, pUpdateList->File[i].DstPath);\r
+ if(LoadMemoryFromFileWithTimestamp(Path, pBuf, UPDATE_MAX_FILE_SIZE, &Length, NULL))\r
{\r
if(GetHashSHA512(pBuf, Length, &Hash))\r
{\r
if(memcmp(&Hash, &pUpdateList->File[i].SrcHash, 64) == 0)\r
+ b = TRUE;\r
+ }\r
+ }\r
+ if(!b)\r
+ {\r
+ if(ReadFileViaHTTP(pBuf, UPDATE_MAX_FILE_SIZE, &Length, HTTP_USER_AGENT, UPDATE_SERVER, pUpdateList->File[i].SrcPath))\r
+ {\r
+ if(GetHashSHA512(pBuf, Length, &Hash))\r
{\r
- _tcscpy(Path, DownloadDir);\r
- _tcscat(Path, pUpdateList->File[i].DstPath);\r
- if(SaveMemoryToFileWithTimestamp(Path, pBuf, Length, &pUpdateList->File[i].Timestamp))\r
- b = TRUE;\r
+ if(memcmp(&Hash, &pUpdateList->File[i].SrcHash, 64) == 0)\r
+ {\r
+ _tcscpy(Path, DownloadDir);\r
+ _tcscat(Path, pUpdateList->File[i].DstPath);\r
+ if(SaveMemoryToFileWithTimestamp(Path, pBuf, Length, &pUpdateList->File[i].Timestamp))\r
+ b = TRUE;\r
+ }\r
}\r
}\r
}\r
_tcscat(Backup, _T("\\"));\r
_tcscat(Backup, BackupDirName);\r
DeleteDirectoryAndContents(Backup);\r
- if(CopyAllFilesInDirectory(DestinationDir, Backup))\r
+ if(CreateDirectory(Backup, NULL))\r
{\r
- _tcscpy(DestinationBackup, DestinationDir);\r
- _tcscat(DestinationBackup, _T("\\"));\r
- _tcscat(DestinationBackup, BackupDirName);\r
- if(CopyAllFilesInDirectory(Source, DestinationDir))\r
- {\r
- DeleteDirectoryAndContents(DestinationBackup);\r
- bResult = TRUE;\r
- }\r
- else\r
+ if(CopyAllFilesInDirectory(DestinationDir, Backup))\r
{\r
- DeleteDirectoryAndContents(DestinationBackup);\r
- CopyAllFilesInDirectory(Backup, DestinationDir);\r
+ _tcscpy(DestinationBackup, DestinationDir);\r
+ _tcscat(DestinationBackup, _T("\\"));\r
+ _tcscat(DestinationBackup, BackupDirName);\r
+ if(CopyAllFilesInDirectory(Source, DestinationDir))\r
+ {\r
+ DeleteDirectoryAndContents(DestinationBackup);\r
+ bResult = TRUE;\r
+ }\r
+ else\r
+ {\r
+ DeleteDirectoryAndContents(DestinationBackup);\r
+ CopyAllFilesInDirectory(Backup, DestinationDir);\r
+ }\r
}\r
}\r
}\r
memset(&Info, 0, sizeof(SHELLEXECUTEINFO));\r
Info.cbSize = sizeof(SHELLEXECUTEINFO);\r
Info.fMask = SEE_MASK_NOCLOSEPROCESS;\r
- Info.lpVerb = _T("runas");\r
+ if(IsUserAnAdmin())\r
+ Info.lpVerb = _T("open");\r
+ else\r
+ Info.lpVerb = _T("runas");\r
Info.lpFile = Path;\r
Info.lpParameters = NewCommandLine;\r
Info.nShow = SW_SHOW;\r