C28170

警告 C28170:函数已声明为分页段,但找不到PAGED_CODE和PAGED_CODE_LOCKED

使用 #pragma alloc_text 或 #pragma code_seg 将不包含PAGED_CODE或 PAGED_CODE_LOCKED 宏的函数移动到可分页代码节时,代码分析工具将报告此错误。 此错误在与函数中的第一 (个大括号 {) 对应的行号处报告。

当节名称以 PAGE 开头时,代码分析工具会推断节是可分页的。 可分页代码中的函数必须在第一个大括号 {) 与第一个条件语句之间的函数开头包含 (PAGED_CODE 或PAGED_CODE_LOCKED宏

这些宏允许代码分析工具和运行时检查器确定是否可以在提升的 IRQL 上运行可分页代码。 如果在提升的级别运行系统时发生页面错误,则系统将崩溃。

如果分页段中的函数随后锁定到内存中,请使用 PAGED_CODE_LOCKED 而不是PAGED_CODE。 PAGE_CODE_LOCKED 宏允许驱动程序调用引发 IRQL,而不会遇到驱动程序的 PREfast 警告。

在测试 (时,这种情况通常很难找到,除非使用PAGED_CODE宏导致驱动程序验证程序检查错误) ,因为代码必须实际分页才能发生页面错误。

示例

下面的代码示例引发此警告。

void func();
#pragma alloc_text("PAGED_CODE", func);

void func1()
{
   // paged, no PAGED_CODE: error
}

下面的代码示例避免了此警告。

void func();
#pragma alloc_text("PAGED_CODE", func);

void func2()
{
   PAGED_CODE(); // includes PAGED_CODE macro
}