堆管理
//创建一个堆,第三个参数为零代表会自动增长的堆
HANDLE hHeap = HeapCreate(0, 0, 0);
SYSTEM_INFO si; //系统信息
GetSystemInfo(&si); // 获取系统信息
//在堆上分配3个页面大小的内存
LPVOID lpMem = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY, si.dwPageSize * 3);
HeapFree(hHeap, 0, lpMem);
HeapDestroy(hHeap);
HANDLE hHeap = GetProcessHeap(); // 获取默认堆
SYSTEM_INFO si; //系统信息
GetSystemInfo(&si); // 获取系统信息
//在堆上分配3个页面大小的内存
lpMem = HeapAlloc(hHeap,
HEAP_ZERO_MEMORY, si.dwPageSize * 3);
HeapFree(hHeap, 0, lpMem);
//HeapDestroy( hHeap );//系统堆不能销毁
虚拟内存管理
// 申请虚拟内存
//第一个参数为NULL的话由系统确认分配区域的位置
//第二个参数为分配的大小,会自动对齐,对齐粒度为一页4kb
//
// LPVOID lpMem = VirtualAlloc(NULL,
// 1,
// MEM_COMMIT,
// PAGE_READWRITE);
// memcpy(lpMem, "hello", sizeof("hello"));
// VirtualFree(lpMem, 0, MEM_RELEASE);
//VirtualAllocEx为指定进程分配新的虚拟地址空间
DWORD dwPid = 38096; //进程pid
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);//打开进程
LPVOID lpMem = VirtualAllocEx(hProcess, NULL,
1,
MEM_COMMIT,
PAGE_READWRITE);
// //memcpy(lpMem, "hello", sizeof("hello"));
// DWORD dwWrite;
// // 将数据写入指定进程hProcess中的内存区域lpMem
// WriteProcessMemory(hProcess, lpMem, "hello", sizeof("hello"), &dwWrite);
// char szStr[100] = {};
//从指定进程hProcess中的内存区域lpMem读取数据
// ReadProcessMemory(hProcess, lpMem, szStr, sizeof(szStr), &dwWrite);
// printf("%X\n", lpMem);
// system("pause");
// 释放分配的虚拟内存
// VirtualFreeEx(hProcess,lpMem, 0, MEM_RELEASE);
//修改内存属性API
DWORD dwOld;
//修改分配的虚拟内存属性为只读
//VirtualProtect(lpMem, 1, PAGE_READONLY, &dwOld);
//memcpy(lpMem, "world", sizeof("world"));//error 访问异常
//恢复原属性
//VirtualProtect(lpMem, 1, dwOld, &dwOld);
//修改指定进程分配的虚拟内存属性为只读
VirtualProtectEx(hProcess, lpMem, 1, PAGE_READONLY, &dwOld);
DWORD dwWrite;
WriteProcessMemory(hProcess, lpMem, "hello", sizeof("hello"), &dwWrite);
char szStr[100] = {
};
ReadProcessMemory(hProcess, lpMem, szStr, sizeof(szStr),