|
VC++ MFC 保护程序自己内存代码
在VC++ MFC中,可以使用以下代码保护程序自己的内存:
- #include <afxwin.h>
- #include <iostream>
- void ProtectMemory()
- {
- MEMORY_BASIC_INFORMATION mbi;
- DWORD oldProtect;
- // 获取当前函数所在模块的基址
- HMODULE hModule = AfxGetInstanceHandle();
- // 获取当前函数所在模块的内存信息
- VirtualQuery(hModule, &mbi, sizeof(mbi));
- // 修改内存页属性
- VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READONLY, &oldProtect);
- }
- class CMyApp : public CWinApp
- {
- public:
- virtual BOOL InitInstance();
- };
- BOOL CMyApp::InitInstance()
- {
- // 保护程序自己的内存
- ProtectMemory();
- // 读取和修改内存
- int iData = 123;
- std::cout << "iData: " << iData << std::endl;
- iData = 456;
- std::cout << "iData: " << iData << std::endl;
- // 恢复内存页属性
- DWORD oldProtect;
- MEMORY_BASIC_INFORMATION mbi;
- HMODULE hModule = AfxGetInstanceHandle();
- VirtualQuery(hModule, &mbi, sizeof(mbi));
- VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &oldProtect);
- return CWinApp::InitInstance();
- }
- CMyApp theApp;
复制代码 在上面的代码中,我们定义了一个ProtectMemory函数,该函数使用VirtualQuery函数获取当前函数所在模块(即程序自己)的内存信息,并使用VirtualProtect函数将内存页属性修改为只读。在CMyApp类的InitInstance函数中,我们调用ProtectMemory函数保护程序自己的内存,并读取和修改内存。最后,我们使用VirtualProtect函数将内存页属性恢复为原来的属性。
需要注意的是,在使用VirtualQuery函数获取内存信息时,我们需要传递一个MEMORY_BASIC_INFORMATION结构体作为参数,并指定该结构体的大小为sizeof(MEMORY_BASIC_INFORMATION)。在使用VirtualProtect函数修改内存页属性时,我们需要指定内存页的大小,即mbi.RegionSize参数。在本例中,我们使用AfxGetInstanceHandle函数获取当前函数所在模块的基址,并将其作为VirtualProtect函数的第一个参数。
|
|