C28170

advertencia C28170: se ha declarado que la función está en un segmento paginado, pero no se encontró PAGED_CODE ni PAGED_CODE_LOCKED

La herramienta Análisis de código notifica este error cuando se usa #pragma alloc_text o #pragma code_seg para mover una función que no contiene una macro PAGED_CODE o PAGED_CODE_LOCKED en una sección de código paginable. Este error se notifica en el número de línea que corresponde a la primera llave ({) de la función.

La herramienta Análisis de código deduce que una sección se puede paginar cuando el nombre de la sección comienza por PAGE. Las funciones del código paginable deben contener una macro PAGED_CODE o PAGED_CODE_LOCKED al principio de la función entre la primera llave ({ ) y la primera instrucción condicional.

Estas macros permiten que la herramienta análisis de código y un comprobador en tiempo de ejecución determinen si el código paginable se puede ejecutar en un IRQL con privilegios elevados. Si se produce un error de página mientras el sistema se ejecuta en un nivel elevado, el sistema se bloqueará.

Si las funciones de un segmento paginado se bloquean posteriormente en la memoria, use PAGED_CODE_LOCKED en lugar de PAGED_CODE. La macro PAGE_CODE_LOCKED permite al controlador realizar llamadas que generen irQL sin encontrar una advertencia PREfast para controladores.

Esta condición suele ser muy difícil de encontrar durante las pruebas (a menos que se use la macro PAGED_CODE para hacer que el Comprobador de controladores compruebe el error), ya que el código debe paginarse realmente para que se produzca el error de página.

Ejemplo

En el ejemplo de código siguiente se produce esta advertencia.

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

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

En el ejemplo de código siguiente se evita esta advertencia.

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

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