请教两次使用VirtualQuery获取内存保护属性失败

songjinn 2009-08-27 09:33:18
分配完内存之后获取保护属性是正确的,可是在修改完毕保护属性后,再次获取保护属性还是当初分配时的保护属性。自己认为可能是没有成功修改保护属性,
可能是在边界处理上没有做好,但是不知道该怎么去修改。

恳请;)

下面粘贴代码

CString strBuf;
CString strMemoryProtect;
CString strProtect;
PVOID pvAddress;
MEMORY_BASIC_INFORMATION mbi;
MEMORY_BASIC_INFORMATION mbi_after;
//DWORD dwLength;
DWORD dwVirtualQuery;
DWORD dwVirtualQuery_after;
DWORD dwOldProtect;

//分配10MB,PAGE_READWRITE
pvAddress = VirtualAlloc(NULL, 100, MEM_RESERVE | MEM_COMMIT, PAGE_READONLY);
if (pvAddress == NULL)
{
MessageBox("VirtualAlloc Error", "error", MB_OK);
}
else
{
strBuf.Format("Address: 0x%08x", pvAddress);
MessageBox(strBuf, "successful", MB_OK);
}

//获取保护状态/**/
dwVirtualQuery = VirtualQuery(pvAddress, &mbi, sizeof(mbi));
switch (mbi.AllocationProtect)
{
case PAGE_READWRITE:
strMemoryProtect.Format("--PAGE_READWRITE--");
break;
case PAGE_READONLY:
strMemoryProtect.Format("--PAGE_READONLY--");
break;
default:
strMemoryProtect.Format("--Page_****--0x%08x--%d", mbi.AllocationProtect, dwVirtualQuery);
break;
}
MessageBox(strMemoryProtect, "Protect", MB_OK);
strMemoryProtect.Empty();

//修改保护状态
if (VirtualProtect(pvAddress, 100, PAGE_NOACCESS, &dwOldProtect) != 0)
{
switch (dwOldProtect)
{
case PAGE_READWRITE:
strMemoryProtect.Format("--PAGE_READWRITE--");
break;
case PAGE_READONLY:
strMemoryProtect.Format("--PAGE_READONLY--");
break;
default:
strMemoryProtect.Format("--Page_****--0x%08x--%d", dwOldProtect, dwVirtualQuery);
break;
}
strProtect.Format("Change Protect Successful");//\nBefore: %s\nAfter: PAGE_READONLY, strMemoryProtect
MessageBox(strProtect, "successful", MB_OK);
strMemoryProtect.Empty();
}
else
{
MessageBox("Change Protect error", "error", MB_OK);
}

//Sleep(2000);
//重新获取保护状态
dwVirtualQuery_after = VirtualQuery(pvAddress, &mbi_after, sizeof(mbi_after));
switch (mbi_after.AllocationProtect)
{
case PAGE_READWRITE:
strMemoryProtect.Format("2--PAGE_READWRITE--0x%08x", mbi_after.AllocationProtect);
break;
case PAGE_READONLY:
strMemoryProtect.Format("2--PAGE_READONLY--");
break;
default:
strMemoryProtect.Format("2--Page_****--0x%08x--%d", mbi_after.AllocationProtect, dwVirtualQuery_after);
break;
}
MessageBox(strMemoryProtect, "Protect", MB_OK);
strMemoryProtect.Empty();

//释放10MB
if(VirtualFree(pvAddress, 0, MEM_RELEASE))
{
MessageBox("Free Memory Successful", "successful", MB_OK);
}
else
{
MessageBox("Free Memory Error", "error", MB_OK);
}
...全文
182 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
csyj501 2011-01-21
  • 打赏
  • 举报
回复
MEMORY_BASIC_INFORMATION.Protect才是当前内存的标记
csyj501 2011-01-21
  • 打赏
  • 举报
回复
AllocationProtect是指分配时指定的保护标记
songjinn 2009-08-27
  • 打赏
  • 举报
回复
请教

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧