为什么RtlFillMemory/RtlCopyMemory定义为宏

Xea*_*nox 4 windows macros winapi crt

从定义(winnt.h):

#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
Run Code Online (Sandbox Code Playgroud)

我们看到这个函数实际上是宏,它调用memset/memcpy函数.

问题是为什么?

原来这个函数是由kernel32.dll导出的(但只作为存根到ntdll.dll),那么将它们用作CRT函数的原因是什么?

Han*_*ant 11

Windows api使用图层实现.有一个记录良好的winapi,每个Windows程序应该使用它来进行操作系统调用.微软永远不会改变它,这样做会破坏许多遗留程序.底部的是本机操作系统api,其名称以Nt或Zw开头.没有记录编写驱动程序所需的文档.Microsoft会定期更新每个Windows版本,这是它在Windows上进行创新而不会破坏太多代码的基本方式.Vista是最后一个版本的Windows,底层真的发生了巨大的变化,产生的抱怨已经很好地发布了.

中间有一层,辅助函数从已发布的api转换为未记录的api和back.它的名字以Rtl开头.

它们也意味着没有文档,但是程序员对它们进行了逆向工程,最终依赖于它们.有些已被Microsoft记录,因为它们通常可用于调试或填补winapi中的空白.这对微软来说是痛苦的,不可避免地当底层发生变化时,那些Rtl功能也需要改变.RtlCopyMemory和RtlFillMemory特别被滥用,许多VB6代码使用它,因为它没有发布同样功能的已发布函数.

好吧,那只猫已经不在了.因此,您发现的声明是Microsoft尝试使程序使用已记录的函数并停止依赖可能需要更改的函数.它可以做的唯一合理的事情来解决这个问题.