Проверить перед вызовом обработчика аварии,
//в состояние готовности.
InitSymEng ();
// Проверить список g_ahMod.
BOOL bCalllt = FALSE;
if ( 0 == g_uiModCount)
{
bCalllt = TRUE;
}
else {
HINSTANCE hBaseAddr = (HINSTANCE)
SymGetModuleBase ((HANDLE)GetCurrentProcessId (), (DWORD)pExPtrs->
ExceptionRecord->
ExceptionAddress);
if ( NULL != hBaseAddr)
{
for ( UINT i = 0; i < g__uiModCount; i ++)
{
if ( hBaseAddr == g_ahMod[ i ])
{
bCalllt = TRUE; break;
}
}
}
}
if ( TRUE == bCalllt)
{
// Проверить перед вызовом обработчика аварии, что он все еще
// существует в памяти.
// Пользователь может забыть зарегистрироваться,
//и обработчик аварии оказывается недействительным, потому что
// он не загружен. Однако, если какая-нибудь другая функция
// загружена в тот же самый адрес, мало что можно сделать.
ASSERT ( FALSE == IsBadCodePtr( (FARPROC)g_pfnCallBack));
if ( FALSE == IsBadCodePtr ( (FARPROC)g_pfnCallBack))
{
IRet = g_pfnCallBack ( pExPtrs);
}
}
else
{
// Вызвать предыдущий фильтр, но только после того,
// как он закончит работу. Я просто немного параноик!:)
ASSERT ( FALSE == IsBadCodePtr ( (FARPROC) g__pfnOrigFilt) ) ;
if ( FALSE == IsBadCodePtr ( (FARPROC)g_pfnOrigFiIt))
{
IRet = g_pfnOrigFilt ( pExPtrs);
}
}
CleanupSymEng ();
}
}
_except ( EXCEPTION_EXECUTE_HANDLER)
{
IRet = EXCEPTION_CONTINUE_SEARCH;
}
return ( IRet);
}
/*/////////////////////////////////////////////
Реализация функций-трансляторов EXCEPTION_POINTER-структyp
//////////////////////////////////////////////*/
LPCTSTR _stdcall GetFaultReason ( EXCEPTION_POINTERS * pExPtrs) {
ASSERT ( FALSE == IsBadReadPtr ( pExPtrs,
sizeof ( EXCEPTION_POINTERS)));
if ( TRUE = IsBadReadPtr ( pExPtrs,
sizeof ( EXCEPTION_POINTERS)))
{
TRACEO ( "Bad parameter to GetFaultReasonA\n");
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий