Aprovecho para mostrarte como obtener el Hash MD5 de un archivo con la API de Windows tal y como lo utilicé en este ejemplo para cazar un virus:
TerminateMD5_Process, a la caza de un virus...
Código PHP:
//---------------------------------------------------------------------------
#define MD5LEN 16
#define BUFSIZE 1024
typedef CHAR TMD5[33];
void GetMD5FromFile(CHAR* FileName, CHAR *MD5)
{
HANDLE hFile = 0;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE Hash[MD5LEN];
DWORD bHash = 0;
DWORD bRead = 0;
BYTE* Buffer = (BYTE*)VirtualAlloc(0, BUFSIZE, MEM_COMMIT, PAGE_READWRITE);
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hFile != INVALID_HANDLE_VALUE){
if(CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)){
if(CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)){
while (1) {
ReadFile(hFile, Buffer, BUFSIZE, &bRead, NULL);
if(!bRead) break;
CryptHashData(hHash, Buffer, bRead, 0);
}
bHash = MD5LEN;
if(CryptGetHashParam(hHash, HP_HASHVAL, Hash, &bHash, 0)){
for(int i=0; i<2*MD5LEN; i++){
MD5[i] = (0x0F & Hash[i/2] >> 4*((i+1)%2)) + 48;
if(MD5[i] > '9') MD5[i] += 7;
}
MD5[32] = 0;
}
}
CryptDestroyHash(hHash);
}
CryptReleaseContext(hProv, 0);
}
CloseHandle(hFile);
VirtualFree(Buffer, 0, MEM_RELEASE);
}
Saludos.