从void *数组中获取值

时间:2014-02-24 08:13:38

标签: c winapi pointers

我正在使用拦截函数调用的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];
}

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);
}

当然,请忽略任何拼写错误,因为我无法为您提供经过测试的代码。