【问题标题】:What is difference between BaseAddress and AllocationBase and between AllocationProtect and Protect in _MEMORY_BASIC_INFORMATION structure?BaseAddress 和 AllocationBase 以及 _MEMORY_BASIC_INFORMATION 结构中的 AllocationProtect 和 Protect 有什么区别?
【发布时间】:2013-10-22 23:36:42
【问题描述】:

_MEMORY_BASIC_INFORMATION 包含描述地址空间的字段。我想知道BaseAddress和AllocationBase有什么区别。 BaseAddress是region的基地址,AllocationBase是什么?

另外,我想知道AllocationProtectProtect 之间的区别。我有点明白,但不确定,我认为AllocationProtect是我们保留区域时的保护属性,Protect是我们使用参数MEM_COMMIT调用VirtualAlloc时的保护属性。如果是这样,当我们只保留区域时,Protect 字段是什么?

【问题讨论】:

    标签: windows operating-system virtualalloc virtualquery


    【解决方案1】:

    当您调用 VirtualAlloc() 时,您可以分配一段跨越多个页面的内存。当您在该部分的中间进行 VirtualQuery() 页面时,AllocationBase 将是 VirtualAlloc 的返回值,它是 VirtualAlloc() 分配的内存的开始。 BaseAddress 将是您查询的单个页面的基地址。

    这是一个展示它的示例程序:

    int main()
    {
        intptr_t addr = (intptr_t)VirtualAlloc(0, 0x3000, MEM_COMMIT, PAGE_READWRITE);
    
        MEMORY_BASIC_INFORMATION mbi{ 0 };
    
        VirtualQuery((void*)(addr + 0x2000), &mbi, sizeof(mbi));
    
        intptr_t middleAddr = addr + 0x2000;
    
        std::cout << "VirtualAlloc returned = 0x" << std::hex << addr << "\n";
    
        std::cout << "Middle Address Queried = 0x" << std::hex << middleAddr << "\n";
    
        std::cout << "mbi.AllocationBase = 0x" << std::hex << mbi.AllocationBase << "\n";
    
        std::cout << "mbi.BaseAddress = 0x" << std::hex << mbi.BaseAddress << "\n";
    
        getchar();
        return 0;
    }
    

    输出:

    VirtualAlloc returned = 0x5d0000
    Middle Address Queried = 0x5d2000
    mbi.AllocationBase = 0x005D0000
    mbi.BaseAddress = 0x005D2000
    

    同样,AllocationProtect 关注的是 Allocation 页面,而不是您查询的单个页面。

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多