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
}