DF
Size: a a a
DF
DF
СК
struct HookDescriptorСтурктура описывает контекст некоторого хука, в котором участвует обработчик хука, указатель на оригинальную функцию,
{
using type = int(*)(int);
static constexpr auto FuncName = "Func";
static constexpr auto ModuleName = "Func";
static void* originalFuncPtr;
static int Handler(int a)
{
if (...)
{
return 0;
}
else
{
return reinterpret_cast<type>(originalFuncPtr)(a);
}
}
};
void* HookDescriptor::originalFuncPtr = nullptr;
InstallHook(HookDescriptor::ModuleName, HookDescriptor::FuncName, &HookDescriptor::Handler, &HookDescriptor::originalFuncPtr);Сейчас всё хорошо и удобно. Теперь представим, что таких хуков 50 разных и требуется как-то обобщить ввсё это дело.
// APIВ общем хотелка понятная - хранить всё максимально в одном месте, чтобы красиво и понятно.
int OriginalApiCall(int, int, int);
//
int Hook_OriginalApiCall(int, int, int)
{
// тут хочется, чтобы можно было бы легко получить доступ к сигнатуре функции + originalFuncPtr
}
using MS = MagicStruct<ApiId, ModuleId>; // -- здесь проблема. Каждый хук однозначно определяется именем оригинального АПИ + именем модуля, в качестве строк в шаблон это просто так не запихнешь, поэтому допустим, что передаем значения из какого-нибудь enum-а
InstallHook(MS::ModuleName, MS::FuncName, &MS::Handler, &MS::originalFuncPtr);
m
CD
SH
NK
SH
NK
NK
NK
D
NK
NK
m
NK
CD
m
DP
NK