C 有趣内存钩子中的符号

C 有趣内存钩子中的符号,c,memory,hook,C,Memory,Hook,可能重复: 从 任何人都可以解释这段代码是如何工作的?特别是,c_是什么符号 #define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a; VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no); *(INT_PTR*)&c##_=*p; VirtualProtect(p,4,PAGE_EXECUTE_READWRITE,&no); *p=(IN

可能重复:

从 任何人都可以解释这段代码是如何工作的?特别是,c_是什么符号

#define DsHook(a,b,c) if (!c##_) { 
INT_PTR* p=b+*(INT_PTR**)a;  VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no);
*(INT_PTR*)&c##_=*p;  VirtualProtect(p,4,PAGE_EXECUTE_READWRITE,&no);  *p=(INT_PTR)c;
它在代码中展开为-

//  redirect  7th member func of IAsyncReader (SyncReadAlligned) to grab mp3 data from output pin of source filter
DsHook(reader,6,SyncReadAlligned); 
我想,这不是一种非常安全的处理记忆的方式,但作者认为这并不重要:

像钩子这样不重要的代码是以片段形式折叠起来的,但是可以随意使用 以您喜欢的方式展开并格式化代码

顺便说一句,如果有人对测试感兴趣,谷歌已经封锁了谷歌本身的乐趣

更新:我认为,简短的分析应该是- 为了重定向IAsyncReader SyncReadAlligned的第7个成员func以从源过滤器的输出引脚获取mp3数据,我们将提交页面的特定区域上的内存保护从原来的任何位置更改为允许完全访问的页面执行读写

关于安全问题,MSDN说:

最好避免使用VirtualProtect更改上的页面保护 GlobalAlloc、HeapAlloc或LocalAlloc分配的内存块, 因为一个页面上可以存在多个内存块。 ... 当保护将可执行的区域时,调用程序 负责确保缓存一致性


它是一个预处理器指令,意味着连接。c_u将生成一个包含参数c的替换值和文字字符u的标记。例如:

#define foo(c) c##_

当使用foobar调用时,它将扩展到bar。

此符号在宏定义中有特殊含义,即连接。这里,c_u将c与下划线连接起来,形成一个新的标记c_u。注意这里c是一个参数。因此,通过将hereIAm作为参数传递给宏,在展开后,c_u将变成hereIAm。

谢谢,虽然如此,但不确定。对这个钩子的安全性有什么评论吗?谷歌搜索了一下堆栈溢出。但我对这段代码的工作方式也很感兴趣。