4 * @brief Implementation file for HashCalc
11 #pragma comment(lib, "bcrypt.lib")
13 static NTSTATUS CalculateHashValue(HANDLE hFile, BCRYPT_HASH_HANDLE hHash, ULONG hashSize, std::vector<uint8_t>& hash)
15 hash.resize(hashSize);
16 std::vector<uint8_t> buffer(64 * 1024);
21 if (!ReadFile(hFile, buffer.data(), static_cast<DWORD>(buffer.size()), &dwRead, nullptr))
23 status = 1; // STATUS_UNSUCCESSFUL
27 status = BCryptHashData(hHash, buffer.data(), dwRead, 0);
28 if (buffer.size() != dwRead)
33 status = BCryptFinishHash(hHash, hash.data(), static_cast<ULONG>(hash.size()), 0);
38 NTSTATUS CalculateHashValue(HANDLE hFile, const wchar_t *pAlgoId, std::vector<uint8_t>& hash)
41 BCRYPT_ALG_HANDLE hAlg = nullptr;
42 NTSTATUS status = BCryptOpenAlgorithmProvider(&hAlg, pAlgoId, nullptr, 0);
45 ULONG bytesWritten = 0;
47 status = BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH, reinterpret_cast<PUCHAR>(&objectSize), sizeof(DWORD), &bytesWritten, 0);
50 std::vector<uint8_t> hashObject(objectSize);
51 BCRYPT_HASH_HANDLE hHash = nullptr;
52 status = BCryptCreateHash(hAlg, &hHash, hashObject.data(), static_cast<ULONG>(hashObject.size()), nullptr, 0, 0);
56 status = BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH, reinterpret_cast<PUCHAR>(&hashSize), sizeof(DWORD), &bytesWritten, 0);
59 status = CalculateHashValue(hFile, hHash, hashSize, hash);
61 BCryptDestroyHash(hHash);
64 BCryptCloseAlgorithmProvider(hAlg, 0);