这只是一个简单的问题。我一直在阅读使用DetourAttach(&(PVOID &)BindKeyT, BindKeyD);
附加到子程序的内存地址的东西的来源,其中BindKeyT
是内存中子程序的地址。我很好奇,(&(PVOID &)
究竟是什么意思?我理解PVOID
是一个无效指针,但是如何将它转换成一个可以用来附加绕道的函数?
答案 0 :(得分:2)
Terry Mahaffey是对的,你传递的是一个指向函数指针的指针。每当您传递指针的函数(在本例中为DetourAttach)想要返回多个值时,通常会使用此方法,其中一个返回值是指针。由于C / C ++中的函数只能返回单个值,因此从中获取多个值的唯一方法是通过指针。
一个简单的例子是当一个人希望返回一个指向已分配内存块的指针时。然后可以编写一个函数:
int allocstr(int len, char **retptr)
{
char *p = malloc(len + 1); /* +1 for \0 */
if(p == NULL)
return 0;
*retptr = p;
return 1;
}
要回答你的另一个问题,关于如何设置一个用作函数的内存地址,可以这样做:
void* (void * BindKeyT)(const char* key) = actual_BindKeyT;
// actual_BindKeyT is a pointer to a function that will be defined elsewhere,
// and whose declaration you will include in your project through a header file
// or a dll import
void * BindKeyD(const char* key)
{
// Code for your hook function
}
DetourAttach(&(PVOID&)BindKeyT, BindKeyD);
(摘自http://zenersblog.blogspot.com/2008/04/api-hooking-with-detours-part-1.html)
请记住,BindKeyT和BindKeyD的声明应匹配。
答案 1 :(得分:1)
我头脑中的C ++解析器(不是没有bug)说它是BindKeyT的C样式转换,引用指向void的指针 - (PVOID&)部分 - 然后取出它的地址 - 和&在前。因此表达式的结果是指向函数的指针。
答案 2 :(得分:0)
这里有Detours的介绍:api-hooking-with-detours-part-1