C28170

peringatan C28170: Fungsi telah dinyatakan berada dalam segmen halaman, tetapi tidak PAGED_CODE maupun PAGED_CODE_LOCKED tidak ditemukan

Alat Analisis Kode melaporkan kesalahan ini ketika #pragma alloc_text atau #pragma code_seg digunakan untuk memindahkan fungsi yang tidak berisi makro PAGED_CODE atau PAGED_CODE_LOCKED ke dalam bagian kode yang dapat dipaginasi. Kesalahan ini dilaporkan pada nomor baris yang sesuai dengan kurung kurawal pertama ({) dalam fungsi.

Alat Analisis Kode menyimpulkan bahwa bagian dapat di-pageable saat nama bagian dimulai dengan PAGE. Fungsi dalam kode yang dapat di-pageable harus berisi makro PAGED_CODE atau PAGED_CODE_LOCKED di awal fungsi antara kurung kurawal pertama ({ ) dan pernyataan kondisional pertama.

Makro ini memungkinkan alat Analisis Kode dan pemeriksa run-time untuk menentukan apakah kode yang dapat di-pageable mungkin dijalankan pada IRQL yang ditingkatkan. Jika kesalahan halaman terjadi saat sistem berjalan pada tingkat yang ditinggikan, sistem akan crash.

Jika fungsi dalam segmen halaman kemudian dikunci ke dalam memori, gunakan PAGED_CODE_LOCKED alih-alih PAGED_CODE. Makro PAGE_CODE_LOCKED mengizinkan driver untuk melakukan panggilan yang menaikkan IRQL tanpa menemui peringatan PREfast untuk Driver.

Kondisi ini seringkali sangat sulit ditemukan saat pengujian (kecuali jika makro PAGED_CODE digunakan untuk menyebabkan Pemverifikasi Driver memeriksa kesalahan), karena kode harus benar-benar di-page out agar kesalahan halaman terjadi.

Contoh

Contoh kode berikut memunculkan peringatan ini.

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

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

Contoh kode berikut menghindari peringatan ini.

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

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