VC++写壳实战第二课:内存映射

这节课我们学习开始加壳这个按钮功能的实现

 

首先添加个和文件名相关的成员变量。在classview中,双击CHUADlg函数,在类的定义中申明成员变量:

public:
 CString m_FilePathNamePacked; //加壳后的文件名

 

双击开始加壳按钮,写入以下代码

void CHUADlg::OnButtonPacking() 
{
HANDLE hFile; //文件句柄
 HANDLE hMapping; //文件映射句柄
 LPVOID lpHeadBase; //创建映射的头指针
 DWORD dwFileSize; //文件大小
 DWORD dwBufferRead; //实际读取字节


 //打开文件
 hFile=CreateFile(m_FilePathName,GENERIC_READ,FILE_SHARE_READ,NULL,
  OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 //如果文件打开失败,就弹出对话框,并返回。
 if (hFile==INVALID_HANDLE_VALUE)
 {
  MessageBox("打开文件失败!","错误提示",MB_OK);
  return;
 }

 //获取文件大小
 dwFileSize=GetFileSize(hFile,NULL);
 //设定加壳后的文件名

 m_FilePathNamePacked=m_FilePathName.Left(m_FilePathName.GetLength()-4)+"_packed.exe";

 //创建文件映射。如果对文件映射不了解,请自行查阅相关资料。
 hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
 //如果创建映射失败,弹出对话框,并关闭文件句柄,然后返回。
 if (hMapping==NULL)
 {
  MessageBox("创建文件映射失败!","错误提示",MB_OK);
  CloseHandle(hFile); //关闭创建的文件句柄
  return;
 }
 //将文件映射对象映射到当前应用程序的地址空间中
 lpHeadBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
 if (lpHeadBase==NULL)
 {
  MessageBox("文件映射地址失败!","错误提示",MB_OK);
  CloseHandle(hMapping); //关闭映射句柄
  CloseHandle(hFile);  //关闭文件句柄
  return;
 }

 //创建加壳后的文件句柄
 hFile=CreateFile(m_FilePathNamePacked,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
  NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
 if (hFile==INVALID_HANDLE_VALUE)
 {
  MessageBox("生成文件失败!","错误提示!",MB_OK);
 }


 //写入文件
 if (!WriteFile(hFile,lpHeadBase,dwFileSize,&dwBufferRead,NULL))
 {
  MessageBox("写入文件失败!","错误提示!",MB_OK);
  //卸载文件映射,关闭文件句柄
  UnmapViewOfFile(lpHeadBase);
  CloseHandle(hMapping);
  CloseHandle(hFile);
  return;
 }
 //卸载文件映射,关闭文件句柄
 UnmapViewOfFile(lpHeadBase);
 CloseHandle(hMapping);
 CloseHandle(hFile);
 //在编辑框中显示信息
 m_RichEditProcInfo.ReplaceSel("文件加壳完成!\r\n");
 
 MessageBox("创建文件成功!","成功提示",MB_OK);


 
}


 

针对于上次还要修改的地方:

打开对话框资源,修改RichEdit的属性,勾选“多行”和“自动垂直滚动”,去掉“自动水平滚动”。

在OnButtonOpenfile() 函数中,在代码

 //替换编辑框最后的内容,实际上就是在最后添加内容。
 m_RichEditProcInfo.ReplaceSel("文件路径:");
 m_RichEditProcInfo.ReplaceSel(m_FilePathName);

的后面添加:

 m_RichEditProcInfo.ReplaceSel("\r\n");

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值