C30029

警告:调用请求可执行内存的内存分配函数。

此警告表示正在使用的功能已被禁止,并且有更强大或更安全的替换功能。 此特定错误表明使用了仅分配可执行非分页池的 API。

注解

只有在需要可执行内存时才可使用。 有关详细信息,请参阅无执行 (NX) 非分页池。 无法提供任何参数来改变这种行为。 解决此问题的唯一方法是使用允许分配不可执行非分页池内存的替代函数。 在下面的示例后,可以找到该错误涉及的所有禁用函数列表以及推荐的替代函数。

代码分析名称:BANNED_MEM_ALLOCATION_NOTYPE

示例

下面的代码将生成此警告。 此问题源于 MmMapIoSpace 的使用:

MmMapIoSpace(PhysicalAddress, numberOfBytes, MmNonCached);

以下代码通过将 MmMapIoSpace 替换为 MmMapIoSpace 来避免此警告:

MmMapIoSpaceEx(PhysicalAddress, numberOfBytes, PAGE_NOCACHE | PAGE_READWRITE);

禁止的函数

禁止的 API 替代函数 理由/备注
MmMapIoSpace() MmMapIoSpaceEx()
MmAllocateContiguousMemorySpecifyCache() MmAllocateContiguousNodeMemory() 根据缓存类型的不同,SpecifyCache 的使用方式可能会将其限制在非可执行内存中。 不过,使用 NodeMemory 可以确保这一点。 有关详细信息,请参阅 C30030,“有关涉及缓存类型的缺陷”子部分