-
January 16th, 2011, 04:53 PM
#1
Simple Checksum question
I created a mapped file, and mapview of a file as follows
hMap=CreateFileMapping(hFile, 0, PAGE_READWRITE, 0,0,0);
lpBaseAddr=(LPBYTE)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
pImgHdr=Checksummapfile(lpBaseAddr,nFileSize,&dwOldSum,&dwNewSum);
The third line in debuging produces error of Access Violation.
Could someone who knows about this offers me some guidance please ?
Thank you.
-
January 16th, 2011, 06:08 PM
#2
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.
-
January 17th, 2011, 08:48 AM
#3
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
-
January 17th, 2011, 11:18 AM
#4
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.
-
January 18th, 2011, 01:15 AM
#5
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?
-
January 19th, 2011, 01:50 PM
#6
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
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!
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|