stuPointInfo tempPointInfo;
stuPointInfo* pResultPointInfo = NULL;
memset(&tempPointInfo, 0, sizeof(stuPointInfo));
tempPointInfo.lpPointAddr = lpAddr;
tempPointInfo.ptType = MEM_POINT;
tempPointInfo.isOnlyOne = FALSE;
if
(stricmp(
"access"
, pCmd->chParam2) == 0)
{
tempPointInfo.ptAccess = ACCESS;
}
else
if
(stricmp(
"write"
, pCmd->chParam2) == 0)
{
tempPointInfo.ptAccess = WRITE;
}
else
{
printf
(
"Void access!\r\n"
);
return
FALSE;
}
int nLen = (int)HexStringToHex(pCmd->chParam3, TRUE);
if
(nLen == 0 )
{
printf
(
"Point length can not set Zero!\r\n"
);
return
FALSE;
}
tempPointInfo.dwPointLen = nLen;
tempPointInfo.nPtNum = m_nOrdPtFlag;
m_nOrdPtFlag++;
//
[FONT=宋体]查找该内存断点在断点链表中是否已经存在[
/FONT
]
if
(FindPointInList(tempPointInfo, &pResultPointInfo, FALSE))
{
if
(pResultPointInfo->dwPointLen >= nLen)
//
[FONT=宋体]存在同样类型且长度大于要设置断点的断点[
/FONT
]
{
printf
(
"The Memory breakpoint is already exist!\r\n"
);
return
FALSE;
}
else
//
[FONT=宋体]查找到的断点长度小于要设置的断点长度,则删除掉找到的断点,重新设置[
/FONT
]
//
[FONT=宋体]此时只需要删除断点[
/FONT
]-[FONT=宋体]分页表项[
/FONT
] [FONT=宋体]和[
/FONT
] [FONT=宋体]断点表项[
/FONT
]
{
DeletePointInList(pResultPointInfo->nPtNum, FALSE);
}
}
//
[FONT=宋体]根据[
/FONT
] tempPointInfo [FONT=宋体]设置内存断点[
/FONT
]
//
[FONT=宋体]添加断点链表项,添加内存断点[
/FONT
]-[FONT=宋体]分页表中记录,添加分页信息表记录[
/FONT
]
//
[FONT=宋体]首先根据[
/FONT
] tempPointInfo [FONT=宋体]中的地址和长度获得所跨越的全部分页[
/FONT
]
LPVOID lpAddress = (LPVOID)((int)tempPointInfo.lpPointAddr & 0xfffff000);
DWORD OutAddr = (DWORD)tempPointInfo.lpPointAddr +
tempPointInfo.dwPointLen;
MEMORY_BASIC_INFORMATION mbi = {0};
while
( TRUE )
{
if
( sizeof(mbi) != VirtualQueryEx(m_hProcess, lpAddress, &mbi, sizeof(mbi)) )
{
break
;
}
if
((DWORD)mbi.BaseAddress >= OutAddr)
{
break
;
}
if
( mbi.State == MEM_COMMIT )
{
//
[FONT=宋体]将内存分页信息添加到分页表中[
/FONT
]
AddRecordInPageList(mbi.BaseAddress,
mbi.RegionSize,
mbi.AllocationProtect);
//
[FONT=宋体]将断点[
/FONT
]-[FONT=宋体]分页信息添加到断点[
/FONT
]-[FONT=宋体]分页表中[
/FONT
]
DWORD dwPageAddr = (DWORD)mbi.BaseAddress;
while
(dwPageAddr < OutAddr)
{
stuPointPage *pPointPage = new stuPointPage;
pPointPage->dwPageAddr = dwPageAddr;
pPointPage->nPtNum = tempPointInfo.nPtNum;
g_PointPageList.push_back(pPointPage);
//
[FONT=宋体]设置该内存页为不可访问[
/FONT
]
DWORD dwTempProtect;
VirtualProtectEx(m_hProcess, (LPVOID)dwPageAddr,
1, PAGE_NOACCESS, &dwTempProtect);
dwPageAddr += 0x1000;
}
}
lpAddress = (LPVOID)((DWORD)mbi.BaseAddress + mbi.RegionSize);
if
((DWORD)lpAddress >= OutAddr)
{
break
;
}
}
//
[FONT=宋体]断点添加到断点信息表中[
/FONT
]
stuPointInfo *pPoint = new stuPointInfo;
memcpy(pPoint, &tempPointInfo, sizeof(stuPointInfo));
g_ptList.push_back(pPoint);
printf
(
"***Set Memory breakpoint success!***\r\n"
);