现在的位置: 首页 > 综合 > 正文

windows md5sum

2013年10月29日 ⁄ 综合 ⁄ 共 3153字 ⁄ 字号 评论关闭

首先下载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;
}

抱歉!评论已关闭.