我正在使用拦截函数调用的API(DynamoRIO)。执行函数之前调用wrap_find_first_file_pre方法,执行函数后调用wrap_find_first_file_post。方法签名由API提供。在预方法中,可以获得函数的参数,但是它们不能在后方法中获得。 API指定如果您需要使用post方法中的参数,则必须通过OUT void ** user_data参数传递它们。
我将两个值作为void ** OUT参数传递,并通过void *参数从第二个函数访问它们。我收到了一个转换错误,我不确定我是否在第二个函数中以正确的方式访问了这些值。
static void wrap_find_first_file_pre(void *wrapcxt, OUT void **user_data){
*(user_data) = (void *)find_path; //LPCTSTR
*(user_data + 1) = (void *)ffd; //WIN32_FIND_DATA
}
static void wrap_find_first_file_post(void *wrapcxt, void *user_data){
LPCTSTR find_path = (LPCTSTR) user_data[0];
WIN32_FIND_DATA ffd = (WIN32_FIND_DATA) user_data[1];
}
答案 0 :(得分:0)
这是一个非常标准的模式,允许您传递数据,而API不知道您可能希望传递哪种数据。 void **user_data
不是void *
的数组,它只是void *
的 out 参数。你只能用它返回一个void *
。
你应该做的是这些方面:
struct my_user_data {
LPCTSTR find_path;
WIN32_FIND_DATA ffd;
};
static void wrap_find_first_file_pre(void *wrapcxt, OUT void **user_data) {
my_user_data *ud = malloc(sizeof(struct my_user_data));
ud->find_path = /* However you get this */;
ud->ffd = /* However you get this */;
*user_data = ud;
}
static void wrap_find_first_file_post(void *wrapcxt, void *user_data) {
my_user_data *ud = (my_user_data *)user_data;
/* Do something with ud->find_path and ud->ffd */
free(ud);
}
当然,请忽略任何拼写错误,因为我无法为您提供经过测试的代码。