Compartilhar via


C28170

aviso C28170: a função foi declarada como em um segmento paginado, mas nem PAGED_CODE nem PAGED_CODE_LOCKED foram encontrados

A ferramenta Análise de Código relata esse erro quando #pragma alloc_text ou #pragma code_seg é usado para mover uma função que não contém uma macro PAGED_CODE ou PAGED_CODE_LOCKED em uma seção de código paginável. Esse erro é relatado no número de linha que corresponde à primeira chave ({) na função.

A ferramenta Análise de Código infere que uma seção é paginável quando o nome da seção começa com PAGE. As funções no código paginável devem conter uma macro PAGED_CODE ou PAGED_CODE_LOCKED no início da função entre a primeira chave ({ ) e a primeira instrução condicional.

Essas macros permitem que a ferramenta Análise de Código e um verificador em tempo de execução determinem se o código paginável pode ser executado em um IRQL elevado. Se ocorrer uma falha de página enquanto o sistema estiver em execução em um nível elevado, o sistema falhará.

Se as funções em um segmento paginado forem posteriormente bloqueadas na memória, use PAGED_CODE_LOCKED em vez de PAGED_CODE. A macro PAGE_CODE_LOCKED permite que o driver faça chamadas que geram o IRQL sem encontrar um aviso PREfast for Drivers.

Essa condição geralmente é muito difícil de encontrar durante o teste (a menos que a macro PAGED_CODE seja usada para fazer com que o Verificador de Driver marcar para o erro), porque o código deve realmente ser paginado para que a falha de página ocorra.

Exemplo

O exemplo de código a seguir gera esse aviso.

void func();
#pragma alloc_text("PAGED_CODE", func);

void func1()
{
   // paged, no PAGED_CODE: error
}

O exemplo de código a seguir evita esse aviso.

void func();
#pragma alloc_text("PAGED_CODE", func);

void func2()
{
   PAGED_CODE(); // includes PAGED_CODE macro
}