C28170
avertissement C28170 : la fonction a été déclarée dans un segment paginé, mais ni PAGED_CODE ni PAGED_CODE_LOCKED n’a été trouvée
L’outil Analyse du code signale cette erreur quand #pragma alloc_text ou #pragma code_seg est utilisé pour déplacer une fonction qui ne contient pas de macro PAGED_CODE ou PAGED_CODE_LOCKED dans une section de code paginable. Cette erreur est signalée au numéro de ligne qui correspond à la première accolade ({) de la fonction.
L’outil Analyse du code déduit qu’une section est paginable lorsque le nom de la section commence par PAGE. Les fonctions du code paginable doivent contenir une macro PAGED_CODE ou PAGED_CODE_LOCKED au début de la fonction entre la première accolade ({ ) et la première instruction conditionnelle.
Ces macros permettent à l’outil Analyse du code et à un vérificateur d’exécution de déterminer si du code paginable peut être exécuté avec un IRQL avec élévation de privilèges. Si une erreur de page se produit alors que le système s’exécute à un niveau élevé, le système se bloque.
Si les fonctions d’un segment paginé sont ensuite verrouillées dans la mémoire, utilisez PAGED_CODE_LOCKED au lieu de PAGED_CODE. La macro PAGE_CODE_LOCKED permet au pilote d’effectuer des appels qui déclenchent l’IRQL sans rencontrer d’avertissement PREfast pour pilotes.
Cette condition est souvent très difficile à trouver lors du test (sauf si la macro PAGED_CODE est utilisée pour provoquer le vérificateur de pilotes à case activée pour l’erreur), car le code doit être mis en page pour que l’erreur de page se produise.
Exemple
L’exemple de code suivant déclenche cet avertissement.
void func();
#pragma alloc_text("PAGED_CODE", func);
void func1()
{
// paged, no PAGED_CODE: error
}
L’exemple de code suivant évite cet avertissement.
void func();
#pragma alloc_text("PAGED_CODE", func);
void func2()
{
PAGED_CODE(); // includes PAGED_CODE macro
}