有趣的记忆钩子中的符号

SCh*_*rin 0 c memory hook

可能重复:
C中##预处理器的用途是什么

来自Google TTS的趣味...... 任何人都可以了解这段代码是如何运作的?特别是 - 什么样的符号是"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;
Run Code Online (Sandbox Code Playgroud)

它在代码中展开为 -

//  redirect  7th member func of IAsyncReader (SyncReadAlligned) to grab mp3 data from output pin of source filter
DsHook(reader,6,SyncReadAlligned); 
Run Code Online (Sandbox Code Playgroud)

我想,这不是一种非常安全的内存播放方式,但作者称其为"不重要":

像钩子这样的不重要的代码以代码段的形式折叠,但随意展开并以您喜欢的方式格式化代码.

PS如果Google已经阻止了"Google with Fun"本身(如果有人有兴趣测试的话).

更新:我认为,简短的分析是 - 要"重定向IAsyncReader的第7个成员函数(SyncReadAlligned)以从源过滤器的输出引脚获取mp3数据",我们更改了已提交页面的某些区域的内存保护"是"到PAGE_EXECUTE_READWRITE(允许完全访问).

关于安全MSDN说 -

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

小智 5

它是一个预处理器指令,意思是"连接".c##_将生成一个包含参数c和文字字符的替换值的标记_.例:

#define foo(c) c##_
Run Code Online (Sandbox Code Playgroud)

当使用时foo(bar),这将扩展为bar_.