CheckSumMappedFile отрабатывает некорректно
Код:
HMODULE hMdl;DWORD dwHdrSum,dwChkSum;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,(LPCSTR)&szVar,&hMdl);
PIMAGE_NT_HEADERS inth=ImageNtHeader(hMdl);
CheckSumMappedFile(hMdl,inth->OptionalHeader.SizeOfImage,&dwHdrSum,&dwChkSum);
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,(LPCSTR)&szVar,&hMdl);
PIMAGE_NT_HEADERS inth=ImageNtHeader(hMdl);
CheckSumMappedFile(hMdl,inth->OptionalHeader.SizeOfImage,&dwHdrSum,&dwChkSum);
Код:
char szName[MAX_PATH];
GetModuleFileName(hMdl,szName,MAX_PATH);
HANDLE hFile=CreateFile(szName,0,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
CheckSumMappedFile(hMdl,GetFileSize(hFile,0),&dwHdrSum,&dwChkSum);
CloseHandle(hFile);
GetModuleFileName(hMdl,szName,MAX_PATH);
HANDLE hFile=CreateFile(szName,0,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
CheckSumMappedFile(hMdl,GetFileSize(hFile,0),&dwHdrSum,&dwChkSum);
CloseHandle(hFile);
Как правильно вызвать эту функцию, если ни размер образа в памяти, ни файла на диске ей не подходят?
Я почитал интернеты, подумал и понял, что всё верно — функция же весь образ в памяти пересчитывает, а там тебе и структуры заполненные, и переменные разные значения имеют. Поэтому остаётся только MapFileAndCheckSum().
It is recommended that all images have valid checksums. It is the caller's responsibility to place the newly computed checksum into the mapped image and update the on-disk image of the file.
Либо попросить линкер изначальную запись сделать:
The linker computes the original checksum at link time, if you use the appropriate linker switch. For more details, see your linker documentation.
Без этого я так понимаю изначальная запись не валидна.
P.S. На Дельфи пример перезаписи нашел тут (там-же и проверка).