invoke closehandle,hmapfile
mov hmapfile,0
invoke closehandle,hfileread
ret
closemapfile endp
上述过程调用是用来关闭内存映射文件和原来打开的文件的,这样可以使得程序退出时没有资源泄漏。如果用户选择保存文件的话,就弹出一个“保存文件”对话框,当用户输入了新文件的名称后,我们调用createfile函数来创建新文件---输出文件。
invoke mapviewoffile,hmapfile,file_map_read,0,0,0
mov pmemory,eax
在输出文件创建后我们调用mapviewoffile来映射希望映射到内存中的部分。该函数的语法如下:
mapviewoffile proto hfilemappingobject:dword,\
dwdesiredaccess:dword,\
dwfileoffsethigh:dword,\
dwfileoffsetlow:dword,\
dwnumberofbytestomap:dword
dwdesiredaccess用来指定我们想对文件进行的操作。在我们例子中,我们只想读,故指定标志file_map_read。
dwfileoffsethigh 和 dwfileoffsetlow 用来指定打开文件中欲映射的起始偏移位置。我们的例子中想映射整个的文件,故指定它们的值为0。
dwnumberofbytestomap 用来指定欲映射的字节数,如果想映射整个的文件,设定该值为0。
调用mapviewoffile后,我们希望的部分就已经映射到内存中去了。您将得到一个指向起始内存块的指针。
invoke getfilesize,hfileread,null
调用该函数可以得到文件的大小,其值通过eax传送,如果文件的长度超过4g,那么文件长度dword的高值部分(也即超过4g的部分)保存在filesizehighword中。因为我们估计一般的文件将没有这么大,故忽略该值。
invoke writefile,hfilewrite,pmemory,eax,addr sizewritten,null
把内存映射文件中的数据写到输出文件中去。
invoke unmapviewoffile,pmemory
写完后,我们解除映射。
call closemapfile
invoke closehandle,hfilewrite
关闭内存映射文件和输出文件的句柄。
invoke setwindowtext,hwnd,addr appname
恢复窗口的标题条到应用程序的名称。
invoke enablemenuitem,hmenu,idm_open,mf_enabled