Annotation of mstools/samples/sdktools/image/imagehlp/checksum.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1993  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     checksum.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     This module implements a function for computing the checksum of an
                     12:     image file. It will also compute the checksum of other files as well.
                     13: 
                     14: Author:
                     15: 
                     16:     David N. Cutler 21-Mar-1993
                     17: 
                     18: Revision History:
                     19: 
                     20: --*/
                     21: 
                     22: #include <windows.h>
                     23: #include <imagehlp.h>
                     24: 
                     25: 
                     26: // Helper routines
                     27: 
                     28: PIMAGE_NT_HEADERS
                     29: ImageNtHeader (
                     30:     IN PVOID Base
                     31:     );
                     32: 
                     33: PVOID
                     34: ImageDirectoryEntryToData (
                     35:     IN PVOID Base,
                     36:     IN BOOLEAN MappedAsImage,
                     37:     IN USHORT DirectoryEntry,
                     38:     OUT PULONG Size
                     39:     );
                     40: 
                     41: //
                     42: // Define checksum routine prototype.
                     43: //
                     44: 
                     45: USHORT
                     46: ChkSum(
                     47:     DWORD PartialSum,
                     48:     PUSHORT Source,
                     49:     DWORD Length
                     50:     );
                     51: 
                     52: PIMAGE_NT_HEADERS
                     53: CheckSumMappedFile (
                     54:     LPVOID BaseAddress,
                     55:     DWORD FileLength,
                     56:     LPDWORD HeaderSum,
                     57:     LPDWORD CheckSum
                     58:     )
                     59: 
                     60: /*++
                     61: 
                     62: Routine Description:
                     63: 
                     64:     This functions computes the checksum of a mapped file.
                     65: 
                     66: Arguments:
                     67: 
                     68:     BaseAddress - Supplies a pointer to the base of the mapped file.
                     69: 
                     70:     FileLength - Supplies the length of the file in bytes.
                     71: 
                     72:     HeaderSum - Suppllies a pointer to a variable that receives the checksum
                     73:         from the image file, or zero if the file is not an image file.
                     74: 
                     75:     CheckSum - Supplies a pointer to the variable that receive the computed
                     76:         checksum.
                     77: 
                     78: Return Value:
                     79: 
                     80:     None.
                     81: 
                     82: --*/
                     83: 
                     84: {
                     85: 
                     86:     PUSHORT AdjustSum;
                     87:     PIMAGE_NT_HEADERS NtHeaders;
                     88:     USHORT PartialSum;
                     89: 
                     90:     //
                     91:     // Compute the checksum of the file and zero the header checksum value.
                     92:     //
                     93: 
                     94:     *HeaderSum = 0;
                     95:     PartialSum = ChkSum(0, (PUSHORT)BaseAddress, (FileLength + 1) >> 1);
                     96: 
                     97:     //
                     98:     // If the file is an image file, then subtract the two checksum words
                     99:     // in the optional header from the computed checksum before adding
                    100:     // the file length, and set the value of the header checksum.
                    101:     //
                    102: 
                    103:     try {
                    104:        NtHeaders = ImageNtHeader(BaseAddress);
                    105: 
                    106:     } except(EXCEPTION_EXECUTE_HANDLER) {
                    107:         NtHeaders = NULL;
                    108:     }
                    109: 
                    110:     if ((NtHeaders != NULL) && (NtHeaders != BaseAddress)) {
                    111:         *HeaderSum = NtHeaders->OptionalHeader.CheckSum;
                    112:         AdjustSum = (PUSHORT)(&NtHeaders->OptionalHeader.CheckSum);
                    113:         PartialSum -= (PartialSum < AdjustSum[0]);
                    114:         PartialSum -= AdjustSum[0];
                    115:         PartialSum -= (PartialSum < AdjustSum[1]);
                    116:         PartialSum -= AdjustSum[1];
                    117:     }
                    118: 
                    119:     //
                    120:     // Compute the final checksum value as the sum of the paritial checksum
                    121:     // and the file length.
                    122:     //
                    123: 
                    124:     *CheckSum = (DWORD)PartialSum + FileLength;
                    125:     return NtHeaders;
                    126: }
                    127: 
                    128: DWORD
                    129: MapFileAndCheckSumW(
                    130:     PWSTR Filename,
                    131:     LPDWORD HeaderSum,
                    132:     LPDWORD CheckSum
                    133:     )
                    134: 
                    135: /*++
                    136: 
                    137: Routine Description:
                    138: 
                    139:     This functions maps the specified file and computes the checksum of
                    140:     the file.
                    141: 
                    142: Arguments:
                    143: 
                    144:     Filename - Supplies a pointer to the name of the file whose checksum
                    145:         is computed.
                    146: 
                    147:     HeaderSum - Supplies a pointer to a variable that receives the checksum
                    148:         from the image file, or zero if the file is not an image file.
                    149: 
                    150:     CheckSum - Supplies a pointer to the variable that receive the computed
                    151:         checksum.
                    152: 
                    153: Return Value:
                    154: 
                    155:     0 if successful, else error number.
                    156: 
                    157: --*/
                    158: 
                    159: {
                    160:     HANDLE FileHandle, MappingHandle;
                    161:     LPVOID BaseAddress;
                    162:     DWORD FileLength;
                    163: 
                    164:     //
                    165:     // Open the file for read access
                    166:     //
                    167: 
                    168:     FileHandle = CreateFileW(
                    169:                         Filename,
                    170:                         GENERIC_READ,
                    171:                         FILE_SHARE_READ | FILE_SHARE_WRITE,
                    172:                         NULL,
                    173:                         OPEN_EXISTING,
                    174:                         FILE_ATTRIBUTE_NORMAL,
                    175:                         NULL );
                    176: 
                    177:     if (FileHandle == INVALID_HANDLE_VALUE) {
                    178:         return CHECKSUM_OPEN_FAILURE;
                    179:     }
                    180: 
                    181:     //
                    182:     //  Create a file mapping, map a view of the file into memory,
                    183:     //  and close the file mapping handle.
                    184:     //
                    185: 
                    186:     MappingHandle = CreateFileMapping(FileHandle,
                    187:                                       NULL,
                    188:                                       PAGE_READONLY,
                    189:                                       0,
                    190:                                       0,
                    191:                                       NULL);
                    192: 
                    193:     if (!MappingHandle) {
                    194:         CloseHandle( FileHandle );
                    195:         return CHECKSUM_MAP_FAILURE;
                    196:     }
                    197: 
                    198:     //
                    199:     // Map a view of the file
                    200:     //
                    201: 
                    202:     BaseAddress = MapViewOfFile(MappingHandle, FILE_MAP_READ, 0, 0, 0);
                    203:     CloseHandle(MappingHandle);
                    204:     if (BaseAddress == NULL) {
                    205:         CloseHandle( FileHandle );
                    206:         return CHECKSUM_MAPVIEW_FAILURE;
                    207:     }
                    208: 
                    209:     //
                    210:     // Get the length of the file in bytes and compute the checksum.
                    211:     //
                    212:     FileLength = GetFileSize( FileHandle, NULL );
                    213:     CheckSumMappedFile(BaseAddress, FileLength, HeaderSum, CheckSum);
                    214: 
                    215:     //
                    216:     // Unmap the view of the file and close file handle.
                    217:     //
                    218: 
                    219:     UnmapViewOfFile(BaseAddress);
                    220:     CloseHandle( FileHandle );
                    221:     return CHECKSUM_SUCCESS;
                    222: }
                    223: 
                    224: 
                    225: ULONG
                    226: MapFileAndCheckSumA (
                    227:     LPSTR Filename,
                    228:     LPDWORD HeaderSum,
                    229:     LPDWORD CheckSum
                    230:     )
                    231: 
                    232: /*++
                    233: 
                    234: Routine Description:
                    235: 
                    236:     This functions maps the specified file and computes the checksum of
                    237:     the file.
                    238: 
                    239: Arguments:
                    240: 
                    241:     Filename - Supplies a pointer to the name of the file whose checksum
                    242:         is computed.
                    243: 
                    244:     HeaderSum - Supplies a pointer to a variable that receives the checksum
                    245:         from the image file, or zero if the file is not an image file.
                    246: 
                    247:     CheckSum - Supplies a pointer to the variable that receive the computed
                    248:         checksum.
                    249: 
                    250: Return Value:
                    251: 
                    252:     0 if successful, else error number.
                    253: 
                    254: --*/
                    255: 
                    256: {
                    257: 
                    258:     WCHAR   FileNameW[ MAX_PATH ];
                    259: 
                    260:     //
                    261:     //  Convert the file name to unicode and call the unicode version
                    262:     //  of this function.
                    263:     //
                    264: 
                    265:     if (MultiByteToWideChar(
                    266:                     CP_ACP,
                    267:                     MB_PRECOMPOSED,
                    268:                     Filename,
                    269:                     -1,
                    270:                     FileNameW,
                    271:                     MAX_PATH ) ) {
                    272: 
                    273:         return MapFileAndCheckSumW(FileNameW, HeaderSum, CheckSum);
                    274: 
                    275:     }
                    276: 
                    277:     return CHECKSUM_UNICODE_FAILURE;
                    278: }
                    279: 
                    280: 
                    281: BOOL
                    282: TouchFileTimes(
                    283:     HANDLE FileHandle,
                    284:     LPSYSTEMTIME lpSystemTime
                    285:     )
                    286: {
                    287:     SYSTEMTIME SystemTime;
                    288:     FILETIME SystemFileTime;
                    289: 
                    290:     if (lpSystemTime == NULL) {
                    291:         lpSystemTime = &SystemTime;
                    292:         GetSystemTime( lpSystemTime );
                    293:         }
                    294: 
                    295:     if (SystemTimeToFileTime( lpSystemTime, &SystemFileTime )) {
                    296:         return SetFileTime( FileHandle, NULL, NULL, &SystemFileTime );
                    297:         }
                    298:     else {
                    299:         return FALSE;
                    300:         }
                    301: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.