mirror of
https://github.com/reactos/reactos.git
synced 2024-09-06 10:52:52 +00:00
![Mark Jansen](/assets/img/avatar_default.png)
Previously, there would be function duplication between installed and available applications. Now this is handled with polymorphism, which allows to re-use a lot of code. Additionally, toolbar buttons are properly disabled now. The mutex used to guard rapps' single instance is renamed, so that the 'new' and old rapps can be run at the same time for testing. CORE-18459
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
/*
|
|
* PROJECT: ReactOS Applications Manager
|
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
|
* PURPOSE: Various integrity check mechanisms
|
|
* COPYRIGHT: Copyright Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
|
|
* Copyright 2016 Mark Jansen <mark.jansen@reactos.org>
|
|
*/
|
|
|
|
#include "rapps.h"
|
|
|
|
#include <sha1.h>
|
|
|
|
BOOL
|
|
VerifyInteg(LPCWSTR lpSHA1Hash, LPCWSTR lpFileName)
|
|
{
|
|
BOOL ret = FALSE;
|
|
|
|
/* first off, does it exist at all? */
|
|
HANDLE file = CreateFileW(lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
|
|
|
|
if (file == INVALID_HANDLE_VALUE)
|
|
return FALSE;
|
|
|
|
/* let's grab the actual file size to organize the mmap'ing rounds */
|
|
LARGE_INTEGER size;
|
|
GetFileSizeEx(file, &size);
|
|
|
|
/* retrieve a handle to map the file contents to memory */
|
|
HANDLE map = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL);
|
|
if (map)
|
|
{
|
|
/* map that thing in address space */
|
|
const unsigned char *file_map = static_cast<const unsigned char *>(MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0));
|
|
if (file_map)
|
|
{
|
|
SHA_CTX ctx;
|
|
/* initialize the SHA-1 context */
|
|
A_SHAInit(&ctx);
|
|
|
|
/* feed the data to the cookie monster */
|
|
A_SHAUpdate(&ctx, file_map, size.LowPart);
|
|
|
|
/* cool, we don't need this anymore */
|
|
UnmapViewOfFile(file_map);
|
|
|
|
/* we're done, compute the final hash */
|
|
ULONG sha[5];
|
|
A_SHAFinal(&ctx, sha);
|
|
|
|
WCHAR buf[(sizeof(sha) * 2) + 1];
|
|
for (UINT i = 0; i < sizeof(sha); i++)
|
|
swprintf(buf + 2 * i, L"%02x", ((unsigned char *)sha)[i]);
|
|
/* does the resulting SHA1 match with the provided one? */
|
|
if (!_wcsicmp(buf, lpSHA1Hash))
|
|
ret = TRUE;
|
|
}
|
|
CloseHandle(map);
|
|
}
|
|
CloseHandle(file);
|
|
return ret;
|
|
}
|