4

根据定义(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 函数的原因是什么?

4

1 回答 1

11

Windows api 是使用层实现的。上面有详细记录的 winapi,每个 Windows 程序都应该使用它来进行操作系统调用。微软永远无法改变它,这样做会破坏很多遗留程序。最下面的是原生操作系统api,函数名以Nt或Zw开头。除了编写驱动程序所需的之外,没有记录。微软会随着每个 Windows 版本定期更改它,这是它可以在 Windows 上进行创新而不会破坏太多代码的基本方式。Vista 是 Windows 的最后一个版本,在底层发生了巨大的变化,产生的抱怨已经很好地公布了。

中间还有一层,帮助函数从已发布的 API 转换为未记录的 API 并返回。它的名字以 Rtl 开头。

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

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

于 2013-04-15T13:30:04.473 回答