C28170

upozornění C28170: Funkce byla deklarována jako stránkovaná, ale nebyla nalezena PAGED_CODE ani PAGED_CODE_LOCKED

Nástroj analýza kódu hlásí tuto chybu, když #pragma alloc_text nebo #pragma code_seg slouží k přesunutí funkce, která neobsahuje PAGED_CODE nebo PAGED_CODE_LOCKED makro do oddílu kódu s možností stránky. Tato chyba je hlášena na čísle řádku, které odpovídá první složené závorce ({) ve funkci.

Nástroj Analýza kódu odvodí, že oddíl je stránkovatelný, když název oddílu začíná stránkou PAGE. Funkce v stránkovatelném kódu musí obsahovat PAGED_CODE nebo PAGED_CODE_LOCKED makro na začátku funkce mezi první složenou závorkou ({ ) a prvním podmíněným příkazem.

Tato makra umožňují nástroji Pro analýzu kódu a nástroj pro kontrolu za běhu určit, jestli se stránkovatelný kód může spouštět v prostředí IRQL se zvýšenými oprávněními. Pokud dojde k chybě stránky, když systém běží na vyšší úrovni, systém se chybově ukončí.

Pokud jsou funkce v stránkovaném segmentu následně uzamčeny do paměti, použijte místo PAGED_CODE PAGED_CODE_LOCKED. Makro PAGE_CODE_LOCKED umožňuje ovladači provádět volání, která vyvolá irQL, aniž by se zobrazila upozornění PREfast pro ovladače.

Tato podmínka je při testování často velmi obtížná (pokud se makro PAGED_CODE nepoužívá k tomu, aby ovladač ověřil chybu), protože kód musí být skutečně stránkován, aby došlo k chybě stránky.

Příklad

Následující příklad kódu vyvolá toto upozornění.

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

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

Následující příklad kódu zabrání tomuto upozornění.

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

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