C28170

警告C28170: 関数はページング セグメント内にあると宣言されていますが、PAGED_CODE も PAGED_CODE_LOCKED も見つかりませんでした

コード分析ツールによってこのエラーが報告されるのは、ページング可能なコード セクションに、PAGED_CODE または PAGED_CODE_LOCKED マクロが含まれていない関数を #pragma alloc_text または #pragma code_seg を使用して移動した場合です。 このエラーは、関数内の最初の中かっこ ({) に対応する行番号で報告されます。

コード分析ツールでは、セクション名が PAGE で始まるときに、セクションがページング可能であると見なされます。 ページング可能なコード内の関数には、最初の中かっこ ({ ) と最初の条件ステートメントの間の関数の先頭に、PAGED_CODE または PAGED_CODE_LOCKED マクロが含まれている必要があります。

これらのマクロを使用すると、コード分析ツールとランタイム チェッカーは、ページング可能なコードを管理者特権の IRQL で実行できるかどうかを判断できます。 管理者特権レベルでシステムが実行されている間にページ障害が発生すると、システムはクラッシュします。

ページング セグメント内の関数がその後メモリにロックされる場合は、PAGED_CODE の 代わりに PAGED_CODE_LOCKED を使用します。 PAGE_CODE_LOCKED マクロを使用すると、ドライバーは PREfast for Drivers 警告を発生させることなく IRQL を引き上げる呼び出しを行うことができます。

ページ フォールトが発生するにはコードが実際にページアウトする必要があるため、この状態をテスト中に検出するのは、(PAGED_CODE マクロを使用してドライバー検証ツールでエラーをチェックしない限り) 非常に難しくなることが少なくありません。

次のコード例では、この警告を発生させています。

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

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

次のコード例では、この警告は生成されません。

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

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