我正在使用一个 API (DynamoRIO) 来拦截函数调用。在函数执行之前调用wrap_find_first_file_pre方法,在函数执行之后调用wrap_find_first_file_post方法。方法签名由 API 提供。在pre方法中可以获取函数的参数,但在post方法中无法获取。 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];
}
最佳答案
这是一个非常标准的模式,允许您在 API 不知道您可能想要传递哪种数据的情况下传递数据。 void **user_data
不是一个 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);
}
当然,请忽略任何拼写错误等,因为我无法为您提供经过测试的代码。
关于c - 从 void * 数组获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21982226/