#include <Windows.h>
#include <string>
#include <strsafe.h>
#include <AtlConv.h>
BOOL PreprocessDatFile(WCHAR* wzFileName, WCHAR* wzFileHash)
{
USES_CONVERSION;
BOOL bRet = FALSE;
HCRYPTPROV hCryptProv = 0;
HCRYPTHASH hHash = 0;
HANDLE hMapFile = 0;
WCHAR *lpFileHash = NULL;
BYTE bHash[0x7f];
DWORD dwHashLen= 16;
BYTE* pBuf;
std::string digest;
DWORD dwFileSize = 0, dwHighFileSize = 0;
HANDLE hFile = CreateFile(wzFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if( hFile == INVALID_HANDLE_VALUE )
{
return FALSE;
}
dwFileSize = GetFileSize(hFile, &dwHighFileSize);
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
goto release;
}
if(CryptAcquireContext(&hCryptProv,NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv,CALG_MD5,0, 0, &hHash))
{
UINT64 filesize = (UINT64)dwHighFileSize << 32 | dwFileSize;
for(UINT64 i = 0; i <= filesize; i+=1048576)// 1024*1024
{
size_t bufsize = size_t(min(filesize-i, 1048576));
pBuf = (BYTE*) MapViewOfFile(hMapFile, FILE_MAP_READ, (DWORD)(i >> 32), (DWORD)i, bufsize);
if (pBuf == NULL)
{
goto release;
}
if(!CryptHashData(hHash, pBuf, bufsize, 0))
{
goto release;
}
UnmapViewOfFile(pBuf);
}
if(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
{
digest.resize(32);
BYTE value;
for (int i = 0; i<16; i++)
{
value = bHash[i] >> 4;
digest[i*2] = value < 10 ? char(value + '0') : char(value - 10 + 'a');
value = bHash[i] & 0x0F;
digest[i*2+1] = value < 10 ? char(value + '0') : char(value - 10 + 'a');
}
lpFileHash = A2T(digest.c_str());
StringCbPrintfW(wzFileHash, MAX_PATH, L"%s", lpFileHash);
bRet = TRUE;
}
}
}
release:
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv, 0);
if(pBuf)
UnmapViewOfFile(pBuf);
if(hMapFile)
CloseHandle(hMapFile);
if(hFile)
CloseHandle(hFile);
return bRet;
}
int main()
{
WCHAR wzFile1Hash[MAX_PATH] = { 0 };
WCHAR wzFile2Hash[MAX_PATH] = { 0 };
PreprocessDatFile(L"C:\\calc.exe", wzFile1Hash);
PreprocessDatFile(L"C:\\notepad.exe", wzFile2Hash);
wprintf(L"%s\n%s\n", wzFile1Hash, wzFile2Hash);
getchar();
return 0;
}
#include <string>
#include <strsafe.h>
#include <AtlConv.h>
BOOL PreprocessDatFile(WCHAR* wzFileName, WCHAR* wzFileHash)
{
USES_CONVERSION;
BOOL bRet = FALSE;
HCRYPTPROV hCryptProv = 0;
HCRYPTHASH hHash = 0;
HANDLE hMapFile = 0;
WCHAR *lpFileHash = NULL;
BYTE bHash[0x7f];
DWORD dwHashLen= 16;
BYTE* pBuf;
std::string digest;
DWORD dwFileSize = 0, dwHighFileSize = 0;
HANDLE hFile = CreateFile(wzFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if( hFile == INVALID_HANDLE_VALUE )
{
return FALSE;
}
dwFileSize = GetFileSize(hFile, &dwHighFileSize);
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
goto release;
}
if(CryptAcquireContext(&hCryptProv,NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv,CALG_MD5,0, 0, &hHash))
{
UINT64 filesize = (UINT64)dwHighFileSize << 32 | dwFileSize;
for(UINT64 i = 0; i <= filesize; i+=1048576)// 1024*1024
{
size_t bufsize = size_t(min(filesize-i, 1048576));
pBuf = (BYTE*) MapViewOfFile(hMapFile, FILE_MAP_READ, (DWORD)(i >> 32), (DWORD)i, bufsize);
if (pBuf == NULL)
{
goto release;
}
if(!CryptHashData(hHash, pBuf, bufsize, 0))
{
goto release;
}
UnmapViewOfFile(pBuf);
}
if(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
{
digest.resize(32);
BYTE value;
for (int i = 0; i<16; i++)
{
value = bHash[i] >> 4;
digest[i*2] = value < 10 ? char(value + '0') : char(value - 10 + 'a');
value = bHash[i] & 0x0F;
digest[i*2+1] = value < 10 ? char(value + '0') : char(value - 10 + 'a');
}
lpFileHash = A2T(digest.c_str());
StringCbPrintfW(wzFileHash, MAX_PATH, L"%s", lpFileHash);
bRet = TRUE;
}
}
}
release:
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv, 0);
if(pBuf)
UnmapViewOfFile(pBuf);
if(hMapFile)
CloseHandle(hMapFile);
if(hFile)
CloseHandle(hFile);
return bRet;
}
int main()
{
WCHAR wzFile1Hash[MAX_PATH] = { 0 };
WCHAR wzFile2Hash[MAX_PATH] = { 0 };
PreprocessDatFile(L"C:\\calc.exe", wzFile1Hash);
PreprocessDatFile(L"C:\\notepad.exe", wzFile2Hash);
wprintf(L"%s\n%s\n", wzFile1Hash, wzFile2Hash);
getchar();
return 0;
}