Re: Simple Checksum question
Either something fail so lpBaseAddr is NULL or you do something bad in Checksummapfile. Single-step your code in the debugger and check the result from every single line.
Re: Simple Checksum question
Access violation will typically mean that you are trying to access a relative offset in the filemapping that exceeds the mapped file.
As in you have a file of 10 bytes, and you are trying to read/write the byte at lpBaseAddr+10
Re: Simple Checksum question
Access violation is pointer error. The code snippet you posted doesn't make any check on nFileSize, hFile, hMap, lpBaseAddress though any of these handles, sizes, pointers could be invalid. I would bet that either lpBaseAddress is NULL or nFileSize is invalid and that the crash is because of that.
Re: Simple Checksum question
Thank you everyone for your ideas, I changed pointers into references and the problem went away. :)
However, I am still stuck on the NULL return of the function, the dwOldSum always becomes zero. MSDN doesn't provide information why that is so. GetLastError after the CheckSumMappedFile also offers a value of 0 which states nothing about the extended error itself. :( Somebody helps me please?
Re: Simple Checksum question
I did this in VS2005 and it worked alright as far as I understand it
Code:
DWORD hdrsum, chksum;
DWORD retval = MapFileAndCheckSum( "../debug/console.exe", &hdrsum, &chksum );
// retval = 0, hdrsum = 0, chksum = 0xdf68
HANDLE hFile = CreateFile( "../debug/console.exe", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
DWORD size = GetFileSize( hFile, 0 ); // Don't need high-order DWORD
HANDLE hMap = CreateFileMapping( hFile, 0, PAGE_READONLY, 0, 0, 0 );
LPVOID lpBaseAddr = MapViewOfFile( hMap, FILE_MAP_COPY, 0, 0, 0 );
IMAGE_NT_HEADERS* pHdrs = CheckSumMappedFile( lpBaseAddr, size, &hdrsum, &chksum );
// pHdrs = 0x3c00e8, hdrsum = 0, chksum = 0xdf68
UnmapViewOfFile( lpBaseAddr ); // Unchecked return...
CloseHandle( hMap );
CloseHandle( hFile );
Since all functions return success I can only presume that the original checksum is 0. In http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx it's stated
Quote:
The linker computes the original checksum at link time, if you use the appropriate linker switch. For more details, see your linker documentation.
and, yes they were right... in my project the Set Checksum option was No so I changed it to Yes and voila! :)