>Нужен быстрый способ проверки цифровой подписи файла на Win32/64.
>Вот в Process Explorer'е и в Autoruns'е есть кнопка Verify, она как раз и делает то, что мне нужно, удовлетворяет всем 3 пунктам. Вопрос — кто-нибудь знает, как они это делают?
bool CheckByCat(const wchar_t *pwFileName)
{
HANDLE hCat;
if (!CryptCATAdminAcquireContext(&hCat, NULL, 0))
return false;
bool out = false;
HANDLE f = CreateFile(
pwFileName, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (f != INVALID_HANDLE_VALUE)
{
BYTE hash[1024];
DWORD cb = sizeof(hash);
if (CryptCATAdminCalcHashFromFileHandle(f, &cb, hash, 0))
{
if(CryptCATAdminEnumCatalogFromHash(hCat, hash, cb, 0, 0))
out = true;
}
}
CryptCATAdminReleaseContext(hCat, 0);
::CloseHandle(f);
return out;
}
bool CheckByWinVerifyTrust(const wchar_t *pwFileName)
{
WINTRUST_FILE_INFO wfi={sizeof(WINTRUST_FILE_INFO), 0};
wfi.pcwszFilePath = pwFileName;
wfi.hFile = NULL;
WINTRUST_DATA wtd={sizeof(WINTRUST_DATA),0};
wtd.dwUIChoice = WTD_UI_NONE;
wtd.fdwRevocationChecks = WTD_REVOKE_NONE;
wtd.dwUnionChoice = WTD_CHOICE_FILE;
wtd.pFile = &wfi;
GUID g = WINTRUST_ACTION_GENERIC_VERIFY_V2;
LONG r = WinVerifyTrust(NULL, &g, &wtd);
return (r==ERROR_SUCCESS);
}
оно?