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


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 for Drivers.

Это условие часто бывает очень трудно найти во время тестирования (если макрос 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
}