windows md5sum
2010-08-13 15:32
106 查看
首先下载md5sum.exe,可以到这里 http://download.csdn.net/source/2608576
拷贝到c:/windows/system32/下,或者将md5sum.exe所在路径设置到环境变量PATH中,就可以直接通过命令行调用了:
c:/md5sum boot.ini
返回的结果就是boot.ini的MD5值。
如果使用要通过程序调用md5sun,获得md5值可以通过CreateProcess调用md5sum的命令行,再通过管道获得md5sum的返回值,代码如下:
int GetFileMD5W(const TCHAR *filefullpath, char *MD5key)
{
TCHAR szfilenameW[MAX_PATH_LENGTH]={0}; //保存文件名
TCHAR szFilePathW[MAX_PATH_LENGTH]={0}; //保存路径
TCHAR szCmdLineW[MAX_PATH_LENGTH]={0}; //保存命令行信息
char buffer[MAX_PATH_LENGTH] = {0}; //保存命令行输出
TCHAR *pos=NULL;
DWORD bytesRead = 0;
if (wcslen(filefullpath)>MAX_PATH_LENGTH)
return false;
wcscpy(szFilePathW, filefullpath);
int i=0;
while (szFilePathW[i]!=0)
{
if (szFilePathW[i]==_T('/'))
szFilePathW[i]=_T('//');
i++;
}
if ((pos=wcschr(szFilePathW, '//'))==NULL) //找到文件路径最右边的'/'
{
return false;
}
wcscpy(szfilenameW, pos+1); //获得文件名
*pos=0; //获得文件所在路径
if (wcslen(szfilenameW)==0 || wcslen(szFilePathW)==0 || MD5key==NULL) //检查文件名或路径大小是否合适
{
return false;
}
wsprintf(szCmdLineW,L"cmd.exe /c md5sum /"%s/" ",szfilenameW); //给出命令行信息
//eg: cmd.exe /c md5sum "for text.txt"
SECURITY_ATTRIBUTES sa = {0};
HANDLE hRead = NULL, hWrite = NULL; //设置管道读写句柄
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa,0)) //创建管道
{
return false;
}
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //
si.hStdOutput = hWrite; //
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcessW(NULL, szCmdLineW
,NULL,NULL,TRUE,NULL,NULL,szFilePathW,&si,&pi)) //注意,这里将szFilePathW(文件所在路径)作为倒数第三个参数
{
CloseHandle(hWrite);
CloseHandle(hRead);
return false;
}
WaitForSingleObject(pi.hProcess,INFINITE); //等待md5sum结束
// Close process and thread handles.
CloseHandle(pi.hProcess); //关闭新进程的主线程
CloseHandle(pi.hThread); //关闭新进程
CloseHandle(hWrite); //关闭管道的写句柄
ReadFile(hRead, buffer, MAX_PATH_LENGTH, &bytesRead, NULL); //从管道中读取md5sum的运行结果
CloseHandle(hRead); //关闭管道的读句柄
if (NULL!=strstr(buffer,"md5sum")) //如果运行结果中出现了md5sum,多半是执行失败
{
//TRACE(buffer);
return -2;
}
else if (!strnicmp(buffer,"No such file:",strlen("No such file:"))) //找不到制定文件
{
//TRACE(buffer);
return -1;
}
if (strlen(buffer)<32) //获得结果小于32位,说明没有得到md5值
{
//TRACE(buffer);
return false;
}
strncpy(MD5key, buffer, 32); //获得md5值成功
strcat(MD5key, "/0");
return TRUE;
}
拷贝到c:/windows/system32/下,或者将md5sum.exe所在路径设置到环境变量PATH中,就可以直接通过命令行调用了:
c:/md5sum boot.ini
返回的结果就是boot.ini的MD5值。
如果使用要通过程序调用md5sun,获得md5值可以通过CreateProcess调用md5sum的命令行,再通过管道获得md5sum的返回值,代码如下:
int GetFileMD5W(const TCHAR *filefullpath, char *MD5key)
{
TCHAR szfilenameW[MAX_PATH_LENGTH]={0}; //保存文件名
TCHAR szFilePathW[MAX_PATH_LENGTH]={0}; //保存路径
TCHAR szCmdLineW[MAX_PATH_LENGTH]={0}; //保存命令行信息
char buffer[MAX_PATH_LENGTH] = {0}; //保存命令行输出
TCHAR *pos=NULL;
DWORD bytesRead = 0;
if (wcslen(filefullpath)>MAX_PATH_LENGTH)
return false;
wcscpy(szFilePathW, filefullpath);
int i=0;
while (szFilePathW[i]!=0)
{
if (szFilePathW[i]==_T('/'))
szFilePathW[i]=_T('//');
i++;
}
if ((pos=wcschr(szFilePathW, '//'))==NULL) //找到文件路径最右边的'/'
{
return false;
}
wcscpy(szfilenameW, pos+1); //获得文件名
*pos=0; //获得文件所在路径
if (wcslen(szfilenameW)==0 || wcslen(szFilePathW)==0 || MD5key==NULL) //检查文件名或路径大小是否合适
{
return false;
}
wsprintf(szCmdLineW,L"cmd.exe /c md5sum /"%s/" ",szfilenameW); //给出命令行信息
//eg: cmd.exe /c md5sum "for text.txt"
SECURITY_ATTRIBUTES sa = {0};
HANDLE hRead = NULL, hWrite = NULL; //设置管道读写句柄
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa,0)) //创建管道
{
return false;
}
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite; //
si.hStdOutput = hWrite; //
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcessW(NULL, szCmdLineW
,NULL,NULL,TRUE,NULL,NULL,szFilePathW,&si,&pi)) //注意,这里将szFilePathW(文件所在路径)作为倒数第三个参数
{
CloseHandle(hWrite);
CloseHandle(hRead);
return false;
}
WaitForSingleObject(pi.hProcess,INFINITE); //等待md5sum结束
// Close process and thread handles.
CloseHandle(pi.hProcess); //关闭新进程的主线程
CloseHandle(pi.hThread); //关闭新进程
CloseHandle(hWrite); //关闭管道的写句柄
ReadFile(hRead, buffer, MAX_PATH_LENGTH, &bytesRead, NULL); //从管道中读取md5sum的运行结果
CloseHandle(hRead); //关闭管道的读句柄
if (NULL!=strstr(buffer,"md5sum")) //如果运行结果中出现了md5sum,多半是执行失败
{
//TRACE(buffer);
return -2;
}
else if (!strnicmp(buffer,"No such file:",strlen("No such file:"))) //找不到制定文件
{
//TRACE(buffer);
return -1;
}
if (strlen(buffer)<32) //获得结果小于32位,说明没有得到md5值
{
//TRACE(buffer);
return false;
}
strncpy(MD5key, buffer, 32); //获得md5值成功
strcat(MD5key, "/0");
return TRUE;
}
相关文章推荐
- Windows网络数据流跟踪技巧
- Windows内存管理机密+揭穿内存优化工具的骗局
- CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/***.dll”错误处理
- Windows 下安装php GD库
- Windows 7尚未成熟 企业应用仍需三思
- windows下安装ruby on rails 环境搭建
- 【个人收藏】Windows 待机 休眠 睡眠的区分
- 【学习知识】木马病毒在windows系统中的几种启动方式 - 病毒防治中心 - 360百科
- Windows XP与Windows 7双系统安装方法集锦
- 自己写注册表,让程序跟windows服务程序一样,在windows登陆之前启动
- 基于visual c++之windows核心编程代码分析(45)利用Windows系统服务启动程序
- Windows Azure Marketplaces上的Bing Search API可用啦!
- 批处理脚本配合windows计划任务自动完成日构建
- windows下一键拷贝文件脚本
- windows下dos命令使用
- Windows中cmd操作mysql
- WINDOWS-API:取得当前用户账户名-GetUserName
- Linux和windows下adb连接android手机
- Vim编辑器在Windows下编码设置问题
- Windows Message Queue