}
// Get size of hash to be used
if (!CryptCATAdminCalcHashFromFileHandle2(
CatAdminHandle,
FileHandle,
&HashLength,
NULL,
NULL))
{
Error = GetLastError();
goto Cleanup;
}
HashData = (PBYTE) HeapAlloc(GetProcessHeap(), 0, HashLength);
if (HashData == NULL)
{
Error = ERROR_OUTOFMEMORY;
goto Cleanup;
}
// Generate hash for a give file
if (!CryptCATAdminCalcHashFromFileHandle2(
CatAdminHandle,
FileHandle,
&HashLength,
HashData,
NULL))
{
Error = GetLastError();
goto Cleanup;
}
// Find the first catalog containing this hash
CatInfoHandle = NULL;
CatInfoHandle = CryptCATAdminEnumCatalogFromHash(
CatAdminHandle,
HashData,
HashLength,
0,
&CatInfoHandle);
while (CatInfoHandle != NULL)
{
CATALOG_INFO catalogInfo = {};
catalogInfo.cbStruct = sizeof(catalogInfo);
Found = true;
if (!CryptCATCatalogInfoFromContext(
CatInfoHandle,
&catalogInfo,
0))
{
Error = GetLastError();
break;
}
wprintf(L"Hash was found in catalog %s\n\n", catalogInfo.wszCatalogFile);
// Look for the next catalog containing the file's hash
CatInfoHandle = CryptCATAdminEnumCatalogFromHash(
CatAdminHandle,
HashData,
HashLength,
0,
&CatInfoHandle);
}
if (Found != true)
{
wprintf(L"Hash was not found in any catalogs.\n");
}
Cleanup:
if (CatAdminHandle != NULL)
{
if (CatInfoHandle != NULL)
{
CryptCATAdminReleaseCatalogContext(CatAdminHandle, CatInfoHandle, 0);
}
CryptCATAdminReleaseContext(CatAdminHandle, 0);
}
if (HashData != NULL)
{
HeapFree(GetProcessHeap(), 0, HashData);
}
return Error;
}
int __cdecl wmain(_In_ unsigned int argc, _In_reads_(argc) PCWSTR wargv[])
{
DWORD Error = ERROR_SUCCESS;
HANDLE FileHandle = INVALID_HANDLE_VALUE;
DWORD ArgStart = 1;
bool UseStrongSigPolicy = false;
if (argc < 3 || argc > 4)
{
PrintUsage(wargv[0]);
Error = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
if (_wcsicmp(wargv[ArgStart], L"-p") == 0)
{
UseStrongSigPolicy = true;
ArgStart++;
}
if (ArgStart + 1 >= argc)
{
PrintUsage(wargv[0]);
Error = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
if ((wcslen(wargv[ArgStart]) != 2) ||
((_wcsicmp(wargv[ArgStart], L"-c") != 0) &&
(_wcsicmp(wargv[ArgStart], L"-e") != 0)))
{
PrintUsage(wargv[0]);
Error = ERROR_INVALID_PARAMETER;
goto Cleanup;
}
FileHandle = CreateFileW(wargv[ArgStart+1],
GENERIC_READ,
FILE_SHARE_READ,
NULL,