-
大小: 275KB文件类型: .rar金币: 2下载: 1 次发布日期: 2021-06-04
- 语言: C/C++
- 标签:
资源简介
从网络下载了CMemLoadDll源码,整理并增加了对64位dll的加载,并增加了调用实例代码(含32位、64位dll的调用)。以上代码全部基于vs2008,当然CMemLoadDll源码在vc6下也可用。
代码片段和文件信息
// MemLoadDll.cpp: implementation of the CMemLoadDll class.
//
//////////////////////////////////////////////////////////////////////
#include “StdAfx.h“
#include “MemLoadDll.h“
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMemLoadDll::CMemLoadDll()
{
m_bIsLoadOk = FALSE;
m_pImagebase = NULL;
m_pDllMain = NULL;
}
CMemLoadDll::~CMemLoadDll()
{
if(m_bIsLoadOk)
{
// ASSERT(m_pImagebase != NULL);
// ASSERT(m_pDllMain != NULL);
//脱钩,准备卸载dll
m_pDllMain((HINSTANCE)m_pImagebase DLL_PROCESS_DETACH 0);
VirtualFree(m_pImagebase 0 MEM_RELEASE);
}
}
//MemLoadLibrary函数从内存缓冲区数据中加载一个dll到当前进程的地址空间,缺省位置0x10000000
//返回值: 成功返回TRUE 失败返回FALSE
//lpFileData: 存放dll文件数据的缓冲区
//nDataLength: 缓冲区中数据的总长度
BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData int nDataLength)
{
if (m_pImagebase != NULL)
{
return FALSE; //已经加载一个dll,还没有释放,不能加载新的dll
}
//检查数据有效性,并初始化
if (!CheckDataValide(lpFileData nDataLength))
{
return FALSE;
}
//计算所需的加载空间
int nImageSize = CalcTotalImageSize();
if (nImageSize == 0)
{
return FALSE;
}
// 分配虚拟内存
void *pMemoryAddress = VirtualAlloc(NULL nImageSize MEM_COMMIT|MEM_RESERVE PAGE_EXECUTE_READWRITE);
if (pMemoryAddress == NULL)
{
return FALSE;
}
else
{
CopyDllDatas(pMemoryAddress lpFileData); //复制dll数据,并对齐每个段
//重定位信息
if (m_pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_baseRELOC].VirtualAddress > 0
&& m_pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_baseRELOC].Size > 0)
{
DoRelocation(pMemoryAddress);
}
//填充引入地址表
if (!FillRavAddress(pMemoryAddress)) //修正引入地址表失败
{
VirtualFree(pMemoryAddress 0 MEM_RELEASE);
return FALSE;
}
//修改页属性。应该根据每个页的属性单独设置其对应内存页的属性。这里简化一下。
//统一设置成一个属性PAGE_EXECUTE_READWRITE
unsigned long unOld;
VirtualProtect(pMemoryAddress nImageSize PAGE_EXECUTE_READWRITE &unOld);
}
//修正基地址
#ifdef WIN32
m_pNTHeader->OptionalHeader.Imagebase = (DWORD)pMemoryAddress;
#else
m_pNTHeader->OptionalHeader.Imagebase = (ULONGULONG)pMemoryAddress;
#endif
//接下来要调用一下dll的入口函数,做初始化工作。
m_pDllMain = (ProcDllMain)(m_pNTHeader->OptionalHeader.AddressOfEntryPoint + (PBYTE)pMemoryAddress);
BOOL InitResult = m_pDllMain((HINSTANCE)pMemoryAddress DLL_PROCESS_ATTACH 0);
if (!InitResult) //初始化失败
{
m_pDllMain((HINSTANCE)pMemoryAddress DLL_PROCESS_DETACH 0);
VirtualFree(pMemoryAddress 0 MEM_RELEASE);
m_pDllMain = NULL;
return FALSE;
}
m_bIsLoadOk = TRUE;
m_pImagebase = pMemoryAddress;
return TRUE;
}
BOOL CMemLoadDll::IsLoadOk()
{
return m_bIsLoadOk;
}
//MemGetProcAddress函数从dll中获取指定函数的地址
//返回值: 成功返回函数地址 失败返回NULL
//lpProcName: 要查找函数的名字或者序号
FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lp
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1230 2010-11-10 14:49 MemLoadDll.h
文件 418 2010-11-09 14:33 CalcModule\CalcModule.cpp
文件 4450 2010-11-09 14:31 CalcModule\CalcModule.dsp
文件 543 2010-11-09 14:12 CalcModule\CalcModule.dsw
文件 320 2010-11-09 14:32 CalcModule\CalcModule.h
文件 48640 2010-11-09 19:25 CalcModule\CalcModule.opt
文件 1727 2010-11-09 14:33 CalcModule\CalcModule.plg
文件 1239 2010-11-10 14:15 CalcModule\CalcModule.sln
..A..H. 9728 2010-11-10 14:54 CalcModule\CalcModule.suo
文件 11863 2010-11-10 14:15 CalcModule\CalcModule.vcproj
文件 1637 2010-11-09 14:12 CalcModule\ReadMe.txt
文件 297 2010-11-09 14:12 CalcModule\StdAfx.cpp
文件 802 2010-11-09 14:12 CalcModule\StdAfx.h
文件 452096 2010-11-10 14:10 Demo\CalcModule32.dll
文件 548352 2010-11-10 14:15 Demo\CalcModule64.dll
文件 35716 2010-11-10 14:28 Demo\memdll.aps
文件 1047 2010-11-09 15:20 Demo\memdll.clw
文件 1890 2010-11-09 15:25 Demo\memdll.cpp
文件 4291 2010-11-03 16:22 Demo\memdll.dsp
文件 535 2010-11-03 16:21 Demo\memdll.dsw
文件 1324 2010-11-03 16:21 Demo\memdll.h
文件 49664 2010-11-09 15:20 Demo\memdll.opt
文件 1614 2010-11-09 15:20 Demo\memdll.plg
文件 5204 2010-11-10 14:28 Demo\memdll.rc
文件 1231 2010-11-09 15:27 Demo\memdll.sln
..A..H. 16384 2010-11-10 14:58 Demo\memdll.suo
文件 14280 2010-11-10 14:29 Demo\memdll.vcproj
文件 5944 2010-11-10 14:57 Demo\memdllDlg.cpp
文件 1434 2010-11-10 14:29 Demo\memdllDlg.h
文件 14209 2010-11-10 14:49 Demo\MemLoadDll.cpp
............此处省略14个文件信息
- 上一篇:基于轮廓的倾斜仪表校正
- 下一篇:VC++(MFC)实现FTP功能(源代码)
评论
共有 条评论