Поделиться через


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
}