为什么RtlFillMemory / RtlCopyMemory定义为宏

时间:2013-04-15 06:07:30

标签: windows winapi macros crt

从定义(winnt.h):

#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))

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

问题是为什么?

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

1 个答案:

答案 0 :(得分:11)

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

介于两者之间,帮助函数从已发布的api转换为未记录的api和back。它的名字以Rtl开头。

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

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