これは簡単な質問です。私は、メモリ内のサブルーチンへのアドレスDetourAttach(&(PVOID &)BindKeyT, BindKeyD);
がどこにBindKeyT
あるかを使用して、サブルーチンのメモリアドレスに接続するもののソースを読んでいます。興味があるのですが(&(PVOID &)
、英語で正確には何を意味するのでしょうか? それが void ポインターであることは理解してPVOID
いますが、これはどのようにして迂回を追加するために使用できる関数に変換されるのでしょうか?
3 に答える
テリー・マハフィーは正しいです。あなたが渡しているのは、関数へのポインターへのポインターです。これは、ポインターを渡す関数 (この場合は DetourAttach) が複数の値を返す必要があり、返される値の 1 つがポインターである場合によく使用されます。C/C++ の関数は 1 つの値しか返せないため、関数から複数の値を取得する唯一の方法はポインターを使用することです。
簡単な例は、割り当てられたメモリのブロックへのポインタを返したい場合です。次に、次のような関数を記述できます。
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 の宣言は一致する必要があることに注意してください。
私の頭の中の C++ パーサー (これにはバグがないわけではありません) は、BindKeyT を void へのポインターへの参照 ((PVOID&) 部分) への C スタイルのキャストであり、そのアドレスを取得する (前に & がある) と言っています。 . したがって、式の結果は、関数へのポインターへのポインターです。
Detours の紹介があります: api-hooking-with-detours-part-1