C28170
Warnung C28170: Die Funktion wurde als Auslagerungssegment deklariert, aber es wurden weder PAGED_CODE noch PAGED_CODE_LOCKED gefunden.
Das Codeanalysetool meldet diesen Fehler, wenn #pragma alloc_text oder #pragma code_seg verwendet wird, um eine Funktion, die kein PAGED_CODE oder PAGED_CODE_LOCKED Makro enthält, in einen ausgelagerten Codeabschnitt zu verschieben. Dieser Fehler wird an der Zeilennummer gemeldet, die der ersten geschweiften Klammer ({) in der Funktion entspricht.
Das Codeanalysetool leitet ab, dass ein Abschnitt ausgelagert werden kann, wenn der Abschnittsname mit PAGE beginnt. Die Funktionen im ausgelagerten Code müssen ein PAGED_CODE- oder PAGED_CODE_LOCKED-Makro am Anfang der Funktion zwischen der ersten geschweiften Klammer ({ ) und der ersten bedingten Anweisung enthalten.
Diese Makros ermöglichen es dem Codeanalysetool und einer Laufzeitprüfung, zu bestimmen, ob ausgelagerter Code in einem IRQL mit erhöhten Rechten ausgeführt werden kann. Wenn ein Seitenfehler auftritt, während das System mit erhöhten Rechten ausgeführt wird, stürzt das System ab.
Wenn die Funktionen in einem ausgelagerten Segment anschließend in den Arbeitsspeicher gesperrt werden, verwenden Sie PAGED_CODE_LOCKED anstelle von PAGED_CODE. Das makro PAGE_CODE_LOCKED ermöglicht es dem Treiber, Aufrufe zu tätigen, die den IRQL auslösen, ohne dass eine PREfast for Drivers-Warnung auftritt.
Diese Bedingung ist beim Testen häufig sehr schwer zu finden (es sei denn, das PAGED_CODE Makro wird verwendet, um die Treiberüberprüfung auf den Fehler zu überprüfen), da der Code tatsächlich ausgelagert werden muss, damit der Seitenfehler auftritt.
Beispiel
Im folgenden Codebeispiel wird diese Warnung ausgelöst.
void func();
#pragma alloc_text("PAGED_CODE", func);
void func1()
{
// paged, no PAGED_CODE: error
}
Im folgenden Codebeispiel wird diese Warnung vermieden.
void func();
#pragma alloc_text("PAGED_CODE", func);
void func2()
{
PAGED_CODE(); // includes PAGED_CODE macro
}