WIN32的问题 请大家帮忙看下!
下面是一个子程序
IsFileModified proc
LOCAL hFile: HANDLE
LOCAL dwFileSize: DWORD
LOCAL dwNumberOfBytesReadWritten: DWORD
LOCAL hMemory: HANDLE
LOCAL pMemory: DWORD
LOCAL OriginalCRC32: DWORD ;文件原本的CRC-32值
LOCAL bModify: BOOL
mov bModify, FALSE
;获得文件名:
invoke GetModuleFileName, hInstance, addr szFileName, MAX_PATH
;打开文件:
invoke CreateFile, addr szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0
mov hFile, eax mov hFile, eax
.if hFile != INVALID_HANDLE_VALUE
;获得文件长度:
invoke GetFileSize, hFile, NULL
mov dwFileSize, eax
;建立文件的内存映射
invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL
.if ! eax
jmp _Ret1
.endif
mov hMemory, eax
;将文件映射到指定内存地址
invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0
.if ! eax
jmp _Ret2
.endif
mov pMemory, eax
;读3ch处的PE文件头指针:
mov ecx, 3ch
add ecx, pMemory
mov ecx, [ecx]
;定位到PE Optional_Section的Win32Version处,并读出储存在这里的CRC-32值:
add ecx, 4ch
add ecx, pMemory
mov eax, [ecx]
mov OriginalCRC32, eax
;下面这步非常关键!!!作用是把Win32Version处的4个字节写成0,否则得出的CRC-32值将会与原先的不同:
----------------mov dword ptr [ecx], 0 //////////////////运行到这里出错
;初始化crc32table:
invoke init_crc32table
;下面赋值给寄存器ebx和ecx,以便进行crc32转换:
;EBX是待转换的字符串的首地址:
mov ebx, pMemory
;ECX是文件的长度:
mov ecx, dwFileSize
;进行crc32转换:
invoke arraycrc32
cmp OriginalCRC32, eax
.if !zero?
mov bModify, TRUE
.endif
_Ret3:
invoke UnmapViewOfFile,pMemory
_Ret2:
invoke CloseHandle,hMemory
_Ret1:
invoke CloseHandle,hFile
.endif
mov eax, bModify
ret
IsFileModified endp
end start
当程序运行到 mov dword ptr [ecx], 0 这一句时出错
我用OD跟了一下 分析原因可能是由于 文件映射在内存的属性是只读的
也就是invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0 中的FILE_MAP_READ这个参数
但如查改成可写参数文件文件映射在内存失败 也就是调用MapViewOfFile这个函数返回0
请问一下 错误的原因在哪儿??如何修改
还是这个程序根本行不通!
谢谢大家请指教!