Отладка приложений


Точки прерывания и пошаговый проход - часть 2


 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); 




Начало  Назад  Вперед



Книжный магазин