计算PE文件校验和

// 计算PE校验和
#include <ImageHlp.h>
#pragma comment(lib,"Imagehlp.lib")
void Getchecksum(TCHAR* pszPath)
{
    /*
        Code by Lthis 转载请注明出处
    */
    DWORD dwHeaderSum, dwCheckSum;            // 一般PE文件中CheckSum字段存储的
                                              // 是本代码中的dwHeaderSum获取的值
    // 打开文件
    HANDLE hFile = CreateFile(
        pszPath,                              // 文件路径
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
        );
    if (hFile == INVALID_HANDLE_VALUE) return FALSE;

    // 获取文件大小
    DWORD dwLowSize        = 0;
    DWORD dwHighSize    = 0;
    dwLowSize = GetFileSize(hFile, &dwHighSize);
    if (INVALID_FILE_SIZE == dwLowSize)
    {
        CString strErr;
        strErr.Format(_T("GetFileSize错误,错误码:%d"), GetLastError());
        return FALSE;
    }

    LPBYTE lpBase = NULL;

    HANDLE hFileMapping = CreateFileMapping(
        hFile, 
        NULL, 
        PAGE_READWRITE, 
        0, 
        dwLowSize, 
        NULL
        );
    lpBase = (LPBYTE)::MapViewOfFile(
        hFileMapping,
        FILE_MAP_READ | FILE_MAP_WRITE,
        0, 0,    // 指定数据(就是指目标磁盘文件)中的哪个字节开始映射至内存
        0        // 如果设定的值是0,那么系统将从文件中的指定位移开始到整个文件的结尾的视图映射到地址空间
        );
    if (NULL == lpBase)
    {
        CString strErr;
        strErr.Format(_T("MapViewOfFile错误,错误码:%d"), GetLastError());
        MessageBox(0, strErr, 0, 0);
        return FALSE;
    }

    CheckSumMappedFile(lpBase, dwLowSize, &dwHeaderSum, &dwCheckSum);
    
    // 显示CheckSum
    m_strChkSum.Format(_T("%08X"), dwHeaderSum);
    m_edtChkSum.SetWindowText(m_strChkSum);
    
    // 清理工作
    ::UnmapViewOfFile(lpBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
}

 

你可能感兴趣的:(文件)