5.5 分配和释放可读可写的虚拟内存页面

效果

5.5 分配和释放可读可写的虚拟内存页面_第1张图片

源码

#include

#include

int main(int argc, PCHAR argv[]){

SIZE_T sizeVirtual = 4000;//大小

LPVOID lpRound = (LPVOID)0x100000FF;//地址

MEMORY_BASIC_INFORMATION mbi;//内存信息

//分配内存,直接分配已提交的内存

LPVOID lpAddress = VirtualAlloc(lpRound, sizeVirtual, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

if (lpAddress == NULL){

printf("分配虚拟内存失败: %d\n", GetLastError());

return 1;

}

printf("分配成功: MEM_COMMIT | MEM_RESERVE 内存已从 空闲 提交为 已提交\n");

//复制数据到内存中

CopyMemory(lpAddress, TEXT("misaka"), lstrlen(TEXT("misaka")));

printf("复制成功,地址: 0x%x, 内容: %s\n", lpAddress, lpAddress);

//获取内存信息并打印

VirtualQuery(lpAddress, &mbi, sizeof(mbi));

printf("使用VirtualQuery函数获得的信息是;\n");

printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);

printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);

printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);

//释放内存,将页面变为保留状态

printf("释放内存,将页面变为保留状态 DECOMMIT\n");

if (!VirtualFree(lpRound, sizeVirtual, MEM_DECOMMIT)){

printf("释放虚拟内存失败: %d\n", GetLastError());

return 1;

}

//再次获取内存信息

VirtualQuery(lpAddress, &mbi, sizeof(mbi));

printf("使用VirtualQuery函数获得的信息是;\n");

printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);

printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);

printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);

//释放内存,将页面变为空闲状态

printf("释放内存,将页面变为空闲状态 RELEASE\n");

if (!VirtualFree(lpAddress, 0, MEM_RELEASE)){

printf("释放虚拟内存失败: %d\n", GetLastError());

return 1;

}

//虽然设置的地址是0x100000FF,大小4000(FA0),跨越了两个虚拟内存页

//所以VirtualAlloc函数自动进行了对齐,这是虚拟内存分配对齐机制

//代码中第二次使用VirtualFree参数不同,使用MEM_RELEASE参数释放虚拟内存必须

//这样释放对齐后的页基址

getchar();

return 0;

}

你可能感兴趣的:(5.5 分配和释放可读可写的虚拟内存页面)