效果
源码
#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;
}