ASSERT ( FALSE == IsBadWritePtr ( pOpCode, sizeof ( OPCODE)));
if ( ( TRUE == IsBadReadPtr ( dp, sizeof ( DEBUGPACKET))) ||
( TRUE == IsBadWritePtr ( pOpCode, sizeof ( OPCODE))) )
{
TRACE0 ( "SetBreakpoint : invalid parameters\n!");
return ( FALSE);
}
// Если текущая операционная система Windows 98 и адрес
// больше 2 Гбайт, то просто выполните возврат,
if ( ( FALSE = IsNT ()) && ( ulAddr >= 0x80000000))
{
return ( FALSE);
}
// Читать код операции по определенному адресу.
bReadMem = DBG_ReadProcessMemory ( dp->hProcess ,
(LPCVOID)ulAddr, SbTempOp , sizeof ( BYTE), SdwReadWrite ) ;
ASSERT ( FALSE != bReadMem);
ASSERT ( sizeof ( BYTE) = dwReadWrite);
if ( ( FALSE = bReadMem ) ||
( sizeof ( BYTE) != dwReadWrite))
{
return ( FALSE);
}
// Готова ли эта новая точка прерывания переписать
// код операции существующей точки прерывания?
if ( BREAKJDPCODE = bTempOp)
{
return ( -1);
}
// Получить страничные свойства для подчиненного отладчика.
DBG_VirtualQueryEx ( dp->hProcess ,
(LPCVOID)ulAddr,
&mbi ,
sizeof ( MEMORY_BASIC_INFORMATION) );
// Перевести подчиненный отладчик в режим
// "копирование-при записи" для страниц памяти,
if ( FALSE == DBG_VirtualProtectEx ( dp->hProcess ,
mbi.BaseAddress ,
mbi.RegionSize ,
PAGE_EXECUTE_READWRITE,
&mbi.Protect ) )
{
ASSERT ( ! "VirtualProtectEx .failed!!");
return ( FALSE);
}
// Сохранить код заменяемой операции.
*pOpCode = (void*)bTempOp;
bТеmрОр = BREAK_DPCODE;
dwReadWrite = 0;
// Код операции был сохранен, так что теперь
// нужно установить точку прерывания.
bWriteMem = DBG_WriteProcessMemory ( dp->hProcess ,
(LPVOID)ulAddr ,
(LPVOID)SbTempOp,
sizeof ( BYTE) ,
sdwReadWrite );
ASSERT ( FALSE != bWriteMem);