|
|
/*** crc32.h - 32-bit CRC generator
* * Microsoft Confidential * Copyright (C) Microsoft Corporation 1993-1994 * All Rights Reserved. * * Author: * Mike Sliger * * History: * 10-Aug-1993 bens Copied from IMG2DMF directory. * * Usage: * ULONG crc; * //** Compute first block
* crc = CRC32Compute(pb,cb,CRC32_INITIAL_VALUE); * //** Compute remaining blocks
* crc = CRC32Compute(pb,cb,crc); * ... * //** When you're done, crc has the CRC.
* * NOTE: See example function getFileChecksum() below that * computes the checksum of a file! */
// ** Must use this as initial value for CRC
#define CRC32_INITIAL_VALUE 0L
/*** CRC32Compute - Compute 32-bit
* * Entry: * pb - Pointer to buffer to computer CRC on * cb - Count of bytes in buffer to CRC * crc32 - Result from previous CRC32Compute call (on first call * to CRC32Compute, must be CRC32_INITIAL_VALUE!!!!). * * Exit: * Returns updated CRC value. */
DWORD CRC32Compute(BYTE *pb,unsigned cb,ULONG crc32);
//** Include nice sample -- don't compile it
//
#ifdef HERE_IS_A_SAMPLE
/*** getFileChecksum - Compute file checksum
* * Entry: * pszFile - Filespec * pchecksum - Receives 32-bit checksum of file * perr - ERROR structure * * Exit-Success: * Returns TRUE, *pchecksum filled in. * * Exit-Failure: * Returns FALSE; perr filled in with error. */ BOOL getFileChecksum(char *pszFile, ULONG *pchecksum, PERROR perr) { #define cbCSUM_BUFFER 4096 // File buffer size
int cb; // Amount of data in read buffer
ULONG csum=CRC32_INITIAL_VALUE; // Initialize CRC
char *pb=NULL; // Read buffer
int hf=-1; // File handle
int rc; BOOL result=FALSE; // Assume failure
//** Initialize returned checksum (assume failure)
*pchecksum = csum;
//** Allocate file buffer
if (!(pb = MemAlloc(cbCSUM_BUFFER))) { ErrSet(perr,pszDIAERR_NO_MEMORY_CRC,"%s",pszFile); return FALSE; }
//** Open file
hf = _open(pszFile,_O_RDONLY | _O_BINARY,&rc); if (hf == -1) { ErrSet(perr,pszDIAERR_OPEN_FAILED,"%s",pszFile); goto Exit; }
//** Compute checksum
while (_eof(hf) == 0) { cb = _read(hf,pb,cbCSUM_BUFFER); if (cb == -1) { ErrSet(perr,pszDIAERR_READ_FAIL_CRC,"%s",pszFile); goto Exit; } if (cb != 0) { csum = CRC32Compute(pb,cb,csum); // Accumulate CRC
} }
//** Success
result = TRUE; *pchecksum = csum; // Store checksum for caller
Exit: if (hf != -1) { _close(hf); } if (pb != NULL) { MemFree(pb); } return result; } /* getFileChecksum() */
#endif // HERE_IS_A_SAMPLE
|