Реферат: Централизованная обработка исключений

public:

CatUnhandledExceptionFilter();

~CatUnhandledExceptionFilter();

ool HookUpUnhandledFilter();

};

где

m_oldSystemUnhandledFilter – адрес оригинальной функции UnhandledExceptionFilter.

myUnhandledExceptionFilter – дружественная классу функция-переходник, ее назначение и код будут рассмотрены ниже.

UnhandledExceptionFilter – наш фильтр необработанных исключений

HookUpUnhandledFilter – функция установки нашего фильтра исключений.

Проект ehfilter является обычной DLL, которая должна быть загружена в адресное пространство приложения. Во время загрузки библиотеки в файле main.cpp создается глобальная переменная gFeedBackFilter типа CatUnhandledExceptionFilter. Во время создания этой переменной в конструкторе определяется адрес функции UnhandledExceptionFilter и запоминается в переменной m_oldSystemUnhandledFilter. Когда в библиотеку приходит сообщение DLL_PROCESS_ATTACH, вызывается функция HookUpUnhandledFilter, которая устанавливает наш фильтр необработанных исключений.

Код функции HookUpUnhandledFilter приведен ниже:

bool CatUnhandledExceptionFilter::HookUpUnhandledFilter()

{

if ( m_oldSystemUnhandledFilter == 0 )

return false;

DWORD addr = m_oldSystemUnhandledFilter;

DWORD old = 0;

if ( TRUE == VirtualProtect((LPVOID)addr, 5, PAGE_READWRITE, &old) )

{

unsigned char *p = (unsigned char*)addr;

*p = 0xE9;

UINT_PTR ehFilter = (UINT_PTR)myUnhandledExceptionFilter;

addr += 5;

ehFilter = ehFilter - addr;

p++;

DWORD *pp = (DWORD*)p;

*pp = ehFilter;

m_oldSystemUnhandledFilter += 5;

К-во Просмотров: 272
Бесплатно скачать Реферат: Централизованная обработка исключений