解説
CryptCATAdminCalcHashFromFileHandleを利用して実行ファイル取得する。
#include "atlstr.h"
//
// ファイルハッシュ計算
//
// Windows2000/XP以降有効のCryptCATAdminCalcHashFromFileHandleを利用
// 生成されるハッシュはSIPハッシュ(MD5ハッシュではない!)
//
bool CalcFileSIPHash(LPCTSTR pszFileName,CAtlString& strHash)
{
BOOL (CALLBACK* pfn_CryptCATAdminCalcHashFromFileHandle)(HANDLE hFile,DWORD* pcbHash,BYTE* pbHash,DWORD dwFlags);
HMODULE hDLL;
BOOL ret;
BYTE pbHash[40];
DWORD cbHash = sizeof(pbHash);
HANDLE hFile;
DWORD i;
CAtlString strBuff;
strHash = _T("");
if(pszFileName == NULL)
return false;
////////////////////////////////////////////
// DLLからCryptCATAdminCalcHashFromFileHandleを取得
//
//DLLのロード
hDLL = ::LoadLibrary(_T("wintrust.dll"));
if(hDLL == NULL)
return false;
//関数の取得
(FARPROC&)pfn_CryptCATAdminCalcHashFromFileHandle = ::GetProcAddress(hDLL,"CryptCATAdminCalcHashFromFileHandle");
if(pfn_CryptCATAdminCalcHashFromFileHandle == NULL)
{
::FreeLibrary(hDLL);
//mscat32.dllに関数があることもある(Windows2000)
//今後のOSでどうなるか不明なのでOSチェックはしていない(取得できれば成功)
//DLLのロード
hDLL = ::LoadLibrary(_T("mscat32.dll"));
if(hDLL == NULL)
return false;
//関数の取得
(FARPROC&)pfn_CryptCATAdminCalcHashFromFileHandle = ::GetProcAddress(hDLL,"CryptCATAdminCalcHashFromFileHandle");
if(pfn_CryptCATAdminCalcHashFromFileHandle == NULL)
{
::FreeLibrary(hDLL);
return false;
}
}
////////////////////////////////////////////
// ハッシュ計算
//
ret = FALSE;
//ファイルオープン
hFile = ::CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
//ハッシュ計算
ret = pfn_CryptCATAdminCalcHashFromFileHandle(hFile, &cbHash, pbHash,0);
//ファイルの開放
::CloseHandle(hFile);
}
//DLLの開放
::FreeLibrary(hDLL);
if(ret == FALSE)
return false;
////////////////////////////////////////////
// 文字列に変換(HEX2BIN)
//
//文字列に変換
for(i = 0; i < cbHash; i++)
{
//非常に効率が悪い!!
strBuff.Format("%02X",pbHash[i]);
strHash += strBuff;
}
return true;
}







