发个通过内存映射实现DLL和EXE通信的例子
本来想做个控制台,然后把DLL注入游戏,通过控制台和DLL通信挂机,所以自己写了个内存映射实现通信的代码,但发现做起来很麻烦,又要写DLL又要写EXE,很难调试。http://www.ghoffice.com/bbs/images/post/smile/default2/16.gif ,已经改为远程注入CALL了下面是代码
EXE中的头文件:
// MemShare.h: interface for the CMemShare class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MEMSHARE_H__AE687DC1_4358_4382_8404_7F9BEFAE36FE__INCLUDED_)
#define AFX_MEMSHARE_H__AE687DC1_4358_4382_8404_7F9BEFAE36FE__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
struct SData1
{
int idata;
int idata1;
};
class CMemShare
{
public:
CMemShare();
virtual ~CMemShare();
void CreatMap(CString MapName);
void WriteMap(SData1 Data,int iLengByte);
void _Init();
void Destory();
protected:
HANDLE m_hFileMap; //创建MAP句柄
HANDLEm_hOpenMap; //打开MAP句柄(没用上)
LPBYTE lpData; //MAP地址指针
};
#endif // !defined(AFX_MEMSHARE_H__AE687DC1_4358_4382_8404_7F9BEFAE36FE__INCLUDED_)
EXE中的代码:
// MemShare.cpp: implementation of the CMemShare class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "内存映射共享结构体.h"
#include "MemShare.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMemShare::CMemShare()
{
_Init();
}
CMemShare::~CMemShare()
{
// Destory();
}
void CMemShare::CreatMap(CString MapName)
{
int iLengByte = sizeof(SData1);
m_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT,0,iLengByte,MapName);
if (!m_hFileMap)
{
AfxMessageBox("CreateFileMapping() failed.");
return;
}
return;
}
void CMemShare::WriteMap(SData1 Data,int iLengByte)
{
// LPBYTE lpData;
lpData = (LPBYTE)MapViewOfFile(m_hFileMap,FILE_MAP_WRITE,0,0,0);
if (lpData==NULL)
{
AfxMessageBox("MapViewOfFile() failed.");
CloseHandle(m_hFileMap);
m_hFileMap=NULL;
return;
}
SData1 *psd=(SData1*)lpData;
psd->idata=Data.idata;
psd->idata1=Data.idata1;
}
void CMemShare::_Init()
{
m_hFileMap=NULL;
lpData=NULL;
}
void CMemShare::Destory()
{
if (m_hFileMap!=NULL)
{
UnmapViewOfFile(lpData);
lpData = NULL;
CloseHandle(m_hFileMap);
m_hFileMap = NULL;
}
}
DLL中的头文件:
// ShareMem.h: interface for the CShareMem class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SHAREMEM_H__3D5627C2_F663_4A08_85A6_FCD272EBDA02__INCLUDED_)
#define AFX_SHAREMEM_H__3D5627C2_F663_4A08_85A6_FCD272EBDA02__INCLUDED_
#include "测试进程Dlg.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
typedef struct tagSDATA1
{
int idata;
int idata1;
}SData1,*SDATA1;
class CShareMem
{
public:
CShareMem();
virtual ~CShareMem();
void OpenMap(CString MapName);
void ReadMap(SData1* psd);
void CloseMap();
protected:
HANDLE m_hOpenMap;//打开MAP句柄
LPBYTE lpReadData;//MAP地址指针
};
#endif // !defined(AFX_SHAREMEM_H__3D5627C2_F663_4A08_85A6_FCD272EBDA02__INCLUDED_)
DLL中的代码
// ShareMem.cpp: implementation of the CShareMem class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "测试进程.h"
#include "ShareMem.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CShareMem::CShareMem()
{
}
CShareMem::~CShareMem()
{
}
void CShareMem::OpenMap(CString MapName)
{
m_hOpenMap=OpenFileMapping(FILE_MAP_READ,FALSE,MapName);
if (m_hOpenMap==NULL)
{
AfxMessageBox("OpenFileMapping() failed.");
return;
}
return;
}
void CShareMem::ReadMap(SData1* psd)
{
lpReadData=(LPBYTE)MapViewOfFile(m_hOpenMap,FILE_MAP_READ,0,0,0);
if (lpReadData==NULL)
{
AfxMessageBox("MapViewOfFile() failed.");
return;
}
SData1 *pData=(SData1*)lpReadData;
psd->idata=pData->idata;
psd->idata1=pData->idata1;
}
void CShareMem::CloseMap()
{
UnmapViewOfFile(lpReadData);
lpReadData = NULL;
CloseHandle(m_hOpenMap);
m_hOpenMap = NULL;
} 当然是要支持了! 看帖回帖是一种美德!:lol 无回帖,不论坛,这才是人道。 学习了,谢谢分享、、、 很好啊!!!!!!!!!! 看看楼主发的是什么 大人,此事必有蹊跷! 我也是坐沙发的 支持楼主,用户楼主,楼主英明呀!!!
页:
[1]
2