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
}