vxug-VXAPI/VX-API/CreateMd5HashFromFilePath.cpp

130 lines
3.0 KiB
C++

#include "Win32Helper.h"
#include <Wincrypt.h>
BOOL CreateMd5HashFromFilePathW(_In_ LPCWSTR FilePath, _Inout_ PWCHAR Md5Hash)
{
HANDLE hHandle = INVALID_HANDLE_VALUE;
HCRYPTPROV hProvider = NULL;
HCRYPTHASH hHash = NULL;
BYTE FileBuffer[1024] = { 0 };
BYTE Md5HashBuffer[32] = { 0 };
DWORD dwRead = 0;
BOOL bFlag = FALSE;
DWORD dwHashData = 16;
CHAR Md5Digits[] = "0123456789abcdef";
CHAR Md5CharBufferTemp[32] = { 0 };
if (!IsPathValidW(FilePath))
return FALSE;
hHandle = CreateFileW(FilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hHandle == INVALID_HANDLE_VALUE)
return FALSE;
if (!CryptAcquireContextW(&hProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
goto EXIT_ROUTINE;
if (!CryptCreateHash(hProvider, CALG_MD5, 0, 0, &hHash))
goto EXIT_ROUTINE;
while (ReadFile(hHandle, FileBuffer, 1024, &dwRead, NULL))
{
if (dwRead == 0)
break;
if (!CryptHashData(hHash, FileBuffer, dwRead, 0))
goto EXIT_ROUTINE;
}
if (!CryptGetHashParam(hHash, HP_HASHVAL, Md5HashBuffer, &dwHashData, 0))
goto EXIT_ROUTINE;
for (DWORD dwX = 0, dwOffset = 0; dwX < dwHashData; dwX++)
{
Md5CharBufferTemp[dwOffset] = Md5Digits[Md5HashBuffer[dwX] >> 4];
dwOffset++;
Md5CharBufferTemp[dwOffset] = Md5Digits[Md5HashBuffer[dwX] & 0xf];
dwOffset++;
}
CharStringToWCharString(Md5Hash, Md5CharBufferTemp, 32);
bFlag = TRUE;
EXIT_ROUTINE:
if (hProvider)
CryptReleaseContext(hProvider, 0);
if (hHash)
CryptDestroyHash(hHash);
if (hHandle)
CloseHandle(hHandle);
return bFlag;
}
BOOL CreateMd5HashFromFilePathA(_In_ LPCSTR FilePath, _Inout_ PCHAR Md5Hash)
{
HANDLE hHandle = INVALID_HANDLE_VALUE;
HCRYPTPROV hProvider = NULL;
HCRYPTHASH hHash = NULL;
BYTE FileBuffer[1024] = { 0 };
BYTE Md5HashBuffer[32] = { 0 };
DWORD dwRead = 0;
BOOL bFlag = FALSE;
DWORD dwHashData = 16;
CHAR Md5Digits[] = "0123456789abcdef";
CHAR Md5CharBufferTemp[32] = { 0 };
if (!IsPathValidA(FilePath))
return FALSE;
hHandle = CreateFileA(FilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hHandle == INVALID_HANDLE_VALUE)
return FALSE;
if (!CryptAcquireContextA(&hProvider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
goto EXIT_ROUTINE;
if (!CryptCreateHash(hProvider, CALG_MD5, 0, 0, &hHash))
goto EXIT_ROUTINE;
while (ReadFile(hHandle, FileBuffer, 1024, &dwRead, NULL))
{
if (dwRead == 0)
break;
if (!CryptHashData(hHash, FileBuffer, dwRead, 0))
goto EXIT_ROUTINE;
}
if (!CryptGetHashParam(hHash, HP_HASHVAL, Md5HashBuffer, &dwHashData, 0))
goto EXIT_ROUTINE;
for (DWORD dwX = 0, dwOffset = 0; dwX < dwHashData; dwX++)
{
Md5CharBufferTemp[dwOffset] = Md5Digits[Md5HashBuffer[dwX] >> 4];
dwOffset++;
Md5CharBufferTemp[dwOffset] = Md5Digits[Md5HashBuffer[dwX] & 0xf];
dwOffset++;
}
StringCopyA(Md5Hash, Md5CharBufferTemp);
bFlag = TRUE;
EXIT_ROUTINE:
if (hProvider)
CryptReleaseContext(hProvider, 0);
if (hHash)
CryptDestroyHash(hHash);
if (hHandle)
CloseHandle(hHandle);
return bFlag;
}