MS Win32安全功能中的内存分配

时间:2013-10-08 17:46:54

标签: c security winapi memory

为什么MS Security示例似乎在一个函数的文档中使用一个内存分配例程,而在另一个函数中使用另一个例程?

我找到了一个示例,他们实际上在示例代码中的不同点使用不同的。请参阅GetAppContainerNamedObjectPath功能。

在分配SID时使用HeapAlloc,在分配安全描述符时使用LocalAlloc。在示例结束之前,两个分配都被释放,为什么它们使用不同的方法?我见过人们在博客示例中使用::malloc

2 个答案:

答案 0 :(得分:1)

在这种情况下,

LocalAllocHeapAlloc是相同的。情况并非总是如此,但至少已经持续了十年。我知道,它令人困惑,但它是传统16位系统和向后兼容性的全部结果。见documentation

  

Windows内存管理不提供单独的本地堆和全局堆,如16位> Windows确实如此。因此,全球和地方的职能家庭是等同的   在他们之间做出选择是个人偏好的问题。

另见documentation

  

从私有堆分配的内存与分配的内存之间没有区别   使用其他内存分配函数。有关功能的完整列表,请参阅表格   在内存管理功能。

存在差异,因此请务必阅读内存功能的文档。例如,CoTaskMemFree处理NULL但HeapFree不处理。不同的分配函数将为您提供不同程度的控制,以便在OS对象(进程等)之间分配和共享内存。但是如果你只想为你的过程想要一些简单的旧内存,那么请检查你正在使用的API的文档,因为它可能指定你应该使用特定的分配或释放函数,但是,只需选择一个并保持一致。

为什么文档会将其切换?我的猜测是,随着时间的推移它被不止一个人攻击,其中没有一个是真正的操作系统团队成员。 MSDN示例代码非常糟糕。应该有一种方法可以标记它或在MSDN页面上留下反馈。

答案 1 :(得分:0)

MS安全示例不使用malloc,因为malloc函数具有运行时依赖性的缺点, HeapAlloc(使用RtlReAllocateHeap)不会为0大小的指针分配内存,其中malloc加上LocalAlloc的开销比HeapAlloc高,但小于malloc。