-
大小: 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功能(源代碼)
評論
共有 條評論