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
}