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宏允许驱动程序进行调用,以便在不遇到 PREfast for Drivers 警告的情况下引发 IRQL。

测试时通常很难找到此条件(除非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
}