В чем разница между BaseAddress и AllocationBase и между AllocationProtect и Protect в структуре _MEMORY_BASIC_INFORMATION?

_MEMORY_BASIC_INFORMATION содержит поля, описывающие адресное пространство Я хочу знать, в чем разница между BaseAddress и АllocationBase, BaseAddress является базовым адресом региона, а что AllocationBase?

Кроме того, я хочу знать разницу между AllocationProtect а также Protect, Я немного понимаю, но не уверен, я думаю AllocationProtect является атрибутом защиты, когда мы резервируем регион, и Protect это атрибуты защиты, когда мы вызываем VirtualAlloc с параметром MEM_COMMIT, Если так, то каков Protect поле когда у нас просто резервный регион?

0 ответов

Когда вы вызываете 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 относится к странице распределения, а не к отдельной запрашиваемой странице.

Другие вопросы по тегам