C宏将函数名与预定义的名称列表进行比较
我在windows上挂接了一些函数(大约200个),我想在所有这些函数中添加一些通用功能。根据我给我的应用程序的一个标志,钩住或不钩住一些预定义的函数 我的想法是这样的:C宏将函数名与预定义的名称列表进行比较,c,visual-studio,macros,precompile,C,Visual Studio,Macros,Precompile,我在windows上挂接了一些函数(大约200个),我想在所有这些函数中添加一些通用功能。根据我给我的应用程序的一个标志,钩住或不钩住一些预定义的函数 我的想法是这样的: #define SHOULD_CHECK_STOP_MONITOR (1 == Configuration.dwShouldMonitor) #define MY_CHECK_MACRO(f) (if(SHOULD_CHECK_STOP_MONITOR && /* What do I do
#define SHOULD_CHECK_STOP_MONITOR (1 == Configuration.dwShouldMonitor)
#define MY_CHECK_MACRO(f) (if(SHOULD_CHECK_STOP_MONITOR && /* What do I do here? */))
void MyHookedFunctionName_A(...)
{
if(!MY_CHECK_MACRO(__FUNCTION__))
goto lbl_Cleanup;
/* rest of code logic */
lbl_Cleanup:
return ...;
}
void MyHookedFunctionName_B(...)
{
if(!MY_CHECK_MACRO(__FUNCTION__))
goto lbl_Cleanup;
/* rest of code logic */
lbl_Cleanup:
return ...;
}
我想要实现的结果是一个预编译逻辑,不是在动态运行时执行,而是在编译时执行。如果1==Configuration.dwShouldMonitor
被配置为True
,它将检查逻辑的其余部分,在这里我将有一些预定义的函数名列表[“MyHookedFunctionName\u A”、“MyHookedFunctionName\u C”、“MyHookedFunctionName\u D”]
宏将根据函数名知道是返回False
还是True
。因此,在本例中,MyHookedFunctionName_B
将执行,而MyHookedFunctionName_A
将不会执行,因为编译时预定义了列表
这样的事情可能吗?对于基于函数名的“复杂”逻辑,是否将其与预定义字符串函数名进行比较
编辑2019.09.15:
我在这里添加了我希望在预编译逻辑之后得到的结果
void MyHookedFunctionName_A(...)
{
if(!(1 == Configuration.dwShouldMonitor && False))
goto lbl_Cleanup;
...
}
void MyHookedFunctionName_B(...)
{
if(!(1 == Configuration.dwShouldMonitor && True))
goto lbl_Cleanup;
...
}
在编译时根据函数字符串名称生成
True
或False
的情况下,许多编译器应该能够完全优化“运行时”检查
下面是一个简单的程序来说明这一点
#include <string.h>
#include <stdio.h>
static const char* func_list[] = { "foo", "bar" };
static inline int is_in_list(const char* f) {
for (int i = 0; i < sizeof(func_list)/sizeof(func_list[0]); ++i)
if (strcmp(f, func_list[i]) == 0)
return 1;
return 0;
}
#define HOOKME if (SHOULD_HOOK && is_in_list(__func__)) return;
void foo() {
HOOKME;
printf("foo\n");
}
void bar() {
HOOKME;
printf("bar\n");
}
void baz() {
HOOKME;
printf("baz\n");
}
int main()
{
foo();
bar();
baz();
}
并非所有的编译器都能做到这一点。明智地选择你的工具 我认为用宏是不可能的。如果是C++,你可以使用<代码> CONTXPRP> /COD>函数…@ HOLYBLASCAT,C中没有替代的等价物吗?我唯一的选择是在运行时的每个函数内执行这个逻辑,我想不出,但是我可能错了。宏调用的结果是一个文本,通常是C或C++程序。您想要生成什么样的文本根本不清楚。您是否可以发布设置标志时希望生成的一些文本,以及未设置标志时希望从同一来源生成的一些文本?您不必在预处理之前发布源代码。这正是预处理后您希望看到的。嘿@n.m.,我添加了我期望的结果,基于函数字符串名称,我希望它能够方便地创建
True
或False
语句,我可以轻松控制所有函数,如果不需要动态执行此逻辑,就像我正在寻找的那样,无法真正使其工作,但是,您知道它是否应该与Microsoft Visual Studio 2015编译器一起工作吗?@0xAK此特定代码不工作(即MSC不会对其进行优化)。
foo:
ret
bar:
ret
.LC0:
.string "baz"
baz:
mov edi, OFFSET FLAT:.LC0
jmp puts
main:
sub rsp, 8
xor eax, eax
call baz
xor eax, eax
add rsp, 8
ret