HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 04.09.2021, 16:21
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

Это обертка над
Код:
AddVectoredExceptionHandler
и
Код:
RemoveVectoredExceptionHandler
, что бы засунуть обработчик не пойманных исключений внутрь класса.

Пример использования:

C++:





Код:
class
MyExceptionFilter
:
public
ExceptionFilter
{
protected
:
long
filter
(
_EXCEPTION_POINTERS
*
ep
)
noexcept
override
{
// handle exception
return
0
;
// EXCEPTION_CONTINUE_SEARCH
}
}
;


Цитата:
Сообщение от Спойлер  

Данный класс добавляет хуки на основе исключений. Такие хуки можно поставить туда, куда не впихиваются другие. Минус таких хуков - они очень медленно выполняются.

header:





Код:
#pragma once
#include "ExceptionFilter.h"
#include 
#include 
#include 
class
SilentHooks
:
public
ExceptionFilter
{
#ifdef _WIN64
static
constexpr
auto
kMaxOpcodeLength
=
20
;
#else
static
constexpr
auto
kMaxOpcodeLength
=
10
;
#endif
std
::
map
>
>
hooks_
;
public
:
void
addHook
(
size_t addr
,
const
std
::
function

&
callback
)
noexcept
;
void
removeHook
(
size_t addr
)
noexcept
;
bool
reenableHook
(
size_t addr
)
const
noexcept
;
static
void
changerRetAddr
(
_EXCEPTION_POINTERS
*
ep
,
size_t addr
)
noexcept
;
protected
:
long
filter
(
_EXCEPTION_POINTERS
*
ep
)
noexcept
override
;
}
;


source:





Код:
#include "SilentHooks.h"
#include 
void
SilentHooks
::
addHook
(
size_t addr
,
const
std
::
function

&
callback
)
noexcept
{
auto
newHook
=
hooks_
.
find
(
addr
)
==
hooks_
.
end
(
)
;
hooks_
[
addr
]
.
push_back
(
callback
)
;
if
(
newHook
)
{
DWORD oldVP
;
VirtualProtect
(
(
void
*
)
addr
,
1
,
PAGE_EXECUTE_READ
|
PAGE_GUARD
,
&
oldVP
)
;
}
}
void
SilentHooks
::
removeHook
(
size_t addr
)
noexcept
{
if
(
hooks_
.
find
(
addr
)
==
hooks_
.
end
(
)
)
return
;
while
(
reenableHook
(
addr
)
)
;
// wait to hook exited
DWORD oldVP
;
VirtualProtect
(
(
void
*
)
addr
,
1
,
PAGE_EXECUTE_READ
,
&
oldVP
)
;
}
bool
SilentHooks
::
reenableHook
(
size_t addr
)
const
noexcept
{
if
(
hooks_
.
find
(
addr
)
==
hooks_
.
end
(
)
)
return
false
;
DWORD oldVP
;
VirtualProtect
(
(
void
*
)
addr
,
1
,
PAGE_EXECUTE_READ
|
PAGE_GUARD
,
&
oldVP
)
;
return
oldVP
!=
(
PAGE_EXECUTE_READ
|
PAGE_GUARD
)
;
}
void
SilentHooks
::
changerRetAddr
(
_EXCEPTION_POINTERS
*
ep
,
size_t addr
)
noexcept
{
ep
->
ContextRecord
->
Eip
=
addr
;
ep
->
ContextRecord
->
EFlags
&=
~
0x100
;
}
long
SilentHooks
::
filter
(
_EXCEPTION_POINTERS
*
ep
)
noexcept
{
if
(
ep
->
ExceptionRecord
->
ExceptionCode
==
STATUS_GUARD_PAGE_VIOLATION
)
{
auto
it
=
hooks_
.
find
(
(
size_t
)
ep
->
ExceptionRecord
->
ExceptionAddress
)
;
if
(
it
==
hooks_
.
end
(
)
)
return
0
;
DWORD oldVP
;
VirtualProtect
(
ep
->
ExceptionRecord
->
ExceptionAddress
,
1
,
PAGE_EXECUTE_READ
,
&
oldVP
)
;
ep
->
ContextRecord
->
EFlags
|=
0x100
;
// step once
for
(
auto
&
cb
:
it
->
second
)
cb
(
ep
)
;
// execute callbacks
return
-
1
;
}
else
if
(
ep
->
ExceptionRecord
->
ExceptionCode
==
STATUS_SINGLE_STEP
)
{
bool
fromHook
=
false
;
for
(
auto
&&
[
addr
,
cb
]
:
hooks_
)
{
if
(
addr
>
(
size_t
)
ep
->
ExceptionRecord
->
ExceptionAddress
)
continue
;
if
(
!
reenableHook
(
addr
)
)
continue
;
fromHook
=
true
;
break
;
}
if
(
!
fromHook
)
return
0
;
ep
->
ContextRecord
->
EFlags
&=
~
0x100
;
// run code
return
-
1
;
}
return
0
;
}


Требования: C++11 или выше

Код: https://gitlab.com/SR_team/ExceptionFilter
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.