Hello,
I´m trying to convert a GetHash function used into Sig2Dat program to generate hashes of files.
I´d tried to use md5_file and sha1_file, but the result isn't the same.
I don't know C very well and I need help to convert this GetHash funtion.
Note: you can find the complete source code at: http://www.geocities.com/vlaibb/sig2dat/sig2dat3.11.a-src.zip
Thanks in advanced.
Pablo de Camargo Cerdeira
DWORD GetHash(HWND hEdit, char filename, unsigned char hash)
{
{
HANDLE hFile;
OVERLAPPED gOverLapped;
BOOL bSuccess = FALSE;
DWORD filesize;
INT sperr;
char smess[1024];
//char filename[2*MAX_PATH];
//filename[0] = 0;
gOverLapped.Offset = 0;
gOverLapped.OffsetHigh = 0;
gOverLapped.hEvent = NULL;
hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if ((hFile != INVALID_HANDLE_VALUE))
{
filesize = GetFileSize(hFile, NULL);
if ((filesize != 0xFFFFFFFF))
{
{
LPSTR filebuf;
DWORD bufsize;
DWORD chunksize = 307200;
DWORD offset = 0x100000;
DWORD lastpos;
DWORD cpos;
DWORD firstlen;
DWORD endlen;
DWORD smallhash;
DWORD checksum;
//unsigned char hash[20];
struct MD5Context md5;
firstlen = chunksize;
if (filesize < chunksize)
{
firstlen = filesize;
}
filebuf = GlobalAlloc(GPTR, firstlen);
if ((filebuf != NULL))
{
DWORD dwRead;
if (ReadFile(hFile, filebuf, firstlen, &dwRead, NULL))
{
if (dwRead == firstlen)
{
// 16 byte md6 hash is calculated from the 1. chunk
MD5Init(&md5);
MD5Update(&md5, filebuf, firstlen);
MD5Final(hash, &md5);
// Calculate the 4-byte small hash.
smallhash = 0xffffffff;
if (filesize > chunksize)
{
offset = 0x100000;
lastpos = chunksize;
while (offset+2*chunksize < filesize)
{
while (lastpos+chunksize < offset)
{
ReadFile(hFile,filebuf,chunksize,&dwRead,NULL);
lastpos += dwRead;
//sperr=sprintf(smess,"Debug: (1) %d %d", lastpos, offset);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
if (0 < offset-lastpos)
{
ReadFile(hFile,filebuf,offset-lastpos,&dwRead,NULL);
lastpos+=dwRead;
//sperr=sprintf(smess,"Debug: (2) %d %d", lastpos, offset);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
if (ReadFile(hFile, filebuf, chunksize, &dwRead, NULL))
{
//sperr=sprintf(smess,"Debug: %d %d %s", offset, dwRead, filename);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
smallhash = hashSmallHash(filebuf, chunksize, smallhash);
lastpos += chunksize;
offset <<= 1;
}
else
{
GlobalFree(filebuf);
sperr=sprintf(smess,"Error: (1) reading file %d %s", dwRead, filename);
SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
return 0;
}
}
endlen = filesize - lastpos;
if (endlen > chunksize)
{
endlen = chunksize;
while (lastpos+chunksize < filesize-endlen)
{
ReadFile(hFile,filebuf,chunksize,&dwRead,NULL);
lastpos += dwRead;
//sperr=sprintf(smess,"Debug: (4) %d %d", lastpos, offset);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
if (0 < filesize-endlen-lastpos)
{
ReadFile(hFile,filebuf,filesize-endlen-lastpos,&dwRead,NULL);
lastpos +=dwRead;
//sperr=sprintf(smess,"Debug: (4) %d %d", lastpos, offset);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
}
if (ReadFile(hFile, filebuf, endlen, &dwRead, NULL))
{
//sperr=sprintf(smess,"Debug: (5) %d %d %s", endlen, dwRead, filename);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
smallhash = hashSmallHash(filebuf, endlen, smallhash);
}
else
{
GlobalFree(filebuf);
sperr=sprintf(smess,"Error: (2) reading file %d %s", dwRead, filename);
SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
return 0;
}
}
smallhash ^= filesize;
hash[16] = smallhash & 0xff;
hash[17] = (smallhash >> 8) & 0xff;
hash[18] = (smallhash >> 16) & 0xff;
hash[19] = (smallhash >> 24) & 0xff;
// Finally, calculate the checksum.
checksum = hashChecksum(hash);
sperr=sprintf(smess,"Signature: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x",
hash[0], hash[1], hash[2], hash[3], hash[4],
hash[5], hash[6], hash[7], hash[8], hash[9],
hash[10], hash[11], hash[12], hash[13], hash[14],
hash[15], hash[16], hash[17], hash[18], hash[19]
);
//SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
else
{
sperr=sprintf(smess,"Error: (3) reading file % d%s ",dwRead, filename);
SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
}
GlobalFree(filebuf);
}
}
}
else
{
sperr=sprintf(smess,"Error: File empty \"%s\"",filename);
SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
CloseHandle(hFile);
}
else
{
sperr=sprintf(smess,"Error: INVALID_HANDLE \"%s\"",filename);
SendMessage(hEdit, LB_ADDSTRING, 0, (LPARAM) smess);
}
return filesize;
}
}