c++ - 从自身获取进程的私有(private)内存页(如VMMap)

标签 c++ windows memory memory-management virtual-memory

我有一个使用CLR主机的小型C++应用程序,我需要通过dotnet从C++访问内存映射数据(作为原始数据)。

我发现它的大小是固定的,我想知道如何执行相同的过程VMMap确实会获取私有(private)内存块的列表并检查大小,如果它们与我读取地址的大小匹配。

Memory Block Screenshot

我如何获取该内存数据?

最佳答案

Here's an open source project 带有您想要的确切内容,并且代码编写得非常整洁,对我有很多帮助,非常感谢作者。
查看VMMap.cpp文件。

  • 如前所述,代码拥有进程,请按以下方式获取进程:process(GetCurrentProcessId()
  • 使用详细信息5并获取您需要的所有详细信息。

  • 这是一个使用 VMMap库代码的函数示例:
    process* target_process;
    
    unsigned long long GetPrivateMemoryAddressBySize(DWORD pid,long size,int offset)
    {
        target_process = &(process(pid));
        process_memory memory(*target_process);
    
        for (std::map<unsigned long long, process_memory_group>::const_iterator it_group = memory.groups().begin(); it_group != memory.groups().end(); it_group++) {
            if ((*it_group).second.size() / 1024 == size) {
                return (*it_group).second.base() + offset;
            }
        }
    
        return 0;
    }
    

    关于c++ - 从自身获取进程的私有(private)内存页(如VMMap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60475968/

    相关文章:

    windows - 在 Windows 上使用引号名称的 Git 标签

    c++ - 如何将成员函数传递给 SetConsoleCtrlHandler()?

    c - 如何在 C 中分配临时小内存段

    c++ - 为什么枚举不能是模板?

    c++ - 使用 OpenCV 丢弃细胞图像中的异常值 SIFT 关键点

    c++ - 使用 cmake 在项目属性(eclipse)中添加定义

    c++ - 为什么 C++ 允许将常量转换为另一个方法中的引用参数?

    c++ - WindowProc 调用时序

    c - 函数内部重新分配 - 损坏的大小与 prev_size

    java - 如何查找 Java 内存泄漏