取文件MD5 WINAPI

复制代码
 1 #include <windows.h>
 2 #include <wincrypt.h>
 3 #include <stdio.h>
 4 
 5 BOOL GetFileHash(LPCSTR lpFileName, LPSTR lpHash)
 6 {
 7     BOOL bResult = FALSE;
 8 
 9     HANDLE hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
10 
11     if (hFile != INVALID_HANDLE_VALUE)
12     {
13         DWORD dwFileSize = GetFileSize(hFile, NULL);
14 
15         if (dwFileSize > 0)
16         {
17             PBYTE lpBuffer = (PBYTE)VirtualAlloc(NULL, dwFileSize, MEM_COMMIT, PAGE_READWRITE);
18 
19             if (lpBuffer != NULL)
20             {
21                 DWORD dwNumOfRead;
22 
23                 if (ReadFile(hFile, lpBuffer, dwFileSize, &dwNumOfRead, NULL) != FALSE)
24                 {
25                     HCRYPTPROV hProv;
26 
27                     if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) != FALSE)
28                     {
29                         HCRYPTHASH hHash;
30 
31                         if (CryptCreateHash(hProv, CALG_MD5, NULL, NULL, &hHash) != FALSE)
32                         {
33                             if (CryptHashData(hHash, lpBuffer, dwFileSize, NULL) != FALSE)
34                             {
35                                 BYTE bData[16]; DWORD dwDataLen;
36 
37                                 if (CryptGetHashParam(hHash, HP_HASHVAL, bData, &dwDataLen, NULL) != FALSE)
38                                 {
39                                     if (dwDataLen == 16)
40                                     {
41                                         LPSTR lpStr = lpHash;
42 
43                                         for (DWORD i = 0; i < dwDataLen; i++, lpStr += 2)
44                                         {
45                                             sprintf(lpStr, "%02X", bData[i]);
46                                         }
47 
48                                         bResult = TRUE;
49                                     }
50                                 }
51                             }
52 
53                             CryptDestroyHash(hHash);
54                         }
55 
56                         CryptReleaseContext(hProv, NULL);
57                     }
58                 }
59 
60                 VirtualFree(lpBuffer, 0, MEM_RELEASE);
61             }
62         }
63 
64         CloseHandle(hFile);
65     }
66 
67     return bResult;
68 }
复制代码

 

posted @   Akatsuki-  阅读(839)  评论(2编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示