Реферат: Централизованная обработка исключений
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
Бесплатно скачать Реферат: Централизованная обработка исключений
|