Freigeben über


C28170

Warnung C28170: Die Funktion wurde in einem seitenseitigen Segment deklariert, aber 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 zu verschieben, die kein PAGED_CODE oder PAGED_CODE_LOCKED Makro in einen ausserstellbaren Codeabschnitt enthält. Dieser Fehler wird an der Zeilennummer gemeldet, die der ersten geschweiften Klammer ({) in der Funktion entspricht.

Das Codeanalysetool leitet ab, dass ein Abschnitt seitenfähig ist, 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 das Codeanalysetool und eine Laufzeitüberprüfung, um zu bestimmen, ob seitenfähiger Code bei einem IRQL mit erhöhten Rechten ausgeführt werden kann. Wenn ein Seitenfehler auftritt, während das System auf einer erhöhten Ebene ausgeführt wird, stürzt das System ab.

Wenn die Funktionen in einem seitenseitigen Segment anschließend in den Arbeitsspeicher gesperrt sind, verwenden Sie PAGED_CODE_LOCKED anstelle von PAGED_CODE. Das PAGE_CODE_LOCKED Makros ermöglicht es dem Treiber, Aufrufe auszuführen, die den IRQL auslösen, ohne dass eine PREfast für Treiberwarnung auftritt.

Diese Bedingung ist häufig sehr schwierig zu finden, während tests (es sei denn, das makro PAGED_CODE 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

Das folgende Codebeispiel löst diese Warnung aus.

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
}