在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → 内存方式加载DLL

内存方式加载DLL

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:26.53M
  • 下载次数:13
  • 浏览次数:244
  • 发布时间:2020-12-29
  • 实例类别:C/C++语言基础
  • 发 布 人:hxske
  • 文件格式:.rar
  • 所需积分:2
 相关标签: dLL 加载 内存

实例介绍

【实例简介】
【实例截图】

【源码目录】

MemLoadDll

├── CalcModule
│   ├── CalcModule.cpp
│   ├── CalcModule.dsp
│   ├── CalcModule.dsw
│   ├── CalcModule.h
│   ├── CalcModule.opt
│   ├── CalcModule.plg
│   ├── CalcModule.sln
│   ├── CalcModule.suo
│   ├── CalcModule.vcproj
│   ├── ReadMe.txt
│   ├── StdAfx.cpp
│   └── StdAfx.h
├── Demo
│   ├── Backup
│   │   ├── memdll.sln
│   │   └── memdll.v12.suo
│   ├── CalcModule32.dll
│   ├── CalcModule64.dll
│   ├── MemLoadDll.cpp
│   ├── MemLoadDll.h
│   ├── ReadMe.txt
│   ├── StdAfx.cpp
│   ├── StdAfx.h
│   ├── UpgradeLog.htm
│   ├── ipch
│   │   └── memdll-34b9df56
│   │       └── debug
│   │           ├── memdll-3c3810e4.ipch
│   │           └── memdll-8ccb9c22.ipch
│   ├── memdll.aps
│   ├── memdll.clw
│   ├── memdll.cpp
│   ├── memdll.dsp
│   ├── memdll.dsw
│   ├── memdll.h
│   ├── memdll.opt
│   ├── memdll.plg
│   ├── memdll.rc
│   ├── memdll.sln
│   ├── memdll.suo
│   ├── memdll.v12.suo
│   ├── memdll.vcproj
│   ├── memdll.vcxproj
│   ├── memdll.vcxproj.filters
│   ├── memdllDlg.cpp
│   ├── memdllDlg.h
│   ├── res
│   │   ├── memdll.ico
│   │   └── memdll.rc2
│   └── resource.h
├── MemLoadDll.cpp
└── MemLoadDll.h

7 directories, 46 files



【核心代码】

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;
}

标签: dLL 加载 内存

实例下载地址

内存方式加载DLL

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
;
报警